Musiikki ja ohjelmointi

Johdanto

Tämän luvun tehtävässä tutustut äänisuunnitteluun tekemällä oman äänen kuvitteelliseen peliin. Tallennat myös suunnittelemasi äänen funktioon jonka avulla voit helposti käyttää ääntä uudelleen missä vain. Lopuksi esittelet kehittämäsi funktion toimintaa lyhyen live_loopin avulla.

Äänisuunnittelusta puhuttaessa tarkoitetaan usein elokuva- tai teatteriproduktioissa toimivia ammattilaisia jotka suunnittelevat koko tuotannon äänimaiseman. Tämän viikon harjoituksessa lähestymme äänisuunnittelua kuitenkin hieman toisesta suunnasta - yhden äänen suunnittelusta. Tämänkaltaista äänisuunnittelua on paljon esimerkiksi ohjelmien käyttöliittymissä, peleissä ja elektronisessa musiikissa.

Super Mario Bros - Kolikon ääni


Windows 95 käynnistysääni

Windows 95 käynnistysääni on Brian Enon käsialaa. Hän on sanonut haastattelussa tehneensä 84 eri 'mikrosävellystä' toimeksiannon pohjalta.


Mallinnus

Äänisuunnittelussa äänet tehdään usein useista elementeistä jotka samaan aikaan soitettuna saavat aikaan uuden äänen. Kuuntele uudelleen Super Marion kolikkoääni

Tässä voi melko selkeästi kuulla äänen olevan kaksi peräkkäin soivaa ääntä joiden välinen intervalli on kvartti. Äänet eivät soi päällekkäin mutta niiden välillä ei ole myöskään tyhjää tilaa. Tämänkaltaisen asian mallintamiseen Sonic Pi on erittäin hyvä!

Aloita avaamalla tyhjä välilehti Sonic Pi:hin. Lähde kaikkein yksinkertaisimmasta elementistä liikkeelle - kaksi ääntä jotka ovat kvartin, eli viiden puolisävelaskeleen päässä toisistaan. Erota komennot sleepillä ja keskity nyt siihen että äänet soivat ajallisesti oikeaan aikaan. Korjaat päällekkäisyyden seuraavassa vaiheessa.

play 83
sleep 0.125
play 88

Verhokäyrä

Äänen verhokäyrä ilmaisee äänenvoimakkuuden eli amplitudin muuttumisen ajassa. Olet mahdollisesti jo käyttänyt attack: ja release: parametrejä muuttamaan verhokäyrää. Sonic Pi:ssa on kuitenkin mahdollisuus määrittää vielä tarkemmin äänen amplitudin muuttuminen. 

ADSR verhokäyrä

Attack tarkoittaa äänen voimistumiseen kuluvaa aikaa ja release puolestaan äänen vaimenemisaikaa. Molemmille parametreille aika annetaan iskujen määränä. 

Decay parametri määrittää miten kauan attack arvosta siirtyminen sustain arvoon kestää.

Sustain parametrille annettava arvo kertoo kuinka kauan ääni soi sustain_level: parametrin arvossa. Oletuksena sustain_level arvo on 1, jolloin sustain kertoo kuinka kauan ääni soi maksimivoimakkuudella.

Kolikkoääntä mallintaessa tarvitsemme verhokäyrän joka alkaa todella nopeasti, kestää määrätyn ajan ja loppuu todella nopeasti. Helppo tapa tehdä tämä Sonic Pi:ssa on antaa releasen arvoksi 0 ja määrittää pituus sustainilla.

play 83, release: 0, sustain: 0.125
sleep 0.125
play 88, release: 0.875

Muuta vielä käytetty syntikka :squareksi autenttisen soundin saamiseksi

use_synth :square
play 83, release: 0, sustain: 0.125
sleep 0.125
play 88, release: 0.875

Koodi pakettiin

Nyt sinulla on valmis kolikkoääni. Mitä jos haluaisit käyttää sitä esimerkiksi omassa pelissäsi monessa eri paikassa? Ja mitä jos haluaisit esimerkiksi muuttaa kolikon sävelkorkeutta sen mukaan miten monta kolikkoa olet kerännyt? Olisi melko työlästä kirjoittaa aina sama koodinpätkä kun haluat kuulla kolikkoäänen. Onneksi Sonic Pi:ssa on mahdollista tallentaa koodinpätkä funktioksi, jolloin sitä voi helposti käyttää uudelleen!

Funktion syntaksi on samantyylinen kuin live_loopin: Aloita kirjoittamalla rivin alkuun define. Seuraavaksi anna funktiolle nimi, samalla tavalla kuin live_loopillekin eli kaksoispisteen kanssa. Seuraavaksi kirjoita do.

Do:n jälkeinen koodi on koodia joka tallennetaan funktioon. Tässä tapauksessa laita kolikkoäänen koodi funktion sisälle ja kirjoita lopuksi end.

define :kolikko do
  use_synth :square
  play 83, release: 0, sustain: 0.125
  sleep 0.125
  play 88, release: 0.875
end

Kun ajat koodin mitään ei kuulu. Tämä johtuu siitä, että olet vasta määrittänyt funktion! Kokeile nyt kirjoittaa funktion nimi ilman kaksoispistettä funktion ulkopuolelle. Kuuletko äänen?

define :kolikko do
  use_synth :square
  play 83, release: 0, sustain: 0.125
  sleep 0.125
  play 88, release: 0.875
end

kolikko


Funktion kesyttäminen

Kopioi seuraava koodi ja toista se

define :kolikko do
  use_synth :square
  play 83, release: 0, sustain: 0.125
  sleep 0.125
  play 88, release: 0.875
  end
end

live_loop :biitti do
  sample :bd_haus
  sleep 0.5
  sample :sn_dolf
  sleep 0.5
end

live_loop :kolikko_man do
  sleep 1
  kolikko
  sleep 1
end

Huomaatko että kolikko live_loop menee nyt epäsynkkaan rumpuloopin kanssa? Tämä ei johdu looppien sleep arvoista, sillä ne ovat keskenään synkassa. Ongelmana on se, että funktion sisällä oleva sleep vaikuttaa myös funktion ulkopuoliseen aikaan. Joskus tämä on toivottu asia, esimerkiksi silloin jos funktiota käyttää kappaleen osien tallettamiseen. Nyt sleepiä käytetään funktion sisällä kuitenkin yksittäisen äänen muodostamiseen eikä tämän ole tarkoitus vaikuttaa funktion ulkopuoliseen rytmiin.

Saat funktion erotettua sen ulkopuolisesta ajasta in_thread koodiblokin avulla. in_thread laittaa kaiken sen sisällä olevan koodin kulkemaan omassa säikeessä (thread). Käytännössä tämä tarkoittaa sitä, että in_threadin sisällä olevat sleepit ja muut komennot vaikuttavat vain säikeen sisällä. In_thread toimii koodiblokin avulla:

in_thread do
  use_synth :saw
  play 60
  sleep 0.75
  play 67
  sleep 0.75
  play 74
  sleep 0.75
end
play 60
sleep 0.5
play 62
sleep 0.5
play 64
sleep 0.25
play 65
sleep 0.5
play 67

Kaikki in_threadin sisällä olevat komennot tapahtuvat kuin omassa maailmassaan, vähän kuin live_loopissa mutta ilman toistoa. in_thread tomii samalla tavalla myös funktion sisällä

define :kolikko do
  in_thread do
    use_synth :square
    play 83, release: 0, sustain: 0.125
    sleep 0.125
    play 88, release: 0.875
  end
end

Nyt funktion sisäinen aika ei vaikuta sen ulkopuolisiin tapahtumin


Funktion parametrit

Mitä jos haluaisit soittaa melodian kolikkoäänellä tai muuttaa jotain muuta funktion sisäistä parametriä lennosta? Funktioille on mahdollista antaa omat parametrit joiden avulla niiden toimintaa voi hallita samalla tavalla kuin esimerkiksi play komennon sävelkorkeutta voi hallita muuttamalla numeroa!

define :kolikko do |nuotti|
  in_thread do
    use_synth :square
    play nuotti, release: 0, sustain: 0.125
    sleep 0.125
    play nuotti+5, release: 0.875
  end
end

Funktiolle annettavat parametrit laitetaan pystyviivojen sisään. Pystyviiva löytyy tavallisesta suomenkielisestä windows-näppäimistöstä painamalla alt gr + <. Macillä saat pystyviivan kun painat alt+7.

Parametriä nuotti käytetään nyt funktion sisällä määrittämään play komennon soittama arvo. Jos koetat nyt käyttää kolikko-funktiota saat virheilmoituksen. Funktio tarvitsee nyt arvon jota käyttää play komennon sävelkorkeuden määrittämiseen. Tämä tapahtuu antamalla kolikko funktiolle arvo

kolikko 72

Voit antaa parametrille myös oletusarvon, jolloin vältät virheviestit. Nyt äänen korkeus muuttuu vain jos sen määrittää erikseen.

define :kolikko do |nuotti=83|
  in_thread do
    use_synth :square
    play nuotti, release: 0, sustain: 0.125
    sleep 0.125
    play nuotti+5, release: 0.875
  end
end

Voit myös antaa funktiolle useita parametrejä. Sinun täytyy vain erotella pystyviivojen sisässä olevat parametrit pilkulla. Jos haluaisit esimerkiksi vaikuttaa myös jälkimmäisen nuotin pituuteen voit kirjoittaa seuraavan:

define :kolikko do |nuotti=83, pituus=0.875|
  in_thread do
    use_synth :square
    play nuotti, release: 0, sustain: 0.125
    sleep 0.125
    play nuotti+5, release: pituus
  end
end

kolikko 70, 2.5

Kannattaa aina antaa funktion parametreille oletusarvo. Tällöin kaikkia parametreja ei tarvitse erikseen kirjoittaa.


Soveltaminen

Vaihe 1
Tee seuraavaksi uusi ääniefekti kuvitteelliseen peliin. Miltä pelisi voimaesineen noukkiminen kuulostaa? Mitä ääntä vastustajat pitävät kun niihin osuu?

Kannattaa avata uusi välilehti äänen työstämistä varten. Alla on vinkkejä kohinasta tehtyjen äänen, kuten hi-hatin tai aaltojen tekemiseen. Voit kuitenkin tehdä minkä tahansa äänen kunhan käytät ääniefektissäsi ainakin seuraavia tekniikoita:

  • Muuta verhokäyrää playn parametrien avulla (attack:, decay: sustain: release:)
  • in_thread koodiblokki jos käytät sleep komentoja funktion sisällä
  • Vähintään yhden parametrin muuttaminen funktion ulkopuolelta

Kohinaa :noise syntikalla

use_synth :noise on erinomainen työkalu perkussiivisten äänien suunnitteluun. Noise on siitä erikoinen syntikka, että sävelkorkeus ei vaikuta siihen millään tavalla - syntikka tuottaa kohinaa koko taajuuskaistalta. Äänen verhokäyrällä on taas todella suuri vaikutus siihen minkälaisen äänen :noise saa aikaiseksi. Pitkät attack ja release arvot saavat syntikan kuulostamaan tuulelta tai aalloilta. Lyhyet arvot taas tekevät äänestä hi-hat tai virvelimäisen.

use_synth :noise
#tuuli/aalto
play 1, attack: 3, release: 4
sleep 8

#hi-hat
play 1, attack: 0, release: 0.05

Sonic Pi:n mukana tulee muutama erikuuloinen kohinageneraattori. Kokeile kaikkia ja löydä tilanteeseen sopivin kohina! Muista, että saat lisää tietoja syntikan ominaisuuksista viemällä kursorin syntikan nimen päälle ja painamalla ctrl+i

:noise
:bnoise
:cnoise
:gnoise
:chipnoise

Mitä parametriä ohjata?

Funktiossa muutettavaa parametriä kannattaa miettiä sen mukaan mitä äänesi tekee. Jos sinulla on esimerkiksi hi-hat, voisi olla kiinnostavaa muuttaa äänen pituutta. Näin voit simuloida avointa ja suljettua hi-hattia vaihtamalla yhtä parametriä. Jos taas simuloit tuulta voisi olla kiinnostavaa ohjata äänenvoimakkuutta tai panorointia. Jos olet tehnyt esimerkiksi jonkin örkin sotahuudon, voit helposti "simuloida" erikokoisia örkkejä muuttamalla äänen korkeutta.

Vaihe 2
Kun sinulla on valmis funktio, tee live_loop jossa esittelet sen toimintaa yhdessä kolikkoäänen kanssa.

Jatkokehittelyideoita aiempiin tehtäiviin

Luku 1

Opitut komennot

play 60
sleep 1
use_bpm 100
4.times do
    #jotain tapahtuu 4 kertaa
end

Ensimmäisessä luvussa testasit Sonic Pi:n käyttöä play ja sleep komennoilla. Käytit myös times do rakennetta toistamaan koodiasi. Opit myös muuttamaan kappaleen tempoa use_bpm komennolla. Tarkoituksena ei ollut niinkään musikaalinen lopputuloksen aikaansaaminen vaan kokeilu ja hauskanpito.

Jatkokehittelyideoita

Tee sävellys jossa käytät vain tiettyjä säveliä (esim asteikko) ja kahta eri sleep arvoa

Soittoäänen tekeminen.

Äänimerkin tekeminen - Millainen on hyvä äänimerkki?

Milloin rytmi muuttuu ääneksi? 

#esimerkki - milloin rytmi muuttuu ääneksi
use_debug false #koodi toimii paremmin tämän avulla
use_bpm 3000 #muuta tätä 
500.times do
  play 60
  sleep 1
end

Luku 2

Opitut komennot

sample
live_loop :nimi do
end
,rate:
,amp:
#kommentointi
rand
rand(5)
rrand(2,7)

Toisen luvun tehtävässä tutustuit sampleihin, eli lyhyisiin äänitiedostoihin. Opit muokkaamaan sampleja parametrien kuten rate: ja amp: avulla. Laitoit samplet looppaamaan loputtomiin live_loop rakenteella ja opit myös #kommentoimaan koodia. Tehtävässä teit loopin avulla toistuvan tulevaisuuden äänen.

Parametrit ovat erittäin hyödyllinen työkalu ottaa haltuun sillä sama rakenne toistuu todella monessa paikassa Sonic Pi:ssa. Esimerkiksi amp: parametriä voi käyttää lähes kaikkien komentojen kanssa säätämään äänenvoimakkuutta. Seuraavat parametrit ovat yleisesti käytettyjä ja hyödyllisiä:

amp:

  • amplitudi eli äänenvoimakkuus
  • amp: 0 = ääni ei kuulu
  • amp: 1 = oletus
  • amp: 2 = tuplavoimakkuus

pan:

  • panorointi
  • pan: -1 = ääni täysin vasemmalla
  • pan: 0 = ääni keskellä
  • pan: 1 = ääni täysin oikealla

Samplen kanssa käytettäviä parametrejä

rate:

  • Samplen toistonopeus
  • oletusarvo 1, suuremmat arvot nopeuttavat samplea (ja nostavat taajuutta) pienemmät hidastavat.
  • negatiiviset arvot soittavat samplen takaperin

beat_stretch: 

  • venyttää samplen annetun pituiseksi
  • esim: beat_stretch: 4 venyttää samplen 4 sleepin mittaiseksi

Viikon tehtävän lisämateriaalissa tutustuttiin satunnaisuuteen kolmella eri tavalla

rand komento arpoo numeron 0 ja 1 välillä

rand(n) komento arpoo numeron 0 ja n välillä

rrand(a,b) arpoo numeron kahden luvun väliltä esimerkiksi rrand(-1,1) arpoo lukuja -1 ja 1 väliltä.

Jatkokehittelyideoita

Rumpukomppeja oudoista äänistä

Taustanauhan tekeminen omalle soittamiselle

Murtoluvut rate: parametrin kanssa ja niiden vaikutus melodisiin sampleihin (muista käyttää jakolaskussa desimaalilukuja)

Samat loopit - eri tempo! (Jokaisella live_loopilla voi olla oma tempo)

Luku 3

Opitut komennot

use_synth
sample "Oman/samplen/tiedostopolku.wav"
,attack:
,release:
with_fx :reverb do
    #tämä on efektoitu
end

Kolmannessa luvussa havainnoit ääniympäristöäsi aktiivisesti ja mahdollisesti nauhoitit sitä. Opit tuomaan omia ääniä Sonic Pi:hin käyttämällä sample komentoa ja yksinkertaisesti vetämällä sen perään äänitiedoston (.wav, .flac, tai .aiff -päätteisenä). Käytit myös use_synth komentoa vaihtaaksesi play komennon ääntä. Lopuksi äänitit sonic pi sävellyksen ja latasit sen instaud.io palveluun. Lisämateriaalissa opittiin käyttämään kaikuefektiä yleisenä soundinparantajana.

Jatkokehittelyideoita

Äänimaiseman nauhoittaminen ja sen parantaminen Sonic Pi:lla

Äänimaiseman kriittinen tarkastelu - muuttuvat äänimaisemat

Tulevaisuuden äänimaisema

Loopit bändin jäseninä - rumpulooppi, bassolooppi, pianolooppi jne.

Luku 4

Opitut komennot

muuttuja = [50,56,58]
use_octave -1
[80,70,60].choose

Luvun 4 tärkein ohjelmointikäsite oli muuttuja. Muuttuja on tallennuspaikka tiedolle. Kun muuttujan kirjoittaa live_looppien ulkopuolelle, sitä voi käyttää kaikki live_loopit. Tehtävässä tätä hyödynnettiin asettamalla sointu muuttujaan jolloin live_loopit pystyivät soittamaan samassa sävellajissa.

Toinen merkittävä ohjelmointikäsite oli listat. Sonic Pi:ssa listat ilmoitetaan hakasulkeilla joiden sisällä on pilkulla eroteltuja arvoja. Listaa käytetään usein säilyttämään useampia toisiinsa liittyviä asioita, kuten esimerkiksi nuotteja tai rytmejä. Opit myös valitsemaan listasta satunnaisen elementin .choose komennon avulla.

Musiikin teoriaan liittyvät komennot chord ja scale ovat kätevä tapa luoda listoja, joiden sisältämät sävelet toimivat yhdessä. Viikon tehtävässä listoilta valittiin satunnaisesti arvoja .choose komennon avulla. Satunnaisuutta voi rajata hyvin sisällyttämällä listaan halutut vaihtoehdot. Vertaa esimerkiksi kahta seuraavaa esimerkkiä:

live_loop :asteikko do
  play (scale :c, :major).choose
  sleep 1
end

live_loop :kaaos do
  play rrand(60,72)
  sleep 1
end

Molemmat loopit sisältävät säveliä saman vaihteluvälin sisällä. Ensimmäinen looppi on kuitenkin rajattu vain c-duurin säveliin kun taas toinen looppi sisältää käytännössä loputtoman määrän eri ääniä oktaavin välillä.

Jatkokehittelyideoita

Lisää teoriapohjaisten komentojen tutkimista - chord_degree (katso esimerkki alla).

Jatkuvasti muuttuva rytmipohja choose komentojen ja useiden live_loopien kanssa.

Oman biisipohjan kehittäminen ja sen jakaminen häkättäväksi.

live_loop :asteet do
#ensimmäinen numero = sointuaste (voidaan ilmoittaa myös :i, :ii, :v, :vii jne)
#tämän jälkeen pohjasävel
#sen jälkeen asteikko
#lopuksi vielä sävelten määrä - 3= kolmisointu 4=nelisointu jne
  play chord_degree 1, :c, :major, 3
  sleep 1
end

Miten tietää mitä komennot tekevät?

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ä.

Ohjetiedostosta löytyy käyttöohjeiden lisäksi myös esimerkkejä, joita voi kopioida suoraan koodiin.

Sonic Pi ja nuotit


Käteviä komentoja

Allaolevassa listassa on joitain hyödyllisiä ohjelmointirakenteita, joita voit käyttää vapaasti koodissa ja opetuksessa.

    #satunnainen äänenvoimakkuus
    play 60, amp: rand

    #satunnainen panorointi (-1 = vasen kaiutin, 0 = keskellä, 1 = oikea kaiutin)
    play 60, pan: rrand(-1,1)

    #valitse tauko yleisistä aika-arvoista
    sleep [1,0.5,0.25].choose

    #luo muuttuja asteikolle ja soita siitä kolme säveltä satunnaisesti
    asteikko = scale :C4, :major
    play asteikko.pick(3)

    #valitse kahdesta samplesta
     sample [:drum_cymbal_closed, :drum_cymbal_open].choose

    #luo laskuri ja nosta sen arvoa joka toistokerta
    #tätä voidaan käyttää esimerkiksi funktioiden kuunteluun
    laskuri = 0
    10.times do
      #kuuntele y=3x
      play 48+laskuri*3
      sleep 1
      laskuri = laskuri+1
    end

    #tosi iso kaikuefekti
    with_fx :reverb, room: 1 do
      play 87, release: 0.05
    end