Homework 2 is about synthesizing an auditory streaming illusion using FM tones.

FM demo -- algorithmic control of panning

Adds a panning parameter to FMdemo4. Values are -1 to 1 for left to right stereo position.

////////////////////////////////////////////////////
suggestions for faster envelopes, faster, longer riffs with panning
cEnv.set( 10::ms, 8::ms, .25, 30::ms ); mEnv.set( 2::ms, 80::ms, .17, 20::ms ); for (0 => int i; i < 50; i++) stereo.pan( (i-20) / 20.0 ); .05::second => now; // riffPlay note duration .05::second => now; // riffPlay duration between note onsets
////////////////////////////////////////////////////
live code
global int mouseX, mouseY; global Event playRiff; SinOsc c => ADSR cEnv => Pan2 stereo => dac; //...as an inline modifier of a signal SinOsc m => blackhole; Step unity => ADSR mEnv => blackhole; //...as a separate signal 440 => float cf; 550 => float mf => m.freq; 200 => float index; // set A, D, S, and R // (note: A, D, R are durations; S is a number between 0 and 1) cEnv.set( 100::ms, 8::ms, .25, 300::ms ); mEnv.set( 20::ms, 80::ms, .17, 200::ms ); fun void runFM() { while( true ) { cf + (mEnv.last() * index * m.last()) => c.freq; 1::samp => now; } } spork ~ runFM(); fun void riffPlay() { for (0 => int i; i < 5; i++) { Std.mtof( 60 + i ) => cf; stereo.pan( (i-2) / 2.0 ); cEnv.keyOn(); mEnv.keyOn(); .1::second => now; cEnv.keyOff(); mEnv.keyOff(); .1::second => now; } } fun void mousePlay() { while (true) { playRiff => now; spork ~ riffPlay(); } } spork ~ mousePlay(); fun void RespondToMouseMovement() { while( true ) { mouseX*0.5 => m.freq; mouseY*0.5 => index; 10::ms => now; } } spork ~ RespondToMouseMovement(); 1::week => now;