multiple amb tracks

This commit is contained in:
minjaesong
2024-01-21 17:01:45 +09:00
parent c00dd4e0bf
commit 6334cac3ba
4 changed files with 61 additions and 39 deletions

View File

@@ -53,19 +53,21 @@ class AudioMixer(val bufferSize: Int): Disposable {
val dynamicSourceCount: Int val dynamicSourceCount: Int
get() = App.getConfigInt("audio_dynamic_source_max") get() = App.getConfigInt("audio_dynamic_source_max")
val tracks = Array(8) { TerrarumAudioMixerTrack( val tracks = Array(10) { TerrarumAudioMixerTrack(
if (it == 0) "Music" if (it == 0) "Music"
else if (it == 1) "Ambient" else if (it == 1) "Amb1"
else if (it == 2) "GUI" else if (it == 2) "Amb2"
else if (it == 3) "\u00E4SFX" else if (it == 3) "GUI"
else if (it == 4) "\u00F0 \u00E4 \u00F0" // summation else if (it == 4) "\u00E4AMB"
else if (it == 5) "\u00D9Open\u00D9" // convolution1 else if (it == 5) "\u00E4SFX"
else if (it == 6) "\u00D9Cave\u00D9" // convolution2 else if (it == 6) "\u00F0 \u00E4 \u00F0" // summation
else if (it == 7) "\u00F0 \u00DA \u00F0" // fade else if (it == 7) "\u00D9Open\u00D9" // convolution1
else if (it == 8) "\u00D9Cave\u00D9" // convolution2
else if (it == 9) "\u00F0 \u00DA \u00F0" // fade
else "Trk${it+1}", trackType = if (it >= 3) TrackType.BUS else TrackType.STATIC_SOURCE, maxVolumeFun = { else "Trk${it+1}", trackType = if (it >= 3) TrackType.BUS else TrackType.STATIC_SOURCE, maxVolumeFun = {
when (it) { when (it) {
0 -> { musicVolume } 0 -> { musicVolume }
1 -> { ambientVolume } 4 -> { ambientVolume }
2 -> { sfxVolume } 2 -> { sfxVolume }
3 -> { guiVolume } 3 -> { guiVolume }
else -> { 1.0 } else -> { 1.0 }
@@ -82,21 +84,25 @@ class AudioMixer(val bufferSize: Int): Disposable {
val musicTrack: TerrarumAudioMixerTrack val musicTrack: TerrarumAudioMixerTrack
get() = tracks[0] get() = tracks[0]
val ambientTrack: TerrarumAudioMixerTrack val ambientTrack1: TerrarumAudioMixerTrack
get() = tracks[1] get() = tracks[1]
val guiTrack: TerrarumAudioMixerTrack val ambientTrack2: TerrarumAudioMixerTrack
get() = tracks[2] get() = tracks[2]
val sfxSumBus: TerrarumAudioMixerTrack val guiTrack: TerrarumAudioMixerTrack
get() = tracks[3] get() = tracks[3]
val sumBus: TerrarumAudioMixerTrack val ambSumBus: TerrarumAudioMixerTrack
get() = tracks[4] get() = tracks[4]
val convolveBusOpen: TerrarumAudioMixerTrack val sfxSumBus: TerrarumAudioMixerTrack
get() = tracks[5] get() = tracks[5]
val convolveBusCave: TerrarumAudioMixerTrack val sumBus: TerrarumAudioMixerTrack
get() = tracks[6] get() = tracks[6]
val fadeBus: TerrarumAudioMixerTrack val convolveBusOpen: TerrarumAudioMixerTrack
get() = tracks[7] get() = tracks[7]
val convolveBusCave: TerrarumAudioMixerTrack
get() = tracks[8]
val fadeBus: TerrarumAudioMixerTrack
get() = tracks[9]
var processing = false var processing = false
@@ -195,7 +201,7 @@ class AudioMixer(val bufferSize: Int): Disposable {
init { init {
// initialise audio paths // // initialise audio paths //
listOf(musicTrack, ambientTrack, sfxSumBus, guiTrack).forEach { listOf(musicTrack, ambientTrack1, ambientTrack2, sfxSumBus, guiTrack).forEach {
it.filters[0] = Gain(1f) it.filters[0] = Gain(1f)
} }
@@ -206,15 +212,21 @@ class AudioMixer(val bufferSize: Int): Disposable {
musicTrack.filters[1] = Vecto() musicTrack.filters[1] = Vecto()
musicTrack.filters[2] = Spectro() musicTrack.filters[2] = Spectro()
ambientTrack.filters[1] = Vecto(decibelsToFullscale(24.0).toFloat()) ambientTrack1.filters[1] = Vecto(decibelsToFullscale(32.0).toFloat())
ambientTrack.filters[2] = Spectro() ambientTrack1.filters[2] = Spectro()
ambientTrack.filters[3] = Gain(1f) ambientTrack2.filters[1] = Vecto(decibelsToFullscale(32.0).toFloat())
ambientTrack2.filters[2] = Spectro()
sfxSumBus.filters[1] = Vecto(0.7071f) sfxSumBus.filters[1] = Vecto(0.7071f)
sfxSumBus.filters[2] = Spectro() sfxSumBus.filters[2] = Spectro()
ambSumBus.addSidechainInput(ambientTrack1, 1.0)
ambSumBus.addSidechainInput(ambientTrack2, 1.0)
ambSumBus.filters[0] = Gain(1f) // controlled by the ambient volume config
ambSumBus.filters[1] = Gain(1f) // controlled by the "openness" controller
listOf(sumBus, convolveBusOpen, convolveBusCave).forEach { listOf(sumBus, convolveBusOpen, convolveBusCave).forEach {
it.addSidechainInput(musicTrack, 1.0) it.addSidechainInput(musicTrack, 1.0)
it.addSidechainInput(ambientTrack, 1.0) it.addSidechainInput(ambSumBus, 1.0)
it.addSidechainInput(sfxSumBus, 1.0) it.addSidechainInput(sfxSumBus, 1.0)
} }
@@ -268,7 +280,7 @@ class AudioMixer(val bufferSize: Int): Disposable {
) )
private val fadeReqs = HashMap<TerrarumAudioMixerTrack, FadeRequest>().also { map -> private val fadeReqs = HashMap<TerrarumAudioMixerTrack, FadeRequest>().also { map ->
listOf(musicTrack, ambientTrack, guiTrack, fadeBus).forEach { listOf(musicTrack, ambientTrack1, ambientTrack2, guiTrack, ambSumBus, fadeBus).forEach {
map[it] = FadeRequest() map[it] = FadeRequest()
} }
} }
@@ -335,7 +347,7 @@ class AudioMixer(val bufferSize: Int): Disposable {
(Gdx.audio as? Lwjgl3Audio)?.update() (Gdx.audio as? Lwjgl3Audio)?.update()
masterTrack.volume = masterVolume masterTrack.volume = masterVolume
musicTrack.getFilter<Gain>().gain = musicVolume.toFloat() * 0.5f musicTrack.getFilter<Gain>().gain = musicVolume.toFloat() * 0.5f
ambientTrack.getFilter<Gain>().gain = ambientVolume.toFloat() * 2 ambSumBus.getFilter<Gain>().gain = ambientVolume.toFloat() * 2
sfxSumBus.getFilter<Gain>().gain = sfxVolume.toFloat() sfxSumBus.getFilter<Gain>().gain = sfxVolume.toFloat()
guiTrack.getFilter<Gain>().gain = guiVolume.toFloat() guiTrack.getFilter<Gain>().gain = guiVolume.toFloat()
@@ -356,9 +368,13 @@ class AudioMixer(val bufferSize: Int): Disposable {
musicTrack.stop() musicTrack.stop()
musicTrack.currentTrack = null musicTrack.currentTrack = null
} }
if (req.fadeTarget == 0.0 && (track == musicTrack || track == fadeBus)) { if (req.fadeTarget == 0.0 && track == ambientTrack1) {
ambientTrack.stop() ambientTrack1.stop()
ambientTrack.currentTrack = null ambientTrack1.currentTrack = null
}
if (req.fadeTarget == 0.0 && track == ambientTrack2) {
ambientTrack2.stop()
ambientTrack2.currentTrack = null
} }
req.callback() req.callback()
@@ -408,13 +424,13 @@ class AudioMixer(val bufferSize: Int): Disposable {
musicTrack.play() musicTrack.play()
} }
if (!ambientTrack.isPlaying && ambientTrack.nextTrack != null) { if (!ambientTrack1.isPlaying && ambientTrack1.nextTrack != null) {
ambientTrack.queueNext(null) ambientTrack1.queueNext(null)
if (ambientStopped) { if (ambientStopped) {
requestFadeIn(ambientTrack, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001) requestFadeIn(ambientTrack1, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001)
} }
ambientTrack.volume = 1.0 ambientTrack1.volume = 1.0
ambientTrack.play() ambientTrack1.play()
ambientStopped = false ambientStopped = false
} }
} }
@@ -433,6 +449,15 @@ class AudioMixer(val bufferSize: Int): Disposable {
} }
fun startAmb(song: MusicContainer) { fun startAmb(song: MusicContainer) {
val ambientTrack = if (!ambientTrack1.streamPlaying)
ambientTrack1
else if (!ambientTrack2.streamPlaying)
ambientTrack2
else if (ambientTrack1.playStartedTime < ambientTrack2.playStartedTime)
ambientTrack1
else
ambientTrack2
if (ambientTrack.isPlaying == true) { if (ambientTrack.isPlaying == true) {
requestFadeOut(musicTrack, DEFAULT_FADEOUT_LEN) requestFadeOut(musicTrack, DEFAULT_FADEOUT_LEN)
} }
@@ -440,10 +465,6 @@ class AudioMixer(val bufferSize: Int): Disposable {
// fade will be processed by the update() // fade will be processed by the update()
} }
fun stopAmb() {
requestFadeOut(ambientTrack, DEFAULT_FADEOUT_LEN * 4)
}
fun requestFadeOut(track: TerrarumAudioMixerTrack, length: Double = DEFAULT_FADEOUT_LEN, target: Double = 0.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) { fun requestFadeOut(track: TerrarumAudioMixerTrack, length: Double = DEFAULT_FADEOUT_LEN, target: Double = 0.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) {
val req = fadeReqs[track]!! val req = fadeReqs[track]!!
if (!req.fadeoutFired) { if (!req.fadeoutFired) {

View File

@@ -913,7 +913,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
App.audioMixer.convolveBusCave.volume = 0.0 App.audioMixer.convolveBusCave.volume = 0.0
} }
val openness = (TileSurvey.getRatio("basegame.Ingame.openness") ?: 0.0).times(1.74).coerceIn(0.0, 1.0) val openness = (TileSurvey.getRatio("basegame.Ingame.openness") ?: 0.0).times(1.74).coerceIn(0.0, 1.0)
(App.audioMixer.ambientTrack.filters[3] as Gain).gain = openness.pow(2.0 / 3.0).toFloat() (App.audioMixer.ambSumBus.filters[1] as Gain).gain = openness.pow(2.0 / 3.0).toFloat()

View File

@@ -15,6 +15,7 @@ import net.torvald.reflection.forceInvoke
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.App.printdbg
import net.torvald.terrarum.audio.AudioMixer import net.torvald.terrarum.audio.AudioMixer
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
@@ -371,8 +372,8 @@ class TerrarumMusicGovernor : MusicGovernor() {
} }
private fun stopAmbient() { private fun stopAmbient() {
if (::currentAmbientTrack.isInitialized) // if (::currentAmbientTrack.isInitialized)
App.audioMixer.ambientTrack.nextTrack = currentAmbientTrack // App.audioMixer.ambientTrack.nextTrack = currentAmbientTrack
} }
private fun startAmbient(song: MusicContainer) { private fun startAmbient(song: MusicContainer) {

View File

@@ -266,7 +266,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) {
App.bogoflops = maxOf(App.bogoflops, bogoflops) App.bogoflops = maxOf(App.bogoflops, bogoflops)
App.audioMixer.ambientTrack.let { listOf(App.audioMixer.ambientTrack1, App.audioMixer.ambientTrack2).forEach {
it.stop() it.stop()
it.currentTrack = null it.currentTrack = null
it.nextTrack = null it.nextTrack = null