Deep Learning Bach-koraler

Videre med deep learning, kunstig intelligens og neurale netværk. Jeg har en ambition om at undersøge hvad man kan med de teknologier, jeg vil simpelthen gerne vide hvad vi kan vente os af dem. Hvad er mulighederne og begrænsningerne?

Så jeg vil bruger dem til at skrive tekst og musik med, og jeg har planer om at lave systemer som laver musikken direkte.

Det her bliver en teknisk omgang, men først mit foreløbige resultat:

Det er både godt og skidt – Bach skulle have drukket rigtigt meget kaffe for at lave den – men den har visse fællestræk med en Bach-koral. Den komplette koral er på fire perioder som mange Bach-koraler, og den slutter med en helnode på en treklang. Godt nok en formindsket treklang…

Jeg har brugt en bunke værktøjer for at nå hertil. Indenfor Python-verdenen findes en værktøjskasse til musikforskning, music21, og her ligger en enorm mængde klassisk musik i musicxml-format, herunder alt hvad  Bach’s har skrevet. Jeg søgte alle koralsatser frem og konverterede dem til MIDI, og skrev et program som kan konvertere dem til en tekstfil, som fylder 1.500.000 karakterer.

Formatet for denne tekstfil ser sådan her ud:

bwv1.6
>>>>>>
1024 53 1024 4
0 57 1024 3
0 60 1024 2
---- en masse linier
0 60 1024 2
0 65 1024 1
<<<<<<<
bwv10.7
>>>>>>
0 .....

Tallene på de enkelte linier er tid, nodehøjde, varighed og stemme. Tredje linie siger altså “Vent 1024 ticks, spil tone nummer 53 i fjerde stemme og hold den i 1024 ticks”. Ticks er ikke nogen defineret enhed, du kan læse den som millisekunder.

Denne fil er input til et neuralt netværk, et såkaldt LSTM  (Long short-term memory). Et LSTM kan huske hvad det selv har skrevet, så når det skriver en tekst vil den næste karakter være afhængigt af hvad den har skrevet forud.

Dette netværk satte jeg til at træne i tre timer på en gammel Macbook Pro, og det tyggede sig 1900 gange igennem filen med alle koralerne. Og kunne så komponere overstående sats – som jeg konverterede tilbage til MIDI og hældte ind i Musescore, uden at bearbejde den iøvrigt. Så det er Musescore som har gætte på d-mol, MIDI-filer indeholder ikke den slags information.

Netværket bygger på Torch, som er udviklet af Facebook. Det er altså det samme neurale netværk som Facebook bruger til at gætte på hvilke reklamer, jeg gerne vil se – og hvilke kattevideoer som kan gå viralt. De bruger nok bare ikke gamle bærbare computere til at køre det på. På Amazons EC2 ville det køre mange tusinde gange hurtigere, men det koster en del.

Jeg kan optimere på andre måder. For det første skal jeg lave inputformatet om, så netværket får flere forskellige karakterer at arbejde med. Lige nu får det stort set kun 11 – tallene fra 0-9 og mellemrum, og det er ikke optimalt for den type netværk. Og i den nuværende udgave fylder varighed, som er en ret banal oplysning, mere end tonehøjden.

Netværket ved jo ingenting om varighed, tonehøjde eller musik. Det ved kun at det skal læse karakterer fra en fil, en ad gangen, og senere skal spytte karakterer ud i en fil, en ad gangen. Og så prøver det at lære sig nogle regler ud fra de karakterrækkefølger, som det læser.

Når netværket er nyt, altså når det har trænet 5 gange, spytter det fuldstændigt tilfældige karakterer ud. Omkring nummer 100 har det lært at bruge de karakterer som er i inputtet, og efter 500 gange kan det stort set overholde formatet. Derfra går det meget langsomt fremad.

Jeg skal bruge en del tid på at eksperimentere med dybden og bredden på netværket, der findes en masse muligheder for at tilpasse Torch til en konkret opgave. Det vil jeg gøre, og samtidigt vil jeg fylde nogle Palestrina-satser i det, så det kan lære Bach og Palestrina på én gang.