42
42
#define TABLE_LENGTH 4096
43
43
double TWOPI = 2 * M_PI;
45
Tone::Tone (const std::string& definition, unsigned int sampleRate) : AudioLoop(), _sampleRate (sampleRate), _xhigher(0.0), _xlower(0.0)
45
Tone::Tone (const std::string& definition, unsigned int sampleRate) : AudioLoop(), _sampleRate (sampleRate), _xhigher (0.0), _xlower (0.0)
48
48
genBuffer (definition); // allocate memory with definition parameter
118
118
// Generate SAMPLING_RATE samples of sinus, buffer is the result
119
_debug("genSin(%d, %d)", freq1, freq2);
119
_debug ("genSin(%d, %d)", freq1, freq2);
120
120
genSin (bufferPos, freq1, freq2, count);
122
122
// To concatenate the different buffers for each section.
144
144
Tone::fillWavetable()
146
double tableSize = (double)TABLE_LENGTH;
146
double tableSize = (double) TABLE_LENGTH;
148
for(int i = 0; i < TABLE_LENGTH; i++) {
149
_wavetable[i] = sin( ((double)i / (tableSize - 1.0)) * TWOPI );
148
for (int i = 0; i < TABLE_LENGTH; i++) {
149
_wavetable[i] = sin ( ( (double) i / (tableSize - 1.0)) * TWOPI);
154
Tone::interpolate(double x)
154
Tone::interpolate (double x)
157
double yi_0, yi_1, A, B;
162
yi_0 =_wavetable[xi_0];
163
yi_1 = _wavetable[xi_1];
168
return A*yi_0 + B*yi_1;
157
double yi_0, yi_1, A, B;
162
yi_0 =_wavetable[xi_0];
163
yi_1 = _wavetable[xi_1];
168
return A*yi_0 + B*yi_1;
172
172
Tone::genSin (SFLDataFormat* buffer, int frequency1, int frequency2, int nb)
177
double sr = (double)_sampleRate;
178
double tableSize = (double)TABLE_LENGTH;
180
double N_h = sr / (double) (frequency1);
181
double N_l = sr / (double) (frequency2);
183
double dx_h = tableSize / N_h;
184
double dx_l = tableSize / N_l;
186
double x_h = _xhigher;
187
double x_l = _xlower;
189
double amp = (double)SFLDataAmplitude;
191
for (int t = 0; t < nb; t ++) {
192
buffer[t] = (int16)(amp*(interpolate(x_h) + interpolate(x_l)));
196
if(x_h > tableSize) {
200
if(x_l > tableSize) {
177
double sr = (double) _sampleRate;
178
double tableSize = (double) TABLE_LENGTH;
180
double N_h = sr / (double) (frequency1);
181
double N_l = sr / (double) (frequency2);
183
double dx_h = tableSize / N_h;
184
double dx_l = tableSize / N_l;
186
double x_h = _xhigher;
187
double x_l = _xlower;
189
double amp = (double) SFLDataAmplitude;
191
for (int t = 0; t < nb; t ++) {
192
buffer[t] = (int16) (amp* (interpolate (x_h) + interpolate (x_l)));
196
if (x_h > tableSize) {
200
if (x_l > tableSize) {