package net.torvald.terrarum.audio.dsp import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.jme3.math.FastMath import net.torvald.terrarum.App import net.torvald.terrarum.audio.TerrarumAudioMixerTrack import net.torvald.terrarum.audio.linToLogPerc import net.torvald.terrarum.ui.BasicDebugInfoWindow import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.COL_METER_GRAD import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.COL_METER_GRAD2 import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.FILTER_NAME_ACTIVE import net.torvald.terrarum.ui.Toolkit /** * Created by minjaesong on 2023-11-17. */ class Lowpass(cutoff0: Float): TerrarumAudioFilter() { var cutoff = cutoff0.toDouble(); private set private var alpha: Float = 0f init { setCutoff(cutoff0) } fun setCutoff(cutoff: Float) { val RC: Float = 1f / (cutoff * FastMath.TWO_PI) val dt: Float = 1f / TerrarumAudioMixerTrack.SAMPLING_RATEF alpha = dt / (RC + dt) this.cutoff = cutoff.toDouble() } fun setCutoff(cutoff: Double) { // println("LP Cutoff: $cutoff") val RC: Double = 1.0 / (cutoff * Math.PI * 2.0) val dt: Double = 1.0 / TerrarumAudioMixerTrack.SAMPLING_RATEF alpha = (dt / (RC + dt)).toFloat() this.cutoff = cutoff } val in0 = FloatArray(2) val out0 = FloatArray(2) override fun thru(inbuf: List, outbuf: List) { for (ch in outbuf.indices) { val out = outbuf[ch] val inn = inbuf[ch] out[0] = out0[ch] + alpha * (inn[0] - out0[ch]) for (i in 1 until outbuf[ch].size) { out[i] = out[i-1] + alpha * (inn[i] - out[i-1]) } out0[ch] = outbuf[ch].last() in0[ch] = inbuf[ch].last() } } override fun drawDebugView(batch: SpriteBatch, x: Int, y: Int) { val perc = linToLogPerc(cutoff, 24.0, 24000.0).toFloat() batch.color = COL_METER_GRAD2 Toolkit.fillArea(batch, x.toFloat(), y.toFloat(), BasicDebugInfoWindow.STRIP_W * perc, 14f) batch.color = COL_METER_GRAD Toolkit.fillArea(batch, x.toFloat(), y+14f, BasicDebugInfoWindow.STRIP_W * perc, 2f) batch.color = FILTER_NAME_ACTIVE App.fontSmallNumbers.draw(batch, "F:${cutoff.toInt()}", x+3f, y+1f) } override val debugViewHeight = 16 override fun copyParamsFrom(other: TerrarumAudioFilter) { if (other is Lowpass) { setCutoff(other.cutoff) } } }