Grać jak z nut – cz. 2

W pierwszej części artykułu poznaliśmy bardzo dużo pojęć muzycznych i technicznych. Teraz czas je wykorzystać do zbudowania automatycznego kompozytora. Zanim jednak do tego przystąpimy, musimy przyjąć pewne założenia (a raczej uproszczenia):

  • utwory będą się składały z 8 taktów w budowie okresowej (poprzednik 4 takty, następnik 4 takty)
  • metrum będzie 4/4 (czyli 4 ćwierćnuty na takt, akcent na pierwszą i trzecią miarę taktu)
  • długość każdego motywu wynosi 1 takt (mimo że to wymaganie wydaje się restrykcyjne, jednak wiele popularnych utworów jest zbudowanych właśnie z motywów, które trwają 1 takt).
  • stosowana będzie tylko tonacja C-dur (w razie potrzeby zawsze można po wygenerowaniu utworu przetransponować go do dowolnej tonacji)
  • ograniczymy się do ok. 25 najczęściej stosowanych odmian stopni harmonicznych (stopni jest 7, ale część z nich ma kilka wersji, z dodatkowymi dźwiękami, które zmieniają barwę akordu).

Co jest potrzebne do stworzenia utworu?

Do stworzenia w automatyczny sposób prostego utworu muzycznego potrzebne nam jest:

  • wygenerowanie harmonii utworu – akordów i ich rytmu
  • stworzenie motywów – ich dźwięków (wysokości) i rytmu
  • stworzenie wariacji tych motywów – j.w.
  • połączenia motywów i wariacji w melodię, dopasowując je do harmonii

Po opanowaniu podstaw możemy przejść do pierwszej części automatycznego komponowania – generowania harmonii. Zacznijmy od stworzenia rytmu harmonii.

Wolny rytm

Choć można by się pokusić o stworzenie statystycznego modelu rytmu harmonicznego, to, niestety, (przynajmniej w chwili pisania tego artykułu) nie ma dostępnej bazy, która by to umożliwiła. Wobec powyższego, musimy poradzić sobie w inny sposób – sami wymyślmy taki model. W tym celu wybierzmy kilka “sensownych” rytmów harmonicznych i zadamy im jakieś “sensowne” prawdopodobieństwa.

rytmprawdopodobieństworytmprawdopodobieństwo
[8]0.2[2,2]0.1
[6, 2]0.1[2,1,1]0.02
[2, 6]0.1[3,1]0.02
[7, 1]0.02[1,1,1,1]0.02
[4]0.4[1,1,2]0.02
Tab1. Rytmy harmoniczne, wartości wyrażane w ćwierćnutach – [6, 2] oznacza rytm, w którym są dwa akordy, pierwszy trwa 6 ćwierćnut, a drugi 2 ćwierćnuty.


Rytmy w tabeli przedstawione są w postaci tego, jak długo akordy będą trwały, a długość trwania przedstawiona jest w liczbie ćwierćnut. Niektóre rytmy trwają dwa takty (np. [8], [6, 2]), a pozostałe jeden takt ([4], [1, 1, 2] itd.).

Generowanie rytmu harmonii przebiega w następujący sposób. Losujemy kolejne rytmy aż do momentu, gdy otrzymamy tyle taktów, ile potrzebowaliśmy (w naszym przypadku 8). Ze względu na to, że rytmy mają różną długość, czasami mogą wyniknąć z tego pewne komplikacje. Przykładowo, może zaistnieć taka sytuacja, że do zakończenia generacji będzie potrzebny ostatni rytm o długości 4 ćwierćnut, a my natomiast wylosujemy rytm o długości 8. W takim przypadku, aby uniknąć niepotrzebnych problemów, można wymusić losowanie z podzbioru rytmów o długości 4 ćwierćnut.

W takim razie, zgodnie z powyższymi ustaleniami, załóżmy, że wylosowaliśmy następujące rytmy:

  • poprzednik: [4, 4], [2, 2], [3, 1], 
  • następnik: [3, 1], [8], [2, 2]

Likelihood

W kolejnym kroku będziemy wykorzystywali pojęcie likelihood. Jest to nieznormalizowane do jedynki prawdopodobieństwo (tzw. pseudo-prawdopodobieństwo), które pomaga ocenić względny poziom prawdopodobieństwa różnych zdarzeń. Dla przykładu, jeżeli likelihoody zdarzeń A i B wynoszą odpowiednio 10 oraz 20, to oznacza, że zdarzenie B jest dwa razy bardziej prawdopodobne od zdarzenia A. Równie dobrze mogłyby te likelihoody wynosić 1 oraz 2, albo 0.005 oraz 0.01. Z likelihoodów można policzyć prawdopodobieństwo. Jeśli założymy, że jedynie zdarzenia A i B mogą wystąpić, to ich prawdopodobieństwa będą wynosić odpowiednio:

Obrazek posiada pusty atrybut alt; plik o nazwie Zasob-1.svg

Progresje akordów

Aby wygenerować prawdopodobne przebiegi harmoniczne najpierw przygotujemy sobie modele N-gramowe stopni harmonicznych. W tym celu skorzystamy z modeli n-gramów udostępnionych na githubie (https://github.com/DataStrategist/Musical-chord-progressions).

Nasz przykładzie będzie wykorzystywać 1-, 2-, 3-, 4- i 5-gramy.

W rytmie harmonii poprzednika jest 6 wartości rytmicznych, więc musimy przygotować przebieg 6 stopni harmonicznych. Pierwszy akord generujemy z użyciem unigramów (1-gramów). Przygotowujemy sobie zatem najpierw likelihoody dla każdego możliwego stopnia, a następnie losujemy z uwzględnieniem tych likelihoodów. Wzór na likelihood jest w tym przypadku dość prosty:

likelihoodX=p(X)

gdzie
X oznacza dowolny stopień harmoniczny
p(X) to prawdopodobieństwo 1-gramu X

My w tym przypadku wylosowaliśmy IV stopień (w tej tonacji F-dur).

Drugi akord generujemy z użyciem bigramów oraz unigramów, z wagą większą dla bigramów:

likelihoodX=waga2gramp(X v IV)+waga1gram*p(X)

gdzie:

  • p(X v IV) to prawdopodobieństwo przebiegu (IV, X)
  • wagaNgram to przyjęta waga N-gramu (im większa tym większy wpływ tego modelu n-gramowego, a mniejszy wpływ innych modeli)

Wagi n-gramów możemy przyjąć takie, jakie chcemy. Na potrzeby przykładu wybraliśmy takie:

n-gram12345
waga0.0010.010.115

Kolejny akord jaki wylosowaliśmy to: vi stopień (a-moll).

Generowanie trzeciego akordu przebiega podobnie, z tym że możemy już wykorzystać 3-gramy:

likelihoodX=waga3gramp(X v IV, vi)+waga2gramp(X v IV)+waga1gram*p(X)

I tak kontynuujemy, aż wygenerujemy wszystkie potrzebne akordy. W naszym przypadku wylosowaliśmy:

IV,  vi, I, iii, IV, vi (w przyjętej tonacji C-dur to są kolejno akordy F-dur, a-moll, C-dur, e-moll, F-dur, a-moll)

Nie jest to jakiś bardzo często spotykany przebieg akordów, ale jak się okazuje występuje w 5 popularnych piosenkach (https://www.hooktheory.com/trends#node=4.6.1.3.4.6&key=rel)

Podsumowanie

Udało nam się wygenerować rytmy i akordy, które są składowymi harmonii utworu. Należy tutaj jednak zwrócić jeszcze uwagę, że dla uproszczenia, nie wzięliśmy pod uwagę dwóch ważnych czynników:

  • Przebiegi harmoniczne poprzednika i następnika są bardzo często w jakiś sposób powiązane. Harmonia następnika może być identyczna do tej poprzednika lub ewentualnie lekko zmieniona, aby sprawiać wrażenie, że te dwa zdania są ze sobą w jakiś sposób powiązane.
  • Poprzednik i następnik kończą się prawie zawsze na konkretnych stopniach harmonicznych. Nie jest to ścisła reguła, ale niektóre stopnie harmoniczne są o wiele bardziej prawdopodobne od innych na końcach zdań muzycznych.

Na potrzeby przykładu można jednak uznać zadanie za zakończone. Harmonię utworu mamy już gotową, teraz należy jedynie stworzyć melodię do tej harmonii. W trzeciej części naszego artykułu można dowiedzieć się, jak właśnie taką melodię skomponować.

Grać jak z nut – cz. 1

Muzycy w czasie swojej edukacji muszą posiąść umiejętność gry a vista – grania nowego dla nich utworu muzycznego, bez wcześniejszego dokładnego zapoznania się z nim. Dzięki temu wirtuozi nie tylko mogą grać bez przygotowania większość utworów, ale też potrzebują dużo mniej czasu na zapoznanie się z bardziej wymagającymi kompozycjami. Do ćwiczeń gry a vista potrzebne jest jednak sporo utworów. Powinny być to raczej mało znane utwory i dopasowane do umiejętności danego muzyka poziomie trudności. Przyszły wirtuoz musi więc poświęcić sporo swojego (i nauczyciela) czasu na przygotowanie takiej playlisty, co dodatkowo demotywuje do nauki. Co gorsza, raz wykorzystana playlista nie jest już do niczego potrzebna.

Tranzystorowy kompozytor

A co gdyby było coś, co samo przygotowuje te utwory, w pełni zautomatyzowany sposób? Nie tylko samo je tworzy, ale też dopasowuje poziom trudności do umiejętności muzyka. Tak powstał pomysł na stworzenie automatycznego kompozytora – programu komputerowego komponującego utwory muzyczne za pomocą sztucznej inteligencji, która w ostatnim czasie nabiera dużego rozgłosu.

Słowo „komponowanie” może jest tu użyte trochę na wyrost, bardziej pasuje „generowanie”. Choć w sumie, kompozytorzy też tworzą kompozycje w oparciu o swoje własne algorytmy. Semantyka na bok, ważne, że stworzenie takiego (prostego póki co) programu się udało i początkujący muzycy mogliby z niego skorzystać.

Zanim jednak przejdziemy do tego, jak generować utwory muzyczne musimy najpierw poznać podstawy, dowiedzieć się jak zbudowane są utwory, a także od czego zależy ich trudność.

Muzyczne ABC

Interwał, półton, akord, takt, metrum, skala muzyczna, tonacje utworu to podstawowe pojęcia w muzycznym ABC. Interwał to wielkość opisująca odległość pomiędzy dwoma kolejnymi dźwiękami melodii. Chociaż jej jednostką jest półton, to zazwyczaj używa się nazw konkretnych interwałów. Z kolei półton to najmniejsza przyjęta różnica pomiędzy wysokościami dźwięków (ok. 5%). Oczywiście różnice te mogą być nieskończenie małe, po prostu taki podział interwałów przyjął się jako standard. Akord to trzy lub więcej dźwięków granych jednocześnie. Następnym pojęciem jest takt, czyli to co znajduje się pomiędzy pionowymi kreskami na pięciolinii. Czasami utwór zaczyna się niepełnym taktem (przedtaktem).

Wizualizacja przedtaktu
Rys. 1 Wizualizacja przedtaktu

Metrum – określenie to odnosi się do tego, ile wartości rytmicznych znajduje się w jednym takcie. W metrum 4/4 w jednym takcie powinny się znaleźć cztery ćwierćnuty. W metrum 3/4 – trzy ćwierćnuty, w metrum 6/8 sześć ósemek. Chociaż 3/4 oraz 6/8 oznaczają taką samą liczbę wartości rytmicznych, to metra te są inne, akcenty w nich przypadają na inne miejsca w takcie. W metrum 3/4 akcent przypada na pierwszą ćwierćnutę (poprawnie mówi się „na pierwszą miarę taktu”). Natomiast w metrum 6/8 akcent przypada na pierwszą i czwartą miarę taktu.

Skala muzyczna to zbiór dźwięków, które określają materiał dźwiękowy, z jakiego utwory muzyczne korzystają. Skale są uporządkowane, zazwyczaj przedstawia się je zgodnie z rosnącą wysokością dźwięków. Najbardziej popularnymi skalami są durowa i molowa. Skal muzycznych jest o wiele więcej, jednak w zachodnim kręgu kulturowym te dwie skale są dominujące. Wykorzystywane były w większości starszych oraz obecnie popularnych utworach. Kolejne pojęcie to tonacja utworu, czyli określenie z jakich dźwięków utwory korzystają. Skala vs. tonacja – skala jest bardziej szerokim określeniem, jest wiele tonacji o danej skali, ale dana tonacja posiada swoją skalę. Tonacja określa od jakiego dźwięku zaczyna się skala.

Budowa utworu muzycznego

W muzyce klasycznej najbardziej popularną zasadą kształtowania utworu muzycznego jest budowa okresowa. Kompozycje budowane są z pewnych elementów – okresów, stanowiących odrębną całość. By jednak zrozumieć, czym one są należy wprowadzić kilka innych pojęć.

Motyw jest to ciąg kilku nut, powtarzających się w tej samej lub nieco odmienionej postaci (wariacja) w innych miejscach utworu. Zazwyczaj czas trwania motywu jest równy długości jednego taktu.

Wariacją motywu nazywamy zmienioną w jakiś sposób formę motywu, zachowującą jednak większość jego właściwości, jak np. rytm bądź charakterystyczny interwał. W utworach muzycznych nie ma bardzo dużej liczby motywów. Większość utworu stanowią wariacje motywów. Dzięki temu utwór ma tak jakby swój charakter i nie zaskakuje słuchacza co raz to nowym materiałem muzycznym.

Muzyczny temat jest to zazwyczaj ciąg 2-3 motywów, które powtarzają się (ewentualnie w nieco zmienionych wersjach) przez cały utwór. Nie każdy utwór musi posiadać swój temat.

Zdanie muzyczne jest to dwie lub więcej fraz.

Okresem muzycznym określamy połączenie dwóch zdań muzycznych. Poniżej przedstawiono prosty okres mały z zaznaczonymi podstawowymi elementami.

Schemat budowy okresowej utworu muzycznego
Rys. 2 Schemat budowy okresowej utworu muzycznego

Tak w uproszczeniu wygląda budowa okresowa. Kilka nut tworzy motywy, kilka motywów frazę, kilka fraz zdanie, kilka zdań okres i w końcu – jeden lub kilka okresów cały utwór muzyczny. Istnieją również alternatywne metody tworzenia utworów muzycznych. Jednakże budowa okresowa jest najbardziej rozpowszechniona, a co ważne w tym przypadku – łatwiejsza do zaprogramowania.

Komponowanie w harmonii

Zazwyczaj kompozycje oparte są na przebiegach harmonicznych – akordach, które mają swoją własną „melodię” i swój własny rytm. Kolejne akordy w przebiegach harmonicznych nie są zupełnie przypadkowe. Na przykład, po akordach F-dur i G-dur bardzo prawdopodobne jest, że następnym akordem będzie C-dur. Mniej prawdopodobne będzie natomiast to, że będzie to e-moll, a zupełnie nieprawdopodobne, by był to Dis-dur. Istnieją pewne reguły rządzące tymi zależnościami między akordami. Nie musimy się jednak w nie bardziej zagłębiać, gdyż będziemy stosować modele statystyczne do generowania harmonii utworów.

Musimy za to zrozumieć, co to są stopnie harmoniczne. Tonacje posiadają kilka ważnych akordów, trójdźwięków. Ich podstawowy dźwięk, prymą są kolejne dźwięki danej tonacji. Pozostałe dźwięki należą do tej tonacji, np. pierwszym stopniem tonacji C-dur jest akord C-dur, drugim stopniem akord d-moll, trzecim e-moll, itd. Stopnie harmoniczne oznaczane są rzymskimi literami, akordy durowe oznaczane są zazwyczaj dużymi literami, a molowe małymi (podstawowe stopnie skali durowej: I, ii, iii, IV, V, vi,VII).

Stopnie harmoniczne są takimi „uniwersalnymi” akordami, niezależnie od jakiego dźwięku zaczyna się tonacja, prawdopodobieństwa kolejnych stopni harmonicznych są takie same. W tonacji C-dur ciąg akordów: C – F – G – C jest tak samo prawdopodobny jak w tonacji G-dur przebieg: G – C – D – G. W tym przykładzie został przedstawiony jeden z najczęściej stosowanych w muzyce przebiegów harmonicznych, wyrażony w stopniach: I – IV – V – I.

Dźwięki melodii nie są zupełnie dowolne, jest wiele reguł i wyjątków, które nimi rządzą. Przykład reguły i wyjątku w tworzeniu harmonii:

  • reguła: na każdą miarę taktu powinien wystąpić dźwięk należący do danego akordu,
  • wyjątek: czasami na daną miarę taktu używa się innych dźwięków, nienależących do tego akordu, lecz po których stosunkowo szybko występuje nuta tego akordu.

Te reguły i wyjątki w harmonii nie muszą być ściśle przestrzegane. Jeśli jednak będziemy się do nich stosować, to istnieje dużo większa szansa, że komponowana przez nas muzyka będzie dobrze, naturalnie brzmieć.

Od czego zależy trudność utworu muzycznego

Jest kilka czynników, które wpływają na trudność utworu:

  • szybkość- generalnie, niezależnie od instrumentu im szybciej, tym trudniej (szczególnie w kontekście gry a vista)
  • dynamika melodii – melodia składająca się z dwóch dźwięków będzie prostsza do zagrania niż taka, która wykorzystuje wiele różnych dźwięków
  • trudność rytmiczna – im bardziej złożony rytm, tym trudniej. Im więcej synkop, trioli, legowanych nut itp. „urozmaiceń” rytmicznych, tym trudniej
  • powtarzalność – nieważne jak trudna melodia, jeśli jej fragmenty się powtarzają, to gra się ją dużo łatwiej, niż taką, która cały czas się zmienia. Jeszcze gorzej jeśli się powtarza, ale w nieco zmieniony, można by rzec „podchwytliwy” sposób (gdy zmiana melodii jest łatwa do przeoczenia)
  • trudności związane z zapisem nutowym – im więcej dodatkowych znaków chromatycznych (bemoli, krzyżyków, kasowników) tym trudniej
  • trudności związane z danym instrumentem – niektóre przebiegi melodyczne mogą mieć diametralnie różne poziomy trudności na różnych instrumentach np. dwudźwięki na pianinie lub gitarze są znacznie prostsze do zagrania niż dwudźwięki na skrzypcach

Niektóre tonacje są trudniejsze od innych, bo posiadają więcej znaków przykluczowych, o których trzeba pamiętać.

Techniczne strony zagadnienia

Muzyczną stronę staraliśmy się nakreślić w poprzednich akapitach natomiast teraz skupimy się na stronie technicznej. Aby dobrze w nią wejść potrzebne jest zagłębienie się w zagadnienie „prawdopodobieństwa warunkowego”. Na początek przykład.

Załóżmy, że nie wiemy gdzie jesteśmy ani nie znamy dzisiejszej daty. Jakie jest prawdopodobieństwo, że jutro zacznie padać śnieg? Zapewne dosyć małe (w większości miejsc na ziemi śnieg nigdy lub prawie nigdy nie pada) więc oszacujemy je na jakieś 2%. Dowiedzieliśmy się jednak, że znajdujemy się w Laponii. Jest to kraina tuż za północnym kołem podbiegunowym. Jak teraz określimy prawdopodobieństwo tego, że jutro spadnie śnieg? Otóż będzie ono dużo wyższe niż przed chwilą. Niestety, dalej taka informacja nie rozwiązuje naszej zagadki, ponieważ nie znamy pory roku jaka obecnie panuje. W związku z tym określimy nasze prawdopodobieństwo na 10%. Kolejną informacją jaką otrzymaliśmy jest to, że jest środek lipca, lato w pełni. Biorąc pod uwagę najnowsze informacje możemy określić prawdopodobieństwo tego, że jutro spadnie śnieg określimy na 0,1%.

Prawdopodobieństwo warunkowe

Z historii powyżej bardzo prosto wysnuć jeden wniosek. Prawdopodobieństwo zależało od stanu naszej wiedzy i zmieniało się na jej podstawie w różne strony. W ten sposób działają prawdopodobieństwa warunkowe, oznaczane w następujący sposób:

P(A|B)

Informują nas o tym, jakie jest prawdopodobieństwo wystąpienia zdarzenia (tutaj A), jeśli wystąpiły jakieś inne zdarzenia (tutaj B). „Zdarzenie” nie musi oznaczać jakiegoś wydarzenia, incydentu – może to być jak w naszym przykładzie dowolny warunek, informacja.

Aby obliczyć prawdopodobieństwo warunkowe musimy wiedzieć, jak często występuje zdarzenie B i jak często występują oba zdarzenia – A i B jednocześnie. Lepiej to zrozumiemy wracając do naszego przykładu. Zakładając, że A to padający śnieg, a B to znajdowanie się w Laponii, to prawdopodobieństwo, że śnieg padać będzie w Laponii jest równe:

wzór na prawdopodobieństwo, że śnieg będzie padać w Laponii

To samo równanie, wyrażone bardziej formalnie i zgodnie z przyjętymi symbolami A i B, będzie wyglądało następująco:

To nie jest to samo, co prawdopodobieństwo tego, że będzie padało w Laponii. Może częściej jeździmy do Laponii zimą i jak już jesteśmy w Laponii, to bardzo prawdopodobne, że będzie padał śnieg?

Aby teraz policzyć dokładnie, ile wynosi to prawdopodobieństwo, potrzebne nam są dwie statystyki:

  • NA∩B ile razy, gdy byliśmy w Laponii, padało,
  • NB ile razy byliśmy w Laponii,

oraz to ile dni do tej pory przeżyliśmy (albo ile dni upłynęło od kiedy zaczęliśmy prowadzić powyższe statystyki):

  • NTOTAL.

Te dane posłużą nam do policzenia odpowiednio P(A∩B) i P(B):

W końcu mamy to, czego oczekiwaliśmy:

Czyli prawdopodobieństwo, że będzie padało, jeżeli znajdujemy się w Laponii jest równe stosunkowi tego ile razy, gdy byliśmy w Laponii padało, do tego jak wiele razy byliśmy w Laponii. Warto też dodać, że im częściej bywaliśmy w Laponii, tym to prawdopodobieństwo będzie dokładniejsze (jeżeli byliśmy 1000 dni w Laponii to będziemy mieli lepsze rozeznanie, niż jeżeli byliśmy tam 3 razy).

N-gramy

Kolejną rzeczą, jaką musimy poznać przed przystąpieniem do algorytmicznego komponowania są N-gramy, jak je stworzyć i jak z nich korzystać do generowania prawdopodobnych sekwencji danych. N-gramy są to modele statystyczne. Jeden N-gram to ciąg elementów o długości równej N. Występują 1-gramy, 2-gramy, 3-gramy, itd. Modele te są często wykorzystywane przy modelowaniu języka. Pozwalają określić, jakie jest prawdopodobieństwo wystąpienia ciągu słów. Bierze się korpus języka (mnóstwo książek, gazet, stron internetowych, forum, itp.) i na podstawie niego zlicza, ile razy wystąpił dany ciąg słów. Na przykład jeśli w zbiorze wystąpił 1000 razy ciąg „zamek królewski”, a tylko 10 razy ciąg „zamek błyskawiczny”, to oznacza, że pierwszy ciąg jest 100 razy bardziej prawdopodobny od drugiego. Takie informacje mogą nam się przydać. Dzięki nim możemy określić, jak prawdopodobne jest każde zdanie.