[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[sc-dev] UGen creation q
So would this work for the audiorate one (havent done
the kr one)?
struct LFPulseLock : public Unit
{
float mPhase, mFreqMul, mDuty, m_prevtrig;
};
void LFPulseLock_next_a(LFPulseLock *unit, int
inNumSamples);
void LFPulseLock_next_k(LFPulseLock *unit, int
inNumSamples);
void LFPulseLock_Ctor(LFPulseLock* unit);
void LFPulseLock_Ctor(LFPulseLock* unit)
{
if (INRATE(0) == calc_FullRate) {
SETCALC(LFPulse_next_a);
} else {
SETCALC(LFPulse_next_k);
}
unit->mFreqMul = unit->mRate->mSampleDur;
unit->mPhase = ZIN0(1);
unit->mDuty = ZIN0(2);
unit->m_prevtrig = 0.f;
LFPulse_next_k(unit, 1);
}
void LFPulseLock_next_a(LFPulseLock *unit, int
inNumSamples)
{
float *out = ZOUT(0);
float *freq = ZIN(0);
float nextDuty = ZIN0(2);
float duty = unit->mDuty;
float prevtrig = unit->m_prevtrig;
float freqmul = unit->mFreqMul;
float phase = unit->mPhase;
float frequency = ZIN0(0);
LOOP(inNumSamples,
float z;
if (phase >= 1.f) {
phase -= 1.f;
duty = unit->mDuty = nextDuty;
// output at least one sample
from the opposite
polarity
z = duty < 0.5 ? 1.f : 0.f;
} else {
z = phase < duty ? 1.f : 0.f;
}
if (prevtrig == 0.f && z == 1.f)
frequency = ZXP(freq);
else { ZXP(freq); }
prevtrig = z;
phase += frequency * freqmul;
ZXP(out) = z;
);
unit->m_prevtrig = prevtrig;
unit->mPhase = phase;
}
void load(InterfaceTable *inTable)
{
ft = inTable;
DefineSimpleUnit(LFPulseLock);
}
__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com