Esempio n. 1
0
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;
    }

}
Esempio n. 2
0
static inline float gverb_set_taillevel(GVerb *unit, float a)
{
  float oldtail = unit->taillevel;
  unit->taillevel = a;
  unit->taillevelslope = CALCSLOPE(a, oldtail);
  return(oldtail);
}
Esempio n. 3
0
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;
	}
    }
}
Esempio n. 4
0
static inline float gverb_set_drylevel(GVerb *unit, float a)
{
  float olddry = unit->drylevel;
  unit->drylevel = a;
  unit->drylevelslope = CALCSLOPE(a, olddry);
  return(olddry);
}
Esempio n. 5
0
File: Lag.cpp Progetto: Angeldude/pd
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);
}
Esempio n. 6
0
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;
	}
    }
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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);
  }

}
Esempio n. 9
0
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);
  }

}
Esempio n. 10
0
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);
}
Esempio n. 11
0
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 {
Esempio n. 12
0
	FloatType calcSlope(FloatType next, FloatType prev) const
	{
		const Unit * unit = this;
		return CALCSLOPE(next, prev);
	}
Esempio n. 13
0
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;
}
Esempio n. 14
0
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;
}