From e7f8bc4efcbd806e497527d2678ae6d0bcd22fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E4=B8=AD=E4=BF=A1=E7=A7=8B?= Date: Fri, 17 Mar 2023 19:24:18 +0900 Subject: [PATCH] Optimize chorus. --- MeltySynth/src/Chorus.cs | 117 ++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 62 deletions(-) diff --git a/MeltySynth/src/Chorus.cs b/MeltySynth/src/Chorus.cs index 21fc7c4..9daebd8 100644 --- a/MeltySynth/src/Chorus.cs +++ b/MeltySynth/src/Chorus.cs @@ -9,8 +9,7 @@ internal sealed class Chorus private readonly float[] delayTable; - private int bufferIndexL; - private int bufferIndexR; + private int bufferIndex; private int delayTableIndexL; private int delayTableIndexR; @@ -27,8 +26,7 @@ internal Chorus(int sampleRate, double delay, double depth, double frequency) delayTable[t] = (float)(sampleRate * (delay + depth * Math.Sin(phase))); } - bufferIndexL = 0; - bufferIndexR = 0; + bufferIndex = 0; delayTableIndexL = 0; delayTableIndexR = delayTable.Length / 4; @@ -38,71 +36,66 @@ public void Process(float[] inputLeft, float[] inputRight, float[] outputLeft, f { for (var t = 0; t < outputLeft.Length; t++) { - var position = bufferIndexL - (double)delayTable[delayTableIndexL]; - if (position < 0.0) { - position += bufferL.Length; + var position = bufferIndex - (double)delayTable[delayTableIndexL]; + if (position < 0.0) + { + position += bufferL.Length; + } + + var index1 = (int)position; + var index2 = index1 + 1; + + if (index2 == bufferL.Length) + { + index2 = 0; + } + + var x1 = (double)bufferL[index1]; + var x2 = (double)bufferL[index2]; + var a = position - index1; + outputLeft[t] = (float)(x1 + a * (x2 - x1)); + + delayTableIndexL++; + if (delayTableIndexL == delayTable.Length) + { + delayTableIndexL = 0; + } } - var index1 = (int)position; - var index2 = index1 + 1; - - if (index2 == bufferL.Length) - { - index2 = 0; - } - - var x1 = (double)bufferL[index1]; - var x2 = (double)bufferL[index2]; - var a = position - index1; - outputLeft[t] = (float)(x1 + a * (x2 - x1)); - - bufferL[bufferIndexL] = inputLeft[t]; - bufferIndexL++; - if (bufferIndexL == bufferL.Length) - { - bufferIndexL = 0; - } - - delayTableIndexL++; - if (delayTableIndexL == delayTable.Length) - { - delayTableIndexL = 0; - } - } - - for (var t = 0; t < outputRight.Length; t++) - { - var position = bufferIndexR - (double)delayTable[delayTableIndexR]; - if (position < 0.0) - { - position += bufferR.Length; - } - - var index1 = (int)position; - var index2 = index1 + 1; - - if (index2 == bufferR.Length) - { - index2 = 0; - } - - var x1 = (double)bufferR[index1]; - var x2 = (double)bufferR[index2]; - var a = position - index1; - outputRight[t] = (float)(x1 + a * (x2 - x1)); - - bufferR[bufferIndexR] = inputRight[t]; - bufferIndexR++; - if (bufferIndexR == bufferR.Length) { - bufferIndexR = 0; + var position = bufferIndex - (double)delayTable[delayTableIndexR]; + if (position < 0.0) + { + position += bufferR.Length; + } + + var index1 = (int)position; + var index2 = index1 + 1; + + if (index2 == bufferR.Length) + { + index2 = 0; + } + + var x1 = (double)bufferR[index1]; + var x2 = (double)bufferR[index2]; + var a = position - index1; + outputRight[t] = (float)(x1 + a * (x2 - x1)); + + delayTableIndexR++; + if (delayTableIndexR == delayTable.Length) + { + delayTableIndexR = 0; + } } - delayTableIndexR++; - if (delayTableIndexR == delayTable.Length) + bufferL[bufferIndex] = inputLeft[t]; + bufferR[bufferIndex] = inputRight[t]; + bufferIndex++; + if (bufferIndex == bufferL.Length) { - delayTableIndexR = 0; + bufferIndex = 0; } } }