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]