Version 4.2.0

This commit is contained in:
Gary Scavone
2009-03-24 23:02:14 -04:00
committed by Stephen Sinclair
parent cf06b7598b
commit a6381b9d38
281 changed files with 17152 additions and 12000 deletions

View File

@@ -8,48 +8,49 @@
at 22050 Hz, but will be appropriately
interpolated for other sample rates. You can
specify the maximum polyphony (maximum number
of simultaneous voices) via a #define in the
Drummer.h.
of simultaneous voices) in Drummer.h.
by Perry R. Cook and Gary P. Scavone, 1995 - 2002.
by Perry R. Cook and Gary P. Scavone, 1995 - 2004.
*/
/***************************************************/
#include "Tabla.h"
#include <string.h>
#include <math.h>
Tabla :: Tabla() : Instrmnt()
{
for (int i=0; i<TABLA_POLYPHONY; i++) {
filters[i] = new OnePole;
sounding[i] = -1;
for ( int i=0; i<TABLA_POLYPHONY; i++ ) {
filters_[i] = new OnePole;
sounding_[i] = -1;
}
// This counts the number of sounding voices.
nSounding = 0;
nSounding_ = 0;
}
Tabla :: ~Tabla()
{
int i;
for ( i=0; i<nSounding-1; i++ ) delete waves[i];
for ( i=0; i<TABLA_POLYPHONY; i++ ) delete filters[i];
for ( i=0; i<nSounding_; i++ ) delete waves_[i];
for ( i=0; i<TABLA_POLYPHONY; i++ ) delete filters_[i];
}
void Tabla :: noteOn(MY_FLOAT instrument, MY_FLOAT amplitude)
void Tabla :: noteOn(StkFloat instrument, StkFloat amplitude)
{
#if defined(_STK_DEBUG_)
std::cerr << "Tabla: NoteOn instrument = " << instrument << ", amplitude = " << amplitude << std::endl;
errorString_ << "Tabla::noteOn: instrument = " << instrument << ", amplitude = " << amplitude << '.';
handleError( StkError::DEBUG_WARNING );
#endif
MY_FLOAT gain = amplitude;
StkFloat gain = amplitude;
if ( amplitude > 1.0 ) {
std::cerr << "Tabla: noteOn amplitude parameter is greater than 1.0!" << std::endl;
errorString_ << "Tabla::noteOn: amplitude parameter is greater than 1.0 ... setting to 1.0.";
handleError( StkError::WARNING );
gain = 1.0;
}
else if ( amplitude < 0.0 ) {
std::cerr << "Tabla: noteOn amplitude parameter is less than 0.0!" << std::endl;
errorString_ << "Tabla::noteOn: amplitude parameter is less than 0.0 ... doing nothing.";
handleError( StkError::WARNING );
return;
}
@@ -71,91 +72,99 @@ void Tabla :: noteOn(MY_FLOAT instrument, MY_FLOAT amplitude)
"DrTak2.raw"
};
int noteNum = ((int) instrument) % 16;
int noteNum = ( (int) instrument ) % 16;
// Check first to see if there's already one like this sounding.
int i, waveIndex = -1;
for (i=0; i<TABLA_POLYPHONY; i++) {
if (sounding[i] == noteNum) waveIndex = i;
for ( i=0; i<TABLA_POLYPHONY; i++ ) {
if ( sounding_[i] == noteNum ) waveIndex = i;
}
if ( waveIndex >= 0 ) {
// Reset this sound.
waves[waveIndex]->reset();
filters[waveIndex]->setPole((MY_FLOAT) 0.999 - (gain * 0.6));
filters[waveIndex]->setGain(gain);
waves_[waveIndex]->reset();
filters_[waveIndex]->setPole( 0.999 - (gain * 0.6) );
filters_[waveIndex]->setGain( gain );
}
else {
if (nSounding == TABLA_POLYPHONY) {
if ( nSounding_ == TABLA_POLYPHONY ) {
// If we're already at maximum polyphony, then preempt the oldest voice.
delete waves[0];
filters[0]->clear();
WvIn *tempWv = waves[0];
OnePole *tempFilt = filters[0];
delete waves_[0];
filters_[0]->clear();
OnePole *tempFilt = filters_[0];
// Re-order the list.
for (i=0; i<TABLA_POLYPHONY-1; i++) {
waves[i] = waves[i+1];
filters[i] = filters[i+1];
for ( i=0; i<TABLA_POLYPHONY-1; i++ ) {
waves_[i] = waves_[i+1];
filters_[i] = filters_[i+1];
}
waves[TABLA_POLYPHONY-1] = tempWv;
filters[TABLA_POLYPHONY-1] = tempFilt;
waves_[TABLA_POLYPHONY-1] = 0;
filters_[TABLA_POLYPHONY-1] = tempFilt;
}
else
nSounding += 1;
nSounding_ += 1;
sounding[nSounding-1] = noteNum;
// Concatenate the STK RAWWAVE_PATH to the rawwave file
char path[128];
strcpy(path, "rawwaves/");
strcat(path, tablaWaves[noteNum]);
waves[nSounding-1] = new WvIn(path, TRUE);
waves[nSounding-1]->normalize(0.4);
filters[nSounding-1]->setPole((MY_FLOAT) 0.999 - (gain * 0.6) );
filters[nSounding-1]->setGain( gain );
sounding_[nSounding_-1] = noteNum;
// Concatenate the rawwave path to the file name.
waves_[nSounding_-1] = new WvIn( (std::string("rawwaves/") + tablaWaves[noteNum]).c_str(), true );
waves_[nSounding_-1]->normalize(0.4);
if ( Stk::sampleRate() != 22050.0 )
waves_[nSounding_-1]->setRate( 22050.0 / Stk::sampleRate() );
filters_[nSounding_-1]->setPole( 0.999 - (gain * 0.6) );
filters_[nSounding_-1]->setGain( gain );
}
#if defined(_STK_DEBUG_)
std::cerr << "Number Sounding = " << nSounding << std::endl;
for (i=0; i<nSounding; i++) std::cerr << sounding[i] << " ";
std::cerr << "\n";
errorString_ << "Tabla::noteOn: number sounding = " << nSounding_ << '\n';
for (i=0; i<nSounding_; i++) errorString_ << sounding_[i] << " ";
errorString_ << '\n';
handleError( StkError::DEBUG_WARNING );
#endif
}
void Tabla :: noteOff(MY_FLOAT amplitude)
void Tabla :: noteOff(StkFloat amplitude)
{
// Set all sounding wave filter gains low.
int i = 0;
while(i < nSounding) {
filters[i++]->setGain( amplitude * 0.01 );
}
while ( i < nSounding_ )
filters_[i++]->setGain( amplitude * 0.01 );
}
MY_FLOAT Tabla :: tick()
StkFloat Tabla :: tick()
{
MY_FLOAT output = 0.0;
OnePole *tempFilt;
int j, i = 0;
while (i < nSounding) {
if ( waves[i]->isFinished() ) {
delete waves[i];
tempFilt = filters[i];
lastOutput_ = 0.0;
while ( i < nSounding_ ) {
if ( waves_[i]->isFinished() ) {
delete waves_[i];
tempFilt = filters_[i];
// Re-order the list.
for (j=i; j<nSounding-1; j++) {
sounding[j] = sounding[j+1];
waves[j] = waves[j+1];
filters[j] = filters[j+1];
for ( j=i; j<nSounding_-1; j++ ) {
sounding_[j] = sounding_[j+1];
waves_[j] = waves_[j+1];
filters_[j] = filters_[j+1];
}
filters[j] = tempFilt;
filters[j]->clear();
sounding[j] = -1;
nSounding -= 1;
filters_[j] = tempFilt;
filters_[j]->clear();
sounding_[j] = -1;
nSounding_ -= 1;
i -= 1;
}
else
output += filters[i]->tick( waves[i]->tick() );
lastOutput_ += filters_[i]->tick( waves_[i]->tick() );
i++;
}
return output;
return lastOutput_;
}
StkFloat *Tabla :: tick(StkFloat *vector, unsigned int vectorSize)
{
return Instrmnt::tick( vector, vectorSize );
}
StkFrames& Tabla :: tick( StkFrames& frames, unsigned int channel )
{
return Instrmnt::tick( frames, channel );
}