Ocena fraz

W projekcie podjęto próbę skonstruowania funkcji automatycznej oceny fraz muzycznych. Ocena walorów estetycznych za pomocą ściśle matematycznych wzorów nie wydaje się rzeczą łatwą (o ile jest w ogóle możliwa), dlatego nie powinno dziwić, że efekty tego eksperymentu nie są zadowalające. Z tych samych powodów, tj. faktycznego niezdefiniowania funkcji celu, czuliśmy się upoważnieni do stosowania rozwiązań (w kilku przypadkach wręcz "trickowych"), których zasadność trudno dowieść, a które – być może - prowadziły do uzyskania pewnego przybliżonego sposobu oceny frazy pod kątem wyszczególnionych cech.

Zastosowano 4 funkcje oceny cech melodii:

  • Melo – zadaniem funkcji jest ocena zmienności wysokości dźwięku w całej frazie z użyciem transformaty Fouriera (DFT),
  • Velo – funkcja ocenia zmienność głośności dźwięku ('ataku') w całej frazie z użyciem DFT,
  • Inter - to – w uproszczeniu – średnia wielkość interwałów pomiędzy kolejnymi dźwiękami,
  • Rthm - zadaniem funkcji jest ocena "bogactwa" rytmu w kolejnych taktach.

Ostatnim etapem jest obliczenie wartości funkcji preferencji "użytkownika" (eval) na podstawie oceny danej cechy (eval_index).

Funkcje oceny cech frazy

"Bogactwo" melodii (Melo)

Funkcja dokonuje dyskretnej transformacji Fouriera (DFT); zestawem próbek wejściowych jest wektor wysokości nut, przetworzony tak, by ciąg kolejnych identycznych wartości był proporcjonalny do czasu trwania nuty, której ten ciąg odpowiada. Dodatkowym etapem przetwarzania jest "zalepienie" pauz sąsiednimi wartościami. Wartość eval_index_Melo jest w przybliżeniu sumą amplitud kolejnych dodatnich składowych DFT podzielonych przez numer składowej. Dodatkowo, funkcja Melo jest jedyną funkcją oceny biorącą pod uwagę tempo melodii.

Funkcja ta – w założeniu – miała zwiększać swą wartość wraz z pojawianiem się w melodii większych interwałów i/lub szybszych fragmentów melodii.

Zróżnicowanie dynamiki (Velo)

Funkcja dokonuje dyskretnej transformacji Fouriera (DFT), a zestawem próbek wejściowych jest wektor wartości głośności nut "przygotowany" wg identycznej zasady, jak w poprzednim punkcie.

eval_index_Velo = (Sk = (1, fmax) (|F|k / k) + 0.25 * maxk = (1, fmax)|F|k ) / fmax, gdzie
|F|k jest amplitudą k-tej składowej DFT.

Średni interwał (Inter)

eval_index_Inter = sumeval / sumdiv

sumeval = Sk intereval (nk-nk+1) * divk,k+1
sumdiv = Sk divk,k+1
divk,k+1 = min {(dk + dk+1) / (dk + dk+1 + pk,k+1), (dk + pk,k+1) / (dk+1 + pk,k+1)}
, gdzie

nk - oznacza wysokość k-tej nuty (odległość w półtonach od "środkowego" C),
dk – długość k-tej nuty,
pk,k+1 – pauzę pomiędzy k-tą nutą, a następną.

Wprowadzenie wagi divk,k+1 uzasadnione jest tym, że duży interwał pomiędzy kolejnymi nutami jest mniej "odczuwalny", jeśli dźwięki te oddziela duża pauza lub pierwszy z nich jest krótką "przednutką" (ozdobnikiem) drugiego.

intereval (k) = 0.8 * log (|k| + 3)
+ 1.0 * log (8 – ||k| mod 12 – 6|)
+ 1.0 * tabeval |k| mod 12
+ 1.0 * [(|k| - 1) / 12]

Wartość powyższej funkcji jest sumą 4 składowych. Dwie z nich zależą od wartości logarytmu z wielkość interwału i odległości interwału od wielkości 6 półtonów (kwinta zmniejszona). Wektor tabeval zawiera (dobrane "arbitralnie") wartości zależne w przybliżeniu od tego, w jakim stopniu dysonansowy jest dany interwał. Ostatni składnik przyjmuje niezerowe wartości tylko, gdy interwał jest większy od oktawy.

"Bogactwo" rytmu (Rthm)

Funkcja dokonuje (osobno dla każdego taktu) dyskretnej transformacji kosinusowej (DCT); zestawem próbek wejściowych jest wektor wartości rosnących o 1 z każdą nutą.

eval_index_Rthm = Sk = (1, fmax) (avgk + std_devk) / fmax, gdzie
avgk jest średnią wartością |Fk, j| obliczoną po j (taktach),
std_devk jest ochyleniem standardowym wśród wartości Fk, j obliczonym po j (taktach),
Fk, j jest wartością k-tej składowej kosinusowej obliczonej dla j-tego taktu.

Zarówno zastąpienie transformaty Fouriera transformatą kosinusową, jak i jej obliczanie osobno dla każdego taktu (wraz z późniejszym uwzględnianiem różnorodności tych wartości) uzasadnione jest chęcią wychwycenia nie tylko bogactwa podziału rytmicznego na przestrzeni całej melodii, ale także różnic podziału "lokalnego".

Ocena fraz na podstawie oceny cech

Dla każdej z badanych cech wartość funkcji preferencji wynosi:

eval = min {a/b, b/a}, gdzie

a = eval_index + add,
b = best + add.

Jest to, jak widać, ilorazowe skalowanie do przedziału [0,1]. Zastosowanie stałej add (oprócz skalowania ilorazu)zapobiega błędnym operacjom arytmetycznym, gdyby best lubeval_index było równe 0. Wartości stałych best i add ustalono arbitralnie.