panning and attenuation for pickaxe audio cue

This commit is contained in:
minjaesong
2024-03-31 21:02:00 +09:00
parent 742b63a8fa
commit f72ed0f706
5 changed files with 48 additions and 27 deletions

View File

@@ -335,7 +335,7 @@ Sound from <https://freesound.org/people/richwise>
- effects/explosion/fuse.ogg
- effects/explosion/fuse_continue.ogg
℗ 2012, 2015 j1987 and ScouseMouseJB
Sound from <https://freesound.org/people/j1987> and <https://freesound.org/people/ScouseMouseJB>
Remixed sound from <https://freesound.org/people/j1987> and <https://freesound.org/people/ScouseMouseJB>
- effects/accessibility/pickaxe_valuable.ogg
℗ 2009 Benboncan

View File

@@ -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<BinoPan>().pan = pan
}
}
/**
* Copies most recent `save` to `save.1`, leaving `save` for overwriting, previous `save.1` will be copied to `save.2`
*/

View File

@@ -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>().gain = ambientVolume.toFloat()
}
sfxSumBus.volume = sfxVolume
guiTrack.volume = guiVolume
guiTrack.getFilter<Gain>().gain = guiVolume.toFloat()
// process fades

View File

@@ -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) {

View File

@@ -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