void SVFilter::filterout(float *smp) { for(int i = 0; i < stages + 1; ++i) singlefilterout(smp, st[i], par); if(needsinterpolation) { float *ismp = getTmpBuffer(); memcpy(ismp, smp, synth->bufferbytes); for(int i = 0; i < stages + 1; ++i) singlefilterout(ismp, st[i], ipar); for(int i = 0; i < synth->buffersize; ++i) { float x = i / synth->buffersize_f; smp[i] = ismp[i] * (1.0f - x) + smp[i] * x; } returnTmpBuffer(ismp); needsinterpolation = false; } for(int i = 0; i < synth->buffersize; ++i) smp[i] *= outgain; }
/* * Note Output */ int SUBnote::noteout(float *outl, float *outr) { memcpy(outl, denormalkillbuf, synth->bufferbytes); memcpy(outr, denormalkillbuf, synth->bufferbytes); if(NoteEnabled == OFF) return 0; float *tmprnd = getTmpBuffer(); float *tmpsmp = getTmpBuffer(); //left channel for(int i = 0; i < synth->buffersize; ++i) tmprnd[i] = RND * 2.0f - 1.0f; for(int n = 0; n < numharmonics; ++n) { memcpy(tmpsmp, tmprnd, synth->bufferbytes); for(int nph = 0; nph < numstages; ++nph) filter(lfilter[nph + n * numstages], tmpsmp); for(int i = 0; i < synth->buffersize; ++i) outl[i] += tmpsmp[i]; } if(GlobalFilterL != NULL) GlobalFilterL->filterout(&outl[0]); //right channel if(stereo != 0) { for(int i = 0; i < synth->buffersize; ++i) tmprnd[i] = RND * 2.0f - 1.0f; for(int n = 0; n < numharmonics; ++n) { memcpy(tmpsmp, tmprnd, synth->bufferbytes); for(int nph = 0; nph < numstages; ++nph) filter(rfilter[nph + n * numstages], tmpsmp); for(int i = 0; i < synth->buffersize; ++i) outr[i] += tmpsmp[i]; } if(GlobalFilterR != NULL) GlobalFilterR->filterout(&outr[0]); } else memcpy(outr, outl, synth->bufferbytes); returnTmpBuffer(tmprnd); returnTmpBuffer(tmpsmp); if(firsttick != 0) { int n = 10; if(n > synth->buffersize) n = synth->buffersize; for(int i = 0; i < n; ++i) { float ampfadein = 0.5f - 0.5f * cosf( (float) i / (float) n * PI); outl[i] *= ampfadein; outr[i] *= ampfadein; } firsttick = 0; } if(ABOVE_AMPLITUDE_THRESHOLD(oldamplitude, newamplitude)) // Amplitude interpolation for(int i = 0; i < synth->buffersize; ++i) { float tmpvol = INTERPOLATE_AMPLITUDE(oldamplitude, newamplitude, i, synth->buffersize); outl[i] *= tmpvol * panning; outr[i] *= tmpvol * (1.0f - panning); } else for(int i = 0; i < synth->buffersize; ++i) { outl[i] *= newamplitude * panning; outr[i] *= newamplitude * (1.0f - panning); } oldamplitude = newamplitude; computecurrentparameters(); // Apply legato-specific sound signal modifications legato.apply(*this, outl, outr); // Check if the note needs to be computed more if(AmpEnvelope->finished() != 0) { for(int i = 0; i < synth->buffersize; ++i) { //fade-out float tmp = 1.0f - (float)i / synth->buffersize_f; outl[i] *= tmp; outr[i] *= tmp; } KillNote(); } return 1; }