Escala de tecla y modo

10

La mayoría de ustedes probablemente conozca la escala C mayor:

C D E F G A B C

La escala mayor se caracteriza por los intervalos entre notas adyacentes, que medidos en semitonos son:

2 2 1 2 2 2 1

A partir de estos intervalos, podemos construir cualquier escala principal a partir de cualquier nota (la clave de la escala). Las 12 notas en nuestro sistema de afinación de temperamento igual de 12 tonos son:

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

equivalentemente (sustituyendo algunos equivalentes enarmónicos ):

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

con un semitono entre cada par de notas adyacentes.

Cada escala debe tener las siete notas en orden, comenzando por la tecla. De lo contrario, podría tener dos notas en la misma línea del pentagrama, lo que sería confuso. Entonces, en G # major / ionian, tienes F ## en lugar de G; los músicos solo verán en qué parte del pentagrama está la nota, ya han aprendido los accidentes para cada escala. De hecho, en G # major , F ## está representado en la línea de F ## sin accidentales, los accidentales están en la firma clave, pero como esa firma clave requeriría 2 objetos punzantes para F, generalmente esto se anota como Ab mayor.

Cambiando los 2 2 1 2 2 2 1intervalos, llegamos a siete modos diferentes de la escala diatónica:

  • Jónico : 2 2 1 2 2 2 1- corresponde a la escala mayor
  • Dorian :2 1 2 2 2 1 2
  • Frigio :1 2 2 2 1 2 2
  • Lidia :2 2 2 1 2 2 1
  • Mixolidio :2 2 1 2 2 1 2
  • Eólico : 2 1 2 2 1 2 2- corresponde a la escala menor natural, y a la escala menor melódica al descender (al subir, la escala menor melódica ha aumentado 6º y 7º grado. También hay una escala menor armónica, con un 7º grado elevado en comparación con la natural menor).
  • Locrian :1 2 2 1 2 2 2

Entonces, el desafío es escribir un programa que tome como entrada (a través de stdin ) una clave y un modo y produzca (a través de stdout ) la escala correspondiente. Algunos casos de prueba ( 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

Referencias adicionales:
¿Cuántas teclas (mayores y menores) hay? ¿Por qué?

ninjalj
fuente
44
Los ejemplos presentan notación que no se describió anteriormente: pisos y objetos punzantes dobles. ¿Es aceptable generar equivalentes utilizando solo las notas base y las especializaciones simples? (Por lo que vale, mi preferencia sería que diga "No" y amplíe un poco la especificación; parece que esta pregunta podría tener un poco de profundidad oculta).
Peter Taylor
@PeterTaylor: Correcto. Espero que la edición sea suficiente. Espero que la salida sea como se muestra, con los siete nombres de nota y sus correspondientes accidentes. Este es un programa relativamente grande.
ninjalj

Respuestas:

7

GolfScript, 96 caracteres

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

Solución de Golfscript que se puede probar en línea .

Nota: Como en los ejemplos, la clave debe estar en mayúscula, mientras que el modo debe estar en minúscula.

Ejemplos:

>C lydian
C D E F# G A B

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