@@ -279,55 +279,10 @@ void Delay::processBlock(float* left, float* right, int nsamps)
279279 // reverse mode processing
280280 if (reverse)
281281 {
282- int playposL = revsizeL - revposL;
283- int playposR = revsizeR - revposR;
284- playposL = std::clamp (playposL, 0 , revsizeL - 1 );
285- playposR = std::clamp (playposR, 0 , revsizeR - 1 );
286- float fadeL = 1 .f ;
287-
288- // apply fades at reverse buffer begin, mid buffer, and end
289- // because the reverse buffer is twice the size of the delay
290- // fade at the middle as well to avoid clicks
291- if (playposL < fadetotalL) // fade in
292- fadeL = playposL / (float )fadetotalL;
293- if (playposL > revsizeL - fadetotalL) // fade out
294- fadeL = (revsizeL - playposL) / (float )fadetotalL;
295-
296- int midStart = midL - fadetotalL;
297- int midEnd = midL + fadetotalL;
298- if (playposL >= midStart && playposL <= midL)
299- fadeL = 1 .f - (playposL - midStart) / (float )fadetotalL;
300- if (playposL > midL && playposL <= midEnd)
301- fadeL = (playposL - midL) / (float )fadetotalL;
302-
303- float fadeR = 1 .f ;
304- if (playposR < fadetotalR) // fade in
305- fadeR = playposR / (float )fadetotalR;
306- if (playposR > revsizeR - fadetotalR) // fade out
307- fadeR = (revsizeR - playposR) / (float )fadetotalR;
308-
309- midStart = midR - fadetotalR;
310- midEnd = midR + fadetotalR;
311- if (playposR >= midStart && playposR <= midR)
312- fadeR = 1 .f - (playposR - midStart) / (float )fadetotalR;
313- if (playposR > midR && playposR <= midEnd)
314- fadeR = (playposR - midR) / (float )fadetotalR;
315-
316- // replace the input buffer in-place with the reversed buffer read
317- float ll = left[i];
318- float rr = right[i];
319- if (revsizeL > 1 ) left[i] = revL[playposL] * fadeL;
320- if (revsizeR > 1 ) right[i] = revR[playposR] * fadeR;
321-
322- // override the input offset to write the reversed signal
323- // right at the read head
282+ processReverse (left[i], right[i], revsizeL, revsizeR, midL, midR, fadetotalL, fadetotalR);
283+ // override the input offset to write the reversed right at the read head
324284 if (revsizeL > 1 ) inputOffsetL = -revsizeL / 2 + 1 ;
325285 if (revsizeR > 1 ) inputOffsetR = -revsizeR / 2 + 1 ;
326-
327- revposL = (revposL + 1 ) % revsizeL;
328- revposR = (revposR + 1 ) % revsizeR;
329- revL[revposL] = ll;
330- revR[revposR] = rr;
331286 }
332287
333288 auto tap1L = mode == Tap ? timeRight : timeLeft;
@@ -431,6 +386,56 @@ void Delay::processBlock(float* left, float* right, int nsamps)
431386 }
432387}
433388
389+ // replaces left and right input samples with reverse buffer output
390+ void Delay::processReverse (float & left, float & right, int revsizeL, int revsizeR, int midL, int midR,
391+ int fadetotalL, int fadetotalR)
392+ {
393+ int playposL = revsizeL - revposL;
394+ int playposR = revsizeR - revposR;
395+ playposL = std::clamp (playposL, 0 , revsizeL - 1 );
396+ playposR = std::clamp (playposR, 0 , revsizeR - 1 );
397+ float fadeL = 1 .f ;
398+
399+ // apply fades at reverse buffer begin, mid buffer, and end
400+ // because the reverse buffer is twice the size of the delay
401+ // fade at the middle as well to avoid clicks
402+ if (playposL < fadetotalL) // fade in
403+ fadeL = playposL / (float )fadetotalL;
404+ if (playposL > revsizeL - fadetotalL) // fade out
405+ fadeL = (revsizeL - playposL) / (float )fadetotalL;
406+
407+ int midStart = midL - fadetotalL;
408+ int midEnd = midL + fadetotalL;
409+ if (playposL >= midStart && playposL <= midL)
410+ fadeL = 1 .f - (playposL - midStart) / (float )fadetotalL;
411+ if (playposL > midL && playposL <= midEnd)
412+ fadeL = (playposL - midL) / (float )fadetotalL;
413+
414+ float fadeR = 1 .f ;
415+ if (playposR < fadetotalR) // fade in
416+ fadeR = playposR / (float )fadetotalR;
417+ if (playposR > revsizeR - fadetotalR) // fade out
418+ fadeR = (revsizeR - playposR) / (float )fadetotalR;
419+
420+ midStart = midR - fadetotalR;
421+ midEnd = midR + fadetotalR;
422+ if (playposR >= midStart && playposR <= midR)
423+ fadeR = 1 .f - (playposR - midStart) / (float )fadetotalR;
424+ if (playposR > midR && playposR <= midEnd)
425+ fadeR = (playposR - midR) / (float )fadetotalR;
426+
427+ // replace the input buffer in-place with the reversed buffer read
428+ float ll = left;
429+ float rr = right;
430+ if (revsizeL > 1 ) left = revL[playposL] * fadeL;
431+ if (revsizeR > 1 ) right = revR[playposR] * fadeR;
432+
433+ revposL = (revposL + 1 ) % revsizeL;
434+ revposR = (revposR + 1 ) % revsizeR;
435+ revL[revposL] = ll;
436+ revR[revposR] = rr;
437+ }
438+
434439void Delay::setEqualizer (std::vector<SVF::EQBand> bands)
435440{
436441 eqBands = bands;
0 commit comments