Grać jak z nut – cz.3

Grać jak z nut

Zawartość artykułu

W drugiej części artykułu stworzyliśmy harmonię utworu. Potrzebujemy teraz jakiejś dobrej melodii, która będzie do tej harmonii pasować. Melodie składają się z motywów, czyli małych fragmentów ok. 2-5 nutowych oraz ich wariacji (czyli przekształceń). Zaczniemy od wygenerowania pierwszego motywu – jego rytmu i dźwięków. Podobnie jak w przypadku generowaniu harmonii, skorzystamy ze statystyk, N-gramów, wyznaczonych na utworach muzycznych. Do przygotowania takich statystyk wykorzystamy bazę Essen Folksong Collection. Równie dobrze można skorzystać z dowolnej innej bazy melodii, taki wybór bazy będzie rzutować na to, jakiego rodzaju melodie będą generowane. Z każdego utworu trzeba wyodrębnić melodię, zamienić ją na ciąg wartości rytmicznych oraz ciąg dźwięków, a z tych  ciągów wyciągnąć statystyki. Przy tworzeniu statystyk dźwięków warto melodie najpierw  w pewien sposób przygotować –  przetransponować je wszystkie do dwóch tonacji, np. C-dur i c-moll. Zmniejszy to liczbę możliwych (prawdopodobnych) N-gramów 12-krotnie, a dzięki temu statystyki będą lepiej oszacowane.

Dobry motyw

Stworzenie pierwszego motywu zaczniemy od wygenerowania jego rytmu. Przypomnę tutaj, że przyjęliśmy wcześniej pewne uproszczenie – każdy z motywów i ich wariacji będzie trwać dokładnie jeden takt. Kolejne kroki generowania rytmu motywu: – losujemy pierwszą wartość rytmiczną z użyciem unigramów, – losujemy kolejną wartość rytmiczną z użyciem bigramów i unigramów – kontynuujemy losowanie kolejnych wartości rytmicznych, z użyciem N-gramów co raz wyższych rzędów (aż do 5-gramów), – przerywamy aż osiągniemy sumaryczną wartość rytmiczną równą długości jednego taktu – jeśli przekroczyliśmy długość 1 taktu, zaczynamy cały proces od początku (takie generowanie jest to na tyle szybkie, że możemy sobie pozwolić na taką niezbyt optymalną metodę prób i błędów).

Następny etap to wygenerowanie dźwięków motywu. Kolejnym uproszczeniem jakie wcześniej przyjęliśmy jest to, że generujemy utwory tylko w tonacji C-dur, dlatego skorzystamy ze statystyk N-gramów stworzonych na utworach przetransponowanych do tej tonacji, z wyłączeniem utworów w tonacjach molowych. Schemat działania jest podobny do tego przy generowaniu rytmu: – losujemy pierwszy dźwięk z użyciem unigramów, – losujemy kolejny dźwięk z użyciem bigramów i unigramów, – kontynuujemy aż wylosujemy tyle dźwięków, ile wylosowaliśmy wcześniej wartości rytmicznych – sprawdzamy, czy motyw pasuje do harmonii, jeśli nie to wracamy zaczynamy od początku – jeśli po ok. 100 próbach nie udało się wygenerować motywu pasującego do harmonii, to może oznaczać, że przy zadanej harmonii i zadanym rytmie jest bardzo małe prawdopodobieństwo wylosowania dźwięków, które będą pasować do harmonii. W takim przypadku cofamy się i generujemy nowy rytm motywu.

Generuj do skutku

Zarówno przy generowaniu rytmu motywu jak i generowaniu jego dźwięków stosujemy metodę prób i błędów. Będziemy ją też stosować w opisanym niżej generowaniu wariacji motywów. Choć taki sposób może się to wydawać “głupi”, to jest prosty i działa. Pomimo iż bardzo często takie losowo wygenerowane motywy nie pasują do harmonii, to możemy sobie pozwolić na wiele takich pomyłek. Nawet 1000 prób zajmuje krótki czas obliczeń na dzisiejszych komputerach, a wystarczy by znaleźć odpowiedni motyw.

Wariacje z powtórzeniami

Mamy pierwszy motyw, a następnie potrzebujemy dalszego ciągu melodii. Nie będziemy jednak cały czas generować nowych motywów, ponieważ utwór stałby się chaotyczny. Nie możemy także ciągle powtarzać tego samego motywu, ponieważ utwór stałby się zbyt nudny. Rozsądną drogą będzie oprócz powtórzeń motywów stworzyć także modyfikację tego motywu co zapewni zróżnicowanie, ale nie uczyni utworu chaotycznym.

Istnieje wiele metod tworzenia wariacji motywu. Jedną z nich jest transpozycja chromatyczna. Polega ona na tym, że wszystkie nuty transponowane są w górę lub dół o ten sam interwał. W takim przypadku zdarza się, że wariacja motywu posiada dźwięki spoza tonacji utworu. To z kolei powoduje, że szansa na to, że wariacja będzie pasować do harmonii jest bardzo mała. Kolejnym sposobem jest transpozycja diatoniczna, gdzie wszystkie nuty są transponowane o tę samą liczbę stopni skali. W przeciwieństwie do poprzedniej metody, wariacje diatoniczne nie posiadają dźwięków spoza tonacji.

Następnym sposobem jest zmiana jednego interwału – zmieniamy wtedy jeden z interwałów motywu pozostawiając wszystkie pozostałe interwały niezmienione. W ten sposób jedna część motywu (początek lub koniec) transponujemy (transpozycją chromatyczną lub diatoniczną). Inne metody to zamiana dwóch nut o tej samej wartości rytmicznej na jedną oraz zamiana jednej nuty na dwie nuty o tej samej wartości rytmicznej. W przypadku pierwszej metody, jeśli motyw posiada dwie nuty o tej samej wartości rytmicznej to możemy zmienić jego rytm i połączyć dwie takie nuty. W przypadku drugiej metody w sposób losowy wybieramy nutę, która zamieniamy na dwie „krótsze”.

Dzięki każdemu z opisanych sposobów tworzenia wariacji można wygenerować różne motywy. Wymienione metody nie są jedynymi obowiązującymi. Można ich wymyślić znacznie więcej. Jedyną zasadą ograniczającą w tym procesie jest to by wygenerowane wariacje nie różniły się za bardzo od oryginalnego motywu. W przeciwnym wypadku to już nie będzie wariacja tylko nowy motyw. Granica pomiędzy tym gdzie kończy się wariacja, a gdzie zaczyna już inny motyw jest umowna.

Itp. itd.

Metod do tworzenia wariacji motywów jest o wiele więcej, wymyślić można ich mnóstwo. Jedyne co nas ogranicza, to zasada, by wygenerowane wariacje nie różniły się za bardzo od oryginalnego motywu. W przeciwnym wypadku to już nie będzie wariacja, tylko nowy motyw. Granica pomiędzy tym gdzie kończy się wariacja a gdzie zaczyna już inny motyw jest raczej umowna i każdy trochę inaczej ją “czuje”, definiuje.

Czy to już koniec?

No to tyle jeśli chodzi o generowanie utworów. Podsumujmy więc kroki jakie przedsięwzięliśmy:

  1. Generacja harmonii utworu:
    • generacja rytmu harmonicznego,
    • generacja progresji akordów.
  2. Generacja melodii:
    • generowanie rytmu motywu,
    • generowanie dźwięków motywu,
    • tworzenie wariacji motywów,
    • tworzenie motywów i wariacji “aż do skutku”, czyli aż będą dopasowane do wygenerowanej harmonii

Pozostało nam jeszcze sprawienie by wygenerowane utwory miały zadaną, tj. dopasowaną do umiejętności grającego, trudność.

Sterowanie trudnością

Jednym z naszych założeń była możliwość sterowania trudnością utworu. Możemy to uzyskać dzięki dwóm podejściom:

  1. generowaniu utworów „jak leci” i sprawdzanie ich poziomów trudności (wg sposobów opisanych wcześniej); przygotowaniu w ten sposób dużej bazy utworów, z której następnie zostaną wybrane losowe utwory o zadanej trudności,
  2. sterowaniu parametrami tworzenia harmonii, motywów i wariacji tak by częściej generowały elementy muzyczne o zadanej trudności

Oba sposoby nie wykluczają się wzajemnie, dlatego możemy z powodzeniem stosować je razem. W pierwszej kolejności należy wygenerować losowo np. 1000 utworów, a następnie sterować parametrami tak by wytworzyć kolejne (ale tylko takie jakich nam brakuje). Odnośnie sterowania parametrami warto zaznaczyć, że można zmieniać prawdopodobieństwo powtórzenia się motywu. Dla utworów o zadanym niskim poziomie trudności nadane prawdopodobieństwo będzie większe (powtórzenia gra się łatwiej). Trudne utwory z kolei będą miały nadane większe prawdopodobieństwo oraz rzadziej spotykane harmonie (które wymuszą także rzadziej spotykane motywy i wariacje).