From f72ed0f706dfba73896fb1b2373f780867b889b2 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 31 Mar 2024 21:02:00 +0900 Subject: [PATCH] panning and attenuation for pickaxe audio cue --- src/net/torvald/terrarum/CreditSingleton.kt | 2 +- src/net/torvald/terrarum/IngameInstance.kt | 12 +++++ src/net/torvald/terrarum/audio/AudioMixer.kt | 6 ++- .../terrarum/audio/MixerTrackProcessor.kt | 45 +++++++++---------- .../gameitems/PickaxeGeneric.kt | 10 ++++- 5 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/net/torvald/terrarum/CreditSingleton.kt b/src/net/torvald/terrarum/CreditSingleton.kt index 05a0bb61b..50bceeaad 100644 --- a/src/net/torvald/terrarum/CreditSingleton.kt +++ b/src/net/torvald/terrarum/CreditSingleton.kt @@ -335,7 +335,7 @@ Sound from - effects/explosion/fuse.ogg - effects/explosion/fuse_continue.ogg ℗ 2012, 2015 j1987 and ScouseMouseJB -Sound from and +Remixed sound from and - effects/accessibility/pickaxe_valuable.ogg ℗ 2009 Benboncan diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 4009b2c17..6a2efd785 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -5,6 +5,8 @@ import com.badlogic.gdx.Input import com.badlogic.gdx.utils.Disposable import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE +import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.dsp.BinoPan import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorID import net.torvald.terrarum.gameactors.ActorWithBody @@ -442,6 +444,16 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo loadedTime_t = App.getTIME_T() } + open fun playGUIsound(sound: MusicContainer, volume: Double = 1.0, pan: Float = 0f) { + App.audioMixer.guiTrack.let { + it.currentTrack = sound + it.maxVolumeFun= { volume } + it.volume = volume + it.playRequested.set(true) + it.getFilter().pan = pan + } + } + /** * Copies most recent `save` to `save.1`, leaving `save` for overwriting, previous `save.1` will be copied to `save.2` */ diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index 10512e5ac..a2140c5e8 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -226,10 +226,12 @@ class AudioMixer : Disposable { init { // initialise audio paths // - listOf(musicTrack, ambientTrack1, ambientTrack2, ambientTrack3, ambientTrack4).forEach { + listOf(musicTrack, ambientTrack1, ambientTrack2, ambientTrack3, ambientTrack4, guiTrack).forEach { it.filters[0] = Gain(1f) } + guiTrack.filters[0] = BinoPan(0f) + masterTrack.filters[0] = SoftClp masterTrack.filters[1] = Buffer masterTrack.filters[2] = Vecto(1.4142f) @@ -369,7 +371,7 @@ class AudioMixer : Disposable { it.getFilter().gain = ambientVolume.toFloat() } sfxSumBus.volume = sfxVolume - guiTrack.volume = guiVolume + guiTrack.getFilter().gain = guiVolume.toFloat() // process fades diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index e1504e7ae..7f28787d1 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -24,6 +24,28 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud private var buffertaille = bufferSize companion object { + fun getVolFun(x: Double): Double { + // https://www.desmos.com/calculator/blcd4s69gl +// val K = 1.225 +// fun q(x: Double) = if (x >= 1.0) 0.5 else (K*x - K).pow(2.0) + 0.5 +// val x2 = x.pow(q(x)) + + // method 1. + // https://www.desmos.com/calculator/uzbjw10lna +// val K = 512.0 +// return K.pow(-sqrt(1.0+x.sqr())) * K + + + // method 2. + // https://www.desmos.com/calculator/3xsac66rsp + + + // method 3. + // comparison with method 1. + // https://www.desmos.com/calculator/rbteowef8v + val Q = 2.0 + return 1.0 / cosh(Q * x).sqr() + } } @Volatile var running = true; private set @@ -310,29 +332,6 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud // } // uncomment to multithread } - private fun getVolFun(x: Double): Double { - // https://www.desmos.com/calculator/blcd4s69gl -// val K = 1.225 -// fun q(x: Double) = if (x >= 1.0) 0.5 else (K*x - K).pow(2.0) + 0.5 -// val x2 = x.pow(q(x)) - - // method 1. - // https://www.desmos.com/calculator/uzbjw10lna -// val K = 512.0 -// return K.pow(-sqrt(1.0+x.sqr())) * K - - - // method 2. - // https://www.desmos.com/calculator/3xsac66rsp - - - // method 3. - // comparison with method 1. - // https://www.desmos.com/calculator/rbteowef8v - val Q = 2.0 - return 1.0 / cosh(Q * x).sqr() - } - private fun FloatArray.applyVolume(volume: Float) = FloatArray(this.size) { (this[it] * volume) } /*private fun FloatArray.applyVolumeInline(volume: Float): FloatArray { for (i in this.indices) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt index 5fb18f647..84989b496 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt @@ -2,9 +2,11 @@ package net.torvald.terrarum.modulebasegame.gameitems import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.TextureRegion +import com.jme3.math.FastMath.pow import net.torvald.terrarum.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED +import net.torvald.terrarum.audio.MixerTrackProcessor import net.torvald.terrarum.audio.MusicContainer import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.AVKey @@ -246,8 +248,14 @@ object PickaxeCore { } // play sound cue + val mvec = Vector2(Terrarum.mouseX, Terrarum.mouseY) + val dist = distBetween(actor, mvec) + val relX = relativeXposition(actor, mvec) + val distFallOff = 1.3 * 128.0 + val pan = 1.3 * relX / distFallOff + val vol = MixerTrackProcessor.getVolFun(dist / distFallOff).coerceAtLeast(0.0) if (!tooltipWasShown && tooltipSet) { - actor.startAudio(soundCue, 0.7) // TODO play on the GUI track + INGAME.playGUIsound(soundCue, 0.25 * vol, pan.toFloat()) } true // just a placeholder