Vaihe 1
Tee seuraavaksi uusi ääniefekti kuvitteelliseen peliin. Miltä pelisi
voimaesineen noukkiminen kuulostaa? Mitä ääntä vastustajat pitävät kun
niihin osuu?
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 on Brian Enon käsialaa. Hän on sanonut haastattelussa tehneensä 84 eri 'mikrosävellystä' toimeksiannon pohjalta.
Ää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
Ää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.
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 :square
ksi autenttisen soundin
saamiseksi
use_synth :square
play 83, release: 0, sustain: 0.125
sleep 0.125
play 88, release: 0.875
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
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_threadi
n 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_thread
in sisällä olevat komennot tapahtuvat kuin omassa
maailmassaan, vähän kuin live_loop
issa 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
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.
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:
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
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.
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.
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:
pan:
Samplen kanssa käytettäviä parametrejä
rate:
beat_stretch:
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ä.
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.
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ä.
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.
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