int mathFoldInt(struct VMGlobals *g, int numArgsPushed) { PyrSlot *a, *b, *c; int err; a = g->sp - 2; b = g->sp - 1; c = g->sp; if (IsSym(b)) { *a = *b; } else if (IsSym(c)) { *a = *c; } else if (IsInt(b) && IsInt(c)) { SetRaw(a, sc_fold(slotRawInt(a), slotRawInt(b), slotRawInt(c))); } else { double x, lo, hi; x = slotRawInt(a); err = slotDoubleVal(b, &lo); if (err) return err; err = slotDoubleVal(c, &hi); if (err) return err; SetFloat(a, sc_fold(x, lo, hi)); } return errNone; }
void Dibrown_next(Dibrown *unit, int inNumSamples) { if (inNumSamples) { float lo = DEMANDINPUT_A(1, inNumSamples); if(!sc_isnan(lo)) { unit->m_lo = (int32)lo; } float hi = DEMANDINPUT_A(2, inNumSamples); if(!sc_isnan(hi)) { unit->m_hi = (int32)hi; } float step = DEMANDINPUT_A(3, inNumSamples); if(!sc_isnan(step)) { unit->m_step = (int32)step; } if (unit->m_repeats < 0.) { float x = DEMANDINPUT_A(0, inNumSamples); unit->m_repeats = sc_isnan(x) ? 0.f : floor(x + 0.5f); unit->m_val = unit->mParent->mRGen->irand(unit->m_hi - unit->m_lo + 1) + unit->m_lo; } if (unit->m_repeatCount >= unit->m_repeats) { OUT0(0) = NAN; return; } OUT0(0) = unit->m_val; int32 z = unit->m_val + unit->mParent->mRGen->irand2(unit->m_step); unit->m_val = sc_fold(z, unit->m_lo, unit->m_hi); } else { unit->m_repeats = -1.f; unit->m_repeatCount = 0; } }
void Dbrown_next(Dbrown *unit, int inNumSamples) { if (inNumSamples) { float lo = DEMANDINPUT_A(1, inNumSamples); if(!sc_isnan(lo)) { unit->m_lo = lo; } float hi = DEMANDINPUT_A(2, inNumSamples); if(!sc_isnan(hi)) { unit->m_hi = hi; } float step = DEMANDINPUT_A(3, inNumSamples); if(!sc_isnan(step)) { unit->m_step = step; } if (unit->m_repeats < 0.) { float x = DEMANDINPUT_A(0, inNumSamples); unit->m_repeats = sc_isnan(x) ? 0.f : floor(x + 0.5f); unit->m_val = unit->mParent->mRGen->frand() * (unit->m_hi - unit->m_lo) + unit->m_lo; } if (unit->m_repeatCount >= unit->m_repeats) { OUT0(0) = NAN; return; } unit->m_repeatCount++; OUT0(0) = unit->m_val; float x = unit->m_val + unit->mParent->mRGen->frand2() * unit->m_step; unit->m_val = sc_fold(x, unit->m_lo, unit->m_hi); } else { unit->m_repeats = -1.f; unit->m_repeatCount = 0; } }