Skip to content

Commit e7b0e4b

Browse files
author
tlr
committed
.
1 parent d92eb08 commit e7b0e4b

File tree

2 files changed

+54
-47
lines changed

2 files changed

+54
-47
lines changed

src/dsp/Delay.cpp

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
434439
void Delay::setEqualizer(std::vector<SVF::EQBand> bands)
435440
{
436441
eqBands = bands;

src/dsp/Delay.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class Delay : private juce::AudioProcessorValueTreeState::Listener
4242
std::array<int, 2> getTimeSamples();
4343
int getFeelOffset(int timeL, int timeR, float swing);
4444
void processBlock(float* left, float* right, int nsamps);
45+
void processReverse(float& left, float& right, int revsizeL, int revsizeR,
46+
int midL, int midR, int fadetotalL, int fadetotalR);
4547
void clear();
4648
void setEqualizer(std::vector<SVF::EQBand> bands);
4749
void onSlider();

0 commit comments

Comments
 (0)