diff --git a/src/itdelatrisu/opsu/audio/MusicController.java b/src/itdelatrisu/opsu/audio/MusicController.java index c5aac333..5ecfa76d 100644 --- a/src/itdelatrisu/opsu/audio/MusicController.java +++ b/src/itdelatrisu/opsu/audio/MusicController.java @@ -237,6 +237,15 @@ public class MusicController { player.fade(duration, 0f, true); } + /** + * Fades out the pitch (and speed) of the track. + * @param duration the pitch fade time (in ms) + */ + public static void pitchFadeOut(int duration) { + if (isPlaying()) + player.pitchFade(duration, 0f); + } + /** * Returns the position in the current track, in milliseconds. * If no track is loaded, 0 will be returned. @@ -316,7 +325,7 @@ public class MusicController { * @param pitch the new pitch */ public static void setPitch(float pitch) { - SoundStore.get().setMusicPitch(pitch); + player.setPitch(pitch); } /** @@ -464,4 +473,4 @@ public class MusicController { ErrorHandler.error("Failed to destroy OpenAL.", e, true); } } -} \ No newline at end of file +} diff --git a/src/itdelatrisu/opsu/states/Game.java b/src/itdelatrisu/opsu/states/Game.java index 0bfa1d54..505f5232 100644 --- a/src/itdelatrisu/opsu/states/Game.java +++ b/src/itdelatrisu/opsu/states/Game.java @@ -1262,9 +1262,6 @@ public class Game extends BasicGameState { // replays if (isReplay) GameMod.loadModState(previousMods); - - // reset playback speed - MusicController.setPitch(1f); } /** diff --git a/src/itdelatrisu/opsu/states/GamePauseMenu.java b/src/itdelatrisu/opsu/states/GamePauseMenu.java index 6a10b965..1b67da42 100644 --- a/src/itdelatrisu/opsu/states/GamePauseMenu.java +++ b/src/itdelatrisu/opsu/states/GamePauseMenu.java @@ -48,7 +48,7 @@ import org.newdawn.slick.state.transition.FadeOutTransition; */ public class GamePauseMenu extends BasicGameState { /** Music fade-out time, in milliseconds. */ - private static final int FADEOUT_TIME = 1000; + private static final int FADEOUT_TIME = 2000; /** Track position when the pause menu was loaded (for FADEOUT_TIME). */ private long pauseStartTime; @@ -207,6 +207,7 @@ public class GamePauseMenu extends BasicGameState { pauseStartTime = System.currentTimeMillis(); if (gameState.getRestart() == Game.Restart.LOSE) { MusicController.fadeOut(FADEOUT_TIME); + MusicController.pitchFadeOut(FADEOUT_TIME); SoundController.playSound(SoundEffect.FAIL); } else MusicController.pause(); @@ -215,6 +216,13 @@ public class GamePauseMenu extends BasicGameState { backButton.resetHover(); } + @Override + public void leave(GameContainer container, StateBasedGame game) + throws SlickException { + // reset pitch fade out + MusicController.pitchFadeOut(0); + } + /** * Loads all game pause/fail menu images. */ diff --git a/src/itdelatrisu/opsu/states/SongMenu.java b/src/itdelatrisu/opsu/states/SongMenu.java index 91f7a997..77b4e312 100644 --- a/src/itdelatrisu/opsu/states/SongMenu.java +++ b/src/itdelatrisu/opsu/states/SongMenu.java @@ -1118,6 +1118,7 @@ public class SongMenu extends BasicGameState { else if (resetTrack) { MusicController.pause(); MusicController.playAt(MusicController.getBeatmap().previewTime, true); + MusicController.setPitch(1.0f); resetTrack = false; } diff --git a/src/org/newdawn/slick/Music.java b/src/org/newdawn/slick/Music.java index 36dd3ca5..b891eb5f 100644 --- a/src/org/newdawn/slick/Music.java +++ b/src/org/newdawn/slick/Music.java @@ -98,7 +98,19 @@ public class Music { private boolean positioning; /** The position that was requested */ private float requiredPosition = -1; - + + /** The pitch of this music */ + private float pitch = 1.0f; + /** Start pitch for fading pitch */ + private float pitchStart; + /** End pitch for fading pitch */ + private float pitchEnd; + /** Countdown for fading pitch */ + private int pitchTime; + /** Duration for fading pitch */ + private int pitchDuration; + + /** * Create and load a piece of music (either OGG or MOD/XM) * @@ -313,6 +325,7 @@ public class Music { currentMusic = this; sound.playAsMusic(pitch, volume, loop); setVolume(volume); + setPitch(pitch); if (requiredPosition != -1) { setPosition(requiredPosition); } @@ -373,6 +386,17 @@ public class Music { SoundStore.get().setCurrentMusicVolume(volume); } } + /** + * Set the pitch of the music as a factor of it's normal pitch + * + * @param pitch The pitch to play music at. + */ + public void setPitch(float pitch) { + this.pitch = pitch; + if (currentMusic == this) { + SoundStore.get().setMusicPitch(pitch); + } + } /** * Get the individual volume of the music @@ -397,6 +421,19 @@ public class Music { fadeTime = duration; } + /** + * Fade the pitch and speed of this music to the pitch specified + * + * @param duration Pitch fade time in milliseconds + * @param endPitch The target pitch (and speed) + */ + public void pitchFade (int duration, float endPitch) { + pitchStart = pitch; + pitchEnd = endPitch; + pitchDuration = duration; + pitchTime = duration; + } + /** * Update the current music applying any effects that need to updated per * tick. @@ -408,6 +445,14 @@ public class Music { return; } + if (pitchTime > 0) { + pitchTime -= delta; + if (pitchTime < 0) { + pitchTime = 0; + } + float offset = (pitchEnd - pitchStart) * (1 - (pitchTime / (float)pitchDuration)); + setPitch(pitchStart + offset); + } if (fadeTime > 0) { fadeTime -= delta; if (fadeTime < 0) {