Ää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();
  }
}
Tehtävä

Käynnistä ensin Processing-ohjelma ja tämän jälkeen Sonic Pi -ohjelma. Mitä huomaat? Miksi nelikulmion paikka vaihtelee ohjelmassa? 

Tee ohjelma, jossa nelikulmioita piirtyy kahden sijasta neljään eri paikkaan!


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

Tehtävä
  1. Kopioi alla oleva ohjelma Sonic Pi:hin.
#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
Tehtävä
  1. Kopioi sitten alla oleva ohjelma Processingin puolelle
/*
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
}
Tehtävä
  1. Käynnistä ensin Sonic Pi -ohjelma  (Run-painike ikkunan ylälaidassa).

  2. Käynnistä  sitten Processing -ohjelma.

  3. Klikkaile hiirtäsi ja kuuntele, miten ääni vaihtelee. Missä Processing-ohjelman osassa toiminto määritellään?

  4. Alla on lisää esimerkkejä, joissa kerrotaan miten voit jatkokehitellä ohjelmaasi.


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.

Tehtävä
Muokkaa Processing-ohjelmaa siten, että se lähettääkin Sonic Pi:hin hiiren paikan sijaan kokonaisluvun "60" aina sekunnin välein. Soita tämän jälkeen tämä numero Sonic Pi:ssa play-konennolla.