Assignment 9.1

posted Jul 17, 2010, 5:53 PM by Unknown user   [ updated Jul 17, 2010, 6:04 PM ]
Hooked up potentiometers to the arduino board, sent values through serial, read them in processing, same old stuff, the only addition being at the end the values are converted into frequencies / amplitudes and played using the minim library. Pretty simple - I did add an extra octave for a little extra complexity though.

ARDUINO CODE:
 
 
const int pot1 = 5;
const int pot2 = 4;

void setup () {
  Serial.begin(9600);  //begin serial communication at 9600 bps
}
void loop () {
  //print to serial port
  Serial.print(analogRead(pot1));  
  Serial.print(',');
  Serial.println(analogRead(pot2));  
  delay(20);
}

PROCESSING CODE:
 
 
import processing.serial.*;
 
 
import ddf.minim.*;
import ddf.minim.signals.*;

Serial serPort;

Minim minim;
AudioOutput out;
SineWave sine;
SineWave octaveDown;

void setup () {
  
  size(512, 200, P2D);

  minim = new Minim(this);
  // get a line out from Minim, default bufferSize is 1024, default sample rate is 44100, bit depth is 16
  out = minim.getLineOut(Minim.STEREO);

  // create a sine wave Oscillator, set to 440 Hz, at 0.5 amplitude, sample rate from line out
  sine = new SineWave(440, 0.5, out.sampleRate());

  // create second wave at half frequency (one octave down)
  octaveDown = new SineWave(220, 0.5, out.sampleRate());

  // set the portamento speed on the oscillator to 200 milliseconds
  octaveDown.portamento(20);
  sine.portamento(20);

  // add the oscillator to the line out
  out.addSignal(sine);
  out.addSignal(octaveDown);

  // set up serial buffer
  serPort = new Serial(this, Serial.list()[0], 9600);
  serPort.bufferUntil('\n');
}

void draw () {
  background(0);
  stroke(255);
  // draw the waveforms
  for(int i = 0; i < out.bufferSize() - 1; i++)
  {
    float x1 = map(i, 0, out.bufferSize(), 0, width);
    float x2 = map(i+1, 0, out.bufferSize(), 0, width);
    line(x1, 50 + out.left.get(i)*50, x2, 50 + out.left.get(i+1)*50);
    line(x1, 150 + out.right.get(i)*50, x2, 150 + out.right.get(i+1)*50);
  }
}

void serialEvent(Serial serPort) {
   //store message from buffer in string
  String message = serPort.readStringUntil('\n');
  if(message != null) {
    //remove whitespace and other nonsense
    message = trim(message);

    //set frequency to the pot value remapped to 60 - 1500 Hz
    float freq = int(split(message, ','))[0];
    sine.setFreq(map(freq, 0, 1023, 1500, 60));
    //do the same to the octaveDown but cut the freq in half
    octaveDown.setFreq(map(freq, 0, 1023, 1500, 60)/2);
    
    //set amp to value of 2nd pot, remapped to 0 - 1
    float amp = int(split(message, ','))[1];
    sine.setAmp(map(amp, 0, 1023, 0, 1));
    octaveDown.setAmp(map(amp, 0, 1023, 0, 1));
  }
}
void stop()
{
  //deallocate classes and whatnot
  out.close();
  minim.stop();
  
  super.stop();
}

FRITZING DIAGRAM:
 
 
 
 

Comments