//-----------------------------------------------------------------------------
// name: joy-noise.ck
// desc: using joystick to control noise (first 3 axes + buttons)
//
// note: select between joysticks by specifying device number;
// to see a list of devices and their numbers, either...
// 1) view the Device Browser window in miniAudicle (select
// "Human Interface Devices" in the drop-down menu)
// OR 2) from the command line:
// > chuck --probe
//
// author: Ge Wang (https://ccrma.stanford.edu/~ge/)
//-----------------------------------------------------------------------------
// HID input and HID message
Hid hi;
HidMsg msg;
// which joystick
0 => int device;
// get from command line
if( me.args() ) me.arg(0) => Std.atoi => device;
// open joystick
if( !hi.openJoystick( device ) ) me.exit();
<<< "joystick '" + hi.name() + "' ready...", "" >>>;
// patch
Noise n => BiQuad f => Envelope e => Pan2 p => dac;
e => Echo echo => p;
e => Echo echo2 => p;
e => Echo echo3 => p;
// set biquad pole radius
.99 => f.prad;
// set biquad gain
.05 => f.gain;
// set equal zeros
1 => f.eqzs;
// our float
0.0 => float t;
// set echo
echo.delay() * 2 => echo2.max => echo2.delay;
echo.delay() * 3 => echo3.max => echo3.delay;
echo.gain( .75 );
echo.gain() * .25 => echo2.gain;
echo2.gain() * .25 => echo3.gain;
// set gain
.5 => n.gain;
// attack
10::ms => e.duration;
// variables
0 => float value;
1 => float factor;
0 => float q;
0 => int count;
// initialize
set( value, factor, q );
// infinite time loop
while( true )
{
// wait on event
hi => now;
// recv message
while( hi.recv( msg ) )
{
// axis 0: map to pan
if( msg.isAxisMotion() && msg.which == 0 )
{ msg.axisPosition => p.pan; }
// axis 1: map to pfreq
if( msg.isAxisMotion() && msg.which == 1 )
{ -msg.axisPosition => value; set( value, factor, q ); }
// axis 2: map to Q
if( msg.isAxisMotion() && msg.which == 2 )
{ msg.axisPosition => q; set( value, factor, q ); }
// button down (any)
if( msg.isButtonDown() )
{ count++; if( count ) e.keyOn(); msg.which + 1 => factor; set( value, factor, q ); }
// button up (any)
if( msg.isButtonUp() )
{ count--; if( !count ) e.keyOff(); }
}
}
// do actual mapping control
fun void set( float value, float factor, float q )
{
(value * 440 + 480) * factor => f.pfreq;
// hacked q mapping
if( q >= 0 )
{ .99+.009*(Math.pow(2,q)-1) => f.prad; .25+.5*(1-q) => e.gain; }
else
{ .99-.09*(Math.pow(2,-q)-1) => f.prad; 1 => e.gain; }
if( count )
<<< "pan:", p.pan(), "resonance:", f.pfreq(), "radius:", f.prad() >>>;
}