void organicInstrument::playNote( NotePlayHandle * _n, sampleFrame * _working_buffer ) { const fpp_t frames = _n->framesLeftForCurrentPeriod(); const f_cnt_t offset = _n->noteOffset(); if( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { Oscillator * oscs_l[m_numOscillators]; Oscillator * oscs_r[m_numOscillators]; for( int i = m_numOscillators - 1; i >= 0; --i ) { m_osc[i]->m_phaseOffsetLeft = rand() / ( RAND_MAX + 1.0f ); m_osc[i]->m_phaseOffsetRight = rand() / ( RAND_MAX + 1.0f ); // initialise ocillators if( i == m_numOscillators - 1 ) { // create left oscillator oscs_l[i] = new Oscillator( &m_osc[i]->m_waveShape, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningLeft, m_osc[i]->m_phaseOffsetLeft, m_osc[i]->m_volumeLeft ); // create right oscillator oscs_r[i] = new Oscillator( &m_osc[i]->m_waveShape, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningRight, m_osc[i]->m_phaseOffsetRight, m_osc[i]->m_volumeRight ); } else { // create left oscillator oscs_l[i] = new Oscillator( &m_osc[i]->m_waveShape, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningLeft, m_osc[i]->m_phaseOffsetLeft, m_osc[i]->m_volumeLeft, oscs_l[i + 1] ); // create right oscillator oscs_r[i] = new Oscillator( &m_osc[i]->m_waveShape, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningRight, m_osc[i]->m_phaseOffsetRight, m_osc[i]->m_volumeRight, oscs_r[i + 1] ); } } _n->m_pluginData = new oscPtr; static_cast<oscPtr *>( _n->m_pluginData )->oscLeft = oscs_l[0]; static_cast<oscPtr *>( _n->m_pluginData )->oscRight = oscs_r[0]; } Oscillator * osc_l = static_cast<oscPtr *>( _n->m_pluginData )->oscLeft; Oscillator * osc_r = static_cast<oscPtr *>( _n->m_pluginData)->oscRight; osc_l->update( _working_buffer + offset, frames, 0 ); osc_r->update( _working_buffer + offset, frames, 1 ); // -- fx section -- // fxKnob is [0;1] float t = m_fx1Model.value(); for (int i=0 ; i < frames ; i++) { _working_buffer[i][0] = waveshape( _working_buffer[i][0], t ) * m_volModel.value() / 100.0f; _working_buffer[i][1] = waveshape( _working_buffer[i][1], t ) * m_volModel.value() / 100.0f; } // -- -- instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n ); }
/* * Prepare the Oscillator */ void OscilGen::prepare() { int i, j, k; REALTYPE a, b, c, d, hmagnew; if((oldbasepar != Pbasefuncpar) || (oldbasefunc != Pcurrentbasefunc) || (oldbasefuncmodulation != Pbasefuncmodulation) || (oldbasefuncmodulationpar1 != Pbasefuncmodulationpar1) || (oldbasefuncmodulationpar2 != Pbasefuncmodulationpar2) || (oldbasefuncmodulationpar3 != Pbasefuncmodulationpar3)) changebasefunction(); for(i = 0; i < MAX_AD_HARMONICS; i++) hphase[i] = (Phphase[i] - 64.0) / 64.0 * PI / (i + 1); for(i = 0; i < MAX_AD_HARMONICS; i++) { hmagnew = 1.0 - fabs(Phmag[i] / 64.0 - 1.0); switch(Phmagtype) { case 1: hmag[i] = exp(hmagnew * log(0.01)); break; case 2: hmag[i] = exp(hmagnew * log(0.001)); break; case 3: hmag[i] = exp(hmagnew * log(0.0001)); break; case 4: hmag[i] = exp(hmagnew * log(0.00001)); break; default: hmag[i] = 1.0 - hmagnew; break; } if(Phmag[i] < 64) hmag[i] = -hmag[i]; } //remove the harmonics where Phmag[i]==64 for(i = 0; i < MAX_AD_HARMONICS; i++) if(Phmag[i] == 64) hmag[i] = 0.0; for(i = 0; i < OSCIL_SIZE / 2; i++) { oscilFFTfreqs.c[i] = 0.0; oscilFFTfreqs.s[i] = 0.0; } if(Pcurrentbasefunc == 0) { //the sine case for(i = 0; i < MAX_AD_HARMONICS; i++) { oscilFFTfreqs.c[i + 1] = -hmag[i] * sin(hphase[i] * (i + 1)) / 2.0; oscilFFTfreqs.s[i + 1] = hmag[i] * cos(hphase[i] * (i + 1)) / 2.0; } } else { for(j = 0; j < MAX_AD_HARMONICS; j++) { if(Phmag[j] == 64) continue; for(i = 1; i < OSCIL_SIZE / 2; i++) { k = i * (j + 1); if(k >= OSCIL_SIZE / 2) break; a = basefuncFFTfreqs.c[i]; b = basefuncFFTfreqs.s[i]; c = hmag[j] * cos(hphase[j] * k); d = hmag[j] * sin(hphase[j] * k); oscilFFTfreqs.c[k] += a * c - b * d; oscilFFTfreqs.s[k] += a * d + b * c; } } } if(Pharmonicshiftfirst != 0) shiftharmonics(); if(Pfilterbeforews == 0) { waveshape(); oscilfilter(); } else { oscilfilter(); waveshape(); } modulation(); spectrumadjust(); if(Pharmonicshiftfirst == 0) shiftharmonics(); oscilFFTfreqs.c[0] = 0.0; oldhmagtype = Phmagtype; oldharmonicshift = Pharmonicshift + Pharmonicshiftfirst * 256; oscilprepared = 1; }
void OscilGen::prepare(fft_t *freqs) { if((oldbasepar != Pbasefuncpar) || (oldbasefunc != Pcurrentbasefunc) || DIFF(basefuncmodulation) || DIFF(basefuncmodulationpar1) || DIFF(basefuncmodulationpar2) || DIFF(basefuncmodulationpar3)) changebasefunction(); for(int i = 0; i < MAX_AD_HARMONICS; ++i) hphase[i] = (Phphase[i] - 64.0f) / 64.0f * PI / (i + 1); for(int i = 0; i < MAX_AD_HARMONICS; ++i) { const float hmagnew = 1.0f - fabs(Phmag[i] / 64.0f - 1.0f); switch(Phmagtype) { case 1: hmag[i] = expf(hmagnew * logf(0.01f)); break; case 2: hmag[i] = expf(hmagnew * logf(0.001f)); break; case 3: hmag[i] = expf(hmagnew * logf(0.0001f)); break; case 4: hmag[i] = expf(hmagnew * logf(0.00001f)); break; default: hmag[i] = 1.0f - hmagnew; break; } if(Phmag[i] < 64) hmag[i] = -hmag[i]; } //remove the harmonics where Phmag[i]==64 for(int i = 0; i < MAX_AD_HARMONICS; ++i) if(Phmag[i] == 64) hmag[i] = 0.0f; clearAll(freqs, synth.oscilsize); if(Pcurrentbasefunc == 0) //the sine case for(int i = 0; i < MAX_AD_HARMONICS - 1; ++i) { freqs[i + 1] = std::complex<float>(-hmag[i] * sinf(hphase[i] * (i + 1)) / 2.0f, hmag[i] * cosf(hphase[i] * (i + 1)) / 2.0f); } else for(int j = 0; j < MAX_AD_HARMONICS; ++j) { if(Phmag[j] == 64) continue; for(int i = 1; i < synth.oscilsize / 2; ++i) { int k = i * (j + 1); if(k >= synth.oscilsize / 2) break; freqs[k] += basefuncFFTfreqs[i] * FFTpolar<fftw_real>( hmag[j], hphase[j] * k); } } if(Pharmonicshiftfirst != 0) shiftharmonics(freqs); if(Pfilterbeforews) { oscilfilter(freqs); waveshape(freqs); } else { waveshape(freqs); oscilfilter(freqs); } modulation(freqs); spectrumadjust(freqs); if(Pharmonicshiftfirst == 0) shiftharmonics(freqs); clearDC(freqs); oldhmagtype = Phmagtype; oldharmonicshift = Pharmonicshift + Pharmonicshiftfirst * 256; oscilprepared = 1; }