mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-11 19:14:05 +09:00
musicplayer: reading playlist.json
This commit is contained in:
@@ -5,14 +5,17 @@ import com.badlogic.gdx.graphics.OrthographicCamera
|
|||||||
import com.badlogic.gdx.graphics.Pixmap
|
import com.badlogic.gdx.graphics.Pixmap
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
||||||
|
import com.badlogic.gdx.utils.JsonValue
|
||||||
import com.jme3.math.FastMath
|
import com.jme3.math.FastMath
|
||||||
import net.torvald.reflection.extortField
|
import net.torvald.reflection.extortField
|
||||||
import net.torvald.terrarum.*
|
import net.torvald.terrarum.*
|
||||||
|
import net.torvald.terrarum.App.printdbg
|
||||||
import net.torvald.terrarum.audio.*
|
import net.torvald.terrarum.audio.*
|
||||||
import net.torvald.terrarum.modulebasegame.TerrarumIngame
|
import net.torvald.terrarum.modulebasegame.TerrarumIngame
|
||||||
import net.torvald.terrarum.ui.BasicDebugInfoWindow
|
import net.torvald.terrarum.ui.BasicDebugInfoWindow
|
||||||
import net.torvald.terrarum.ui.Toolkit
|
import net.torvald.terrarum.ui.Toolkit
|
||||||
import net.torvald.terrarum.ui.UICanvas
|
import net.torvald.terrarum.ui.UICanvas
|
||||||
|
import net.torvald.terrarum.utils.JsonFetcher
|
||||||
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
|
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
|
||||||
import kotlin.math.*
|
import kotlin.math.*
|
||||||
|
|
||||||
@@ -66,12 +69,25 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
|
|||||||
setAsAlwaysVisible()
|
setAsAlwaysVisible()
|
||||||
|
|
||||||
// test code
|
// test code
|
||||||
val diskJockeyingMode = "continuous" // must be read from the playlist.json
|
val albumDir = App.customMusicDir + "/FurryJoA 2023 Live"
|
||||||
registerPlaylist(App.customDir + "/MusicFJ", false, diskJockeyingMode)
|
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) {
|
fun registerPlaylist(path: String, fileToName: JsonValue, shuffled: Boolean, diskJockeyingMode: String) {
|
||||||
ingame.musicGovernor.queueDirectory(path, shuffled, diskJockeyingMode)
|
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 ->
|
ingame.musicGovernor.addMusicStartHook { music ->
|
||||||
setMusicName(music.name)
|
setMusicName(music.name)
|
||||||
@@ -104,7 +120,8 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
|
|||||||
currentMusicName = str
|
currentMusicName = str
|
||||||
realNameLength = App.fontGameFBO.getWidth(str)
|
realNameLength = App.fontGameFBO.getWidth(str)
|
||||||
nameLength = realNameLength.coerceAtMost(nameStrMaxLen)
|
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)
|
nameOverflown = (realNameLength > nameLength)
|
||||||
musicPlayingTimer = 0f
|
musicPlayingTimer = 0f
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ 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.Companion.SAMPLING_RATE
|
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE
|
||||||
import net.torvald.unicode.EMDASH
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileInputStream
|
import java.io.FileInputStream
|
||||||
import javax.sound.sampled.AudioSystem
|
import javax.sound.sampled.AudioSystem
|
||||||
@@ -148,15 +147,24 @@ class TerrarumMusicGovernor : MusicGovernor() {
|
|||||||
private var shuffled = true
|
private var shuffled = true
|
||||||
private var diskJockeyingMode = "intermittent" // intermittent, continuous
|
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 {
|
songs = File(musicDir).listFiles()?.sortedBy { it.name }?.mapNotNull {
|
||||||
printdbg(this, "Music: ${it.absolutePath}")
|
printdbg(this, "Music: ${it.absolutePath}")
|
||||||
try {
|
try {
|
||||||
MusicContainer(
|
MusicContainer(
|
||||||
it.nameWithoutExtension.replace('_', ' ').split(" ").map { it.capitalize() }.joinToString(" "),
|
fileToName(it.name),
|
||||||
it,
|
it,
|
||||||
Gdx.audio.newMusic(Gdx.files.absolute(it.absolutePath))
|
Gdx.audio.newMusic(Gdx.files.absolute(it.absolutePath))
|
||||||
).also { muscon ->
|
).also { muscon ->
|
||||||
|
|
||||||
|
printdbg(this, "MusicTitle: ${muscon.name}")
|
||||||
|
|
||||||
muscon.songFinishedHook = { stopMusic(muscon) }
|
muscon.songFinishedHook = { stopMusic(muscon) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -176,14 +184,14 @@ class TerrarumMusicGovernor : MusicGovernor() {
|
|||||||
* @param shuffled if the tracks are to be shuffled
|
* @param shuffled if the tracks are to be shuffled
|
||||||
* @param diskJockeyingMode `intermittent` to give random gap between tracks, `continuous` for continuous playback
|
* @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) {
|
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
|
AudioMixer.requestFadeOut(AudioMixer.fadeBus, AudioMixer.DEFAULT_FADEOUT_LEN) // explicit call for fade-out when the game instance quits
|
||||||
stopMusic(AudioMixer.musicTrack.currentTrack)
|
stopMusic(AudioMixer.musicTrack.currentTrack)
|
||||||
}
|
}
|
||||||
|
|
||||||
songs.forEach { it.gdxMusic.tryDispose() }
|
songs.forEach { it.gdxMusic.tryDispose() }
|
||||||
registerSongsFromDir(musicDir)
|
registerSongsFromDir(musicDir, fileToName)
|
||||||
|
|
||||||
this.shuffled = shuffled
|
this.shuffled = shuffled
|
||||||
this.diskJockeyingMode = diskJockeyingMode
|
this.diskJockeyingMode = diskJockeyingMode
|
||||||
@@ -253,7 +261,7 @@ class TerrarumMusicGovernor : MusicGovernor() {
|
|||||||
|
|
||||||
private fun startMusic(song: MusicContainer) {
|
private fun startMusic(song: MusicContainer) {
|
||||||
AudioMixer.startMusic(song)
|
AudioMixer.startMusic(song)
|
||||||
printdbg(this, "startMusic Now playing: $song")
|
printdbg(this, "startMusic Now playing: ${song.name}")
|
||||||
// INGAME.sendNotification("Now Playing $EMDASH ${song.name}")
|
// INGAME.sendNotification("Now Playing $EMDASH ${song.name}")
|
||||||
if (musicStartHooks.isNotEmpty()) musicStartHooks.forEach { it(song) }
|
if (musicStartHooks.isNotEmpty()) musicStartHooks.forEach { it(song) }
|
||||||
musicState = STATE_PLAYING
|
musicState = STATE_PLAYING
|
||||||
|
|||||||
Reference in New Issue
Block a user