Skaluj według klucza i trybu

10

Większość z was prawdopodobnie zna skalę C-dur:

C D E F G A B C

Skala główna charakteryzuje się odstępami między sąsiednimi nutami, które mierzone w półtonach to:

2 2 1 2 2 2 1

Z tych przedziałów możemy skonstruować dowolną dużą skalę, zaczynając od dowolnej nuty ( klucz skali). 12 nut w naszym 12-tonowym systemie strojenia o równym temperamencie to:

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

równoważnie (zastępując niektóre odpowiedniki enharmoniczne ):

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

z półtonem między każdą parą sąsiednich nut.

Każda skala musi mieć po kolei siedem nut, zaczynając od klucza. W przeciwnym razie możesz mieć dwie nuty w tej samej linii pentagramu, co byłoby mylące. Zatem w G # major / ionian masz F ## zamiast G; muzycy po prostu sprawdzą, gdzie na pentagramie jest nuta, już nauczyli się przypadków dla każdej skali. Rzeczywiście, w G # dur , F ## jest reprezentowane w linii F ## bez przypadkowych, wypadki są w sygnaturze kluczowej - ale ponieważ ta sygnatura kluczowa wymagałaby 2 ostrych znaków dla F, zwykle jest to oznaczone jako Ab-dur.

Przesuwając 2 2 1 2 2 2 1interwały, dochodzimy do siedmiu różnych trybów skali diatonicznej:

  • Joński : 2 2 1 2 2 2 1- odpowiada skali głównej
  • Dorian :2 1 2 2 2 1 2
  • Frygijski :1 2 2 2 1 2 2
  • Lidian :2 2 2 1 2 2 1
  • Mixolydian :2 2 1 2 2 1 2
  • Eolska : 2 1 2 2 1 2 2- odpowiada naturalnej skali mniejszej i melodycznej skali mniejszej podczas schodzenia (podczas wstępowania skala melodyczna podniosła 6 i 7 stopni. Istnieje również harmoniczna skala mniejsza, z podniesionym 7 stopniem w porównaniu do naturalnego mniejszy).
  • Locrian :1 2 2 1 2 2 2

Wyzwanie polega więc na napisaniu programu, który przyjmuje jako wejście (przez stdin ) klucz oraz tryb i wyprowadza (przez stdout ) odpowiednią skalę. Niektóre przypadki testowe ( 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

Dalsze odniesienia:
Ile jest kluczy (głównych i mniejszych)? Dlaczego?

ninjalj
źródło
4
Przykłady zawierają notację, która nie została opisana powyżej - mieszkania i podwójne ostrza. Czy dopuszczalne jest generowanie ekwiwalentów przy użyciu tylko nut podstawowych i prostych głównych? (Jeśli chodzi o to, co jest warte, wolałbym powiedzieć „Nie” i nieco rozszerzyć specyfikację - wygląda na to, że to pytanie może mieć dość ukrytą głębię).
Peter Taylor,
@PeterTaylor: Racja. Mam nadzieję, że edycja wystarczy. Oczekuję, że wynik będzie taki, jak pokazano, z siedmioma nazwami nut i odpowiadającymi im przypadkowymi przypadkami. To stosunkowo duży program.
ninjalj

Odpowiedzi:

7

GolfScript, 96 znaków

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

Rozwiązanie Golfscript, które można przetestować online .

Uwaga: Podobnie jak w przykładach, klawisz musi być pisany wielkimi literami, podczas gdy tryb musi być podawany małymi literami.

Przykłady:

>C lydian
C D E F# G A B

>C mixolydian
C D E F G A Bb
Howard
źródło