Pchełki SQL: Ile jest różnych skal muzycznych?

https://xpil.eu/z37

Pomysł na dzisiejszy wpis zerżnąłem (zresztą nie po raz pierwszy) od Johna: https://www.johndcook.com/blog/2017/09/30/how-many-musical-scales-are-there/

Analogicznie do chlebaka, który jak powszechnie wiadomo służy do noszenia granatów, oktawa, jak sama nazwa wskazuje, składa się z dwunastu półtonów.

To znaczy tak: półtonów jest rzeczywiście dwanaście, ale dźwięków tylko osiem.

Zakładając, że dźwięki te zaczynają się od C, mamy po kolei: C-D-E-F-G-A-H-C.

Między E i F jest tylko jeden półton, podobnie między H i C. Wszędzie indziej odstęp między kolejnymi dźwiękami wynosi dwa półtony.

Mamy więc siedem interwałów: dwa pojedyncze i pięć podwójnych. 2x1+5x2 daje 12, zgodnie z tym, co napisałem na samym początku. Chlebak, granaty, oktawa, dwanaście.

Oczywiście powyższe ma rację bytu wyłącznie wtedy, kiedy chcemy zagrać uśmiechniętą i szczęśliwą gamę durową. W przypadku spadku nastroju przestawiamy się na mole i wtedy już zamiast od C, zaczniemy od A: A-H-C-D-E-F-G-A.

Tutaj również mamy dwa pojedyncze interwały i pięć podwójnych, ale już w wersji molowej. Skala, chociaż składa się z identycznych dźwięków, brzmi zdecydowanie smutniej.

Dwie wymienione powyżej skale to podstawowa skala durowa i molowa. Zarówno jedną jak i drugą można rozpocząć od dowolnego dźwięku, jednak za każdym razem będzie tak, że w skali durowej pojedynczy półton pojawi się między dźwiękami numer 3 i 4 oraz 7 i 8, a w molowej - między 2 i 3 oraz 5 i 6.

Czy to jedyne możliwe warianty?

Oczywiście, że nie.

Istnieje kilka innych skal opartych na oktawie (a więc na interwale składającym sie z dwunastu półtonów). Na przykład skala miksolidyjska, która - jeżeli rozpocząć ją od dźwięku C - wygląda tak: C-D-E-F-G-A-B-C. Jedyna różnica między skalą miksolidyjską a durową polega na tym, że przedostatni dźwięk jest obniżony o pół tonu.

Innym przykładem jest molowa skala węgierska (zwana też skalą cygańską) - tutaj mamy dźwięki C-D-Eb-F#-G-Ab-H-C

(uwaga: ponieważ jestem leniwy, zamiast symbolu bemol używam małej litery b, a zamiast krzyżyka muzycznego - zwykłego hasza).

Jak widać mamy tu novum, a mianowicie aż trzy półtony odstępu między dwoma kolejnymi dźwiękami: Eb-F#

Jeszcze innym przykładem skali jest skala ukraińska doriańska, różniąca się od cygańskiej jednym dźwiękiem: C-D-Eb-F#-G-Ab-B-C.

I tak dalej, i tak dalej. Różnych oficjalnie "uznanych" skal jest dobrze ponad dziesięć. Wszystkie mają jednak dwie wspólne cechy: zaczynają się i kończą tym samym dźwiękiem (a więc, odległość między pierwszym i ostatnim dźwiękiem wynosi dokładnie jedną oktawę) oraz składają się z ośmiu dźwięków (lub siedmiu interwałów, jak kto woli).

Z oczywistych względów pomijam tu również zagadnienie różnych rodzajów półtonów. Dziś - z nielicznymi, egzotycznymi wyjątkami - używa się wyłącznie półtonów temperowanych, a więc takich, których bazowe częstotliwości różnią się o współczynnik równy pierwiastkowi dwunastego stopnia z dwóch (w przybliżeniu: 1.059463). O półtonach diatonicznych oraz chromatycznych zapominamy.

Do tego dochodzą jeszcze inne skale, o których dziś nie chcę opowiadać, ponieważ nie pasują mi one do schematu.Na przykład moja ulubiona skala bluesowa: C-Eb-F-G-B-C, albo różne skale pentatoniczne, od których nazwę wzięła jedna z moich ulubionych kapel wokalnych (Pentatonix). Ponieważ mają one mniej niż osiem dźwięków - dziś je pominę.

Czas na główne zagadnienie dzisiejszego wpisu, czyli: ile można skonstruować ośmiostopniowych skal opartych na dźwięku C, w których maksymalny interwał między kolejnymi dźwiękami wynosi trzy półtony?

Przekładając to na język trochę (ale tylko trochę!) bardziej matematyczny, pytanie brzmi: ile jest ciągów o następujących własnościach:
- składają się z siedmiu elementów
- każdy element to jedynka, dwójka lub trójka
- suma wszystkich elementów to 12

?

Gdyby podejść do zagadnienia "na poważnie", pewnie dałoby się to jakoś wyliczyć analitycznie. Odrobina kombinatoryki doprawiona szczyptą zdrowego rozsądku, na podkładzie z kilku czystych kartek A4 - i gotowe.

Ponieważ jednak nie posiadam ani odpowiedniej wiedzy, ani cierpliwości, rozwiążę zagadnienie w sposób siłowy (podobnie jak zrobiłem to swego czasu z zagadką od Pendragona: !klik!)

Dodatkowo, ponieważ z racji wykonywanego zawodu piszę głównie w języku SQL, skorzystam z tego własnie języka zamiast użyć czegoś bardziejszego. To trochę tak, jakby przybijać gwoździe wiertarką - da się, ale trwa to odrobinę dłużej i trzeba się nieco bardziej narobić.

OK, starczy już tego pitolenia, przechodzimy do samego gęstego. A więc - kod:

WITH nuty AS (
          SELECT 0 id, 'C' nuta
    UNION SELECT 1 , 'C#'
    UNION SELECT 2, 'D'
    UNION SELECT 3, 'D#'
    UNION SELECT 4, 'E'
    UNION SELECT 5, 'F'
    UNION SELECT 6, 'F#'
    UNION SELECT 7, 'G'
    UNION SELECT 8, 'G#'
    UNION SELECT 9, 'A'
    UNION SELECT 10, 'A#'
    UNION SELECT 11, 'H'
    UNION SELECT 12, 'C'
)
, interwaly AS (SELECT 1 AS i UNION ALL SELECT 2 UNION ALL SELECT 3)
, skale1 AS
(
    SELECT i1.i int1, i2.i int2, i3.i int3, i4.i int4, i5.i int5, i6.i int6, i7.i int7
    FROM interwaly i1, interwaly i2, interwaly i3, interwaly i4, interwaly i5, interwaly i6, interwaly i7
    WHERE i1.i+i2.i+i3.i+i4.i+i5.i+i6.i+i7.i=12
)
, skale2 AS
(
    SELECT   
        skale1.int1 nuta1,
        skale1.int1 + skale1.int2 nuta2,
        skale1.int1 + skale1.int2 + skale1.int3 nuta3,
        skale1.int1 + skale1.int2 + skale1.int3 + skale1.int4 nuta4,
        skale1.int1 + skale1.int2 + skale1.int3 + skale1.int4 + skale1.int5 nuta5,
        skale1.int1 + skale1.int2 + skale1.int3 + skale1.int4 + skale1.int5 + skale1.int6 nuta6,
        skale1.int1 + skale1.int2 + skale1.int3 + skale1.int4 + skale1.int5 + skale1.int6 + skale1.int7 nuta7
    FROM skale1
)
SELECT 'C' +'-'+
       n1.nuta + '-' +
       n2.nuta + '-' +
       n3.nuta + '-' +
       n4.nuta + '-' +
       n5.nuta + '-' +
       n6.nuta + '-' +
       n7.nuta skala
FROM skale2 AS s
    JOIN nuty AS n1 ON s.nuta1 = n1.id
    JOIN nuty AS n2 ON s.nuta2 = n2.id
    JOIN nuty AS n3 ON s.nuta3 = n3.id
    JOIN nuty AS n4 ON s.nuta4 = n4.id
    JOIN nuty AS n5 ON s.nuta5 = n5.id
    JOIN nuty AS n6 ON s.nuta6 = n6.id
    JOIN nuty AS n7 ON s.nuta7 = n7.id;

Na wyjściu dostaniemy ni mniej ni więcej tylko 266 skal. Na tyle sposobów możemy przewędrować od jednego klawisza C do następnego, nie przeskakując więcej niż 3 półtony na raz.

https://xpil.eu/z37

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.