LABORATORIUM AKUSTYKI MUZYCZNEJ
Ćw. 6
Algorytmy automatycznego generowania linii melodycznej
Wykonujący: Ocena:
Specjalność: IDiO, sem. III Data wykonania ćwiczenia:
opracowanie: mgr inż. Adam Kurowski, wersja instrukcji z dnia: 6. maja 2019 roku
1. PODSTAWY TEORETYCZNE
Próby formalizowania zapisu muzycznego oraz podejścia do kompozycji są tak stare jak sama muzyka. Przykładem takiej próby sformalizowania zasad tworzenia muzyki jest Pitagorejska klasyfikacja interwałów oraz strój naturalny wywodzący się z wprowadzonych przez niego zasad. Przejawem formalizacji muzyki jest także zbiór zasad kompozycji muzyki. Potrafi się on różnić w zależności od gatunku muzycznego, epoki, z której dane utwory pochodzą, czy wręcz może być on inny dla każdego kompozytora. Podejmowane są próby, aby tego typu formalizacja mogła być dokonywana nie tylko przez kompozytora spisującego na papierze reguły dotyczące współbrzmień (np. harmonia tonalna), czy też współistnienia i równoległego prowadzenia wielu głosów melodycznych (tzw. kontrapunkt). Pewną inspiracją dla kompozytora mogą być sygnały o losowym charakterze, którego własności statystyczne są zbliżone do analogicznych właściwości przejawianych przez ciągi melodyczne. Pierwsza kompozycją uznaną za wynik kompozycji dokonanej przez komputer jest Illiac Suite for String Quartet. Algorytm kompozycji bazował zarówno na klasycznych regułach harmonii tonalnej oraz kontrapunktu, jak i na regułach tonalności rozluźnionej i dodekafonii. Dodatkowo wykorzystano także moduły oprogramowania bazujące na wykorzystaniu łańcuchów Markowa. Autorami oprogramowania był Lejaren Hiller oraz Leonard Isaacson. Innym znanym kompozytorem wykorzystującym w swojej praktyce artystycznej algorytmy komputerowe był Iannis Xenakis, który chętnie stosował metody bazujące na teorii wielkich liczb Bernoulliego, procesach Markowa, czy teorii gier. Utwory komponowane przez algorytmy implementowane w postaci programów komputerowych mogły stanowić dzieła same w sobie, ale mogły także posłużyć za punkt wyjścia, inspirację dla kompozytora, który komponował dzieła muzyczne przetwarzając tego typu materiał wygenerowany przez maszynę. Jest to tak zwana komputerowo wspomagana kompozycja algorytmiczna (ang. computer aided algotirthmic composition, CAAC).
Niniejsze laboratorium ma za zadanie przybliżyć tematykę technik stosowanych do komputerowego wspomagania procesu twórczego jakim jest komponowanie melodii na bazie modeli matematycznych mających na celu uchwycenie jej wewnętrznej struktury lub na bazie wykorzystania zjawisk mających z sygnałem muzycznym pewne wspólne cechy. Wszystkie metody kompozycji algorytmicznej oraz sposoby jej wspomagania zostały zaimplementowane w języku programowania Python przy wykorzystaniu następujących bibliotek:
numpy
obliczenia numeryczne ogólnego przeznaczenia
mido
do odczytu i zapisu plików MIDItensorflow, keras
biblioteki realizujące zadania uczenia maszynowego oraz obliczeń koniecznych w tym celuW ramach laboratorium zbadane zostaną trzy sposoby wspomagania i automatycznej kompozycji linii melodycznych. Pierwszym z nich są sposoby bazujące na generowaniu próbek szumu o własnościach statystycznych podobnych do własności przejawianych przez rozkład wysokości nut w kompozycji muzycznej. Wykorzystany jest tutaj fakt, że następujące po sobie nuty są ze sobą skorelowane oraz że całość kompozycji muzycznej posiada charakter samopodobny. Sygnały losowe o takich cechach mogą być wykorzystane do generowania ciągów nut. Tego typu zjawiska można zaobserwować na przykładzie pokazanym na Rysunku 1.
Rysunek 1. Przykład frazowania oraz samopodobieństwa ciągów nut w utworze muzycznym, źródło: N. Vaccai, Metodo practico di canto italiano.
Widoczne są frazy muzyczne, które powtarzają się z pewną dokładnością co dwa takty, Jednocześnie zachodzi prawdopodobieństwo, że następna nuta melodii znajdzie się blisko nuty ją poprzedzającej (najczęstszym interwałem jest sekunda), co pozwala przypuszczać, że ze statystycznego punktu widzenia zachodzi zależność pomiędzy wysokościami kolejnych nut melodii.
Innym sposobem generowania melodii jest posłużenie się łańcuchami Markowa oraz innymi, bardziej złożonymi gramatykami losowymi. W łańcuchu Markowa istnieje zależność jedynie pomiędzy dwoma następującymi po sobie stanami procesu losowego. W przypadku kompozycji algorytmicznej są to wysokości generowanych nut. Jednak, na potrzeby konstrukcji tego typu systemów czasami dobrze jest uwzględnić więcej niż jedną poprzedzającą nutę, co pozwala na bardziej dokładne odtwarzanie sposobu konstrukcji fraz w dziele muzycznym. Gramatyki stochastyczne mogą być wygenerowany na podstawie dostarczonych przykładów. Dodatkowo, przejścia pomiędzy kolejnymi stanami łańcucha są losowe, zatem do algorytmu kompozycji wprowadzony jest element losowości, dzięki któremu za każdym uruchomieniem algorytmu generowany jest trochę inny wynik. Przykład łańcucha Markowa zastosowanego w roli stochastycznej gramatyki generującej sekwencje nut przedstawiony jest na Rysunku 2.
Rysunek 2. Przykład wykorzystania gramatyki stochastycznej w postaci łańcucha Markowa do
stworzenia modelu generowania melodii. Na rozkład prawdopodobieństwa następnej nuty w sekwencji ma w tym przypadku wpływ jedynie wysokość nuty poprzedzającej. Na przykład: jeżeli poprzednią nutą była nuta C, to istnieje prawdopodobieństwo równe 0.6, że następna nutą będzie D, a 0.4, że następną nutą będzie nuta E.
Ostatnim zaprezentowanym sposobem jest wykorzystanie rekurencyjnej sieci neuronowej do generowania kolejnych nut utwory na bazie kilku nut je poprzedzających. Najprostszym rozwiązaniem w tego typu zastosowaniu jest użycie tradycyjnej sieci ze sprzężeniem zwrotnym, jednak źle sprawdzają się one w przypadku analizy długich ciągów. Z tego względu w zastosowaniach tego typu znacznie częściej wykorzystuje się sieci typu LSTM (ang. long short-term memory), których konstrukcja bazująca na blokach pamięci sterowanych przez osobne podsieci wspiera uczenie się długich sekwencji. Właśnie taka sieć jest wykorzystywana w trakcie laboratorium. Przykład konstrukcji takiej sieci przedstawiony jest na Rysunku 3.
Rysunek 3. Konstrukcja pojedynczego bloku sieci neuronowej typu LSTM. Żółte bloczki
oznaczają poszczególne podsieci odpowiedzialne za sterowanie przepływem informacji w pojedynczym bloku sieci, źródło: http://colah.github.io/posts/2015-08-Understanding-LSTMs/, data dostępu 30. maja 2017.
W przypadku kompozycji algorytmicznej za pomocą sieci neuronowej konieczne jest ustalenie kodowania umożliwiającego odpowiednie wprowadzenie i wyprowadzenie danych z sieci neuronowej. Przykładem takiego kodowania może być zapis typu „one-hot”. Realizuje się go w ten sposób, że sieć neuronowa ma tyle wyjść, ile jest możliwych dźwięków w melodii. W jednej chwili wartość „1” może mieć tylko jedno wyjście, natomiast pozostałe mają wartość „0”. Melodia jest w takim przypadku ciągiem wektorów o długości takiej, jak liczba możliwych nut w melodii (dla standardowej klawiatury fortepianowej liczba klawiszy, a co za tym idzie długość tego wektora, wynosi 88). Długość nuty można regulować za pomocą powtarzania tego samego wektora. Przykładowo, jeżeli pojedynczy wektor oznacza ósemkę, to czterokrotnie powtórzony będzie oznaczać wygenerowanie półnuty. Przykład tego typu zapisu został przedstawiony na Rysunku 4.
Rysunek 4. Sposób kodowania „one hot” umożliwiający proste kodowanie wysokości oraz
długości trwania nuty. Przykłady dźwiękowe zapisane w tej konwencji mogą być wykorzystane do uczenia sieci LSTM, która następnie może być wykorzystana do wygenerowania ciągów o charakterystyce podobnej do ciągów uczących.
2. OPROGRAMOWANIE I SKRYPTY
Na potrzeby ćwiczenia przygotowany został zestaw skryptów umożliwiający generowanie przebiegów nut sterowanych za pomocą generatora wartości losowych, kompozycję za pomocą gramatyk stochastycznych oraz kompozycję z wykorzystaniem sieci LSTM. Każde z ćwiczeń posiada swój osobny folder odpowiadający numerowi ćwiczenia z sekcji 2. instrukcji laboratoryjnej. Modyfikacja nastaw odbywa się przez modyfikację zawartości skryptów napisanych w języku Python. Sekcje w których należy dokonać modyfikacji są oznaczone w plikach stosownym komentarzem, wszelkie nastawy, których wartości można zmieniać są wyszczególnione jako osobne zmienne i także opatrzone odpowiednim komentarzem dotyczącym ich funkcji. Skrypty można w szybki sposób uruchomić naciskając dwukrotnie na plik start.bat. W przypadku ćwiczenia 2. oraz 3. konieczne jest poleganie na bazie nagrań uczących, ta znajduje się w folderze music_examples. Skrypty wczytują zawarte w tym folderze pliki, możliwe jest wyłączenie plików ze zbioru uczącego poprzez przeniesienie do innego folderu (np. do folderu
hidden utworzonego w folderze z przykładami). Wynikowe pliki generowane przez skrypt są
zapisywane w folderze output_examples. Istnieje możliwość modyfikacji lub dodania własnych przykładów uczących, w tym celu należy posłużyć się edytorem midi takim jak np. MuseScore dostępny na stanowiskach laboratoryjnych
W zadaniu drugim istnieje możliwość obejrzenia wynikowych gramatyk generowanych na podstawie wzorców. Są one zapisywane w postaci plików txt w następującym formacie:
[0,-2,-1,-2,-2,0,] ---> 2: 0.666666666667 9: 0.166666666667 12: 0.166666666667
gdzie w górnej linijce zaznaczone są sekwencje poprzedzających interwałów (algorytm analizuje odległości między dźwiękami wyrażone w półtonach, z uwzględnieniem kierunku, ujemne wartości to przeskok melodii w dół), a następnie podawane są możliwe następne interwały oraz, po dwukropku, ich prawdopodobieństwa.
W zadaniu 3. istnieje możliwość wytrenowania własnego modelu sieci neuronowej lub wczytania któregoś z wcześniej wczytanych wzorców, szczegółowy opis linijek służących do tego celu znajduje się w sekcji skryptu przeznaczonej do edycji.
2. ZADANIA
Zad. 2.1: Generatory szumu
a) Wygeneruj ciągi nut bazujące na próbce szumu białego, Browna oraz różowego. Odsłuchaj ich. Jakie własności tego typów szumu można zidentyfikować słuchając tych ciągów.
b) Wykreśl widmo częstotliwościowe oraz funkcję autokorelacji każdego z nich, załącz je do niniejszego sprawozdania. Z czego wynikają różnice pomiędzy wynikami dla każdego typu szumu? Jak te różnice wpływają na generowane ciągi nut?
c) Jak zmienianie parametrów generowania szumu różowego wpływa na otrzymywane rezultaty oceniane w podpunktach a) oraz b)?
d) Dlaczego cechy takie jak samopodobieństwo i skorelowanie próbek szumu są pożądane z punktu widzenia algorytmu generującego ciągi nut mające stanowić podstawę dla generatora melodii?
Zad. 2.2: Gramatyki stochastyczne
a) Zapoznaj się z nagraniami umieszczonymi w folderze z przykładami uczącymi. Uruchom skrypt i posłuchaj plików MIDI wygenerowanych przez gramatykę stochastyczną. Jak zmieniają się generowane melodie w zależności od ilości przykładów uczących?
b) Uruchom algorytm tylko dla jednego nagrania oraz dla kilku nagrań, jak zmieniają się generowane utwory? Jak zmienia się złożoność generowanej gramatyki? (złożoność i liczba reguł)
c) Uruchom algorytm dla stałej ilości przykładów jednocześnie zmieniając rząd gramatyki. Jak zmieniają się generowane utwory? Jaka jest przyczyna tych zmian? Jak zmienia się złożoność generowanej gramatyki?
Zad. 2.3: Rekurencyjna sieć neuronowa
a) Korzystając z przykładowych, wytrenowanych sieci, wygeneruj melodie za pomocą sieci neuronowej. Jak melodie te różnią się w stosunku do tych wygenerowanych w poprzednich punktach?
b) Spróbuj wytrenować własny model do generowania melodii. W jaki sposób zmienia się czas uczenia w zależności od liczby przykładów i liczby próbek rozpatrywanych przez algorytm w trakcie syntezy?
Zad. 2.4: Pytania ogólne
a) Czy zaprezentowane w trakcie laboratorium metody faktycznie mogą stanowić samodzielne sposoby kompozycji, czy służyć za źródło inspiracji dla kompozytora? Odpowiedź uzasadnij.
b) Jak złożoność modelu wpływa na jakość generowanych melodii? Czy zawsze bardzo wysoka złożoność modelu jest pożądana z punktu widzenia implementacji?
c) Jakie cechy utworu muzycznego powinny być uwzględniane przez algorytm kompozycji automatycznej? Które z tych cech są, a które nie są uwzględniane przez modele zaprezentowane w trakcie laboratorium?
d) W jaki sposób można poprawić jakość melodii generowanych przez zaprezentowane w trakcie laboratoriów algorytmy?
e) Jakie mogą być potencjalne zastosowania algorytmów automatycznej kompozycji muzyki? Jakie są słabe i mocne strony tego typu algorytmów?
3. OPRACOWANIE
Do każdego z podpunktów zadania odpowiedzieć na zadane w nich pytania, dopisać komentarze i wnioski, należy zamieścić także rysunki zawierające wymagane wizualizacje.
4. LITERATURA
[1] Kotoński, W., Muzyka Elektroniczna, PWM, Kraków, 2002.
[2] Gwizdalanka, D., Historia Muzyki 1, podręcznik dla szkół muzycznych, PWM, Kraków, 2005. [3] Fernandez, J., Vico, F., AI Methods In Algorithmic Composition: A Comprehensive Survey, Journal of Artificial Inteligence (48), 513-583, 2013.
[4] Elowsson, A., Friberg, A., Algorithmic Composition of Popular Music, Proceedings of the International Conference on Music Perception and Cognition, 276-281, 2012.
[5] https://keras.io/ - strona internetowa biblioteki Keras służącej do realizacji algorytmów uczenia maszynowego, data dostępu: 30. maja 2017.
[6] https://deepmind.com/blog/wavenet-generative-model-raw-audio/ - przykład neuronowego modelu generatywnego opracowany przez firmę Deep Mind, data dostępu: 6. maja 2019.