Goto: [ Program Documentation ]
//
// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Sat Mar 9 00:43:13 PST 1996
// Last Modified: Tue Apr 23 00:04:22 PDT 1996
// Last Modified: Tue Apr 18 12:29:16 PDT 2000 (syntax updated)
// Filename: .../sig/doc/examples/all/hundred/hundred.cpp
// Syntax: C++; batonImprov 2.0
//
// Description: Test of the detection of simultaneous triggering
// of both batons. Baton divided into 10 locations:
// 5 divisions along the x direction and 2 divisions along
// the y direction. Batons control the key number of the
// MIDI note: Baton 1 controlling the tens digits of the
// key number, and Baton 2 controlling the ones digit of
// the key number. Digits are arranged on the radio drum as:
// 1 2 3 4 5
// 6 7 8 9 0
//
#include "batonImprov.h"
Voice voice; // voice for output notes
int time1, time2; // for determining whether batons trigger together
int timbre = 0; // instrument to play voice upon
int keyno = 0; // the MIDI key number to play
void dial1position(void); // channel changer
void dial2position(void); // timbre changer
/***************** Beginning of user functions ****************************/
int makeDigit(int x, int y) {
static const int digitHolder[5][2] = // 1 2 3 4 5
{{6,1},{7,2},{8,3},{9,4},{0,5}}; // 6 7 8 9 0
return digitHolder[x][y];
}
int makeKeyno(int a1, int a2, int b1, int b2) {
return 10 * makeDigit(midiscale(a1,0,4), midiscale(a2,0,1)) +
1 * makeDigit(midiscale(b1,0,4), midiscale(b2,0,1));
}
/*---------------- Documentation functions -------------------------------*/
void description(void) {
cout
<< "______________________________________________________________ \n"
<< "| Description: |\n"
<< "| Test of the detection of simultaneous triggering |\n"
<< "| of both batons. Baton divided into 10 locations: |\n"
<< "| 5 divisions along the x direction and 2 divisions along |\n"
<< "| the y direction. Batons control the key number of the |\n"
<< "| MIDI note: Baton 1 controlling the tens digits of the |\n"
<< "| key number, and Baton 2 controlling the ones digit of |\n"
<< "| the key number. Digits are arranged on the radio drum as:|\n"
<< "| 1 2 3 4 5 |\n"
<< "| 6 7 8 9 0 |\n"
<< "| -- Craig Stuart Sapp, 9 Mar 1996 |\n"
<< "---------------------------------------------------------------\n"
;
}
void programhelp(void) {
cout
<< "> \n"
<< "> Baton 1: Tens digit of keyno to play \n"
<< "> x1t: Five divisions \n"
<< "> y1t: Two divisions \n"
<< "> w1t: Averages with w2t for key velocity of note. \n"
<< "> Baton 2: Ones digit of keyno to play \n"
<< "> x2t: Five divisions \n"
<< "> y2t: Two divisions \n"
<< "> w2t: Averages with w1t for key velocity of note. \n"
<< "> \n"
<< "> p1p: Channel Number to play note on. \n"
<< "> p2p: Timber of note. \n"
<< "> +b14: Command mode. \n"
<< "> +b15: This help screen. \n"
<< "> \n"
;
}
/*---------------- Initialization functions ------------------------------*/
void initialization(void) {
description();
baton.dial1position = dial1position;
baton.dial2position = dial2position;
voice.pc(timbre);
}
/*---------------- Main loop functions -----------------------------------*/
void mainloopalgorithms(void) { }
/*---------------- Trigger response functions ----------------------------*/
int togetherQ(void) {
if (abs(time1-time2) < 50) {
return 1;
} else {
return 0;
}
}
void ActIfTogether(void) {
int a1, a2, b1, b2;
if (togetherQ()) {
a1 = baton.x1t;
a2 = baton.y1t;
b1 = baton.x2t;
b2 = baton.y2t;
keyno = makeKeyno(a1, a2, b1, b2);
cout << "Keyno = " << keyno << endl;
voice.play(keyno, (baton.w1t+baton.w2t)/2);
}
}
void stick1trig(void) {
cout << "Baton 1 triggered. " << endl;
time1 = t_time;
ActIfTogether();
}
void stick2trig(void) {
cout << "Baton 2 triggered. " << endl;
time2 = t_time;
ActIfTogether();
}
void b14minusdowntrig(void) { }
void b14minusuptrig(void) { }
void b14plustrig(void) { cout << "B14+ triggered\n"; programhelp(); }
void b15minusdowntrig(void) { }
void b15minusuptrig(void) { }
void b15plustrig(void) { cout << "B15+ triggered\n"; programhelp(); }
/*---------------- Poll response functions -------------------------------*/
void dial1position(void) {
if (midiscale(baton.d1p,0,15) != voice.getChannel()) {
voice.setChannel(midiscale(baton.d1p,0,15));
cout << "Channel = " << voice.getChannel() << endl;
}
}
void dial2position(void) {
if (baton.d2p != timbre) {
timbre = baton.d2p;
voice.pc(timbre);
cout << "Timber = " << GeneralMidiName(timbre) << endl;
}
}
/*---------------- Actions to take just before leaving program -----------*/
void finishup(void) { }
void keyboardchar(int key) { }
/***************** End of user functions **********************************/
// md5sum: d6ee6cec1844aa238d21d15daa7caa6d hundred.cpp [20050403]