void Dseries_next(Dseries *unit, int inNumSamples) { if (inNumSamples) { // inNumSamples == 0 -> reset from demand ugen if (unit->m_repeats < 0) { // unit->m_repeats < 0 -> unit recieved a reset last time float x = DEMANDINPUT(0); unit->m_repeats = sc_isnan(x) ? 0 : (int32)floor(x + 0.5f); // test for NaN: // if it is a NaN, this will end (repeats = 0) // if not, repeats input (x) is increased by 0.5 (make float compat) unit->m_value = DEMANDINPUT(1); unit->m_step = DEMANDINPUT(2); } if (unit->m_repeatCount >= unit->m_repeats) { // -> count exceeds repeats OUT0(0) = NAN; // signal end by putting out a NaN. // users will know by this that they use their last input ad infinitum return; } OUT0(0) = unit->m_value; unit->m_value += unit->m_step; // increase value by step unit->m_repeatCount++; } else { unit->m_repeats = -1; // trigger the reset unit->m_repeatCount = 0; // set count to 0 again } } void Drand_next(Drand *unit, int inNumSamples) { if (inNumSamples) { // inNumSamples == 0 -> reset from demand ugen if (unit->m_repeats < 0) { // unit->m_repeats < 0 -> unit recieved a reset last time float x = DEMANDINPUT(0); unit->m_repeats = sc_isnan(x) ? 0 : (int32)floor(x + 0.5f); // see above } while (true) { if (unit->m_repeatCount >= unit->m_repeats) { // -> count exceeds repeats OUT0(0) = NAN; // signal end by putting out a NaN. // users will know by this that they use their last input ad infinitum return; } // m_index is the current index into the array if (ISDEMANDINPUT(unit->m_index)) { // check if demand ugen or normal ugen if (unit->m_needToResetChild) { // e.g. when arriving new at the index unit->m_needToResetChild = false; RESETINPUT(unit->m_index); // reset the unit at current index } float x = DEMANDINPUT(unit->m_index); // get next value at index if (sc_isnan(x)) { // input unit ended // generate new index unit->m_index = unit->mParent->mRGen->irand(unit->mNumInputs - 1) + 1; // increase repeat count unit->m_repeatCount++; unit->m_needToResetChild = true; // don't forget to reset the input next time } else { OUT0(0) = x; // if not ended, output x return; } } else { // if normal ugen OUT0(0) = IN0(unit->m_index); // get first slot of ugen output // act as if ugen ended. unit->m_index = unit->mParent->mRGen->irand(unit->mNumInputs - 1) + 1; unit->m_repeatCount++; unit->m_needToResetChild = true; return; } } } else { // reset part: unit->m_repeats = -1; unit->m_repeatCount = 0; unit->m_needToResetChild = true; // generate rand index unit->m_index = unit->mParent->mRGen->irand(unit->mNumInputs - 1) + 1; } }