Escala a partir da tecla e do modo

10

A maioria de vocês provavelmente conhece a escala maior C:

C D E F G A B C

A escala maior é caracterizada pelos intervalos entre as notas adjacentes, medidas em semitons :

2 2 1 2 2 2 1

A partir desses intervalos, podemos construir qualquer escala maior iniciando em qualquer nota (a chave da escala). As 12 notas em nosso sistema de ajuste de temperamento igual a 12 tons são:

C C♯ D D♯ E F F♯ G G♯ A A♯ B

equivalentemente (substituindo alguns equivalentes enarmônicos ):

C D♭ D E♭ E F G♭ G Ab A B♭ B

com um semitom entre cada par de notas adjacentes.

Cada escala deve ter as sete notas em ordem, começando pela tecla. Caso contrário, você poderia ter duas notas na mesma linha do pentagrama, o que seria confuso. Então, em G # major / ionian, você tem F ## em vez de G; os músicos apenas observam onde está a nota no pentagrama, eles já aprenderam os acidentes de cada escala. De fato, em G # major , F ## é representado na linha de F ## sem acidentes, os acidentes estão na assinatura da chave - mas como essa assinatura exigiria 2 sharps para F, geralmente isso é anotado como Ab major.

Mudando os 2 2 1 2 2 2 1intervalos, chegamos a sete modos diferentes da escala diatônica:

  • Jónico : 2 2 1 2 2 2 1- corresponde à escala maior
  • Dorian :2 1 2 2 2 1 2
  • Frígio :1 2 2 2 1 2 2
  • Lídio :2 2 2 1 2 2 1
  • Mixolidiano :2 2 1 2 2 1 2
  • Eólios : 2 1 2 2 1 2 2- corresponde à escala menor natural e à escala menor melódica ao descer (quando ascendente, a escala menor melódica aumentou 6 e 7 graus. Há também uma escala menor harmônica, com um 7º grau elevado em comparação com o natural menor).
  • Locrian :1 2 2 1 2 2 2

Portanto, o desafio é escrever um programa que tome como entrada (via stdin ) uma tecla e um modo e produza (via stdout ) a escala correspondente. Alguns casos de teste ( stdin ( key mode) => stdout ( scale)):

Input:              Output:
C mixolydian   =>   C D E F G A Bb
F mixolydian   =>   F G A Bb C D Eb
G mixolydian   =>   G A B C D E F
G# ionian      =>   G# A# B# C# D# E# F##
Bb aeolian     =>   Bb C Db Eb F Gb Ab

Referências adicionais:
Quantas chaves (maiores e menores) existem? Por quê?

ninjalj
fonte
4
Os exemplos apresentam notação que não foi descrita acima - planos e objetos cortantes duplos. É aceitável produzir equivalentes usando apenas notas de base e notas simples? (Pelo que vale a pena, minha preferência é que você diga "Não" e expanda um pouco a especificação - parece que essa pergunta pode ter um pouco de profundidade oculta).
Peter Taylor
@ PeterTaylor: Certo. Espero que a edição seja suficiente. Eu espero que a saída seja como mostrada, com os nomes das sete notas e os respectivos acidentes. Este é um programa relativamente grande.
Ninjalj

Respostas:

7

GolfScript, 96 caracteres

" "/~5<{+}*7%"v]nwm[{"=2*2base(;\(" #"@?]{.1>))["b""""#"..+]=+\[~@(@+@(7%65+\1$7%4%0>-]}7*;]" "*

Solução Golfscript que pode ser testada online .

Nota: Como nos exemplos, a tecla deve estar em maiúscula enquanto o modo deve ser fornecido em minúscula.

Exemplos:

>C lydian
C D E F# G A B

>C mixolydian
C D E F G A Bb
Howard
fonte