// Effect output void Distorsion::out(float *smpsl, float *smpsr) { float inputdrive = powf(5.0f, (Pdrive - 32.0f) / 127.0f); if (Pnegate) inputdrive *= -1.0f; if (Pstereo) // Stereo { for (int i = 0; i < synth->p_buffersize; ++i) { efxoutl[i] = smpsl[i] * inputdrive * pangainL; efxoutr[i] = smpsr[i] * inputdrive* pangainR; } } else // Mono for (int i = 0; i < synth->p_buffersize; ++i) efxoutl[i] = inputdrive * (smpsl[i]* pangainL + smpsr[i]* pangainR) * 0.7f; if (Pprefiltering) applyfilters(efxoutl, efxoutr); waveShapeSmps(synth->p_buffersize, efxoutl, Ptype + 1, Pdrive); if (Pstereo) waveShapeSmps(synth->p_buffersize, efxoutr, Ptype + 1, Pdrive); if (!Pprefiltering) applyfilters(efxoutl, efxoutr); if (!Pstereo) memcpy(efxoutr, efxoutl, synth->p_bufferbytes); float level = dB2rap(60.0f * Plevel / 127.0f - 40.0f); for (int i = 0; i < synth->p_buffersize; ++i) { float lout = efxoutl[i]; float rout = efxoutr[i]; float l = lout * (1.0f - lrcross) + rout * lrcross; float r = rout * (1.0f - lrcross) + lout * lrcross; lout = l; rout = r; efxoutl[i] = lout * 2.0f * level; efxoutr[i] = rout * 2.0f * level; } }
//Effect output void Distorsion::out(const Stereo<float *> &smp) { float inputvol = powf(5.0f, (Pdrive - 32.0f) / 127.0f); if(Pnegate) inputvol *= -1.0f; if(Pstereo) //Stereo for(int i = 0; i < buffersize; ++i) { efxoutl[i] = smp.l[i] * inputvol * pangainL; efxoutr[i] = smp.r[i] * inputvol * pangainR; } else //Mono for(int i = 0; i < buffersize; ++i) efxoutl[i] = (smp.l[i] * pangainL + smp.r[i] * pangainR) * inputvol; if(Pprefiltering) applyfilters(efxoutl, efxoutr); waveShapeSmps(buffersize, efxoutl, Ptype + 1, Pdrive); if(Pstereo) waveShapeSmps(buffersize, efxoutr, Ptype + 1, Pdrive); if(!Pprefiltering) applyfilters(efxoutl, efxoutr); if(!Pstereo) memcpy(efxoutr, efxoutl, bufferbytes); float level = dB2rap(60.0f * Plevel / 127.0f - 40.0f); for(int i = 0; i < buffersize; ++i) { float lout = efxoutl[i]; float rout = efxoutr[i]; float l = lout * (1.0f - lrcross) + rout * lrcross; float r = rout * (1.0f - lrcross) + lout * lrcross; lout = l; rout = r; efxoutl[i] = lout * 2.0f * level; efxoutr[i] = rout * 2.0f * level; } }
/* * Waveshape */ void OscilGen::waveshape(fft_t *freqs) { oldwaveshapingfunction = Pwaveshapingfunction; oldwaveshaping = Pwaveshaping; if(Pwaveshapingfunction == 0) return; clearDC(freqs); //reduce the amplitude of the freqs near the nyquist for(int i = 1; i < synth.oscilsize / 8; ++i) { float gain = i / (synth.oscilsize / 8.0f); freqs[synth.oscilsize / 2 - i] *= gain; } fft->freqs2smps(freqs, tmpsmps); //Normalize normalize(tmpsmps, synth.oscilsize); //Do the waveshaping waveShapeSmps(synth.oscilsize, tmpsmps, Pwaveshapingfunction, Pwaveshaping); fft->smps2freqs(tmpsmps, freqs); //perform FFT }