Rozwinięcie rodziału III
This commit is contained in:
parent
be4e4ace4c
commit
73a98701f4
@ -86,18 +86,21 @@
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.1\relax .\leavevmode@ifvmode \kern .5em }Koncepcja}{33}\protected@file@percent }
|
||||
\citation{onehot}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Przygotowanie danych}{34}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Wst\IeC {\k e}pne przygotowanie danych do treningu}{34}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1\relax .\leavevmode@ifvmode \kern .5em }Przyk\IeC {\l }ad dzia\IeC {\l }ania One-Hot Encoding}{34}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2\relax .\leavevmode@ifvmode \kern .5em }Muzyczne "s\IeC {\l }owo"}{34}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3\relax .\leavevmode@ifvmode \kern .5em }Konwersja MIDI na sekwencje s\IeC {\l }\IeC {\'o}w muzycznych}{35}\protected@file@percent }
|
||||
\citation{survay}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.4\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania danych}{38}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.5\relax .\leavevmode@ifvmode \kern .5em }Podzia\IeC {\l } danych na dane wej\IeC {\'s}ciowe i wyj\IeC {\'s}ciowe}{38}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{39}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Proces uczenia}{39}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{39}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.6\relax .\leavevmode@ifvmode \kern .5em }Wnioski}{39}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 4\relax .\leavevmode@ifvmode \kern .5em Podsumowanie}{41}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.6\relax .\leavevmode@ifvmode \kern .5em }Inne apekty przygotowania zbioru ucz\IeC {\k a}cego}{41}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Tranformacja danych dla modelu}{43}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{43}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Uczenie modelu}{43}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.6\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanego modelu}{43}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.7\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{43}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.8\relax .\leavevmode@ifvmode \kern .5em }Wnioski}{43}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 4\relax .\leavevmode@ifvmode \kern .5em Podsumowanie}{45}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\bibcite{survay}{1}
|
||||
@ -109,6 +112,6 @@
|
||||
\bibcite{statystyka}{7}
|
||||
\bibcite{tempos}{8}
|
||||
\bibcite{deep_learning_2}{9}
|
||||
\@writefile{toc}{\contentsline {chapter}{Bibliografia}{43}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {chapter}{Bibliografia}{47}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
|
@ -1,10 +1,10 @@
|
||||
# Fdb version 3
|
||||
["makeindex document.idx"] 1590745558 "document.idx" "document.ind" "document" 1590745699
|
||||
"document.idx" 1590745646 0 d41d8cd98f00b204e9800998ecf8427e ""
|
||||
["makeindex document.idx"] 1590755603 "document.idx" "document.ind" "document" 1590757486
|
||||
"document.idx" 1590757063 0 d41d8cd98f00b204e9800998ecf8427e ""
|
||||
(generated)
|
||||
"document.ilg"
|
||||
"document.ind"
|
||||
["pdflatex"] 1590745645 "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" "j:/_MAGISTERKA/praca-magisterska/docs/document.pdf" "document" 1590745699
|
||||
["pdflatex"] 1590757062 "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" "j:/_MAGISTERKA/praca-magisterska/docs/document.pdf" "document" 1590757486
|
||||
"c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plit.enc" 1550775191 1946 62ba825cda1ff16dbaa60d53ac60525a ""
|
||||
"c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plme.enc" 1550775191 3126 59f33ff3e396436ebc36f4e7b444d5c4 ""
|
||||
"c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plmi.enc" 1550775191 2005 f094775651a1386335c158fb632529f1 ""
|
||||
@ -195,10 +195,10 @@
|
||||
"c:/software/latex/texmf-var/web2c/pdftex/pdflatex.fmt" 1550776400 4224189 0864f2c37b2414e08790946f00bc88b0 ""
|
||||
"c:/software/latex/texmf.cnf" 1550776299 715 839ef4b14d931ce86420174d3a223d3e ""
|
||||
"chapter-style.sty" 1560952449 376 87871882de090607c810d89fd5ae18d9 ""
|
||||
"document.aux" 1590745648 10185 1d4100bf7a7a11756e6a204340f8b394 ""
|
||||
"document.ind" 1590745558 0 d41d8cd98f00b204e9800998ecf8427e "makeindex document.idx"
|
||||
"document.tex" 1590745698 55805 05c6a6897114e47cb6ad72dd459af1fc ""
|
||||
"document.toc" 1590745648 4113 b6c175cb8bd09638400a674d6275f5a8 ""
|
||||
"document.aux" 1590757065 10736 57cf014558ed2721c808333cb45e6592 ""
|
||||
"document.ind" 1590755603 0 d41d8cd98f00b204e9800998ecf8427e "makeindex document.idx"
|
||||
"document.tex" 1590757484 62644 8369d73b1bcb13719b29ec701215a197 ""
|
||||
"document.toc" 1590757065 4544 1b34bff092761ddd8bc0ec731033ba82 ""
|
||||
"images/autoencoder.png" 1590441548 23857 e7e97c4ad164834bf8d9e2a1bef11905 ""
|
||||
"images/gradient_descent_1_long.png" 1590441549 10075 3f2887989844779ae2c10639cdfbca6e ""
|
||||
"images/gradient_descent_2_long.png" 1590441549 8705 4b42e8becdda3fb5896ce89581451166 ""
|
||||
@ -217,14 +217,14 @@
|
||||
"images/tanh.png" 1590744728 11044 b335b43319d514b24107cb538c17cd0a ""
|
||||
"images/wartosc_nut.jpg" 1590441554 48213 d311c2cedb2ed53dcf5eff20f70eda80 ""
|
||||
"images/waveform.png" 1590441554 14738 e92dd40519d908b347590b71a2a36bb4 ""
|
||||
"j:/_MAGISTERKA/praca-magisterska/docs/document.aux" 1590745648 10185 1d4100bf7a7a11756e6a204340f8b394 ""
|
||||
"j:/_MAGISTERKA/praca-magisterska/docs/document.tex" 1590745698 55805 05c6a6897114e47cb6ad72dd459af1fc ""
|
||||
"j:/_MAGISTERKA/praca-magisterska/docs/document.aux" 1590757065 10736 57cf014558ed2721c808333cb45e6592 ""
|
||||
"j:/_MAGISTERKA/praca-magisterska/docs/document.tex" 1590757484 62644 8369d73b1bcb13719b29ec701215a197 ""
|
||||
"pythonhighlight.sty" 1590660734 4822 44a39a68d852c9742af161f7166b2a03 ""
|
||||
(generated)
|
||||
"document.pdf"
|
||||
"j:/_MAGISTERKA/praca-magisterska/docs/document.log"
|
||||
"document.log"
|
||||
"document.toc"
|
||||
"document.idx"
|
||||
"document.aux"
|
||||
"j:/_MAGISTERKA/praca-magisterska/docs/document.pdf"
|
||||
"document.aux"
|
||||
"document.pdf"
|
||||
"document.toc"
|
||||
"document.log"
|
||||
"j:/_MAGISTERKA/praca-magisterska/docs/document.log"
|
||||
|
@ -1,4 +1,4 @@
|
||||
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) (preloaded format=pdflatex 2019.2.21) 29 MAY 2020 11:47
|
||||
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) (preloaded format=pdflatex 2019.2.21) 29 MAY 2020 14:57
|
||||
entering extended mode
|
||||
restricted \write18 enabled.
|
||||
file:line:error style messages enabled.
|
||||
@ -679,11 +679,11 @@ Underfull \vbox (badness 1072) has occurred while \output is active []
|
||||
[29 <j:/_MAGISTERKA/praca-magisterska/docs/images/wartosc_nut.jpg>] [30 <j:/_MAGISTERKA/praca-magisterska/docs/images/nuty_linia.png (PNG copy)>] (c:/software/latex/texmf-dist/tex/latex/listings/lstlang1.sty
|
||||
File: lstlang1.sty 2018/09/02 1.7 listings language file
|
||||
)
|
||||
LaTeX Font Info: Try loading font information for OT4+cmtt on input line 661.
|
||||
LaTeX Font Info: Try loading font information for OT4+cmtt on input line 664.
|
||||
(c:/software/latex/texmf-dist/tex/latex/polski/ot4cmtt.fd
|
||||
File: ot4cmtt.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW)
|
||||
) [31] [32]
|
||||
Overfull \vbox (16.08192pt too high) detected at line 721
|
||||
Overfull \vbox (16.08192pt too high) detected at line 720
|
||||
[]
|
||||
|
||||
Rozdzia\PlPrIeC {\l } 3.
|
||||
@ -715,36 +715,36 @@ Missing character: There is no
|
||||
LaTeX Font Warning: Font shape `OT4/cmtt/bx/n' in size <10> not available
|
||||
(Font) Font shape `OT4/cmtt/m/n' tried instead on input line 787.
|
||||
|
||||
[35] [36] [37]
|
||||
[35] [36] [37] [38] [39] [40] [41]
|
||||
Underfull \vbox (badness 10000) has occurred while \output is active []
|
||||
|
||||
[38] [39] [40
|
||||
[42] [43] [44
|
||||
|
||||
]
|
||||
Overfull \vbox (16.08192pt too high) detected at line 928
|
||||
Overfull \vbox (16.08192pt too high) detected at line 1080
|
||||
[]
|
||||
|
||||
Rozdzia\PlPrIeC {\l } 4.
|
||||
[41] [42
|
||||
[45] [46
|
||||
|
||||
] (j:/_MAGISTERKA/praca-magisterska/docs/document.ind) [43] (j:/_MAGISTERKA/praca-magisterska/docs/document.aux)
|
||||
] (j:/_MAGISTERKA/praca-magisterska/docs/document.ind) [47] (j:/_MAGISTERKA/praca-magisterska/docs/document.aux)
|
||||
|
||||
LaTeX Warning: There were multiply-defined labels.
|
||||
|
||||
)
|
||||
Here is how much of TeX's memory you used:
|
||||
16325 strings out of 492616
|
||||
304539 string characters out of 6131816
|
||||
638269 words of memory out of 5000000
|
||||
19886 multiletter control sequences out of 15000+600000
|
||||
16405 strings out of 492616
|
||||
305842 string characters out of 6131816
|
||||
636269 words of memory out of 5000000
|
||||
19966 multiletter control sequences out of 15000+600000
|
||||
27095 words of font info for 80 fonts, out of 8000000 for 9000
|
||||
1141 hyphenation exceptions out of 8191
|
||||
55i,14n,50p,1574b,1931s stack positions out of 5000i,500n,10000p,200000b,80000s
|
||||
{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plit.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/pltt.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plrm.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plmi.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plms.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plme.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plsc.enc}<c:/software/latex/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plcsc10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plex10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi6.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmib10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr7.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsltt10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsy10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsy8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plti10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plti12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/pltt10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/pltt12.pfb>
|
||||
Output written on j:/_MAGISTERKA/praca-magisterska/docs/document.pdf (43 pages, 636582 bytes).
|
||||
Output written on j:/_MAGISTERKA/praca-magisterska/docs/document.pdf (47 pages, 653423 bytes).
|
||||
PDF statistics:
|
||||
271 PDF objects out of 1000 (max. 8388607)
|
||||
175 compressed objects within 2 object streams
|
||||
283 PDF objects out of 1000 (max. 8388607)
|
||||
183 compressed objects within 2 object streams
|
||||
0 named destinations out of 1000 (max. 500000)
|
||||
88 words of extra memory for PDF output out of 10000 (max. 10000000)
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
@ -633,6 +633,9 @@ Jednocześnie przyjmuję do wiadomości, że przypisanie sobie, w pracy dyplomow
|
||||
\end{figure}
|
||||
|
||||
|
||||
\subsubsection{Interwały}
|
||||
|
||||
|
||||
\subsubsection{Oktawy}
|
||||
|
||||
Oktawą nazywamy zestaw ośmiu nut od C do H. Podane w Tabeli~\ref{table:dzwieki} częstotliwości nut odpowiadają dźwiękom w oktawie czwartej. Dlatego w indeksie dolnym nuty widnieje liczba 4. Aby utworzyć dźwięk, np. $A_5$ należy pomnożyć częstotliwość dźwięku $A_4$ razy dwa, natomiast aby utworzyć dźwięk $A_3$, należy tę częstotliwość podzielić przez dwa.
|
||||
@ -714,10 +717,6 @@ note_on channel=0 note=60 velocity=0 time=0
|
||||
\subsubsection{Ścieżka}
|
||||
Ścieżka (ang. Track) grupuje nuty aby podzielić utwór muzyczny na różne intrumenty lub partie. Protokół MIDI pozwala aby grać wiele ścieżek dzwiękowych jednocześnie, wtedy mówimy o muzyce polifonicznej lub multiintrumentalnej.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
\chapter{Projekt}
|
||||
W tym rozdzialę opiszę w jaki sposób zbudowałem swój własny geneator muzyki, jak przechodził proces uczenia, jakie próbki udało mi się wygenrować. Opis kodu który napisałem.
|
||||
|
||||
@ -729,13 +728,13 @@ note_on channel=0 note=60 velocity=0 time=0
|
||||
|
||||
Kluczone było zauważenie podobieństwa między językiem naturalnym oraz muzyką. Zarówno zdanie, jak i partia muzyczna składa się z sekwencji elementów rozmieszczonych w czasie. Elementy te są zależne od długoterminowego kontekstu, oraz od tego jaki element był ustawiony wcześniej. Dla języka naturalnego są to słowa, na muzyki są to nuty i akordy. Dodatkowo pomyslałem, że różne instrumenty można porównać do róznych języków świata. Wtedy, aby stworzyć melodię np. basu tak aby pasowała pod partę gitary, nalezy "przetłumaczyć" język gitary na język basu. Do tłumaczeń języka naturalnego wykorzystuje się modele sequence-to-sequence, dlatego postanowiłem w modelu generowania muzyki wykorzystać właśnie tą architekturę. Dodatkowo modele sequance-to-sequance mają tę cechę, że liczba elementów sekwencji wejściowej, może być inna niż liczba elementów sekwencji wyjściowej. Idealnie sprawdzi się w przypadku muzyki, ponieważ o długości trwania ścieżki muzycznej nie świadczy liczba nut, tylko suma ich wartości.
|
||||
|
||||
\section{Przygotowanie danych}
|
||||
\section{Wstępne przygotowanie danych do treningu}
|
||||
|
||||
Aby móc przedstawić sieci neuronowej muzykę, aby mogła być ona przez niego zrozumiana nalezy zamienić ją na liczby, wektory i macierze. Istenieje wiele technik umożliwiających osiągnięcie tego celu. W mojej pracy wykorzystałem technikę o nazwie one-hot encoding. Enkodowanie One-Hot jest wykorzystywane w uczeniu maszynowym aby nadać liczbową wartość danych kategorycznych. Polega ona stworzeniu słownika, w ktorym każde słowo otrzyma swój unikatowy identyfikator, następnie zostanie utworzony wektor o wymiarze słów w słowniku, gdzie na pozycji odpowiadającej indeksowi słowa bedzie wartość 1 a na pozostałych bedzie watość zero. \cite{onehot} %\footnote{https://deepai.org/machine-learning-glossary-and-terms/one-hot-encoding 28 maja 2020 12:24}
|
||||
Aby móc przedstawić sieci neuronowej muzykę, aby mogła być ona przez niego zrozumiana nalezy zamienić ją na liczby, wektory i macierze. Istenieje wiele technik umożliwiających osiągnięcie tego celu. W mojej pracy wykorzystałem technikę o nazwie one-hot encoding. Enkodowanie One-Hot jest wykorzystywane w uczeniu maszynowym aby nadać liczbową wartość danych kategorycznych. Polega ona stworzeniu słownika, w ktorym każde słowo otrzyma swój unikatowy identyfikator, następnie zostanie utworzony wektor o wymiarze słów w słowniku, gdzie na pozycji odpowiadającej indeksowi słowa bedzie wartość 1 a na pozostałych bedzie watość zero \cite{onehot}. %\footnote{https://deepai.org/machine-learning-glossary-and-terms/one-hot-encoding 28 maja 2020 12:24}
|
||||
|
||||
\subsection{Przykład działania One-Hot Encoding}
|
||||
|
||||
Weźmy sekwencję liter w słowie MATEMATYKA. Znajdźmy unikatowe litery w tym słowie, oraz nadajmy im indentyfikator. Kolejność nie ma znaczenia.
|
||||
Weźmy sekwencję liter w słowie MATEMATYKA. Znajdźmy unikatowe elementy tej sekwencji, oraz nadajmy im unikatowy indentyfikator. Kolejność nie ma znaczenia.
|
||||
|
||||
\begin{center}
|
||||
M - 0,
|
||||
@ -746,9 +745,10 @@ note_on channel=0 note=60 velocity=0 time=0
|
||||
K - 5.
|
||||
\end{center}
|
||||
|
||||
Kodując literę T utworzylibysmy wektor a kodując całe słowo (sekwencję), otrzymalibysmy macierz
|
||||
Kodując słowo MATEMATYKA, otrzymalibysmy macierz
|
||||
|
||||
\[
|
||||
\mathbb{\boldsymbol{
|
||||
\begin{bmatrix}
|
||||
1 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 \\
|
||||
0 & 1 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\
|
||||
@ -756,12 +756,12 @@ note_on channel=0 note=60 velocity=0 time=0
|
||||
0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\
|
||||
0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\
|
||||
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
|
||||
\end{bmatrix}
|
||||
\end{bmatrix} }}
|
||||
\]
|
||||
|
||||
\subsection{Muzyczne "słowo"}
|
||||
|
||||
Na potrzeby dostosowania danych muzycznych do koncepcji słów w zdaniu, zapisałem pojedyncze słowo jako
|
||||
Na potrzeby dostosowania danych muzycznych do koncepcji słów w zdaniu, zakodowałem pojedyncze słowo muzyczne jako
|
||||
|
||||
\[
|
||||
((zbiór wysokości), długość)
|
||||
@ -769,17 +769,17 @@ note_on channel=0 note=60 velocity=0 time=0
|
||||
|
||||
W ten sposób byłem w stanie zakodować podedyjcze nuty oraz akordy.
|
||||
|
||||
Akord C-dur składojący się z dzwięków C, E i G o długości ćwierćnuty, zapisalibyśmy w następujący sposób.
|
||||
Akord C-dur składojący się z dzwięków C, E i G o długości ósemki, zapisalibyśmy w następujący sposób.
|
||||
|
||||
\[
|
||||
((60, 64, 67), 24)
|
||||
((60, 64, 67), 0.5)
|
||||
\]
|
||||
|
||||
W ten sposób jesteśmy wstanie kodować melodię w sekwencji słów muzycznych. Tak skonstruowane dane, mają niestety swoje negatywne aspekty. Nie da się w ten sposób zapisać partii, w której zostaje grana nowa nuta gdy poprzednia jeszcze powinna brzmieć. Nasz zapis zakłąda, że melodia, jest grana element po elemencie, i nowy element wymusza zakończenie poprzedniego. Nie przechowujemy również informacji o dynamice melodii (głośności). Rozszerzenie tego zapisu o informacje o głośności nie jest trudne i nie będzie wymagać przebudowania modelu, natomiast zwiększy liczbę możliwych "słów muzycznych" w słowniku i zwiększy złożoność obliczeniową. Zdecydowałem się na niewykorzystanie tych danych w generowaniu muzyki.
|
||||
|
||||
\subsection{Konwersja MIDI na sekwencje słów muzycznych}
|
||||
|
||||
Powrzechny sposób przechowywania muzyki symbolicznej w formie cyfrowej to pliki *.mid lib *.midi które przechowuja informację o całym potoku sygnałów w standarcie MIDI. Aby odczytać wiadomości plików MIDI, wykorzystałem bibliotekę \pyth{pretty_midi}, która zawiera wiele funcji pozwalających na edycję plików MIDI.
|
||||
Powrzechny sposób przechowywania muzyki symbolicznej w formie cyfrowej to pliki *.mid lub *.midi które przechowuja informację o potoku wiadomości protokołu MIDI. Aby odczytać wiadomości plików MIDI, wykorzystałem bibliotekę \pyth{pretty_midi}, która zawiera wiele funcji pozwalających na edycję plików MIDI.
|
||||
|
||||
Aby otworzyć pliki midi za pomocą bilbioteli \pyth{pretty_midi} należy skorzystać z poniższej skłądni.
|
||||
|
||||
@ -801,7 +801,7 @@ note_on channel=0 note=60 velocity=0 time=0
|
||||
...]
|
||||
\end{python}
|
||||
|
||||
Dzięki bibliotece \pyth{pretty_midi}, plik midi został odczytany i przechwany w objecie \pyth{PrettyMIDI}. Ten objekt posiada atrybut \pyth{instruments}, który jest lista ścieżek pliku MIDI. Objekt ścieżki posiada atrubut \pyth{notes}, który jest listą nut tej ścieżki. Możemy zobaczyć, że biblioteka \pyth{pretty_midi} zamieniła potok sygnałów protokołu MIDI na konkretne nuty posiadajace parametry start, end, pitch orac velocity. Aby ootrzymać sekwencję danych w takim formacie w jakim potrzebujemy możemy zastosować na obiekcie \pyth{Instrument} poniższą funcjkę.
|
||||
Dzięki bibliotece \pyth{pretty_midi}, plik midi został odczytany i przechwany w objecie \pyth{PrettyMIDI}. Ten objekt posiada atrybut \pyth{instruments}, który jest listą ścieżek pliku MIDI. Objekt ścieżki posiada atrubut \pyth{notes}, który jest listą nut tej ścieżki. Możemy zobaczyć, że biblioteka \pyth{pretty_midi} zamieniła potok sygnałów protokołu MIDI na konkretne nuty posiadajace parametry $start$, $end$, $pitch$ orac $velocity$. Aby otrzymać sekwencję danych w takim formacie w jakim potrzebujemy możemy zastosować na obiekcie \pyth{Instrument} poniższą funkcję.
|
||||
|
||||
\begin{python}
|
||||
def parse_pretty_midi_instrument(instrument, resolution,
|
||||
@ -893,31 +893,183 @@ resolution, time_to_tick, key_offset=0)
|
||||
Po odczytaniu danych i konwersji je do pożądanego formatu dane należy oczyścić. W mojej pracy zastowowałem kilka operacji, w celu zwiększenia muzycznego sensu danych.
|
||||
|
||||
\subsubsection{Unormowanie skali}
|
||||
W muzyce istenieje pojęcie skali. Skala jest to zestaw nut, które dobrze ze sobą wspołgrają. Zostało to szerzej opiswane w podrozdziale~\ref{section:skala}. W uczeniu maszynowym powodouje to realny problem, ponieważ piosenki wykorzystują różne skale, i sieć neuronowa będzie preferować wybranie skali częściej używanej. Dodatkowo zmiana skali, nie zmienia drastycznie kontenku muzycznego utworu. Zmiana wysokości przyskich nut, bez zmiany ich względnych interwałów nazywana jest transpozycją. Aby rozwiązać ten problem zaleca się agmentację danych, do wszystkich mozliwych skal. W mojej pracy wykorzystalem jednak inne rozwiązanie. Zamiast rozszerzać zbiór danych, sprowadziłem wszystkie ścieżki muzyczne do jednej skali C. Dzięki temu model przyłoży większą uwagę na rozumienie wzajemnych relacji, zamiast uczyć się pojęcia tonacji skali.\cite{survay}
|
||||
W muzyce istenieje pojęcie skali. Skala jest to zestaw nut, które dobrze ze sobą wspołgrają. Zostało to szerzej opiswane w podrozdziale~\ref{section:skala}. W uczeniu maszynowym powodouje to realny problem, ponieważ piosenki wykorzystują różne skale, i sieć neuronowa będzie preferować wybranie skali częściej używanej. Dodatkowo zmiana skali, nie zmienia drastycznie kontenku muzycznego utworu. Zmiana wysokości przyskich nut, bez zmiany ich względnych interwałów nazywana jest transpozycją. Aby rozwiązać ten problem zaleca się agmentację danych, do wszystkich mozliwych skal. W mojej pracy wykorzystalem jednak inne rozwiązanie. Zamiast rozszerzać zbiór danych, sprowadziłem wszystkie ścieżki muzyczne do jednej skali C. Dzięki temu model przyłoży większą uwagę na rozumienie wzajemnych relacji, zamiast uczyć się pojęcia tonacji skali \cite{survay}.
|
||||
|
||||
\subsubsection{Podział na takty}
|
||||
Długie listy muzycznych słów zostały podzielone na takty (\textit(bars)), o odpowiedniej długości, domyslnie o długości 4, co odpowiada czterem ćwierćnutom. Dzięki temu utwór muzyczny zostanie podzielony na mniejsze sekwencje. Sekwencje te będą posidały różną liczbę elementów, ale będą tak samo długie, w kontekcie muzycznym.
|
||||
Długie listy muzycznych słów zostały podzielone na takty (\textit{bars}), o odpowiedniej długości, domyslnie o długości 4, co odpowiada czterem ćwierćnutom. Dzięki temu utwór muzyczny zostanie podzielony na mniejsze sekwencje. Sekwencje te będą posidały różną liczbę elementów, ale będą tak samo długie, w kontekcie muzycznym. Głównym celem takie zabiegu, jest zapewnienie muzycznego sensu sekwenjom. Takt jest naturalnym dla muzyki podziałem dłuższegej pratii na mniejsze.
|
||||
|
||||
\subsection{Podział danych na dane wejściowe i wyjściowe}
|
||||
|
||||
Na podstawie przetworzonych danych, należy przygotować dane wejściowe $X$ i wyjściowe $Y$ dla sieci neurowonych, aby przeprowadzić proces uczenia. W tym celu będziemy rozważać pary sekwencji $(x, y)$, gdzie $x \in X$ i $y \in Y$. Każda senwencja zawierać bedzie omówione wcześniej słowa muzyczne. W przygotowanym przeze mnie modelu, występują dwa rodzaje sieci neuronowych, sieć generująca oraz sieć akompaniująca.
|
||||
|
||||
\subsubsection{Przygotowanie danych dla generatora}
|
||||
|
||||
1g, 2g ,3g, 4g, 5g
|
||||
2g, 3g, 4g, 5g, 6g
|
||||
Model generatywny będzie tworzył partie muzyczne, na podstawie poprzeprzednich sekwencji tego samego intrumentu. Weźmy parię muzyczną $G$, która jest uporządkowaną listą elementów $g$ w czasie. Każdy element $g$ jest taktem składających sie ze słów muzycznych.
|
||||
\[
|
||||
G = \left[g_1, g_2, g_n \right],
|
||||
\]
|
||||
gdzie $n$ jest liczbą taktów w partii muzycznej. Pary $(x_t, y_t)$ tworzymy według poniżej reguły
|
||||
\[
|
||||
\begin{array}{c}
|
||||
x_t = g_t \\
|
||||
y_t = g_{t+1},
|
||||
\end{array}
|
||||
\]
|
||||
dla $t \in (1, n-1)$.
|
||||
|
||||
+ deduplikacja i usuniecie pustych taktów
|
||||
Dzięki takiemu zdefiniowaniu danych uczacych generator będzie uczył sie jak powinien wyglądać następny takt, na podstawie poprzedniego. W ten sposób będziemy wstanie wykorzystać model, do generowania muzyki bez danych wejściowych. Wątek zostanie rozwinięty w dalejszej części pracy.
|
||||
|
||||
Implementacja w pythonie:
|
||||
\begin{python}
|
||||
def get_data_seq2seq_melody(self, instrument_class,
|
||||
x_seq_len=4):
|
||||
'''return a list of bars with content for every track
|
||||
with given instrument class for melody generaiton
|
||||
x_seq_len and y_seq_len
|
||||
|
||||
x previous sentence, y next sentence of the same melody line
|
||||
|
||||
'''
|
||||
|
||||
instrument_tracks =
|
||||
self.tracks_by_instrument[instrument_class]
|
||||
|
||||
for track_index in instrument_tracks:
|
||||
bars = self.tracks[track_index].stream_to_bars()
|
||||
bars_indexes_with_content =
|
||||
get_bar_indexes_with_content(bars)
|
||||
bars_with_content =
|
||||
[bars[i] for i in get_bar_indexes_with_content(bars)]
|
||||
|
||||
x_seq = []
|
||||
y_seq = []
|
||||
for i in range(len(bars_with_content)-x_seq_len-1):
|
||||
_x_seq =
|
||||
[note for bar in bars_with_content[i:i+x_seq_len]
|
||||
for note in bar]
|
||||
_y_bar = bars_with_content[i+x_seq_len]
|
||||
x_seq.append(_x_seq)
|
||||
y_seq.append(_y_bar)
|
||||
|
||||
return x_seq, y_seq
|
||||
\end{python}
|
||||
|
||||
\subsubsection{Przygotowanie danych dla akomaniamentu}
|
||||
|
||||
g1, g2, g3, g4, g5
|
||||
b1, b2, b3, b4, b5
|
||||
Model akompaniujący natomiast, będzie na podstawie partii jednego tworzyć partię na nowy instrument, dla tego samego kroku czasu.
|
||||
Niech $G, B$ będą sekcjami muzycznymi różnych instrumentów tej samej długości oraz niech
|
||||
\[
|
||||
\begin{array}{c}
|
||||
G = \left[g_1, g_2, ..., g_k \right] \\
|
||||
B = \left[b_1, b_2, ..., b_k \right],
|
||||
\end{array}
|
||||
\]
|
||||
wówczas pary dla zbioru uczącego tworzymy w nastęujący sposób
|
||||
|
||||
\[
|
||||
\begin{array}{c}
|
||||
x_t = g_t \\
|
||||
y_t = b_t,
|
||||
\end{array}
|
||||
\]
|
||||
|
||||
dla $t \in (1, k)$.
|
||||
Istotne jest aby każdy element ze zbioru taktów partii $B$ był rzeczywistą aranżacją tego instrumentu dla taktów partii $G$ oraz aby między elementami $g_t$ oraz $b_t$ była muzyczna relacja.
|
||||
|
||||
Implementacja przedstawionej techniki w pythonie.
|
||||
\begin{python}
|
||||
def get_data_seq2seq_arrangment(self, x_instrument,
|
||||
y_instrument, bars_in_seq=4):
|
||||
'''this method is returning a sequances of given lenth
|
||||
by rolling this lists of x and y for arrangemt generation
|
||||
x and y has the same bar lenth, and represent the
|
||||
same musical phrase played mb difrent instruments (tracks)
|
||||
|
||||
'''
|
||||
x_seq = []
|
||||
y_seq = []
|
||||
x_bars, y_bars =
|
||||
self.get_common_bars_for_every_possible_pair(
|
||||
x_instrument, y_instrument)
|
||||
|
||||
for i in range(len(x_bars) - bars_in_seq + 1):
|
||||
x_seq_to_add =
|
||||
[note for bar in
|
||||
x_bars[i:i+bars_in_seq] for note in bar ]
|
||||
y_seq_to_add =
|
||||
[note for bar in
|
||||
y_bars[i:i+bars_in_seq] for note in bar ]
|
||||
x_seq.append(x_seq_to_add)
|
||||
y_seq.append(y_seq_to_add)
|
||||
|
||||
return x_seq, y_seq
|
||||
|
||||
\end{python}
|
||||
|
||||
\subsection{Inne apekty przygotowania zbioru uczącego}
|
||||
|
||||
\subsubsection{Oczyszczenie danych}
|
||||
W przygotowaniu danych dla modelu, ważne jest aby dostarczone dane były jak najlepszej jakości. W tym celu zastosowałem jeszcze deduplikację par $(x, y)$ oraz usunąłem takty które nie zawierały muzycznego kontentu.
|
||||
|
||||
\subsubsection{Wybór programu dla intrumentu}
|
||||
Podczas etapu ekstracji danych z plików MIDI poza informacjami o muzyce, zapamiętuję również informacje o programie partii muzycznej. Każda ścieżka MIDI przechowuje informacje o intrumencie (brzmieniu) danej partii. Istenieje 128 rówznych programów, dla zmniejszenia szczegółwości na potrzeby modelu wyróżniam 16 intrumentów zgodnie z grupą do jakiej należą w podziale General MIDI. Dla każdej z grup, sprawdzam jaki program został najczęściej wykorzystywany i zapisuję go na przyszłość, aby móc wygenrowanej muzyce przy kompilacji do MIDI zdefiniować brzmienie intrumentu zgodnie z najczęściej wykorzystywanym w zbiorze MIDI, który został wykorzystany do stworzenia zbioru uczacego dla modelu.
|
||||
|
||||
\subsubsection{Melodia}
|
||||
Dodatkowym elementem procesu ektracji danych jest znaleniezie ścieżek melodii przewodnich w plikach MIDI. Ścieżki tego typu zamiast być oznaczone nazwą grupy intrumentów do której należą oznaczone są nazwą \pyth{Melody}. Melodia jest kategorią ścieżek z podziału ze względu na rolę partii w utworze, zamiast na intrument. Istnieją też inne role intrumentów, jednak często rola jest w pewnym sensie definiowana przez instrument. Nie jest to zasada, bardziej prawidłowość w muzyce. Uznazłem że wydobycie ten informacji na temat ścieżki nada więcej muzycznego sensu danym.
|
||||
Aby sprawdzić czy dana ścieżka jest melodią, zastosowałem poniższą funkcję:
|
||||
|
||||
\begin{python}
|
||||
def check_if_melody(self):
|
||||
'''checks if Track object could be a melody
|
||||
|
||||
it checks if percentage of single notes in
|
||||
Track.stream.notes is higher than treshold
|
||||
of 90 and there is at least 2 notes in bar per average
|
||||
|
||||
'''
|
||||
events = None
|
||||
single_notes = None
|
||||
content_lenth = None
|
||||
|
||||
for note in self.stream.notes:
|
||||
if self.name not in ['Bass','Drums']:
|
||||
events = 0
|
||||
content_lenth = 0
|
||||
single_notes = 0
|
||||
if note[0][0] != -1: # if note is not a rest
|
||||
events += 1
|
||||
content_lenth += note[1]
|
||||
if len(note[0]) == 1: # if note is a single note
|
||||
single_notes += 1
|
||||
|
||||
if events != None:
|
||||
if events == 0 or content_lenth == 0:
|
||||
return False
|
||||
else:
|
||||
single_notes_rate = single_notes/events
|
||||
density_rate = events/content_lenth
|
||||
if single_notes_rate >= 0.9 and density_rate < 2:
|
||||
self.name = 'Melody'
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
else:
|
||||
return False
|
||||
\end{python}
|
||||
|
||||
Funkcja sprawdza liczbę pojedynczych nut i akordów w ścieżce, oraz zagęszczenie nut w takcie. Jeśli jest więcej niż 90 pojedynczych nut w ścieżce oraz jest średnio więcej nut w takcie niż dwie, wtedy uznaję że partia intrumentalna utworu jest melodią.
|
||||
|
||||
\section{Tranformacja danych dla modelu}
|
||||
|
||||
+ deduplikacja, usunięcie pustych taktów.
|
||||
|
||||
|
||||
\section{Definicja modelu}
|
||||
|
||||
\section{Proces uczenia}
|
||||
|
||||
|
||||
\section{Uczenie modelu}
|
||||
|
||||
\section{Generowanie muzyki przy pomocy wytrenowanego modelu}
|
||||
|
||||
\section{Wyniki}
|
||||
|
||||
|
@ -24,15 +24,18 @@
|
||||
\contentsline {subsection}{\numberline {2.2.1\relax .\leavevmode@ifvmode \kern .5em }Standard MIDI}{31}%
|
||||
\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 3\relax .\leavevmode@ifvmode \kern .5em Projekt}{33}%
|
||||
\contentsline {section}{\numberline {3.1\relax .\leavevmode@ifvmode \kern .5em }Koncepcja}{33}%
|
||||
\contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Przygotowanie danych}{34}%
|
||||
\contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Wst\IeC {\k e}pne przygotowanie danych do treningu}{34}%
|
||||
\contentsline {subsection}{\numberline {3.2.1\relax .\leavevmode@ifvmode \kern .5em }Przyk\IeC {\l }ad dzia\IeC {\l }ania One-Hot Encoding}{34}%
|
||||
\contentsline {subsection}{\numberline {3.2.2\relax .\leavevmode@ifvmode \kern .5em }Muzyczne "s\IeC {\l }owo"}{34}%
|
||||
\contentsline {subsection}{\numberline {3.2.3\relax .\leavevmode@ifvmode \kern .5em }Konwersja MIDI na sekwencje s\IeC {\l }\IeC {\'o}w muzycznych}{35}%
|
||||
\contentsline {subsection}{\numberline {3.2.4\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania danych}{38}%
|
||||
\contentsline {subsection}{\numberline {3.2.5\relax .\leavevmode@ifvmode \kern .5em }Podzia\IeC {\l } danych na dane wej\IeC {\'s}ciowe i wyj\IeC {\'s}ciowe}{38}%
|
||||
\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{39}%
|
||||
\contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Proces uczenia}{39}%
|
||||
\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{39}%
|
||||
\contentsline {section}{\numberline {3.6\relax .\leavevmode@ifvmode \kern .5em }Wnioski}{39}%
|
||||
\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 4\relax .\leavevmode@ifvmode \kern .5em Podsumowanie}{41}%
|
||||
\contentsline {chapter}{Bibliografia}{43}%
|
||||
\contentsline {subsection}{\numberline {3.2.6\relax .\leavevmode@ifvmode \kern .5em }Inne apekty przygotowania zbioru ucz\IeC {\k a}cego}{41}%
|
||||
\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Tranformacja danych dla modelu}{43}%
|
||||
\contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{43}%
|
||||
\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Uczenie modelu}{43}%
|
||||
\contentsline {section}{\numberline {3.6\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanego modelu}{43}%
|
||||
\contentsline {section}{\numberline {3.7\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{43}%
|
||||
\contentsline {section}{\numberline {3.8\relax .\leavevmode@ifvmode \kern .5em }Wnioski}{43}%
|
||||
\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 4\relax .\leavevmode@ifvmode \kern .5em Podsumowanie}{45}%
|
||||
\contentsline {chapter}{Bibliografia}{47}%
|
||||
|
Loading…
Reference in New Issue
Block a user