void AudioControl_next_1(AudioControl *unit, int inNumSamples) { float **mapin = unit->mParent->mMapControls + unit->mSpecialIndex; float *out = OUT(0); int *mapRatep; int mapRate; float nextVal, curVal, valSlope; float* prevVal; prevVal = unit->prevVal; curVal = prevVal[0]; mapRatep = unit->mParent->mControlRates + unit->mSpecialIndex; mapRate = mapRatep[0]; switch (mapRate) { case 0 : { for(int i = 0; i < inNumSamples; i++){ out[i] = *mapin[0]; } } break; case 1 : { nextVal = *mapin[0]; valSlope = CALCSLOPE(nextVal, curVal); for(int i = 0; i < inNumSamples; i++){ out[i] = curVal; curVal += valSlope; } unit->prevVal[0] = curVal; } break; case 2 : Copy(inNumSamples, out, *mapin); break; } }
static inline float gverb_set_taillevel(GVerb *unit, float a) { float oldtail = unit->taillevel; unit->taillevel = a; unit->taillevelslope = CALCSLOPE(a, oldtail); return(oldtail); }
void AudioControl_next_k(AudioControl *unit, int inNumSamples) { uint32 numChannels = unit->mNumOutputs; float *prevVal = unit->prevVal; float **mapin = unit->mParent->mMapControls + unit->mSpecialIndex; for(uint32 i = 0; i < numChannels; ++i, mapin++){ float *out = OUT(i); int *mapRatep; int mapRate; float nextVal, curVal, valSlope; mapRatep = unit->mParent->mControlRates + unit->mSpecialIndex; mapRate = mapRatep[i]; switch (mapRate) { case 0 : { for(int j = 0; j < inNumSamples; j++){ out[j] = *mapin[0]; } } break; case 1 : { nextVal = *mapin[0]; curVal = prevVal[i]; valSlope = CALCSLOPE(nextVal, curVal); for(int j = 0; j < inNumSamples; j++){ out[j] = curVal; // should be prevVal curVal += valSlope; } unit->prevVal[i] = curVal; } break; case 2 : Copy(inNumSamples, out, *mapin); break; } } }
static inline float gverb_set_drylevel(GVerb *unit, float a) { float olddry = unit->drylevel; unit->drylevel = a; unit->drylevelslope = CALCSLOPE(a, olddry); return(olddry); }
void Lag_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nout = *out; t_sample *nin = *in; float y1 = m_y1; float b1 = m_b1; if (changed) { float b1_slope = CALCSLOPE(m_b1, n_b1); m_b1 = n_b1; for (int i = 0; i!= n;++i) { float y0 = ZXP(nin); ZXP(nout) = y1 = y0 + b1 * (y1 - y0); b1 += b1_slope; } changed = false; } else { for (int i = 0; i!= n;++i) { float y0 = ZXP(nin); ZXP(nout) = y1 = y0 + b1 * (y1 - y0); } } m_y1 = zapgremlins(y1); }
void scmul_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nin = *in; t_sample *nout = *out; if (changed) { float xb = m_nextfactor; float slope = CALCSLOPE(xb, m_factor); for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) * xb; xb += slope; } m_factor = xb; changed = false; } else { float xb = m_factor; for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) * xb; } } }
void DelayN_ar::m_signal_(int n, t_sample *const *in, t_sample *const *out) { t_sample *nin = *in; t_sample *nout = *out; float *dlybuf = m_dlybuf; long iwrphase = m_iwrphase; float dsamp = m_dsamp; long mask = m_mask; if (changed) { float next_dsamp = CalcDelay(m_delaytime); float dsamp_slope = CALCSLOPE(next_dsamp, dsamp); for (int i = 0; i!= n;++i) { dlybuf[iwrphase & mask] = ZXP(nin); dsamp += dsamp_slope; ++iwrphase; long irdphase = iwrphase - (long)dsamp; ZXP(nout) = dlybuf[irdphase & mask]; } m_dsamp = dsamp; changed = false; } else { long irdphase = iwrphase - (long)dsamp; float* dlybuf1 = dlybuf - ZOFF; float* dlyrd = dlybuf1 + (irdphase & mask); float* dlywr = dlybuf1 + (iwrphase & mask); float* dlyN = dlybuf1 + m_idelaylen; long remain = n; while (remain) { long rdspace = dlyN - dlyrd; long wrspace = dlyN - dlywr; long nsmps = sc_min(rdspace, wrspace); nsmps = sc_min(remain, nsmps); remain -= nsmps; for (int i = 0; i!= nsmps;++i) { ZXP(dlywr) = ZXP(nin); ZXP(nout) = ZXP(dlyrd); } if (dlyrd == dlyN) dlyrd = dlybuf1; if (dlywr == dlyN) dlywr = dlybuf1; } iwrphase += n; } m_iwrphase = iwrphase; }
static inline void gverb_set_roomsize(GVerb *unit, const float a) { unsigned int i; if (a <= 1.0 || sc_isnan(a)) { unit->roomsize = 1.0; } else { if(a >= unit->maxroomsize) unit->roomsize = unit->maxroomsize - 1.; else unit->roomsize = a; }; unit->largestdelay = SAMPLERATE * unit->roomsize / 340.0; // * 0.00294f; // the line below causes everything to blow up.... why????? // unit->fdnlens[0] = nearestprime((int)(unit->largestdelay), 0.5); unit->fdnlens[1] = (int)(0.816490*unit->largestdelay); unit->fdnlens[2] = (int)(0.707100*unit->largestdelay); unit->fdnlens[3] = (int)(0.632450*unit->largestdelay); for(i = 0; i < FDNORDER; i++) { float oldfdngain = unit->fdngains[i]; unit->fdngains[i] = -powf((float)unit->alpha, unit->fdnlens[i]); unit->fdngainslopes[i] = CALCSLOPE(unit->fdngains[i], oldfdngain); } unit->taps[0] = 5 + (int)(0.410 * unit->largestdelay); unit->taps[1] = 5 + (int)(0.300 * unit->largestdelay); unit->taps[2] = 5 + (int)(0.155 * unit->largestdelay); unit->taps[3] = 5; //+ f_round(0.000 * largestdelay); for(i = 0; i < FDNORDER; i++) { float oldtapgain = unit->tapgains[i]; unit->tapgains[i] = pow(unit->alpha, unit->taps[i]); unit->tapgainslopes[i] = CALCSLOPE(unit->tapgains[i], oldtapgain); } }
static inline void gverb_set_revtime(GVerb *unit, float a) { float ga; double n; unsigned int i; unit->revtime = a; ga = 0.001; n = SAMPLERATE * a; unit->alpha = (double)powf(ga,(float)(1.f/n)); for(i = 0; i < FDNORDER; i++) { float oldfdngain = unit->fdngains[i]; unit->fdngains[i] = -powf((float)unit->alpha, unit->fdnlens[i]); unit->fdngainslopes[i] = CALCSLOPE(unit->fdngains[i], oldfdngain); } }
void Lag3_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nout = *out; t_sample *nin = *in; float y1a = m_y1a; float y1b = m_y1b; float y1c = m_y1c; float b1 = m_b1; if (changed) { float b1_slope = CALCSLOPE(m_b1, n_b1); m_b1 = n_b1; for (int i = 0; i!= n;++i) { float y0a = ZXP(nin); y1a = y0a + b1 * (y1a - y0a); y1b = y1a + b1 * (y1b - y1a); y1c = y1b + b1 * (y1c - y1b); ZXP(nout) = y1c; b1 += b1_slope; } changed = false; } else { for (int i = 0; i!= n;++i) { float y0a = ZXP(nin); y1a = y0a + b1 * (y1a - y0a); y1b = y1a + b1 * (y1b - y1a); y1c = y1b + b1 * (y1c - y1b); ZXP(nout) = y1c; } } m_y1a = zapgremlins(y1a); m_y1b = zapgremlins(y1b); m_y1b = zapgremlins(y1c); }
void XOut_next_a(XOut *unit, int inNumSamples) { World *world = unit->mWorld; int bufLength = world->mBufLength; int numChannels = unit->mNumInputs - 2; float fbusChannel = ZIN0(0); if (fbusChannel != unit->m_fbusChannel) { unit->m_fbusChannel = fbusChannel; uint32 busChannel = (uint32)fbusChannel; uint32 lastChannel = busChannel + numChannels; if (!(lastChannel > world->mNumAudioBusChannels)) { unit->m_bus = world->mAudioBus + (busChannel * bufLength); unit->m_busTouched = world->mAudioBusTouched + busChannel; } } float next_xfade = ZIN0(1); float xfade0 = unit->m_xfade; float *out = unit->m_bus; int32 *touched = unit->m_busTouched; int32 bufCounter = unit->mWorld->mBufCounter; if (xfade0 != next_xfade) { float slope = CALCSLOPE(next_xfade, xfade0); for (int i=0; i<numChannels; ++i) { ACQUIRE_BUS_AUDIO((int32)fbusChannel + i); float xfade = xfade0; float *in = IN(i+2); if (touched[i] == bufCounter) { LOOP1(inNumSamples, float zin = *in; float zout = *out; *out = zout + xfade * (zin - zout); //if (xxi==0) Print("x %d %d %g %g %g %g\n", bufCounter, i, zin, zout, xfade, *out); xfade += slope; ++out; ++in; ); } else {
FloatType calcSlope(FloatType next, FloatType prev) const { const Unit * unit = this; return CALCSLOPE(next, prev); }
void AllpassC_ar::m_signal_(int n, t_sample *const *in, t_sample *const *out) { t_sample *nin = *in; t_sample *nout = *out; float *dlybuf = m_dlybuf; long iwrphase = m_iwrphase; float dsamp = m_dsamp; float feedbk = m_feedbk; long mask = m_mask; float d0, d1, d2, d3; if(delay_changed || decay_changed) { float next_dsamp = CalcDelay(m_delaytime); float dsamp_slope = CALCSLOPE(next_dsamp, dsamp); float next_feedbk = CalcFeedback(m_delaytime, m_decaytime); float feedbk_slope = CALCSLOPE(next_feedbk, feedbk); for(int i=0; i!= n;++i) { dsamp += dsamp_slope; long idsamp = (long)dsamp; float frac = dsamp - idsamp; long irdphase1 = iwrphase - idsamp; long irdphase2 = irdphase1 - 1; long irdphase3 = irdphase1 - 2; long irdphase0 = irdphase1 + 1; float d0 = dlybuf[irdphase0 & mask]; float d1 = dlybuf[irdphase1 & mask]; float d2 = dlybuf[irdphase2 & mask]; float d3 = dlybuf[irdphase3 & mask]; float value = cubicinterp(frac, d0, d1, d2, d3); float dwr = ZXP(nin) + feedbk * value; dlybuf[iwrphase & mask] = dwr; ZXP(nout) = value - feedbk * dwr; feedbk += feedbk_slope; iwrphase++; } m_feedbk = feedbk; m_dsamp = dsamp; delay_changed = decay_changed = false; } else { long idsamp = (long)dsamp; float frac = dsamp - idsamp; for(int i=0; i!= n;++i) { long irdphase1 = iwrphase - idsamp; long irdphase2 = irdphase1 - 1; long irdphase3 = irdphase1 - 2; long irdphase0 = irdphase1 + 1; float d0 = dlybuf[irdphase0 & mask]; float d1 = dlybuf[irdphase1 & mask]; float d2 = dlybuf[irdphase2 & mask]; float d3 = dlybuf[irdphase3 & mask]; float value = cubicinterp(frac, d0, d1, d2, d3); float dwr = ZXP(nin) + feedbk * value; dlybuf[iwrphase & mask] = dwr; ZXP(nout) = value - feedbk * dwr; iwrphase++; } } m_iwrphase = iwrphase; }
void AllpassN_ar::m_signal_(int n, t_sample *const *in, t_sample *const *out) { t_sample *nin = *in; t_sample *nout = *out; float *dlybuf = m_dlybuf; long iwrphase = m_iwrphase; float dsamp = m_dsamp; float feedbk = m_feedbk; long mask = m_mask; if(delay_changed) { float next_dsamp = CalcDelay(m_delaytime); float dsamp_slope = CALCSLOPE(next_dsamp, dsamp); float next_feedbk = CalcFeedback(m_delaytime, m_decaytime); float feedbk_slope = CALCSLOPE(next_feedbk, feedbk); for(int i=0; i!= n; ++i) { dsamp += dsamp_slope; ++iwrphase; long irdphase = iwrphase - (long)dsamp; float value = dlybuf[irdphase & mask]; float dwr = value * feedbk + ZXP(nin); dlybuf[iwrphase & mask] = dwr; ZXP(nout) = value - feedbk * dwr; feedbk += feedbk_slope; } m_feedbk = feedbk; m_dsamp = dsamp; delay_changed = decay_changed = false; } else { long irdphase = iwrphase - (long)dsamp; float* dlybuf1 = dlybuf - ZOFF; float* dlyrd = dlybuf1 + (irdphase & mask); float* dlywr = dlybuf1 + (iwrphase & mask); float* dlyN = dlybuf1 + m_idelaylen; if(decay_changed) { float next_feedbk = CalcFeedback(m_delaytime, m_decaytime); float feedbk_slope = CALCSLOPE(next_feedbk, feedbk); long remain = n; while (remain) { long rdspace = dlyN - dlyrd; long wrspace = dlyN - dlywr; long nsmps = sc_min(rdspace, wrspace); nsmps = sc_min(remain, nsmps); remain -= nsmps; for(int i=0; i!= nsmps; ++i) { float value = ZXP(dlyrd); float dwr = value * feedbk + ZXP(nin); ZXP(dlywr) = dwr; ZXP(nout) = value - feedbk * dwr; feedbk += feedbk_slope; } if (dlyrd == dlyN) dlyrd = dlybuf1; if (dlywr == dlyN) dlywr = dlybuf1; } m_feedbk = feedbk; decay_changed = false; } else { long remain = n; while (remain) { long rdspace = dlyN - dlyrd; long wrspace = dlyN - dlywr; long nsmps = sc_min(rdspace, wrspace); nsmps = sc_min(remain, nsmps); remain -= nsmps; for (int i = 0; i!= nsmps; ++i) { float value = ZXP(dlyrd); float dwr = value * feedbk + ZXP(nin); ZXP(dlywr) = dwr; ZXP(nout) = value - feedbk * dwr; } if (dlyrd == dlyN) dlyrd = dlybuf1; if (dlywr == dlyN) dlywr = dlybuf1; } } iwrphase += n; } m_iwrphase = iwrphase; }