*** empty log message ***
[chuck-blob.git] / exile / nime_workshop / examples / mand-o-matic.ck
blob182d358b9c9783977a279e3fc8e2fa7916701727
1 //---------------|
2 // mand-o-matic!
3 // by: Ge Wang (gewang@cs.princeton.edu)
4 //     Perry R. Cook (prc@cs.princeton.edu)
5 //------------------|
7 // our patch
8 Mandolin mand => JCRev r => Echo a => Echo b => Echo c => dac;
9 // set the gain
10 .95 => r.gain;
11 // set the reverb mix
12 .2 => r.mix;
13 // set max delay for echo
14 1000::ms => a.max => b.max => c.max;
15 // set delay for echo
16 750::ms => a.delay => b.delay => c.delay;
17 // set the initial effect mix
18 0.0 => a.mix => b.mix => c.mix;
20 // shred to modulate the mix
21 fun void echo_shred( )
23     0.0 => float decider => float mix => float old => float inc;
25     // time loop
26     while( true )
27     {
28         std.rand2f(0.0,1.0) => decider;
29         if( decider < .35 ) 0.0 => mix;
30         else if( decider < .55 ) .08 => mix;
31         else if( decider < .8 ) .5 => mix;
32         else .15 => mix;
34         // find the increment
35         (mix-old)/1000.0 => inc; 1000 => int n;
36         // time loop
37         while( n-- )
38         {
39             // set the mix for a, b, c
40             old + inc => old => a.mix => b.mix => c.mix;
41             1::ms => now;
42         }
43         // remember the old
44         mix => old;
45         // let time pass until the next iteration
46         std.rand2(2,6)::second => now;
47     }
50 // let echo shred go
51 spork ~ echo_shred();
53 // our main loop
54 while( true )
56     // position
57     std.rand2f( 0.2, 0.8 ) => mand.pluckPos;
58     // frequency...
59     2 * std.rand2( 0, 4 ) => int freq;
60     if( freq == 6 ) 7 => freq; if( freq == 8 ) 9 => freq;
61     220.0 * math.pow( 1.05946, (std.rand2(0,2)*12)
62                       +freq ) => mand.freq;
63     // pluck it!
64     std.rand2f( 0.2, 0.9 ) => mand.pluck;
66     if( std.randf() > 0.8 )
67     { 500::ms => now; }
68     else if( std.randf() > .85 )
69     { 250::ms => now; }
70     else if( std.randf() > -0.9 )
71     { .125::second => now; }
72     else
73     {
74         1 => int i => int pick_dir;
75         // how many times
76         4 * std.rand2( 1, 5 ) => int pick;
77         0.0 => float pluck;
78         0.7 / pick => float inc;
79         // time loop
80         for( ; i < pick; i++ )
81         {
82             75::ms => now;
83             std.rand2f(.2,.3) + i*inc => pluck;
84             pluck + -.2 * pick_dir => mand.pluck;
85             // simulate pluck direction
86             !pick_dir => pick_dir;
87         }
88         // let time pass for final pluck
89         75::ms => now;
90     }