// HID 2: Mouse
// name: mouse-fm.ck
// desc: uses first X/Y axes of a mouse to control mf and index for FM
// author: Spencer Salazar
global Event mouseMoved, mouseDown, mouseUp;
global int mouseDeltaX, mouseDeltaY;
// modulator to carrier
SinOsc m => SinOsc c => Envelope e => dac;
// carrier frequency
220 => c.freq;
// modulator frequency
550 => m.freq;
// index of modulation
1000 => m.gain;
// phase modulation is FM synthesis (sync is 2)
2 => c.sync;
// attack
10::ms => e.duration;
.5 => e.gain;
// variables
int base;
float a0;
float a1;
float a2;
int count;
// start things
set( base, a0, a1, a2 );
fun void RespondToMouseMovement()
{
while( true )
{
mouseMoved => now;
mouseDeltaX * .001 + a0 => a0;
mouseDeltaY * .001 + a1 => a1;
set( base, a0, a1, a2 );
}
}
spork ~ RespondToMouseMovement();
fun void RespondToMouseClickDown()
{
while( true )
{
mouseDown => now;
count++;
if( count == 1 ) e.keyOn();
set( base, a0, a1, a2 );
}
}
spork ~ RespondToMouseClickDown();
fun void RespondToMouseClickUp()
{
while( true )
{
mouseUp => now;
count--;
if( count <= 0 )
{
e.keyOff();
0 => count;
}
}
}
spork ~ RespondToMouseClickUp();
// infinite time loop
while( true )
{
0.1::second => now;
<<< "carrier:", c.freq(), "modulator:", m.freq(), "index:", m.gain() >>>;
}
// mapping function
fun void set( int base, float v0, float v1, float v2 )
{
// modulator frequency
( 500 + 5*base + ( 500 * v0) ) => m.freq;
// carrier frequency
( 220 + (220 * v2) ) => c.freq;
// index of modulation
( 1000 * (v1+1) ) => m.gain;
//<<< "carrier:", c.freq(), "modulator:", m.freq(), "index:", m.gain() >>>;
}