fract32 delay_next(delayLine* dl, fract32 in) { //If you return in, we have a delay of zero length - works! //return in; buffer_tapN_write(&(dl->tapWr), in); fract32 readVal; readVal = bufferTap24_8_read( &(dl->tapRd) ); // advance the write phasor //if(dl->runWr) { buffer_tapN_next( &(dl->tapWr) ); //} // advance the read phasor //if(dl->runRd) { bufferTap24_8_next( &(dl->tapRd) ); //} //For now the write head always writes over any contents... //so this is commented /* // figure out what to write if(dl->preLevel == 0) { if(dl->write) { // write and replace buffer_tap_write(&(dl->tapWr), in); } } else if(dl->preLevel < 0) { // consider <0 to be == 1 if(dl->write) { // overdub buffer_tap_add(&(dl->tapWr), in); } } else { // prelevel is non-zero, non-full if(dl->write) { // write mix buffer_tap_mix(&(dl->tapWr), in, dl->preLevel); } } */ return readVal; }
extern fract32 delay_next(delayLine* dl, fract32 in) { fract32 readVal; // get read value first. // so, setting loop == delaytime gives sensible results (???) readVal = buffer_tapN_read( &(dl->tapRd) ); // figure out what to write if(dl->preLevel == 0) { if(dl->write) { // write and replace buffer_tapN_write(&(dl->tapWr), in); } } else if(dl->preLevel < 0) { // consider <0 to be == 1 if(dl->write) { // overdub buffer_tapN_add(&(dl->tapWr), in); } } else { // prelevel is non-zero, non-full if(dl->write) { // write mix buffer_tapN_mix(&(dl->tapWr), in, dl->preLevel); } } // advance the read phasor if(dl->runRd) { buffer_tapN_next( &(dl->tapRd) ); } // advance the write phasor if(dl->runWr) { buffer_tapN_next( &(dl->tapWr) ); } return readVal; }