Musiikki ja ohjelmointi

Johdanto

Tämän luvun tehtävässä tutustut listoihin ja muuttujiin sekä käytät näitä ohjelmoinnin rakenteita oman algoritmisen sävellyksen luomiseen.

Häkkääminen musiikissa

Musiikin häkkäämisestä saattaa ensimmäisenä tulla mieleen jonkin olemassa olevan kappaleen remiksaaminen eli siitä uuden biisin tekeminen. Remiksaus onkin hyvä tapa lähestyä häkkäämisen konseptia musiikissa - otetaan jotain olemassa olevaa, muokataan sitä ja tehdään siitä oman kuuloinen. Vaikka remiksaaminen liitetään usein elektroniseen musiikkiin, sen taustalla olevat häkkäämisen konseptit eivät ole mitenkään uusia. Säveltäjät ovat kautta historian tehneet muunnelmia toistensa töistään, sekä häkkäilleet omaa materiaaliaan uuteen uskoon.

Mitä tarkoitetaan algoritmisella säveltämisellä?

Algoritmi on ohje siitä miten jokin asia suoritetaan tai ongelma ratkaistaan. Perinteisessä säveltämisessä tämä algoritmi voisi olla nuotit, jotka kertovat muusikolle miten kappale soitetaan alusta loppuun - ohjeet "ongelman" ratkaisemiseksi.

Algoritmisessa säveltämisessä jokin algoritmi päättää mitkä nuotit soitetaan ja miksi. Algoritminen säveltäminen ei sinänsä edellytä tietokoneen käyttämistä sillä algoritmi voi olla hyvinkin yksinkertainen. Algoritmi voi esimerkiksi pyytää soittajaa valitsemaan satunnaisen nuotin c-duurisoinnusta ja soittamaan sitä neljä tahtia. Tässä tapauksessa satunnaisen valinnan tekee soittaja. Valinnan voi myös tehdä jokin ulkoinen tekijä, kuten noppa. Esimerkiksi Mozart tiettävästi sävelsi musiikillisen pelin, jossa soittaja muodostaa sävellyksen valmiiksi sävelletyistä palasista noppaa heittämällä.

Algoritminen sävellys liittyy olennaisesti häkkäämiseen. Musiikin teoriaa voi ajatella musiikin sääntöinä joita säveltäjän tai ohjelmoijan algoritmit häkkäävät jonkin musikaalisen lopputuloksen aikaansaamiseksi. Mozartin tapauksessa algoritmi oli yksinkertainen, mutta sisälsi valtavan määrän ennalta sävellettyä materiaalia.

Listat

Listat ovat yksi ohjelmoinnin perusrakenteista. Ne ovat tapa ryhmitellä samankaltaista tietoa yhteen paikkaan. Musiikin kontekstissa lista voi esimerkiksi tarkoittaa joidenkin tiettyjen nuottien yhdistelmiä kuten sointuja tai asteikkoja. Kokeile seuraavaa:

live_loop :soinnut do
  play [60,65,69], release: 2
  sleep 2
  play [62,65,70]
  sleep 1
  play [60,65,69], release: 2
  sleep 2
  play [60,64,67]
  sleep 1
end

Play komennolle annetaan nyt yhden arvon sijaan lista arvoja - kolmisointuja! Sonic Pi:ssa listat merkitään hakasulkein ja listojen sisältö, eli listan elementit eritellään pilkkujen avulla. Esimerkissä elementit ovat numeroita, mutta ne voisivat yhtä hyvin olla esimerkiksi nuottien nimiä [:c, :e, :g]

Listan käyttämisellä on monia etuja. Esimerkiksi parametrit vaikuttavat nyt kaikkiin listan elementteihin. Play komennon kanssa käytettävät listat myös säätävät äänenvoimakkuutta automaattisesti listan koon mukaan. 

Vaihe 1
Käytä listaa live_loopissa ja luo ainakin muutaman soinnun kierto

Listat ja satunnaisuus

Listat ovat erittäin hyödyllinen työkalu algoritmisen musiikin säveltämisessä. Sen sijaan, että soittaisit kaikki listan sävelet samaan aikaan voit käskeä Sonic Pi:ta valitsemaan listasta satunnaisen arvon uuden komennon avulla! Kirjoita vain listan perään .choose

live_loop :valitsija do
  play [60,65,69].choose
  sleep 2
  play [62,65,70].choose
  sleep 1
  play [60,65,69].choose
  sleep 2
  play [60,64,67].choose
  sleep 1
end

Tässä ylempänä olevan koodin soinnuista valitaan aina yksi sävel.

Kokeile soittaa tämä samaan aikaan ylemmän loopin kanssa. Koska melodia pohjautuu nyt sointujen säveliin ne sopivat varmasti yhteen. 

Äänen vaihtaminen

Kaksi looppia samalla äänellä ja samalta sävelkorkeudelta kuulostavat helposti todella samanlaisilta. Saat helposti vaihtelua käyttämällä use_synth komentoa.

Voit käyttää choosea valitsemaan mistä tahansa listasta yhden elementin. Voit esimerkiksi antaa sleepille muutaman mahdollisen vaihtoehdon listan avulla ja valita niistä yhden .choose komennolla.

sleep [1,0.5].choose

Voit myös valita käytettävän syntikan satunnaisesti:

use_synth [:saw, :square].choose

Vaihe 2
Käytä .choose komentoa valitsemaan listasta satunnainen elementti. Kokeile tätä ainakin kahteen eri tarkoitukseen!

Muuttuja

Koodia kirjoittaessa pyritään usein välttämään turhaa toistoa. Asioiden mekaaninen toistaminen ei ole kovin mielekästä puuhaa eikä myöskään tehokasta. Katso seuraava koodi:

live_loop :soinnut do
  play [60,65,69]
  sleep 2
  play [62,65,70]
  sleep 1
  play [60,65,69]
  sleep 2
  play [60,64,67]
  sleep 1
end
live_loop :nuotit do
  use_synth :saw
  play [60,65,69].choose
  sleep 2
  play [62,65,70].choose
  sleep 1
  play [60,65,69].choose
  sleep 2
  play [60,64,67].choose
  sleep 1
end

Koodissa soinnut tukevat satunnaista melodiaa. Koodi toimii, mutta siinä on muutama ongelma:

Ensinnäkin, molemmissa loopeissa on täysin samat soinnut kirjoitettuna. Mitä jos haluaisit vaihtaa ensimmäisen soinnun joksikin toiseksi? Sinun täytyy tehdä muutoksia molempiin looppeihin! Kahden loopin kanssa tämä ei ole vielä kovin työlästä, mutta mitä jos looppeja onkin 10?

Toiseksi, melodian sopivuus harmoniaan on riippuvainen rytmistä. Jos haluaisit esimerkiksi arpoa .choose komennolla sleep-arvoja melodialle, menevät soinnut ja melodia ristiin. Joskus tämä voi olla kiinnostava efekti - joskus taas korviariipivä.

Tarvitsemme siis keinon, jolla saada tieto soitettavasta soinnusta jaettua live_loopien kesken!


Ohjelmoinnissa tiedon tallentaminen ja uudelleenkäyttö tapahtuu muuttujien avulla. 

sointu = [60, 65, 69]

Muuttujaa voidaan ajatella paikkana johon jokin asia tallennetaan ja jota voidaan käyttää myöhemmin uudelleen. Yläpuolella on määritelty muuttuja nimeltä sointu. Muuttujan nimi voi olla mikä tahansa mutta usein on järkevää antaa niille kuvaavat ja helposti muistettavat nimet. Muuttujan sisältö määritellään = merkillä. Nyt muuttuja sisältää listan nuoteista joka voidaan toistaa esimerkiksi play komennon avulla.

sointu = [60, 65, 69]
play sointu
sleep 1
sointu = [61,66,70]
play sointu

Muuttujan sisällön voi muuttaa yksinkertaisesti antamalla sille uuden arvon. Toinen play komento toistaa uuden muuttujan sisällön ilman että itse play komennolle tarvitsee tehdä mitään!

Sonic Pi:n live_loopit ovat hieman kuin soittajia jotka eivät oikeastaan tiedä yhtään mitä muut soittajat tekevät. Looppien ulkopuolella oleva muuttuja sointu on kuitenkin tietoa, johon kaikki live_loopit pääsevät käsiksi, ja osaavat siksi soittaa yhdessä samassa sävellajissa.

Vaihe 3
Luo sävellyksesi alkuun muuttuja nimeltä sointu, johon talletat listan nuoteista

Sointukierto

Nyt kun sinulla on muuttuja kappaleessa käytettävää sointua varten voit käyttää sitä missä tahansa live_loopissa. 

sointu = [60,65,69]
live_loop :harmonia do
  play sointu
  sleep 1
end
live_loop :melodia do
  #valitse yksi ääni muuttujaan tallennetusta soinnusta
  play sointu.choose, release: 0.5
  sleep 0.5
end

Nyt molemmat live_loopit soittavat muuttujan määrittelemää sointua, mutta itse sointu pysyy koko ajan samana. 

Voit muuttaa aikaisemman sointuja soittaneen live_loopin, koko biisin sointuja vaihtavaan live_loopiin helposti. Sen sijaan että soittaisit soinnun play-komennolla, käytä looppia määrittämään muuttujalle sointu uusi arvo:

live_loop :sointukierto do
  sointu = [60,65,69]
  sleep 2
  sointu = [62,65,70]
  sleep 1
  sointu = [60,65,69]
  sleep 2
  sointu = [60,64,67]
  sleep 1
end

Nyt tämä looppi määrittää kappaleessa käytettävän soinnun ja muut live_loopit seuraavat perässä! Huomaa, että looppi ei itsessään pidä ääntä!

Vaihe 4
Muokkaa oma sointukierto looppisi toimimaan muuttujan vaihtajana ylläolevan esimerkin mukaisesti

Algoritmin hiominen

Algoritminen sävellyksesi saattaa nyt näyttää joltain tämän kaltaiselta:

sointu = [60,65,69]
live_loop :sointukierto do
  sointu = [60,65,69]
  sleep 2
  sointu = [62,65,70]
  sleep 1
  sointu = [60,65,69]
  sleep 2
  sointu = [60,64,67]
  sleep 1
end
live_loop :harmonia do
  use_synth :piano
  play sointu
  sleep 1
end
live_loop :melodia do
  #valitse yksi ääni muuttujaan tallennetusta soinnusta
  play sointu.choose, release: 0.5
  sleep 0.5
end

Helppo tapa erottaa melodia harmoniasta on nostaa eli transponoida se oktaavilla. Komento use_octave tekee juuri tämän! Komennolle annetaan parametriksi numero, joka kertoo transponoinnin määrän. Positiiviset arvot nostavat oktaavia ja negatiiviset laskevat:

live_loop :melodia do
  #soita melodia oktaavia korkeammalta
  use_octave 1
  #valitse yksi ääni muuttujaan tallennetusta soinnusta
  play sointu.choose, release: 0.5
  sleep 0.5
end

Muista, että voit käyttää .choose komentoa myös oktaavin valintaan kun laitat sen listan sisälle!

use_octave [0,1,2].choose

Vaihe 5
Transponoi yksi live_loop oktaavilla johonkin suuntaan

Miten tietää mitä eri komennot tekevät?

Sonic Pi on täynnä erilaisia komentoja. Olet varmaan huomannut miten ohjelma ehdottaa pudotusvalikon avulla muitakin komentoja mitä sinun on tarkoitus käyttää. Mistä tiedät miten komennot toimivat?

Apupaneelin Lang-tabista löytyvät kaikki Sonic Pi:n komennot ja niiden ohjeet. Voit myös hypätä komennon ohjetiedostoon suoraan siirtämällä osoittimen ensin haluamasi komennon, efektin tai syntikan päälle ja painamalla ctrl+i. Allaolevassa kuvassa käyttöjärjestelmänä on mac, mutta näppäinyhdistelmä on sama kaikilla käyttöjärjestelmillä.

Viimeistely ja ekstra

Vaihe 6
Jatka algoritmisen sävellyksesi hiomista.

Voit esimerkiksi lisätä teokseesi rytmiä samplejen avulla. Voit myös käyttää edellisissä tehtävissä käytettyä kaoottisempaa satunnaisuutta rrand(pienin, isoin) komennolla. Älä myöskään unohda efektien käyttöä!

Voit kokeilla luoda sävellykseesi toisen osan tekemällä sointuja vaihtavaan looppiin rakenteita. Esimerkiksi edellistä esimerkkiä voisi jatkaa näin:

live_loop :sointukierto do  
    4.times do
      sointu = [60,65,69]
      sleep 2
      sointu = [62,65,70]
      sleep 1
      sointu = [60,65,69]
      sleep 2
      sointu = [60,64,67]
      sleep 1
    end
    2.times do
      sointu = [62, 65, 69]
      sleep 3
      sointu = [60, 64, 69]
      sleep 3
      sointu = [60, 65, 69]
      sleep 3
      sointu = [61, 64, 69]
      sleep 3
    end
end

Alla on esitelty muutama tekniikka jonka avulla saat häkättyä musiikin teoriaa omaan käyttöösi! 

Extra: lisää soinnuista

Sonic pi:n mukana tulee lista sointuja, joten sinun ei tarvitse erikseen muistaa kaikkia mahdollisia sointuja! chord komennon avulla voidaan luoda sointu. Chordin ensimmäinen parametri on sen pohjasävel. Kun painat tämän jälkeen pilkkua, näet pudotusvalikon josta voit valita jonkun Sonic Pi:n mukana tulevasta seitsemästäkymmenestä soinnusta.

Voit halutessasi korvata chord-komennolla aikaisemmin käyttämän listan sillä sen toiminto on sama.

    sointu = [60,64,67]
    #on täsmälleen sama kuin tämä
    sointu = chord :C, :major
Extra: sointuja ja asteikkoja

Sonic Pi:n mukana tulee myös valtava määrä asteikkoja, jotka toimivat lähes samalla tavalla kuin soinnut!

  1. Aloita kirjoittamalla scale
  2. Tämän jälkeen kirjoita pohjasävel ja paina pilkkua
  3. Valitse asteikko pudotusvalikosta

Koko asteikon soittaminen kerralla ei ole välttämättä kovin mielekästä. Choose komento on kätevä, mutta sen avulla saat vain yhden sävelen kerrallaan. Voit käyttää komentoa .pick(3) valitsemaan listasta kolme satunnaista säveltä, jolloin voit esimerkiksi soittaa asteikosta satunnaisia sointuja. Sulkeiden sisällä oleva numero kertoo kuinka monta säveltä listasta valitaan.

Lisää tietoa listojen kanssa käytettävistä komennoista saat Sonic Pi:n apupaneelin tutoriaalin osasta 8.5 - Ring Chains