// Listing 5.14 Drum machine using patterns stored in arrays // sound chain: two drums SndBuf kick => dac; // (1) SndBufs for kick and snare drum sounds SndBuf snare => dac; // (2) load the sound files for our kick and snare drums me.dir() + "/audio/kick_01.wav" => kick.read; me.dir() + "/audio/snare_03.wav" => snare.read; // (3) set their pointers to end, to make no sound kick.samples() => kick.pos; snare.samples() => snare.pos; // drum patterns as logical variables, // (4) Arrays to hold logical values, play=1/not play=0 [1,0,0,0,1,0,0,0] @=> int kickPattern1[]; [0,0,1,0,0,0,1,0] @=> int kickPattern2[]; [1,0,1,0,1,0,1,0] @=> int snarePattern1[]; [1,1,1,1,0,1,1,1] @=> int snarePattern2[]; // function to play pattern arrays fun void playSection(int kickA[], int snareA[], float beattime) { // (5) playSection function, arrayarguments control patterns for (0 => int i; i < kickA.cap(); i++) { if (kickA[i]) { 0 => kick.pos; } if (snareA[i]) { 0 => snare.pos; } beattime::second => now; } } // Main program, infinite loop while (true) // (6) Infinite test loop { // (7) Call playSection with different patterns playSection(kickPattern1,snarePattern2,0.2); playSection(kickPattern2,snarePattern2,0.2); playSection(kickPattern1,snarePattern2,0.2); playSection(kickPattern2,snarePattern1,0.2); }