From 949ff841deb4c8f3b436a248eec60ed0711b5ce7 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 20 Jan 2024 19:18:53 +0900 Subject: [PATCH] ambient audio stuffs --- .../mods/basegame/audio/ambient/autumn1.ogg | 3 ++ .../mods/basegame/audio/ambient/summer1.ogg | 3 ++ .../mods/basegame/audio/ambient/winter1.ogg | 3 ++ src/net/torvald/terrarum/audio/AudioMixer.kt | 20 +++++++--- .../terrarum/modulebasegame/TerrarumIngame.kt | 15 +++++++ .../modulebasegame/TerrarumMusicGovernor.kt | 39 +++++++++---------- .../terrarum/modulebasegame/TitleScreen.kt | 5 +++ .../terrarum/ui/BasicDebugInfoWindow.kt | 2 +- 8 files changed, 64 insertions(+), 26 deletions(-) create mode 100644 assets/mods/basegame/audio/ambient/autumn1.ogg create mode 100644 assets/mods/basegame/audio/ambient/summer1.ogg create mode 100644 assets/mods/basegame/audio/ambient/winter1.ogg diff --git a/assets/mods/basegame/audio/ambient/autumn1.ogg b/assets/mods/basegame/audio/ambient/autumn1.ogg new file mode 100644 index 000000000..ad97b46d7 --- /dev/null +++ b/assets/mods/basegame/audio/ambient/autumn1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4106ad46632a2e924f98c8129d0ead674d6ed8915c501d3db3f73a4a83e6936f +size 5173445 diff --git a/assets/mods/basegame/audio/ambient/summer1.ogg b/assets/mods/basegame/audio/ambient/summer1.ogg new file mode 100644 index 000000000..15f76ed2e --- /dev/null +++ b/assets/mods/basegame/audio/ambient/summer1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72175b849610a426f0fa33420e71e21028e82404445df60cb0fc61041de2c88e +size 5424074 diff --git a/assets/mods/basegame/audio/ambient/winter1.ogg b/assets/mods/basegame/audio/ambient/winter1.ogg new file mode 100644 index 000000000..f975b79d7 --- /dev/null +++ b/assets/mods/basegame/audio/ambient/winter1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dddc2bf3533e317e94cb16665c86ef1a661dc864d6252e99ca2f72851978342c +size 5723437 diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index e0ff3034b..e9057402e 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -7,6 +7,7 @@ import com.badlogic.gdx.utils.Disposable import com.jme3.math.FastMath import net.torvald.spriteanimation.AssembledSpriteAnimation import net.torvald.terrarum.* +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATED import net.torvald.terrarum.audio.dsp.* @@ -205,8 +206,9 @@ class AudioMixer(val bufferSize: Int): Disposable { musicTrack.filters[1] = Vecto() musicTrack.filters[2] = Spectro() - ambientTrack.filters[1] = Vecto() + ambientTrack.filters[1] = Vecto(decibelsToFullscale(24.0).toFloat()) ambientTrack.filters[2] = Spectro() + ambientTrack.filters[3] = Gain(1f) sfxSumBus.filters[1] = Vecto(0.7071f) sfxSumBus.filters[2] = Spectro() @@ -232,7 +234,6 @@ class AudioMixer(val bufferSize: Int): Disposable { masterTrack.addSidechainInput(fadeBus, 1.0) masterTrack.addSidechainInput(guiTrack, 1.0) - musicTrack.filters[3] = Gain(0.5f) dynamicTracks.forEach { it.filters[0] = BinoPan(0f) @@ -333,8 +334,8 @@ class AudioMixer(val bufferSize: Int): Disposable { // the real updates (Gdx.audio as? Lwjgl3Audio)?.update() masterTrack.volume = masterVolume - musicTrack.getFilter().gain = musicVolume.toFloat() - ambientTrack.getFilter().gain = ambientVolume.toFloat() + musicTrack.getFilter().gain = musicVolume.toFloat() * 0.5f + ambientTrack.getFilter().gain = ambientVolume.toFloat() * 2 sfxSumBus.getFilter().gain = sfxVolume.toFloat() guiTrack.getFilter().gain = guiVolume.toFloat() @@ -409,12 +410,17 @@ class AudioMixer(val bufferSize: Int): Disposable { if (!ambientTrack.isPlaying && ambientTrack.nextTrack != null) { ambientTrack.queueNext(null) - requestFadeIn(ambientTrack, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001) + if (ambientStopped) { + requestFadeIn(ambientTrack, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001) + } ambientTrack.volume = 1.0 ambientTrack.play() + ambientStopped = false } } + private var ambientStopped = true + fun startMusic(song: MusicContainer) { if (musicTrack.isPlaying) { requestFadeOut(musicTrack, DEFAULT_FADEOUT_LEN) @@ -451,6 +457,9 @@ class AudioMixer(val bufferSize: Int): Disposable { } fun requestFadeIn(track: TerrarumAudioMixerTrack, length: Double, target: Double = 1.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) { + printdbg(this, "fadein called by") + printStackTrace(this) + val req = fadeReqs[track]!! if (!req.fadeinFired) { req.fadeLength = length.coerceAtLeast(1.0/1024.0) @@ -484,6 +493,7 @@ class AudioMixer(val bufferSize: Int): Disposable { } fun reset() { + ambientStopped = true dynamicTracks.forEach { it.stop() } tracks.filter { it.trackType == TrackType.STATIC_SOURCE }.forEach { it.stop() } tracks.forEach { diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index a5609c208..78ca9ce3f 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -12,6 +12,7 @@ import net.torvald.terrarum.Terrarum.getPlayerSaveFiledesc import net.torvald.terrarum.Terrarum.getWorldSaveFiledesc import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED +import net.torvald.terrarum.audio.dsp.Gain import net.torvald.terrarum.blockproperties.BlockPropUtil import net.torvald.terrarum.blockstats.MinimapComposer import net.torvald.terrarum.blockstats.TileSurvey @@ -312,6 +313,16 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { MaterialCodex[prop.material].sondrefl } ) + + TileSurvey.submitProposal( + TileSurvey.SurveyProposal( + "basegame.Ingame.openness", 73, 73, 2, 4 + ) { world, x, y -> + val tileProp = BlockCodex[world.getTileFromTerrain(x, y)] + val wallProp = BlockCodex[world.getTileFromWall(x, y)] + (!tileProp.isSolid && !wallProp.isSolid).toInt().toFloat() + } + ) } data class NewGameParams( @@ -904,6 +915,10 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { App.audioMixer.convolveBusOpen.volume = (1.0 - ratio1).pow(0.75) App.audioMixer.convolveBusCave.volume = 0.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() + + actorNowPlaying?.let { if (WORLD_UPDATE_TIMER % 4 == 1) updateWorldGenerator(actorNowPlaying!!) } diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt index 24b420443..f418dfbcf 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt @@ -269,22 +269,22 @@ class TerrarumMusicGovernor : MusicGovernor() { } private val ambients: List = - File(App.customAmbientDir).listFiles()?.mapNotNull { + ModMgr.getFilesFromEveryMod("audio/ambient/").flatMap { it.second.listFiles()?.toList() ?: emptyList() }.mapNotNull { printdbg(this, "Ambient: ${it.absolutePath}") try { MusicContainer( it.nameWithoutExtension.replace('_', ' ').split(" ").map { it.capitalize() }.joinToString(" "), it, - Gdx.audio.newMusic(Gdx.files.absolute(it.absolutePath)) + Gdx.audio.newMusic(Gdx.files.absolute(it.absolutePath)).also { + it.isLooping = true + } ) { stopAmbient() } } catch (e: GdxRuntimeException) { e.printStackTrace() null } - } ?: emptyList() // TODO test code - - private var ambientsBin: ArrayList = ArrayList(ambients.indices.toList().shuffled()) + } private val musicStartHooks = ArrayList<(MusicContainer) -> Unit>() private val musicStopHooks = ArrayList<(MusicContainer) -> Unit>() @@ -367,30 +367,19 @@ class TerrarumMusicGovernor : MusicGovernor() { } } - // MixerTrackProcessor will call this function externally to make gapless playback work - fun pullNextAmbientTrack(): MusicContainer { - // prevent same song to play twice in row (for the most time) - if (ambientsBin.isEmpty()) { - ambientsBin = ArrayList(ambients.indices.toList().shuffled()) - } - return ambients[ambientsBin.removeAt(0)] - } - private fun stopAmbient() { - ambState = STATE_INTERMISSION - intermissionAkku = 0f - intermissionLength = 30f + 30f * Math.random().toFloat() // 30s-60s - ambFired = false - printdbg(this, "stopAmbient Intermission: $intermissionLength seconds") + App.audioMixer.ambientTrack.nextTrack = currentAmbientTrack } private fun startAmbient(song: MusicContainer) { + currentAmbientTrack = song App.audioMixer.startAmb(song) printdbg(this, "startAmbient Now playing: $song") // INGAME.sendNotification("Now Playing $EMDASH ${song.name}") ambState = STATE_PLAYING } + private lateinit var currentAmbientTrack: MusicContainer override fun update(ingame: IngameInstance, delta: Float) { // start the song queueing if there is one to play @@ -422,7 +411,17 @@ class TerrarumMusicGovernor : MusicGovernor() { STATE_FIREPLAY -> { if (!ambFired) { ambFired = true - startAmbient(pullNextAmbientTrack()) + + val season = ingame.world.worldTime.ecologicalSeason + val seasonName = when (season) { + in 0f..2f -> "autumn" + in 2f..3f -> "summer" + in 3f..5f -> "autumn" + else -> "winter" + } + val track = ambients.filter { it.name.lowercase().startsWith(seasonName) }.random() + + startAmbient(track) } } STATE_PLAYING -> { diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index 043532593..d12e6106e 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -266,6 +266,11 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { App.bogoflops = maxOf(App.bogoflops, bogoflops) + App.audioMixer.ambientTrack.let { + it.stop() + it.currentTrack = null + it.nextTrack = null + } App.audioMixer.reset() } diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index 13bb3ccac..9177f58b5 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -463,7 +463,7 @@ class BasicDebugInfoWindow : UICanvas() { private val stripGap = 1 private val stripFilterHeight = 16 private val stripFaderHeight = meterHeight + 20 - private val numberOfFilters = 14 + private val numberOfFilters = 16 private val stripH = stripFaderHeight + stripFilterHeight * numberOfFilters + 16 private val trackBack = listOf(COL_WELL, COL_WELL2)