From 71a8d6d266f4600f3e45c2cec2609d12a18cb7af Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 25 Nov 2023 00:17:29 +0900 Subject: [PATCH] reverb filter --- src/net/torvald/terrarum/audio/AudioMixer.kt | 2 +- .../terrarum/audio/TerrarumAudioFilter.kt | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index eb2756682..beef31a84 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -102,7 +102,7 @@ object AudioMixer: Disposable { init { // musicTrack.filters[0] = BinoPan((Math.random() * 2.0 - 1.0).toFloat()) -// musicTrack.filters[1] = Reverb(25f, 1f, 1000f) + musicTrack.filters[1] = Reverb(36f, 0.9f, 100f) masterTrack.filters[0] = SoftClp masterTrack.filters[1] = Buffer diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioFilter.kt b/src/net/torvald/terrarum/audio/TerrarumAudioFilter.kt index 3a2b9bd5a..ff0496be7 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioFilter.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioFilter.kt @@ -238,7 +238,7 @@ class BinoPan(var pan: Float, var earDist: Float = 0.18f): TerrarumAudioFilter() class Bitcrush(var steps: Int, var inputGain: Float = 1f): TerrarumAudioFilter() { override fun thru(inbuf0: List, inbuf1: List, outbuf0: List, outbuf1: List) { - for (ch in 0 until outbuf1.size) { + for (ch in outbuf1.indices) { for (i in 0 until BUFFER_SIZE / 4) { val inn = ((inbuf1[ch][i] * inputGain).coerceIn(-1f, 1f) + 1f) / 2f // 0f..1f val stepped = (inn * (steps - 1)).roundToFloat() / (steps - 1) @@ -249,35 +249,35 @@ class Bitcrush(var steps: Int, var inputGain: Float = 1f): TerrarumAudioFilter() } } -class Reverb(val delayMS: Float, var decay: Float, var lowpass: Float): TerrarumAudioFilter() { +class Reverb(val delayMS: Float, var feedback: Float, var lowpass: Float): TerrarumAudioFilter() { private var delay = (SAMPLING_RATEF * delayMS / 1000f).roundToInt() - - private val buf = Array(2) { FloatArray(delay) } - + private val bufSize = delay + private val buf = Array(2) { FloatArray(bufSize) } private fun unshift(sample: Float, buf: FloatArray) { - for (i in delay - 1 downTo 1) { + for (i in bufSize - 1 downTo 1) { buf[i] = buf[i - 1] } buf[0] = sample } + override fun thru(inbuf0: List, inbuf1: List, outbuf0: List, outbuf1: List) { val RC: Float = 1f / (lowpass * FastMath.TWO_PI) val dt: Float = 1f / SAMPLING_RATEF val alpha = dt / (RC + dt) - for (ch in 0 until outbuf1.size) { + for (ch in outbuf1.indices) { for (i in 0 until BUFFER_SIZE / 4) { + // TODO lowpass is not really working val in1 = inbuf1[ch][i] - val in2 = buf[ch][delay - 2] - val in3 = buf[ch][delay - 1] + val rv1 = buf[ch][delay - 1] + val rv0 = buf[ch][delay - 2] - val dek1 = 1f / (1f + decay) - val dek2 = decay / (1f + decay) + val reverb = (rv1 + alpha * (rv0 - rv1)) - val out = in1 * dek1 + (in2 + alpha * (in3 - in2)) * dek2 + val out = in1 - reverb * feedback unshift(out, buf[ch])