[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[sc-dev] Sweep rate





currently the Sweep rate input does not scale in rate/seconds,
but rate/sample. (as the comment in the sc class is rate/sec, I conclude this was the intention)

{ SinOsc.ar(Sweep.kr(Impulse.kr(1), 400) + 400, 0, 0.1) }.play;


the same change should then also apply to Phasor.
the BufRd help example would then be:

{ BufRd.ar(1, 0, Phasor.ar(0, 1/BufDur.kr(0), 0, BufFrames.kr(0))) }.play;




I guess the implementation should be looking like this (should I commit this?):



void Sweep_next_k(Sweep *unit, int inNumSamples)
{
	float *out = ZOUT(0);
	float *in = ZIN(0);
	float rate = ZIN0(1);
	float previn = unit->m_previn;
	float level = unit->mLevel;
	float div = 1.f / unit->mRate->mSampleRate;

	LOOP(inNumSamples,
		float curin = ZXP(in);
		if (previn <= 0.f && curin > 0.f) {
			float frac = -previn/(curin-previn);
			level = frac * rate * div;
		} else {
			level += rate * div;
		}
		ZXP(out) = level;
		previn = curin;
	);

	unit->m_previn = previn;
	unit->mLevel = level;
}

void Sweep_next_a(Sweep *unit, int inNumSamples)
{
	float *out = ZOUT(0);
	float *in = ZIN(0);
	float *rate = ZIN(1);
	float previn = unit->m_previn;
	float level = unit->mLevel;
	float div = 1.f / unit->mRate->mSampleRate;

	LOOP(inNumSamples,
		float curin = ZXP(in);
		float zrate = *rate++ * div;
		if (previn <= 0.f && curin > 0.f) {
			float frac = -previn/(curin-previn);
			level = frac * zrate;
		} else {
			level += zrate;
		}
		ZXP(out) = level;
		previn = curin;
	);

	unit->m_previn = previn;
	unit->mLevel = level;
}


--








.