diff --git a/src/net/torvald/terrarum/audio/dsp/Convolv.kt b/src/net/torvald/terrarum/audio/dsp/Convolv.kt index 079dc6a5c..a4f8f041b 100644 --- a/src/net/torvald/terrarum/audio/dsp/Convolv.kt +++ b/src/net/torvald/terrarum/audio/dsp/Convolv.kt @@ -14,7 +14,6 @@ import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.COL_METER_GRAD_YEL import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.FILTER_NAME_ACTIVE import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.STRIP_W import net.torvald.terrarum.ui.Toolkit -import java.io.File import kotlin.math.roundToInt /** @@ -63,7 +62,7 @@ class Convolv(irModule: String, irPath: String, val crossfeed: Float, gain: Floa - pushSum(gain, inbuf[0], inbuf[1], sumbuf) + pushSumCircular(gain, inbuf[0], inbuf[1], sumbuf) convolve(sumbuf[0], convFFT[0], fftOutL) convolve(sumbuf[1], convFFT[1], fftOutR) @@ -80,30 +79,16 @@ class Convolv(irModule: String, irPath: String, val crossfeed: Float, gain: Floa processingSpeed = realtime / ptime } - - private fun push(gain: Float, samples: FloatArray, buf: ComplexArray) { - // shift numbers - System.arraycopy(buf.reim, samples.size * 2, buf.reim, 0, buf.reim.size - samples.size * 2) - // fill in the shifted area - val baseI = buf.reim.size - samples.size * 2 - samples.forEachIndexed { index, fl -> - buf.reim[baseI + index * 2 + 0] = fl * gain - buf.reim[baseI + index * 2 + 1] = 0f - } - } - - private fun pushSum(gain: Float, sampleL: FloatArray, sampleR: FloatArray, sumbuf: Array) { - // shift numbers - System.arraycopy(sumbuf[0].reim, sampleL.size * 2, sumbuf[0].reim, 0, sumbuf[0].reim.size - sampleL.size * 2) - System.arraycopy(sumbuf[1].reim, sampleL.size * 2, sumbuf[1].reim, 0, sumbuf[1].reim.size - sampleL.size * 2) - // fill in the shifted area - val baseI = sumbuf[0].reim.size - sampleL.size * 2 - for (index in sampleL.indices) { - sumbuf[0].reim[baseI + index * 2 + 0] = (sampleL[index] * 1.000000f + sampleR[index] * crossfeed) * gain - sumbuf[0].reim[baseI + index * 2 + 1] = 0f - sumbuf[1].reim[baseI + index * 2 + 0] = (sampleL[index] * crossfeed + sampleR[index] * 1.000000f) * gain - sumbuf[1].reim[baseI + index * 2 + 1] = 0f + private var bufferIndex = 0 + private fun pushSumCircular(gain: Float, sampleL: FloatArray, sampleR: FloatArray, sumbuf: Array) { + val baseIdx = bufferIndex * 2 + for (i in sampleL.indices) { + sumbuf[0].reim[baseIdx + i * 2] = (sampleL[i] + sampleR[i] * crossfeed) * gain + sumbuf[0].reim[baseIdx + i * 2 + 1] = 0f + sumbuf[1].reim[baseIdx + i * 2] = (sampleL[i] * crossfeed + sampleR[i]) * gain + sumbuf[1].reim[baseIdx + i * 2 + 1] = 0f } + bufferIndex = (bufferIndex + sampleL.size) % (fftLen - sampleL.size) } override fun drawDebugView(batch: SpriteBatch, x: Int, y: Int) {