diff --git a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt index dbcf6b7d6..5c44cdefd 100644 --- a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt +++ b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt @@ -5,14 +5,17 @@ import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.glutils.FrameBuffer +import com.badlogic.gdx.utils.JsonValue import com.jme3.math.FastMath import net.torvald.reflection.extortField import net.torvald.terrarum.* +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.* import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.ui.BasicDebugInfoWindow import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.utils.JsonFetcher import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import kotlin.math.* @@ -66,12 +69,25 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { setAsAlwaysVisible() // test code - val diskJockeyingMode = "continuous" // must be read from the playlist.json - registerPlaylist(App.customDir + "/MusicFJ", false, diskJockeyingMode) + val albumDir = App.customMusicDir + "/FurryJoA 2023 Live" + val playlistFile = JsonFetcher.invoke("$albumDir/playlist.json") + + val diskJockeyingMode = playlistFile.get("diskJockeyingMode").asString() + val shuffled = playlistFile.get("shuffled").asBoolean() + val fileToName = playlistFile.get("files") + + registerPlaylist(albumDir, fileToName, shuffled, diskJockeyingMode) } - fun registerPlaylist(path: String, shuffled: Boolean, diskJockeyingMode: String) { - ingame.musicGovernor.queueDirectory(path, shuffled, diskJockeyingMode) + fun registerPlaylist(path: String, fileToName: JsonValue, shuffled: Boolean, diskJockeyingMode: String) { + ingame.musicGovernor.queueDirectory(path, shuffled, diskJockeyingMode) { filename -> + fileToName.get(filename).let { + if (it == null) + filename.substringBeforeLast('.').replace('_', ' ').split(" ").map { it.capitalize() }.joinToString(" ") + else + it.asString() + } + } ingame.musicGovernor.addMusicStartHook { music -> setMusicName(music.name) @@ -104,7 +120,8 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { currentMusicName = str realNameLength = App.fontGameFBO.getWidth(str) nameLength = realNameLength.coerceAtMost(nameStrMaxLen) - TRANSITION_LENGTH = 0.8f * ((nameLength - nameLengthOld).absoluteValue / nameStrMaxLen) + TRANSITION_LENGTH = 0.8f * ((nameLength - nameLengthOld).absoluteValue.toFloat() / nameStrMaxLen) + if (TRANSITION_LENGTH.isNaN()) TRANSITION_LENGTH = 0f nameOverflown = (realNameLength > nameLength) musicPlayingTimer = 0f diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt index b37dedc47..6f124a550 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt @@ -15,7 +15,6 @@ import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.AudioMixer import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE -import net.torvald.unicode.EMDASH import java.io.File import java.io.FileInputStream import javax.sound.sampled.AudioSystem @@ -148,15 +147,24 @@ class TerrarumMusicGovernor : MusicGovernor() { private var shuffled = true private var diskJockeyingMode = "intermittent" // intermittent, continuous - private fun registerSongsFromDir(musicDir: String) { + private fun registerSongsFromDir(musicDir: String, fileToName: ((String) -> String)?) { + val fileToName = if (fileToName == null) { + { name: String -> name.substringBeforeLast('.').replace('_', ' ').split(" ").map { it.capitalize() }.joinToString(" ") } + } + else fileToName + + songs = File(musicDir).listFiles()?.sortedBy { it.name }?.mapNotNull { printdbg(this, "Music: ${it.absolutePath}") try { MusicContainer( - it.nameWithoutExtension.replace('_', ' ').split(" ").map { it.capitalize() }.joinToString(" "), + fileToName(it.name), it, Gdx.audio.newMusic(Gdx.files.absolute(it.absolutePath)) - ).also { muscon -> + ).also { muscon -> + + printdbg(this, "MusicTitle: ${muscon.name}") + muscon.songFinishedHook = { stopMusic(muscon) } } } @@ -176,14 +184,14 @@ class TerrarumMusicGovernor : MusicGovernor() { * @param shuffled if the tracks are to be shuffled * @param diskJockeyingMode `intermittent` to give random gap between tracks, `continuous` for continuous playback */ - fun queueDirectory(musicDir: String, shuffled: Boolean, diskJockeyingMode: String) { + fun queueDirectory(musicDir: String, shuffled: Boolean, diskJockeyingMode: String, fileToName: ((String) -> String)? = null) { if (musicState != STATE_INIT && musicState != STATE_INTERMISSION) { AudioMixer.requestFadeOut(AudioMixer.fadeBus, AudioMixer.DEFAULT_FADEOUT_LEN) // explicit call for fade-out when the game instance quits stopMusic(AudioMixer.musicTrack.currentTrack) } songs.forEach { it.gdxMusic.tryDispose() } - registerSongsFromDir(musicDir) + registerSongsFromDir(musicDir, fileToName) this.shuffled = shuffled this.diskJockeyingMode = diskJockeyingMode @@ -253,7 +261,7 @@ class TerrarumMusicGovernor : MusicGovernor() { private fun startMusic(song: MusicContainer) { AudioMixer.startMusic(song) - printdbg(this, "startMusic Now playing: $song") + printdbg(this, "startMusic Now playing: ${song.name}") // INGAME.sendNotification("Now Playing $EMDASH ${song.name}") if (musicStartHooks.isNotEmpty()) musicStartHooks.forEach { it(song) } musicState = STATE_PLAYING