[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;
}
--
.