// // Programmer: Craig Sapp <craig@ccrma.stanford.edu> // Programmer: Juan Reyes <juanig@ccrma.stanford.edu> // Creation Date: 12 April 2000 // Last Modified: 15 April 2000 // Filename: ...sig/doc/examples/improv/synthImprov/henontune.cpp // Syntax: C++; synthImprov 2.0 // // Description: This is a template which you fill with algorithms // in the following functions to create a synthImprov program. // // See Also: http://henon.sapp.org // for a non-realtime musical implementation of the Henon map. // #include "synthImprov.h" // includes the default Win95 console interface // for the synthImprov environment void startHenon(int prealpha, int prebeta); int nextHenon(void); /*----------------- beginning of improvization algorithms ---------------*/ MidiMessage message; double y = 0.0; double x = 0.0; double newx; double newy; int key; int nextnotetime; double alpha = -1.56693; double beta = -0.011811; Voice voice; /*--------------------- 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 << "Some good results:\n" "Alpha = -1.81496 (58) Beta = -0.208661 (37) \n" "Alpha = -1.56693 (79) Beta = -0.011811 (62) \n" "Alpha = -1.85039 (55) Beta = 0.00393701 (64) \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) { nextnotetime = t_time; } ////////////////////////////// // // 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 (synth.getNoteCount() > 0) { message = synth.extractNote(); if (message.p2() != 0) { startHenon(message.p1(), message.p2()); } } if (nextnotetime < t_time) { nextnotetime += 100; key = nextHenon(); voice.play(key, 64); } } void startHenon(int prealpha, int prebeta) { alpha = prealpha/127.0 * 1.5 - 2.5; beta = prebeta/127.0 - 0.5; x = 0.0; y = 0.0; cout << "Alpha = " << alpha << " (" << prealpha << ")" << "\tBeta = " << beta << " (" << prebeta << ")" << endl; } int nextHenon(void) { newx = 1 + alpha * x * x + beta * y; newy = x; x = newx; y = newy; int output; output = (int)((x + 1.0)/2.0 * 127.0 + 0.5); if (output < 0) { output = 0; } if (output > 127) { output = 127; } return output; } /*-------------------- triggered algorithms -----------------------------*/ /////////////////////////////// // // 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) { } /*------------------ end improvization algorithms -----------------------*/ // md5sum: 0f8aa5ec5c782a4439742a50fe3dc213 henontune.cpp [20050403]