// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: 26 December 1997 // Last Modified: Tue Apr 18 17:51:22 PDT 2000 (updated syntax) // Filename: ...sig/doc/examples/all/box/box.cpp // Syntax: C++; batonImprov 2.0 // // Description: Demonstrates how to create boxes on the radio drum. // Notice that the edged of the boxes are very narrow, // and the notes can oscillate at the edges. // #include "batonImprov.h" /*----------------- beginning of improvization algorithms ---------------*/ int boxlevel; // the height of the four boxes on the surface of the drum void stick1position(void); void stick2position(void); /*--------------------- maintenance algorithms --------------------------*/ void description(void) { printboxtop(); printstringline( " Description: Demonstrates how to create boxes +---------+---------+ "); psl( " on the radio drum. Notice that the edged of | note 1 | note 2 | "); psl( " the boxes are very narrow, and the notes can | | | "); psl( " oscillate at the edges. There are four boxes | (dial1) | (dial2) | "); psl( " on the drum surface, one for each quadrant. +---------+---------+ "); psl( " When a stick enters a box, it will generate a | note 3 | note 4 | "); psl( " note. | | | "); psl( " The volume of each box is controlled by | (dial3) | (dial4) | "); psl( " each of the four dials as indicated to the +---------+---------+ "); psl( " right. The b14+ raises the height of the boxes, and b15+ lowers "); psl( " the height of the box on the surface of the radio drum. "); printboxbottom(); } void initialization(void) { boxlevel = 100; baton.stick1position = stick1position; baton.stick2position = stick2position; } void finishup(void) { } /*-------------------- main loop algorithms -----------------------------*/ int newbox(int batonNumber) { // this function returns true if a new box was entered switch (batonNumber) { case 1: // check the z-axis if (baton.z1pb[0] > boxlevel && baton.z1pb[1] <= boxlevel) { return 1; } // first check to see if the x-axis border was crossed: if (baton.x1pc(0, 1)) { return 1; } // now check to see if the y-axis boarder was crossed: if (baton.y1pc(0, 1)) { return 1; } break; case 2: // check the z-axis if (baton.z2pb[0] > boxlevel && baton.z2pb[-1] <= boxlevel) { return 1; } // first check to see if the x-axis border was crossed: if (baton.x2pc(0, 1)) { return 1; } // now check to see if the y-axis boarder was crossed: if (baton.y2pc(0, 1)) { return 1; } break; } // end of switch // no new box return 0; } void playbox(int boxnumber) { switch (boxnumber) { case 11: synth.play(CH_10, GM_LOW_MID_TOM, baton.d1p); break; case 12: synth.play(CH_10, GM_HIGH_MID_TOM, baton.d2p); break; case 21: synth.play(CH_10, GM_LOW_TOM, baton.d3p); break; case 22: synth.play(CH_10, GM_HIGH_TOM, baton.d4p); break; } // end switch } void playboxnote1(void) { int boxnumber = 10 * baton.x1ps(1, 2) + baton.y1ps(1, 2); playbox(boxnumber); } void playboxnote2(void) { int boxnumber = 10 * baton.x2ps(1, 2) + baton.y2ps(1, 2); playbox(boxnumber); } void mainloopalgorithms(void) { } /*-------------------- triggered algorithms -----------------------------*/ void stick1position(void) { if (newbox(1)) { playboxnote1(); } } void stick2position(void) { if (newbox(2)) { playboxnote2(); } } void stick1trig(void) { } void stick2trig(void) { } void b14plustrig(void) { boxlevel--; if (boxlevel < 0) boxlevel = 0; cout << "boxlevel = " << boxlevel << endl; } void b15plustrig(void) { boxlevel++; if (boxlevel > 127) boxlevel = 127; cout << "boxlevel = " << boxlevel << endl; } void b14minusuptrig(void) { cout << "b14 pedal released" << endl; } void b14minusdowntrig(void) { cout << "b14 pedal released" << endl; } void b15minusuptrig(void) { cout << "b15 pedal released" << endl; } void b15minusdowntrig(void) { cout << "b15 pedal depressed" << endl; } void keyboardchar(int key) { charsynth(key); } /*------------------ end improvization algorithms -----------------------*/ // md5sum: 77cd37ef3f92e819522ad91250656d3a box.cpp [20050403]