transition anim for gapless play

This commit is contained in:
minjaesong
2023-12-28 21:37:17 +09:00
parent a4cb3f4d29
commit fe762e9396
3 changed files with 18 additions and 11 deletions

View File

@@ -91,7 +91,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
track.doGaplessPlayback = (diskJockeyingMode == "continuous") track.doGaplessPlayback = (diskJockeyingMode == "continuous")
if (track.doGaplessPlayback) { if (track.doGaplessPlayback) {
track.pullNextTrack = { track.pullNextTrack = {
track.currentTrack = ingame.musicGovernor.pullNextMusicTrack() track.currentTrack = ingame.musicGovernor.pullNextMusicTrack(true)
setMusicName(track.currentTrack?.name ?: "") setMusicName(track.currentTrack?.name ?: "")
} }
} }
@@ -113,13 +113,15 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
ingame.musicGovernor.addMusicStartHook { music -> ingame.musicGovernor.addMusicStartHook { music ->
setMusicName(music.name) setMusicName(music.name)
transitionRequest = MODE_PLAYING if (mode <= MODE_PLAYING)
transitionRequest = MODE_PLAYING
} }
ingame.musicGovernor.addMusicStopHook { music -> ingame.musicGovernor.addMusicStopHook { music ->
if (diskJockeyingMode == "intermittent") { if (diskJockeyingMode == "intermittent") {
setIntermission() setIntermission()
transitionRequest = MODE_IDLE if (mode <= MODE_PLAYING)
transitionRequest = MODE_IDLE
} }
else if (diskJockeyingMode == "continuous") { else if (diskJockeyingMode == "continuous") {
@@ -287,14 +289,15 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
private var _posX = 0f // not using provided `posX` as there is one frame delay between update and it actually used to drawing private var _posX = 0f // not using provided `posX` as there is one frame delay between update and it actually used to drawing
private var _posY = 0f private var _posY = 0f
private var _posXnonStretched = 0f // posXY on PLAYING status private var widthForFreqMeter = 0
private var posXforMusicLine = 0f
override val mouseUp: Boolean override val mouseUp: Boolean
get() = relativeMouseX.toFloat() in _posX-capsuleMosaicSize .. _posX+width+capsuleMosaicSize && get() = relativeMouseX.toFloat() in _posX-capsuleMosaicSize .. _posX+width+capsuleMosaicSize &&
relativeMouseY.toFloat() in _posY .. _posY+height relativeMouseY.toFloat() in _posY .. _posY+height
override fun renderUI(batch: SpriteBatch, camera: OrthographicCamera) { override fun renderUI(batch: SpriteBatch, camera: OrthographicCamera) {
val widthForFreqMeter = if (transitionOngoing && modeNext >= MODE_MOUSE_UP || mode >= MODE_MOUSE_UP) widthForFreqMeter = if (transitionOngoing && modeNext >= MODE_MOUSE_UP || mode >= MODE_MOUSE_UP)
uiWidthFromTextWidth(nameLength) uiWidthFromTextWidth(nameLength)
else else
width width
@@ -308,10 +311,10 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() {
_posX = ((Toolkit.drawWidth - width) / 2).toFloat() _posX = ((Toolkit.drawWidth - width) / 2).toFloat()
_posY = (App.scr.height - App.scr.tvSafeGraphicsHeight - height).toFloat() _posY = (App.scr.height - App.scr.tvSafeGraphicsHeight - height).toFloat()
_posXnonStretched = ((Toolkit.drawWidth - uiWidthFromTextWidth(nameLength)) / 2).toFloat() val _posXnonStretched = ((Toolkit.drawWidth - uiWidthFromTextWidth(nameLength)) / 2).toFloat()
val posXforMusicLine = if (transitionOngoing && modeNext >= MODE_MOUSE_UP || mode >= MODE_MOUSE_UP) posXforMusicLine = if (transitionOngoing && modeNext >= MODE_MOUSE_UP || mode >= MODE_MOUSE_UP)
_posXnonStretched _posXnonStretched
else else
_posX _posX

View File

@@ -179,8 +179,10 @@ object AudioMixer: Disposable {
masterTrack.filters[2] = Spectro() masterTrack.filters[2] = Spectro()
masterTrack.filters[3] = Vecto(2f) masterTrack.filters[3] = Vecto(2f)
musicTrack.filters[1] = Spectro() musicTrack.filters[1] = Vecto()
ambientTrack.filters[1] = Spectro() musicTrack.filters[2] = Spectro()
ambientTrack.filters[1] = Vecto()
ambientTrack.filters[2] = Spectro()
listOf(sumBus, convolveBusOpen, convolveBusCave).forEach { listOf(sumBus, convolveBusOpen, convolveBusCave).forEach {
it.addSidechainInput(musicTrack, 1.0) it.addSidechainInput(musicTrack, 1.0)

View File

@@ -277,12 +277,14 @@ class TerrarumMusicGovernor : MusicGovernor() {
} }
// MixerTrackProcessor will call this function externally to make gapless playback work // MixerTrackProcessor will call this function externally to make gapless playback work
fun pullNextMusicTrack(): MusicContainer { fun pullNextMusicTrack(callNextMusicHook: Boolean = false): MusicContainer {
// prevent same song to play twice in row (for the most time) // prevent same song to play twice in row (for the most time)
if (musicBin.isEmpty()) { if (musicBin.isEmpty()) {
restockMUsicBin() restockMUsicBin()
} }
return songs[musicBin.removeAt(0)] return songs[musicBin.removeAt(0)].also { mus ->
if (musicStartHooks.isNotEmpty()) musicStartHooks.forEach { it(mus) }
}
} }
// MixerTrackProcessor will call this function externally to make gapless playback work // MixerTrackProcessor will call this function externally to make gapless playback work