This example is for Processing (BETA) version 149+. If you have a previous version, use the examples included with your software. If you see any errors or have comments, please let us know.
Synthesizer 2 by R. Luke DuBois.
Sound is generated at setup with a triangle waveform and a simple envelope generator. Insert your own array of notes as 'rawSequence' and let it roll.
This example requires the Ess library. Download from this address and then follow the installation instructions: http://www.tree-axis.com/Ess/
import krister.Ess.*;
AudioChannel myChannel; // Create channel
TriangleWave myWave; // Create triangle waveform
Envelope myEnvelope; // Create envelope
int numNotes = 200; // Number of notes
int noteDuration = 300; // Duration of each note in milliseconds
float[] rawSequence = { 293.6648, 293.6648, 329.62756, 329.62756, 391.995,
369.99445 , 293.6648, 293.6648, 329.62756, 293.6648,
439.997, 391.995, 293.6648, 293.6648, 587.3294, 493.8834,
391.995, 369.9945, 329.62756, 523.2516, 523.2516,
493.8834, 391.995, 439.997, 391.995 }; // Happy birthday
void setup()
{
size(100, 100);
Ess.start(this); // Start Ess
myChannel = new AudioChannel(); // Create a new AudioChannel
myChannel.initChannel(myChannel.frames(rawSequence.length * noteDuration));
int current = 0;
myWave = new TriangleWave(480, 0.3); // Create triangle wave
EPoint[] myEnv = new EPoint[3]; // Three-step breakpoint function
myEnv[0] = new EPoint(0, 0); // Start at 0
myEnv[1] = new EPoint(0.25, 1); // Attack
myEnv[2] = new EPoint(2, 0); // Release
myEnvelope = new Envelope(myEnv); // Bind Envelope to the breakpoint function
int time = 0;
for (int i = 0; i < rawSequence.length; i++) {
myWave.frequency = rawSequence[current]; // Update waveform frequency
int begin = myChannel.frames(time); // Starting position within Channel
int e = int(noteDuration * 0.8);
int end = myChannel.frames(e); // Ending position with Channel
myWave.generate(myChannel, begin, end); // Render triangle wave
myEnvelope.filter(myChannel, begin, end); // Apply envelope
current++; // Move to next note
time += noteDuration; // Increment the Channel output point
}
myChannel.play(); // Play the sound!
}
void draw() { } // Empty draw() keeps the program running
void stop()
{
Ess.stop(); // When program stops, stop Ess too
super.stop();
}


