sound engine is no longer a singleton

This commit is contained in:
minjaesong
2024-01-16 02:50:47 +09:00
parent 350e205028
commit 755ced9ea4
30 changed files with 275 additions and 159 deletions

View File

@@ -3,10 +3,7 @@ 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.App.printdbg
import net.torvald.terrarum.audio.AudioMixer
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.AUDIO_BUFFER_SIZE
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATEF
import net.torvald.terrarum.audio.decibelsToFullscale
import net.torvald.terrarum.ceilToInt
@@ -43,8 +40,8 @@ class BinoPan(var pan: Float, var earDist: Float = EARDIST_DEFAULT): TerrarumAud
private val delays = arrayOf(0f, 0f)
private val mults = arrayOf(1f, 1f)
private val outLs = Array(2) { FloatArray(AUDIO_BUFFER_SIZE) }
private val outRs = Array(2) { FloatArray(AUDIO_BUFFER_SIZE) }
private var outLs = Array(2) { FloatArray(App.audioBufferSize) }
private var outRs = Array(2) { FloatArray(App.audioBufferSize) }
companion object {
@@ -58,6 +55,13 @@ class BinoPan(var pan: Float, var earDist: Float = EARDIST_DEFAULT): TerrarumAud
private val HALF_PI = (Math.PI / 2.0).toFloat()
}
override fun reset() {
outLs = Array(2) { FloatArray(App.audioBufferSize) }
outRs = Array(2) { FloatArray(App.audioBufferSize) }
delayLineL.fill(0f)
delayLineR.fill(0f)
}
/**
* @param intensity -inf to +inf
*/
@@ -104,7 +108,7 @@ class BinoPan(var pan: Float, var earDist: Float = EARDIST_DEFAULT): TerrarumAud
mults[R] = volMultFsOther
}
for (i in 0 until AUDIO_BUFFER_SIZE) {
for (i in 0 until App.audioBufferSize) {
sumbuf[L][i] = mults[L] * getFrom(i - delays[L], delayLine, inbuf)
sumbuf[R][i] = mults[R] * getFrom(i - delays[R], delayLine, inbuf)
}
@@ -115,7 +119,7 @@ class BinoPan(var pan: Float, var earDist: Float = EARDIST_DEFAULT): TerrarumAud
thru("L", -50f, inbuf[L], outLs, delayLineL) // 50 will become 59.036 on panningFieldMap
thru("R", +50f, inbuf[R], outRs, delayLineR)
for (i in 0 until AUDIO_BUFFER_SIZE) {
for (i in 0 until App.audioBufferSize) {
val outL = (outLs[L][i] + outRs[L][i]) / 2f
val outR = (outLs[R][i] + outRs[R][i]) / 2f
outbuf[L][i] = outL

View File

@@ -3,7 +3,6 @@ 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.roundToFloat
import net.torvald.terrarum.ui.BasicDebugInfoWindow
@@ -13,7 +12,7 @@ import net.torvald.terrarum.ui.Toolkit
class Bitcrush(var steps: Int, var inputGain: Float = 1f): TerrarumAudioFilter() {
override fun thru(inbuf: List<FloatArray>, outbuf: List<FloatArray>) {
for (ch in outbuf.indices) {
for (i in 0 until TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE) {
for (i in 0 until App.audioBufferSize) {
val inn = ((inbuf[ch][i] * inputGain).coerceIn(-1f, 1f) + 1f) / 2f // 0f..1f
val stepped = (inn * (steps - 1)).roundToFloat() / (steps - 1)
val out = (stepped * 2f) - 1f // -1f..1f
@@ -35,5 +34,8 @@ class Bitcrush(var steps: Int, var inputGain: Float = 1f): TerrarumAudioFilter()
App.fontSmallNumbers.draw(batch, "B:$bits", x+3f, y+1f)
}
override fun reset() {
}
override val debugViewHeight = 16
}

View File

@@ -2,7 +2,6 @@ package net.torvald.terrarum.audio.dsp
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.AUDIO_BUFFER_SIZE
import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.FILTER_NAME_ACTIVE
object Buffer : TerrarumAudioFilter() {
@@ -16,7 +15,10 @@ object Buffer : TerrarumAudioFilter() {
override fun drawDebugView(batch: SpriteBatch, x: Int, y: Int) {
batch.color = FILTER_NAME_ACTIVE
App.fontSmallNumbers.draw(batch, "Bs:${AUDIO_BUFFER_SIZE}", x+3f, y+1f)
App.fontSmallNumbers.draw(batch, "Bs:${App.audioBufferSize}", x+3f, y+1f)
}
override fun reset() {
}
override val debugViewHeight = 16

View File

@@ -5,8 +5,6 @@ import com.jme3.math.FastMath
import net.torvald.terrarum.App
import net.torvald.terrarum.App.setDebugTime
import net.torvald.terrarum.audio.*
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.AUDIO_BUFFER_SIZE
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.COL_METER_GRAD2_RED
@@ -25,14 +23,13 @@ import kotlin.math.roundToInt
* @param gain output gain. Fullscale (0.0 - 1.0)
*/
class Convolv(ir: File, val crossfeed: Float, gain: Float = 1f / 256f): TerrarumAudioFilter() {
private val gain: Float = gain / (1f + crossfeed)
val fftLen: Int
private val convFFT: Array<ComplexArray>
private val sumbuf: Array<ComplexArray>
private val BLOCKSIZE = TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE
var processingSpeed = 1f; private set
init {
@@ -71,12 +68,18 @@ class Convolv(ir: File, val crossfeed: Float, gain: Float = 1f / 256f): Terrarum
}
}
private val realtime = (BLOCKSIZE / TerrarumAudioMixerTrack.SAMPLING_RATEF * 1000000000L)
private var realtime = (App.audioBufferSize / TerrarumAudioMixerTrack.SAMPLING_RATEF * 1000000000L)
private val fftIn = ComplexArray(FloatArray(fftLen * 2))
private val fftMult = ComplexArray(FloatArray(fftLen * 2))
private val fftOutL = FloatArray(fftLen)
private val fftOutR = FloatArray(fftLen)
override fun reset() {
realtime = (App.audioBufferSize / TerrarumAudioMixerTrack.SAMPLING_RATEF * 1000000000L)
processingSpeed = 1f
sumbuf.forEach { it.reim.fill(0f) }
}
private fun convolve(x: ComplexArray, h: ComplexArray, output: FloatArray) {
FFT.fftInto(x, fftIn)
fftIn.mult(h, fftMult)
@@ -96,9 +99,9 @@ class Convolv(ir: File, val crossfeed: Float, gain: Float = 1f / 256f): Terrarum
convolve(sumbuf[0], convFFT[0], fftOutL)
convolve(sumbuf[1], convFFT[1], fftOutR)
for (i in 0 until BLOCKSIZE) {
outbuf[0][i] = fftOutL[fftLen - BLOCKSIZE + i]
outbuf[1][i] = fftOutR[fftLen - BLOCKSIZE + i]
for (i in 0 until App.audioBufferSize) {
outbuf[0][i] = fftOutL[fftLen - App.audioBufferSize + i]
outbuf[1][i] = fftOutR[fftLen - App.audioBufferSize + i]
}
@@ -144,7 +147,7 @@ class Convolv(ir: File, val crossfeed: Float, gain: Float = 1f / 256f): Terrarum
Toolkit.fillArea(batch, x.toFloat(), y+14f, STRIP_W * perc, 2f)
// filter length bar
val g = FastMath.intLog2(AUDIO_BUFFER_SIZE)
val g = FastMath.intLog2(App.audioBufferSize)
val perc2 = (FastMath.intLog2(fftLen).minus(g).toFloat() / (16f - g)).coerceIn(0f, 1f)
batch.color = COL_METER_GRAD2
Toolkit.fillArea(batch, x.toFloat(), y + 16f, STRIP_W * perc2, 14f)

View File

@@ -2,14 +2,13 @@ package net.torvald.terrarum.audio.dsp
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack
import net.torvald.terrarum.audio.fullscaleToDecibels
import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.FILTER_NAME_ACTIVE
import kotlin.math.roundToInt
class Gain(var gain: Float): TerrarumAudioFilter() {
override fun thru(inbuf: List<FloatArray>, outbuf: List<FloatArray>) {
for (i in 0 until TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE) {
for (i in 0 until App.audioBufferSize) {
outbuf[0][i] = inbuf[0][i] * gain
outbuf[1][i] = inbuf[1][i] * gain
}
@@ -20,5 +19,9 @@ class Gain(var gain: Float): TerrarumAudioFilter() {
App.fontSmallNumbers.draw(batch, "G:${fullscaleToDecibels(gain.toDouble()).times(100).roundToInt().div(100f)}", x+3f, y+1f)
}
override fun reset() {
}
override val debugViewHeight = 16
}

View File

@@ -68,4 +68,8 @@ class Highpass(cutoff0: Float): TerrarumAudioFilter() {
override val debugViewHeight = 16
override fun reset() {
in0.fill(0f)
out0.fill(0f)
}
}

View File

@@ -67,4 +67,9 @@ class Lowpass(cutoff0: Float): TerrarumAudioFilter() {
}
override val debugViewHeight = 16
override fun reset() {
in0.fill(0f)
out0.fill(0f)
}
}

View File

@@ -13,4 +13,7 @@ object NullFilter : TerrarumAudioFilter() {
}
override val debugViewHeight = 0
override fun reset() {
}
}

View File

@@ -2,6 +2,7 @@ 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 kotlin.math.roundToInt
@@ -31,7 +32,7 @@ class Reverb(val delayMS: Float = 36f, var feedback: Float = 0.92f, var lowpass:
val alphaHi = RCHi / (RCHi + dt)
for (ch in outbuf.indices) {
for (i in 0 until TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE) {
for (i in 0 until App.audioBufferSize) {
val inn = inbuf[ch][i]
// reverb
@@ -52,4 +53,8 @@ class Reverb(val delayMS: Float = 36f, var feedback: Float = 0.92f, var lowpass:
}
override val debugViewHeight = 0
override fun reset() {
buf.forEach { it.fill(0f) }
}
}

View File

@@ -56,4 +56,7 @@ object SoftClp : TerrarumAudioFilter() {
}
override val debugViewHeight = 0
override fun reset() {
}
}

View File

@@ -3,8 +3,8 @@ package net.torvald.terrarum.audio.dsp
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.jme3.math.FastMath
import net.torvald.terrarum.App
import net.torvald.terrarum.audio.*
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.AUDIO_BUFFER_SIZE
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATED
import net.torvald.terrarum.ui.BasicDebugInfoWindow
import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.STRIP_W
@@ -91,15 +91,18 @@ class Spectro(val gain: Float = 1f) : TerrarumAudioFilter() {
}
override val debugViewHeight = STRIP_W
override fun reset() {
}
}
class Vecto(val gain: Float = 1f) : TerrarumAudioFilter() {
val backbufL = Array((6144f / AUDIO_BUFFER_SIZE).roundToInt().coerceAtLeast(1)) {
FloatArray(AUDIO_BUFFER_SIZE)
var backbufL = Array((6144f / App.audioBufferSize).roundToInt().coerceAtLeast(1)) {
FloatArray(App.audioBufferSize)
}
val backbufR = Array((6144f / AUDIO_BUFFER_SIZE).roundToInt().coerceAtLeast(1)) {
FloatArray(AUDIO_BUFFER_SIZE)
var backbufR = Array((6144f / App.audioBufferSize).roundToInt().coerceAtLeast(1)) {
FloatArray(App.audioBufferSize)
}
private val sqrt2p = 0.7071067811865475
@@ -110,11 +113,11 @@ class Vecto(val gain: Float = 1f) : TerrarumAudioFilter() {
backbufL[i] = backbufL[i - 1]
backbufR[i] = backbufR[i - 1]
}
backbufL[0] = FloatArray(TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE)
backbufR[0] = FloatArray(TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE)
backbufL[0] = FloatArray(App.audioBufferSize)
backbufR[0] = FloatArray(App.audioBufferSize)
// plot dots
for (i in 0 until TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE) {
for (i in 0 until App.audioBufferSize) {
val y0 = +inbuf[0][i] * gain
val x0 = -inbuf[1][i] * gain// rotate the domain by -90 deg
@@ -154,4 +157,13 @@ class Vecto(val gain: Float = 1f) : TerrarumAudioFilter() {
}
override val debugViewHeight = STRIP_W
override fun reset() {
backbufL = Array((6144f / App.audioBufferSize).roundToInt().coerceAtLeast(1)) {
FloatArray(App.audioBufferSize)
}
backbufR = Array((6144f / App.audioBufferSize).roundToInt().coerceAtLeast(1)) {
FloatArray(App.audioBufferSize)
}
}
}

View File

@@ -13,6 +13,7 @@ abstract class TerrarumAudioFilter {
}
else thru(inbuf, outbuf)
}
abstract fun reset()
abstract fun drawDebugView(batch: SpriteBatch, x: Int, y: Int)
abstract val debugViewHeight: Int
}

View File

@@ -1,11 +1,11 @@
package net.torvald.terrarum.audio.dsp
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack
import net.torvald.terrarum.App
object XYtoMS: TerrarumAudioFilter() {
override fun thru(inbuf: List<FloatArray>, outbuf: List<FloatArray>) {
for (i in 0 until TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE) {
for (i in 0 until App.audioBufferSize) {
val X = inbuf[0][i]
val Y = inbuf[1][i]
val M = (X + Y) / 2f
@@ -19,11 +19,14 @@ object XYtoMS: TerrarumAudioFilter() {
}
override val debugViewHeight = 0
override fun reset() {
}
}
object MStoXY: TerrarumAudioFilter() {
override fun thru(inbuf: List<FloatArray>, outbuf: List<FloatArray>) {
for (i in 0 until TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE) {
for (i in 0 until App.audioBufferSize) {
val M = inbuf[0][i]
val S = inbuf[1][i]
val X = M + S
@@ -37,4 +40,7 @@ object MStoXY: TerrarumAudioFilter() {
}
override val debugViewHeight = 0
override fun reset() {
}
}