//
// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Tue Feb 2 16:49:52 PST 1999
// Last Modified: Tue Feb 2 16:49:57 PST 1999
// Filename: ...improv/doc/examples/batonImprov/theremin/theremin.cpp
// Syntax: C++; batonImprov
//
// Description: Plays an oscillator with baton 1/2 x-axis controlling
// frequency and baton 1/2 y-axis controlling amplitude.
//
#include "batonImprov.h"
#include "sig.h"
/*----------------- beginning of improvization algorithms ---------------*/
// sound elements
Constant smoothamt(0.0005);
Constant Axaxis;
Constant Ayaxis;
Smoother Afrequency;
Smoother Aamplitude;
Osc Aosc;
Constant Bsmoothamt(0.001);
Constant Bxaxis;
Constant Byaxis;
Smoother Bfrequency;
Smoother Bamplitude;
Osc Bosc;
Add add;
Scale scale(0.5);
LinuxSoundOut outsound(44100, 2);
Action action;
SigTimer soundTimer;
SigTimer displayTimer;
int positionDisplay = 0;
double smoothFactor = 0.0005;
SoundHeader header;
SoundFileOut *fileout;
int sine1 = 1; // boolean for outputing sine1 sound
int sine2 = 1; // boolean for outputing sine2 sound
/*--------------------- maintenance algorithms --------------------------*/
void description(void) {
cout
<< "Initial test program for live sound with Improv programs"
<< "press 'p' to toggle frequency position display\n"
<< endl;
}
void initialization(void) {
header.setHighMono();
fileout = new SoundFileOut("test.snd", header);
// sound element connections
Afrequency.connect(Axaxis);
Afrequency.connect(smoothamt);
Aamplitude.connect(Ayaxis);
Aamplitude.connect(smoothamt);
Aosc.connect(Afrequency);
Aosc.connect(Aamplitude);
Bfrequency.connect(Bxaxis);
Bfrequency.connect(smoothamt);
Bamplitude.connect(Byaxis);
Bamplitude.connect(smoothamt);
Bosc.connect(Bfrequency);
Bosc.connect(Bamplitude);
add.connect(Aosc);
add.connect(Bosc);
scale.connect(add);
outsound.connect(scale);
outsound.connect(scale);
fileout->connect(outsound);
action.freezeState(*fileout);
eventIdler.setPeriod(0);
soundTimer.setPeriod(5);
displayTimer.setPeriod(200);
}
void finishup(void) { }
/*-------------------- main loop algorithms -----------------------------*/
void mainloopalgorithms(void) {
Axaxis.setValue((baton.x1p/127.0)*3200 + 200);
Ayaxis.setValue(baton.y1p/127.0);
Bxaxis.setValue((baton.x2p/127.0)*3200 + 200);
Byaxis.setValue(baton.y2p/127.0);
if (positionDisplay && displayTimer.expired()) {
displayTimer.reset();
cout << "\rfrequency: " << Afrequency.output(0)
<< ", " << Bfrequency.output(0)
<< " amplitude: " << Aamplitude.output(0)
<< ", " << Bamplitude.output(0)
<< flush;
}
if (soundTimer.expired()) {
soundTimer.reset();
action.tick(*fileout, 512);
}
}
/*-------------------- 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) { }
void keyboardchar(int key) {
switch (key) {
case '[': // decrease smooth factor
smoothFactor -= 0.00001;
if (smoothFactor < 0.000) {
smoothFactor = 0.0;
}
smoothamt.setValue(smoothFactor);
cout << "Smooth factor is: " << smoothFactor << endl;
break;
case ']': // increase smooth factor
smoothFactor += 0.00001;
if (smoothFactor > 1.000) {
smoothFactor = 1.0;
}
smoothamt.setValue(smoothFactor);
cout << "Smooth factor is: " << smoothFactor << endl;
break;
case 'p': // toggle position display
positionDisplay = !positionDisplay;
if (positionDisplay) {
cout << "position display ON" << endl;
} else {
cout << "\nposition display OFF" << endl;
}
break;
case '1':
sine1 = !sine1;
if (sine1) {
add.connect(Aosc, 1, 1);
cout << "Turning on sine 1" << endl;
} else {
add.disconnect(Aosc);
cout << "Turning off sine 1" << endl;
}
break;
case '2':
sine2 = !sine2;
if (sine2) {
add.connect(Bosc, 1, 2);
cout << "Turning on sine 2" << endl;
} else {
add.disconnect(Bosc);
cout << "Turning off sine 2" << endl;
}
break;
}
}
/*------------------ end improvization algorithms -----------------------*/
// md5sum: 82564355cebefa865bcdc07df8585380 theremin.cpp [20050403]