/** * This sketch demonstrates how to use an SawWave with an AudioOutput.
* Move the mouse up and down to change the frequency, left and right to change the panning.
*
* SawWave is a subclass of Oscillator, which is an abstract class that implements the interface AudioSignal.
* This means that it can be added to an AudioOutput and the AudioOutput will call one of the two * generate() functions, depending on whether the AudioOutput is STEREO or MONO. Since it is an * abstract class, it can't be directly instantiated, it merely provides the functionality of * smoothly changing frequency, amplitude and pan. In order to have an Oscillator that actually * produces sound, you have to extend Oscillator and define the value() function. This function * takes a step value and returns a sample value between -1 and 1. */ import ddf.minim.*; import ddf.minim.signals.*; Minim minim; AudioOutput out; SawWave saw; void setup() { size(512, 200, P3D); minim = new Minim(this); // get a line out from Minim, default sample rate is 44100, bit depth is 16 out = minim.getLineOut(Minim.STEREO, 2048); // create a sine wave Oscillator, set to 440 Hz, at 0.5 amplitude, sample rate to match the line out saw = new SawWave(440, 0.2, out.sampleRate()); // set the portamento speed on the oscillator to 200 milliseconds saw.portamento(200); // add the oscillator to the line out out.addSignal(saw); } 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 mouseMoved() { // with portamento on the frequency will change smoothly float freq = map(mouseY, 0, height, 1500, 60); saw.setFreq(freq); // pan always changes smoothly to avoid crackles getting into the signal // note that we could call setPan on out, instead of on sine // this would sound the same, but the waveforms in out would not reflect the panning float pan = map(mouseX, 0, width, -1, 1); saw.setPan(pan); } void stop() { out.close(); minim.stop(); super.stop(); }