I built a completely new circuit for this one. I got rid of the push buttons and added two potentiometers attached to analog pins 0 and 4 so that I could get two analog values to control the frequency(pitch) and amplitude(volume).
Arduino:
int potPin1 = 0; // set up variables
int potPin2 = 4; int val1 = 0; int val2 = 0; void setup() {
Serial.begin(9600); // begin serial communication at 9600 bps } void loop() {
val1 = analogRead(potPin1); // read potPin value and store in val1 val1 = map(val1, 0, 1023, 0, 4978); // adjust values val2 = analogRead(potPin2);
val2 = map(val2, 0, 1023, 0, 4978); Serial.print(val1, DEC); // print values and separate with a comma
Serial.print(','); Serial.println(val2, DEC); } Processing:
import processing.serial.*; // import libraries
import ddf.minim.*; import ddf.minim.signals.*; Minim minim; // set up variables AudioOutput out; SineWave sine; Serial myPort; float freq; float amp; void setup() {
size(400, 220, P2D); // sets window size minim = new Minim(this); // get a line out from Minim with default bufferSize, sample rate, and bit depth out = minim.getLineOut(Minim.STEREO); // create a sine wave oscillator, set to value of freq, value of amp, sample rate from line out sine = new SineWave(freq, amp, out.sampleRate()); // set the portamento speed on the oscillator to 200 milliseconds sine.portamento(200); // add the oscillator to the line out out.addSignal(sine); // declares myPort and begins serial communication at 9600 bps myPort = new Serial(this, Serial.list()[0], 9600); // store values from myPort in a buffer until value is reached myPort.bufferUntil('\n'); } void draw() {
background(0); // sets background color stroke(255); // sets stroke color // 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 myPort) {
// read string and store it in a buffer until value is reached String myString = myPort.readStringUntil('\n'); // if there is something in myString if(myString != null) { // split it at the comma myString = trim(myString); int sensors[] = int(split(myString, ',')); for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++) { // print the sensor values print("Sensor " + sensorNum + ": " + sensors[sensorNum] + "\t"); } println(); if(sensors.length > 1) { // adjust the value of sensors[0] and set as freq float freq = map(sensors[0], 0, 4978, 1500, 60); // set the frequency to the new values sine.setFreq(freq); // adjust the value of sensors[1] and set as amp float amp = map(sensors[1], 0, 4978, -1, 1); // set the amplitude to the new values sine.setAmp(amp); } } sine.setPan(0); // set speaker balance to even } void stop() {
out.close(); minim.stop(); super.stop(); } A Fritzing picture of the circuit is attached. |