I videon hörs en utdaterad version av koden. Jag hade av misstag bara lagt panorisering till ena "handen" av det självspelande pianot så balanseringen är lite ensidig. Det är självklart viktigt med en estetiskt tilltalande panorisering, alltså hur mycket till höger eller vänster i stereoljudbilden som ljuden spelas. Istället för att bara dela upp panoreringen jämt emellan de två "händerna" som spelar tangenterna, kom jag fram till att jag ville slumpa panoriseringen för varje spelad tangent, det gav en mycket större stereoeffekt. Det är å ena sidan mindre verklighetstroget, ett piano som befinner sig i ett rum kastar ju inte varje ton i en slumpmässig riktning, utan ljudet härstämmar ifrån var strängarna i pianot befinner sig. Å andra sidan var detta en vackrare lösning för örat, och ibland får det vackraste, mest effektfulla, vinna över det resonliga. På något sätt är det i sig det mest resonliga.


Vad försökte jag åstadkomma? Jag ville programmera en prototyp för procedurisk musik. Procedurisk för detta syfte betyder att en mer eller mindre slumpmässig input följer en algoritm för att ge ett intressant resultat. Med enklare termer, det är inte menat att bara vara slumpmässiga toner som spelas; det skulle inte vara igenkänningsbart som musik. Istället behövde jag definera vad jag menar med musik, och komma på ett sätt att få en kod att på egen hand skapa musik utan att det är alldeles för uppenbart att pianisten är en robot. Jag ville kunna bygga bakgrundsmusik som är ny och unik varje gång, som aldrig behöver repetera om jag inte vill det.

Hur gick jag tillväga? Till och börja med undvek jag att strikt definera musik, men jag satte realistiska ramar för vad jag tänkte skulle få musiken att kännas igen som musik. Musiken behövde 1. följa musikteori, 2. följa en låtstruktur med tydligt tema i varje låt.

Låtar går som bekant i någon tonart, det betyder att det finns en grundton som de andra tonerna i låten kontrasterar mot. Jag gav programmet en lista med alla tolv toner i en oktav i samma ordning de ligger på ett pianos klaviatur. Sedan lät jag programmet sortera tonerna efter tonarten, så grundtonen blir första tangenten och nästa tangent är nästa tangent i ordningen osv. Det kan jämföras med att pianisten flyttar sin hand upp eller ned på klaviaturet beroende på tonarten.

Det är i själva verket mycket mer än bara en jämförelse, det kom som naturligast för mig att visualisera programmet som en riktig fysisk pianospelare och bygga det med hjälp av analogier. Ett piano är ett väldigt konkret instrument på många sätt, så att gå efter visualisering av ett piano och en pianospelare var mycket självklarare än mer abstrakta lösningar.

Skalor och ackord föll på plats efter det, det var till att mata in 14 skalor och 12 ackord som jag valde ut efter hur de defineras musikteoretiskt. Wikipediasidorna för skalor och ackord var till stor hjälp där jag kunde hitta intervallerna som just definerade dem. Intervallerna är lite förenklat vilka tangenter som trycks ned och inte. Rättare sagt hur många tangenter spelas och när hoppar man över tangenter. Istället för att det är specifika tangenter på ett piano, beskriver det "mönstret" som skalorna och ackorden har. Dessa kan då spelas i olika tonarter men behålla sin form.

Nu kunde jag bygga låtar med musikteori men jag behövde ett sätt att generera låtar. Igen vände jag mig till en analogi i notpapper. Jag lät programmet slumpa en längd delbart i fyra. Varför fyra? För enkelhetens skull började jag med vanlig fyrtakt. Denna längd då, definerade hur många takter låten har. Till en början slumpades ackorden och de enskilda tonernas position i varje takt helt och hållet, resultatet av det blev en obegriplig röra. Jag fick göra det klart för mig att hela poängen med låtstrukturen var att undvika en obegriplig röra, så jag behövde ett sätt att få programmet att improvisera något mer konventionellt.

Jag byggde en hierarki. De viktigaste tonerna spelas i princip alltid, och en avtagande sannolikhet för resten. För att understryka rytmen i låten lät jag varje helnot definitivt spelas. Emellan varje helnot är det dock inte säkert att det finns halvnoter eller fjärdedelar. En takt kan till exempel bli bara ett långt ackord, medan andra takter är mer fyllda; precis som låtar så som vi känner igen dem.

För att variera låtarna så slumpas deras grundton, skala, och intensivitet när de skapas. Intensiviteten är sannolikheten för halvnoter och fjärdedelar, så i en intensivare låt händer mer medan en mindre intensiv låt är mer sparsmakad och lugnare. Slutligen behövde jag dela upp ackord som har råkar ha fler toner än den valda skalan till fler tangenter. Jag gav programmet två "händer", som en riktig pianospelare, som fortsätter på ackordet högre upp eller längre ned på pianot när det behövs, och varierar hur hårt de trycker på tangenterna. För bästa resultat valde jag stora, rumfyllda pianoljud med mycket karaktär för att dölja lite av det robotiska som uppstod när jag hade enklare pianoljud.

Tillbaka