Tekstitykset
Äänta mukaan
Sonic Pi on Sam Aaronin kehittelemä ilmaisohjelma, jolla voi ohjelmoida musiikkia Ruby-ohjelmointikieltä mukailevalla rakenteella. Voit ladata ohjelman osoitteesta sonic-pi.net. Mehackit on tuottanut Sonic Pi:hin oppimateriaalia, jonka löydät osoitteesta sonic-pi.mehackit.org
Tässä harjoituksessa ideana on kommunikoida Processingin ja Sonic Pi:n
välillä eli toisin sanoen yhdistää kuvaa ja ääntä. Kuvioiden ja musiikin
ohjelmoiminen erikseenkin on palkitsevaa, mutta mieti mitä
mahdollisuuksia olisi näiden taidemuotojen yhdistämisessä! Mikäli et ole
vielä käyttänyt lainkaan Sonic Pi:ta, on sinun hyvä hieman tutusta
siihen vaikka yllä linkatun Mehackit-materiaalin kautta.
Alla on vielä video Mehackitin järjestämästä Sonic Pi -työpajasta
Englannissa. Kun olet hieman tutustunut Sonic Pi:hin, siirry seuraavalle
sivulle!
Ensin tavoitteena on tuottaa visuaalisia kuvioita Sonic Pi:n äänien pohjalta.
Alla on Sonic Pi: -ohjelma, josta löydät yhden live_loopin. Loop tarkoittaa nimensä mukaisesti toistoa, ja voit verrata sitä Processingin draw-komentoon. Lue Sonic Pi -ohjelman kommentit (#-merkin jälkeen), ja koita päätellä, miten se toimii.
#OSC viestin lähettäminen
#määrittää mihin lähetetään
use_osc "localhost", 12000
live_loop :viesti do
#valitsee nuotin
nuotti = [60,80].choose
play nuotti
#lähettää viestin nimeltä paikka
osc "paikka/", nuotti
sleep 1
end
Kopioi sen jälkeen alta ohjelma Processingin puolelle.
/*
OSC viestin vastaanottaminen sonic pi:sta
muista asentaa oscP5 kirjasto kohdasta:
sketch-import-add library...
*/
import netP5.*;
import oscP5.*;
//luodaan muuttuja kommunikointia varten
OscP5 oscP5;
//muuttuja sonic pi:stä saatavalle arvolle
int arvo=0;
void setup() {
size(800, 600);
//luodaan oscP5 tyypin muuttuja
oscP5 = new OscP5(this, 12000);
}
void draw() {
background(100);
fill(0, 255, 255);
//nelikulmion sijainti riippuu muuttujasta arvo
rect(0+arvo, 0+arvo, 50, 60);
}
//metodi osc viestien vastaanottamiseen
void oscEvent(OscMessage aMessage) {
//katsotaan, onko viestin nimi paikka
if (aMessage.checkAddrPattern("paikka/") == true) {
//jos on, asetetaan viestin ensimmäinen numero
//muuttujaan arvo
arvo = aMessage.get(0).intValue();
}
}
Äskeisessä projektissa muodostettiin kuvaa Sonic Pi:n lähettämien viestien pohjalta. Mutta mitä, jos halauisitkin tehdä Processingilla jotain, ja tuotta Sonic Pi:lla ääniä sen pohjalta? Tällöin viestien tulee kulkea toiseen suuntaan.
#osc viestin vastaanottaminen
#asettaa sonic pin latenssin (viiveen) mahdollisimman pieneksi
set_sched_ahead_time! 0
#globaali muuttuja äänenvoimakkuudelle
volume = 0
#live_loop toistuu vain kun osc viesti saapuu
live_loop :osc do
viesti=sync"/osc/volume" #sync osc viestiin, huomaa lisätty /osc
#osc viesti tulee listana vaikka siinä olisi vain yksi arvo
#asetetaan listan ensimmäinen arvo äänenvoimakkuuden muuttujaan
volume = viesti[0]
sleep 0.125
end
#looppi pyörii alusta, mutta äänenvoimakkuuden säätää volume-muuttuja
live_loop :biitti do
sample :bd_mehackit, amp: volume
sleep 0.5
sample :sn_generic, amp: volume
sleep 0.5
end
/*
Osc viestin lähettäminen sonic pi:hin
muista asentaa oscP5 kirjasto kohdasta
sketch-import library- add library…
*/
import oscP5.*;
import netP5.*;
//luodaan muuttujat kommunikointia varten
OscP5 oscP5;
NetAddress sijainti;
void setup() {
size(400, 400);
/* start oscP5, listening for incoming messages at port 12000 */
oscP5 = new OscP5(this, 12000);
//sonic pi kuuntelee porttia 4559
sijainti = new NetAddress("127.0.0.1", 4559);
}
void draw() {
background(0);
}
//hiiren painallus lähettää viestin
void mousePressed() {
//luodaan osc viesti nimeltä "volume"
OscMessage myMessage = new OscMessage("/volume");
myMessage.add(1); //lisätään arvo 1 viestiin
oscP5.send(myMessage, sijainti);// viesti lähetetään sonic pille
}
Kun tutustuit äskeiseen ohjelmaan, huomasit varmaan osc-tekstit sekä Processingin että Sonic Pi:n puoella. OSC (Open sound control) on tapa, jolla eri ohjelmat voivat lähettää ääniviestejä keskenään. Lisätietoa OSC-kommunikaatiosta löydät täältä.
Kopioimassasi ohjelmassa Processing lähettää OSC-viestejä, jotka sisältävät hiiresi x- sekä y-koordinaatin. Tämä tapahtuu seuraavassa kohdassa ohjelmaa.
myOscMessage.add(mousex); // Adding those floats to the OSC message…
myOscMessage.add(mousey);
oscP5.send(myOscMessage, myBroadcastLocation); // Broadcast
Sonic-Pi puolestaan kuuntelee näitä viestejä, ja vastaanottaa ne
seuraavilla komennoilla ohjelmassa.
osc=sync "/osc/osc" # The OSC message which Processing sends, based on mouse coordinates.
mousex=osc[0] # Assigning the first argument to resonance.
mousey=osc[1] # Assigning the second argument to centre.
Lopulta Sonic Pi tuottaa ääntä hiiresi x- ja y-koordinaatin pohjalta.
myscale = scale_names[(73 * mousey).to_int] # mouse y sets scale
mynote = 24 + (48 * mousex) # mouse x sets scale root note
play scale(mynote,myscale,num_ontaves: 5).tick
Sonic Pi ei siis suoraan pysty kuuntelemaan hiiresi paikkaa - tähän tarvitaan Processingia. Sonic Pi kuuntelee ainoastaan Processingin kirjoittamia OSC-viestejä, joita voi sitten käsitellä haluamallaan tavalla.