// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Sun Jul 2 15:23:31 PDT 2000 // Last Modified: Sun Jul 2 15:23:35 PDT 2000 // Filename: ...sig/doc/examples/all/loopcount/loopcount.cpp // Syntax: C++; synthImprov 2.0 // // Description: Counts the number of times the mainloop is called during // one second. You can controll the speed of the looping up to the // maximum possible looping speed. // #include "batonImprov.h" /*----------------- beginning of improvization algorithms ---------------*/ SigTimer timer; // for keeping track of time double tempo = 60.0; // tempo for fixed tempo algorithms int counter = 0; // count the loop iterations double idletime = 0.0; // pause between loops in milliseconds int getMaxCycle(void); /*--------------------- maintenance algorithms --------------------------*/ ////////////////////////////// // // description -- this function is called by the improv interface // whenever a capital "D" is pressed on the computer keyboard. // Put a description of the program and how to use it here. // void description(void) { cout << "LOOPCOUNT -- Craig Stuart Sapp <craig@ccrma.stanford.edu> July 2000\n" " Description: Counts the number of times the mainloop is called during\n" " one second. You can controll the speed of the looping up to the\n" " maximum possible looping speed.\n" " Commands:\n" " < = slow down report tempo > = speed up report tempo \n" " [ = speed up idle duration ] = slow down idle duration \n" " r = perform a raw loop count\n" << endl; } ////////////////////////////// // // initialization -- this function is called by the improv // interface once at the start of the program. Put items // here which need to be initialized at the beginning of // the program. // void initialization(void) { timer.setTempo(tempo); timer.reset(); eventIdler.setPeriod(idletime); } ////////////////////////////// // // finishup -- this function is called by the improv interface // whenever the program is exited. Put items here which // need to be taken care of when the program is finished. // void finishup(void) { } /*-------------------- main loop algorithms -----------------------------*/ ////////////////////////////// // // mainloopalgorithms -- this function is called by the improv interface // continuously while the program is running. The global variable t_time // which stores the current time is set just before this function is // called and remains constant while in this functions. // void mainloopalgorithms(void) { if (timer.expired()) { cout << "beat loop count = " << counter << endl; counter = 0; timer.update(); } else { counter++; } } /*-------------------- triggered algorithms -----------------------------*/ void stick1trig(void) { } void stick2trig(void) { } void b14plustrig(void) { } void b15plustrig(void) { } void b14minusuptrig(void) { } void b14minusdowntrig(void) { } void b15minusuptrig(void) { } void b15minusdowntrig(void) { } /////////////////////////////// // // keyboardchar -- this function is called by the improv interface // whenever a key is pressed on the computer keyboard. // Put commands here which will be executed when a key is // pressed on the computer keyboard. // void keyboardchar(int key) { switch (key) { case '<': // slow the tempo down for fixed tempo options case ',': // slow the tempo down for fixed tempo options tempo /= 1.02; timer.setTempo(tempo); cout << "Fixed tempo set to: " << tempo << endl; break; case '>': // speed up the tempo down for fixed tempo options case '.': // speed up the tempo down for fixed tempo options tempo *= 1.02; timer.setTempo(tempo); cout << "Fixed tempo set to: " << tempo << endl; break; case '[': // lower idle duration case '{': // lower idle duration idletime -= 1.0; if (idletime < 0.0) { idletime = 0.0; } eventIdler.setPeriod(idletime); cout << "Idle duration is " << idletime << " milliseconds" << endl; break; case ']': // raise idle duration case '}': // raise idle duration idletime += 1.0; eventIdler.setPeriod(idletime); cout << "Idle duration is " << idletime << " milliseconds" << endl; break; case 'r': // raw loop cycle count cout << "Maximum possible cyclecount = " << getMaxCycle() << endl; } } /*------------------ end improvization algorithms -----------------------*/ ////////////////////////////// // // getMaxCycle -- returns the cycle count that occurs when // nothing is done except continuously access the // CPUs cyclecount register in the SigTimer::expired() function. // int getMaxCycle(void) { SigTimer x; x.setTempo(60); x.reset(); int counter = 0; while (!x.expired()) { counter++; } return counter; } // md5sum: 60e0f70cde269f4f3b48f1fcec863a92 loopcount.cpp [20050403]