// Listing 4.12a SndBufs and panning connections for your big drum machine
// Drum Machine, version 4.0
// by block-rockin programmer, Jan 1, 2099
// Here we'll use Modulo % and random to play drums
// Define array of master Gains for left, center, right
Gain master[3];
master[0] => dac.left; // Connects left ([0]) to dac.left.
master[1] => dac; // Connects center ([1]) to dac (both
// left and right automatically).
master[2] => dac.right; // Connects right ([2]) to dac.right.
// Declare SndBufs for lots of drums
// hook them up to pan positions
SndBuf kick => master[1]; // Connects kick drum SndBuf to center master gain.
SndBuf snare => master[1]; // Connects snare drum to center also.
SndBuf hihat => master[2]; // Connects hihat to right master gain.
SndBuf cowbell => master[0]; // Connects cowbell SndBuf to left master gain.
// Use a Pan2 for the hand claps,
// we'll use random panning later
SndBuf claps => Pan2 claPan; // Connects clap SndBuf to a Pan2 object.
claPan.chan(0) => master[0]; // Connects the left (0) channel of the Pan2 to master gain left.
claPan.chan(1) => master[2]; // Connects the right (1) channel of the Pan2 to master gain right.
// load up some samples of those // Loads all the sound files.
me.dir()+"/audio/kick_01.wav" => kick.read;
me.dir()+"/audio/snare_01.wav" => snare.read;
me.dir()+"/audio/hihat_01.wav" => hihat.read;
me.dir()+"/audio/cowbell_01.wav" => cowbell.read;
me.dir()+"/audio/clap_01.wav" => claps.read;
// Listing 4.12b Setting up variables for your big drum machine
// (1) Array to control cowbell strikes.
[1,0,1,0, 1,0,0,1, 0,1,0,1, 0,1,1,1] @=> int cowHits[];
// controls the overall length of our "measures"
// .cap() determines the maximum number of beats in your measure.
cowHits.cap() => int MAX_BEAT; // define using all caps, remember?
// modulo number for controlling kick and snare
4 => int MOD; // Constant for MOD operator--
// You'll use this to control
// kick and snare drum hits.
// overall speed control // Master speed control (tempo)--
0.15 :: second => dur tempo; // you'll use this to advance time each beat.
// counters: beat within measures, and measure
0 => int beat; // Two counters, one for beat
0 => int measure; // and one for measure number.
// Listing 4.12c Main loop to actually play drum patterns
// Main infinite drum loop
while (true)
{
// play kick drum on all main beats (0, 4, ...)
if (beat % 4 == 0) // (1) Uses MOD 4 to play
{ // kick drum every fourth beat
0 => kick.pos;
}
// after a time, play snare on off beats (2, 6, ...)
if (beat % 4 == 2 && measure %2 == 1) // (2) Plays snare only on specific beats
{
0 => snare.pos;
}
// After a time, randomly play hihat or cowbell
if (measure > 1) { // (3) Plays cowbell and hihat only after measure 1
if (cowHits[beat]) // (4) Plays cowbell, controlled by array
{
0 => cowbell.pos;
}
else // (5) If not cowbell, then hi-hat
{
Math.random2f(0.0,1.0) => hihat.gain; // (6) Hi-hat has random gain
0 => hihat.pos;
}
}
// after a time, play randomly spaced claps at end of measure
if (beat > 11 && measure > 3) // (7) Plays claps only on certain measures and beats
{
Math.random2f(-1.0,1.0) => claPan.pan; // (8) Claps have random pan
0 => claps.pos;
}
tempo => now; // (9) Waits for one beat...
(beat + 1) % MAX_BEAT => beat; // (10) ...and then updates beat counter (MOD MAX)
if (beat==0)
{ // (11) Increments measure counter at each new measure
measure++;
}
}