diff --git a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
index c6e105117..341f7f7a9 100644
--- a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
+++ b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
@@ -228,11 +228,6 @@ public class PlayerLocal extends Player
         }
         super.onLivingUpdate();
 
-        if (mc != null)
-        {
-           mc.ppm.update();
-        }
-
         WorldTypeFXDispatcher.getInstance().getDispatch(world.getWorldType()).playerAnimationTick(world, this);
     }
     
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
index 6ee32e0dc..794f9735e 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
@@ -281,6 +281,9 @@ public class ScreenMainMenu extends Screen
             }
         }
 
+        if (mc.gameSettings.playTitleScreenMusic.value) {
+            mc.sndManager.playTitleScreenMusic();
+        }
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index fe00d2656..1bd9c7592 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -122,6 +122,7 @@ public abstract class OptionsPages
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.subtitles))
                 .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.musicFrequency))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.muteOnLostFocus))
+                .withComponent(new BooleanOptionComponent(mc.gameSettings.playTitleScreenMusic))
                 .withComponent(new FloatOptionComponent(mc.gameSettings.masterVolume))
                 .withComponent(new FloatOptionComponent(mc.gameSettings.musicVolume))
                 .withComponent(new FloatOptionComponent(mc.gameSettings.worldSoundsVolume))
diff --git a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
index 29c2ff1e9..3143dca81 100644
--- a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -56,6 +56,7 @@ public class GameSettings {
 	public @NotNull OptionVolume caveSoundsVolume = new OptionVolume(this, "sound.cave", 1.0f, SoundCategory.CAVE_SOUNDS);
 	public @NotNull OptionVolume guiSoundsVolume = new OptionVolume(this, "sound.gui", 1.0f, SoundCategory.GUI_SOUNDS);
 	public @NotNull OptionVolume weatherSoundsVolume = new OptionVolume(this, "sound.weather", 1.0f, SoundCategory.WEATHER_SOUNDS);
+	public @NotNull OptionBoolean playTitleScreenMusic = new OptionBoolean(this, "playTitleScreenMusic", false);
 	
 	public @NotNull OptionFloat FoV = new OptionFloat(this, "fov", 0.40140846f);
 	public @NotNull OptionFloat mouseSensitivity = new OptionFloat(this, "mouseSensitivity", 0.5f);
diff --git a/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java b/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
index 151533f9e..0a0c4e546 100644
--- a/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -218,7 +218,9 @@ public abstract class PlayerController {
 			mc.hudIngame.damageGuiPartialTime = f1;
 			mc.renderGlobal.destroyProgress = f1;
 		}
-	}
+
+        mc.ppm.render(f);
+    }
 
 	public float getBlockReachDistance() {
 		return mc.thePlayer.getGamemode().getBlockReachDistance();
@@ -238,6 +240,7 @@ public abstract class PlayerController {
 		syncCurrentPlayItem();
 		previousDamage = currentDamage;
 		mc.sndManager.tick();
+		mc.ppm.tick();
 	}
 
 	public boolean canHurtPlayer() {
diff --git a/game/client/src/main/java/net/minecraft/client/render/PostProcessingManager.java b/game/client/src/main/java/net/minecraft/client/render/PostProcessingManager.java
index 55c1347e1..dbf608462 100644
--- a/game/client/src/main/java/net/minecraft/client/render/PostProcessingManager.java
+++ b/game/client/src/main/java/net/minecraft/client/render/PostProcessingManager.java
@@ -7,190 +7,208 @@ import net.minecraft.core.world.type.WorldTypes;
 import net.minecraft.core.world.season.Seasons;
 import net.minecraft.core.world.weather.Weather;
 import net.minecraft.core.world.weather.Weathers;
+import org.jetbrains.annotations.NotNull;
+
+public class PostProcessingManager {
+    public static class PostProcessingConfig {
+        public float brightness = 0.0f;
+        public float contrast = 0.0f;
+        public float exposure = 0.0f;
+        public float saturation = 0.0f;
+        public float rMod = 1.0f;
+        public float gMod = 1.0f;
+        public float bMod = 1.0f;
+        public float heatHaze = 0.0f;
+
+        public void reset() {
+            this.brightness = 0.0f;
+            this.contrast = 0.0f;
+            this.exposure = 0.0f;
+            this.saturation = 0.0f;
+            this.rMod = 1.0f;
+            this.gMod = 1.0f;
+            this.bMod = 1.0f;
+            this.heatHaze = 0.0f;
+        }
 
-public class PostProcessingManager
-{
-    private final Minecraft mc;
-
-    public float brightness = 0.0f;
-    public float contrast = 0.0f;
-    public float exposure = 0.0f;
-    public float saturation = 0.0f;
-    public float rMod = 1.0f;
-    public float gMod = 1.0f;
-    public float bMod = 1.0f;
-    
-    public boolean enabled = true;
+        public void set(final @NotNull PostProcessingConfig config) {
+            this.brightness = config.brightness;
+            this.contrast = config.contrast;
+            this.exposure = config.exposure;
+            this.saturation = config.saturation;
+            this.rMod = config.rMod;
+            this.gMod = config.gMod;
+            this.bMod = config.bMod;
+            this.heatHaze = config.heatHaze;
+        }
+    }
+
+    private final @NotNull Minecraft mc;
 
-    public float heatHaze = 0f;
+    private final @NotNull PostProcessingConfig oldCurrent = new PostProcessingConfig();
+    private final @NotNull PostProcessingConfig current = new PostProcessingConfig();
+    public final @NotNull PostProcessingConfig lerped = new PostProcessingConfig();
+
+    public boolean enabled = true;
 
     private double lastTemperature = 0.0;
     private double lastHumidity = 0.0;
 
-    public PostProcessingManager(Minecraft mc)
-    {
+    public PostProcessingManager(final @NotNull Minecraft mc) {
         this.mc = mc;
     }
 
-    public void reset()
-    {
-        brightness = 0.0f;
-        contrast = 0.0f;
-        exposure = 0.0f;
-        saturation = 0.0f;
-        rMod = 1.0f;
-        gMod = 1.0f;
-        bMod = 1.0f;
-        heatHaze = 0.0f;
+    public void reset() {
+        this.oldCurrent.set(this.current);
+        this.current.reset();
     }
 
-    public void update()
-    {
-        if (mc.currentWorld == null || mc.thePlayer == null) return;
+    public void tick() {
+        if (this.mc.currentWorld == null || this.mc.thePlayer == null) return;
 
-        reset();
-        if (mc.gameSettings.colorCorrection.value == 0) return;
+        this.reset();
+        if (this.mc.gameSettings.colorCorrection.value == 0) return;
 
-        float y = (float)mc.thePlayer.y;
-        int maxY = mc.currentWorld.getWorldType().getMaxY();
-        int minY = mc.currentWorld.getWorldType().getMinY();
-        int rangeY = maxY - minY;
-        int halfY = minY + rangeY / 2;
-        int quarterY = minY + rangeY / 4;
+        final float y = (float) this.mc.thePlayer.y;
+        final int maxY = this.mc.currentWorld.getWorldType().getMaxY();
+        final int minY = this.mc.currentWorld.getWorldType().getMinY();
+        final int rangeY = maxY - minY;
+        final int halfY = minY + rangeY / 2;
+        final int quarterY = minY + rangeY / 4;
         // > half Y should be 100%, < quarter Y should be 0%
-        int hToQRange = halfY - quarterY;
-        float adjustedY = y - quarterY;
+        final int hToQRange = halfY - quarterY;
+        final float adjustedY = y - quarterY;
         float surfaceness = adjustedY / hToQRange;
         surfaceness = MathHelper.clamp(surfaceness, 0.0f, 1.0f);
 
-        double t = mc.currentWorld.getBlockTemperature((int)mc.thePlayer.x, (int)mc.thePlayer.z); // Ranges from 0.0 to 1.0
-        if (t == Double.NEGATIVE_INFINITY) t = lastTemperature;
+        double t = this.mc.currentWorld.getBlockTemperature((int) this.mc.thePlayer.x, (int) this.mc.thePlayer.z); // Ranges from 0.0 to 1.0
+        if (t == Double.NEGATIVE_INFINITY) t = this.lastTemperature;
         final double temperature = t;
-        lastTemperature = temperature;
-        double h = mc.currentWorld.getBlockHumidity((int)mc.thePlayer.x, (int)mc.thePlayer.z); // Ranges from 0.0 to 1.0
-        if (h == Double.NEGATIVE_INFINITY) h = lastHumidity;
+        this.lastTemperature = temperature;
+        double h = this.mc.currentWorld.getBlockHumidity((int) this.mc.thePlayer.x, (int) this.mc.thePlayer.z); // Ranges from 0.0 to 1.0
+        if (h == Double.NEGATIVE_INFINITY) h = this.lastHumidity;
         final double humidity = h;
-        lastHumidity = humidity;
+        this.lastHumidity = humidity;
 
         // Perform base temperature change
-        if (mc.currentWorld.dimension == Dimension.OVERWORLD)
-        {
-            lastTemperature = temperature;
-            double tt = (temperature * 2) - 1.0; // Ranges from -1.0 to 1.0
-            saturation += (float) (0.25 * tt * surfaceness);
-            contrast += (float) (-0.1 * tt * surfaceness);
+        if (this.mc.currentWorld.dimension == Dimension.OVERWORLD) {
+            this.lastTemperature = temperature;
+            final double tt = (temperature * 2) - 1.0; // Ranges from -1.0 to 1.0
+            this.current.saturation += (float) (0.25 * tt * surfaceness);
+            this.current.contrast += (float) (-0.1 * tt * surfaceness);
         }
-        if (mc.currentWorld.dimension == Dimension.NETHER) {
-            lastTemperature = temperature;
+        if (this.mc.currentWorld.dimension == Dimension.NETHER) {
+            this.lastTemperature = temperature;
             if (temperature < 0.5) {
-                double tt = temperature * 2; // Ranges from 0.0 to 1.0
-                saturation -= (float) (0.5 * (1.0 - tt));
+                final double tt = temperature * 2; // Ranges from 0.0 to 1.0
+                this.current.saturation -= (float) (0.5 * (1.0 - tt));
             }
         }
 
         // Perform season effects
-        float seasonProgress = mc.currentWorld.getSeasonManager().getSeasonProgress(); // Ranges from 0.0 to 1.0
+        float seasonProgress = this.mc.currentWorld.getSeasonManager().getSeasonProgress(); // Ranges from 0.0 to 1.0
         seasonProgress = (seasonProgress * 2) - 1f; // Ranges from -1.0 to 1.0
         seasonProgress = Math.abs(seasonProgress); // Ranges from 1.0 to 0.0 to 1.0
         seasonProgress = -seasonProgress + 1.0f; // Ranges from 0.0 to 1.0 to 0.0
-        if (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SPRING)
-        {
-            saturation += 0.1f * seasonProgress * surfaceness;
-        }
-        else if (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SUMMER)
-        {
-            rMod += 0.1f * seasonProgress * surfaceness;
-            gMod += 0.1f * seasonProgress * surfaceness;
-        }
-        else if (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_FALL)
-        {
-            contrast -= 0.1f * seasonProgress * surfaceness;
-            rMod += 0.1f * seasonProgress * surfaceness;
-        }
-        else if (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_WINTER)
-        {
-            contrast -= 0.1f * seasonProgress * surfaceness;
-            bMod += 0.1f * seasonProgress * surfaceness;
+        if (this.mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SPRING) {
+            this.current.saturation += 0.1f * seasonProgress * surfaceness;
+        } else if (this.mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SUMMER) {
+            this.current.rMod += 0.1f * seasonProgress * surfaceness;
+            this.current.gMod += 0.1f * seasonProgress * surfaceness;
+        } else if (this.mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_FALL) {
+            this.current.contrast -= 0.1f * seasonProgress * surfaceness;
+            this.current.rMod += 0.1f * seasonProgress * surfaceness;
+        } else if (this.mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_WINTER) {
+            this.current.contrast -= 0.1f * seasonProgress * surfaceness;
+            this.current.bMod += 0.1f * seasonProgress * surfaceness;
         }
 
         // Perform weather effects
-        Weather activeWeather = mc.currentWorld.getCurrentWeather();
-        if (activeWeather != null)
-        {
-            float intensity = mc.currentWorld.weatherManager.getWeatherIntensity() * mc.currentWorld.weatherManager.getWeatherIntensity();
-            if (activeWeather == Weathers.OVERWORLD_SNOW || activeWeather == Weathers.OVERWORLD_WINTER_SNOW)
-            {
-                contrast += -0.125f * intensity * surfaceness;
-                saturation += -0.25f * intensity * surfaceness;
-                bMod += 0.25f * intensity * surfaceness;
-            }
-            else if (activeWeather == Weathers.OVERWORLD_RAIN_BLOOD)
-            {
-                rMod += 0.4f * intensity * surfaceness;
-                gMod += 0.1f * intensity * surfaceness;
-                saturation += 0.125f * intensity * surfaceness;
-                exposure -= 0.125f * intensity * surfaceness;
-            }
-            else if (activeWeather == Weathers.OVERWORLD_RAIN)
-            {
-                bMod += 0.1f * intensity * surfaceness;
-                saturation += -0.125f * intensity * surfaceness;
-                brightness += -0.0625f * intensity * surfaceness;
-            }
-            else if (activeWeather == Weathers.OVERWORLD_STORM)
-            {
-                bMod += 0.1f * intensity * surfaceness;
-                saturation += -0.2f * intensity * surfaceness;
-                brightness += -0.1f * intensity * surfaceness;
-            }
-            else if (activeWeather == Weathers.OVERWORLD_FOG && mc.gameSettings.fog.value)
-            {
-                saturation += -0.4f * intensity * surfaceness;
-                contrast += -0.25f * intensity * surfaceness;
+        final Weather activeWeather = this.mc.currentWorld.getCurrentWeather();
+        if (activeWeather != null) {
+            final float intensity = this.mc.currentWorld.weatherManager.getWeatherIntensity() * this.mc.currentWorld.weatherManager.getWeatherIntensity();
+            if (activeWeather == Weathers.OVERWORLD_SNOW || activeWeather == Weathers.OVERWORLD_WINTER_SNOW) {
+                this.current.contrast += -0.125f * intensity * surfaceness;
+                this.current.saturation += -0.25f * intensity * surfaceness;
+                this.current.bMod += 0.25f * intensity * surfaceness;
+            } else if (activeWeather == Weathers.OVERWORLD_RAIN_BLOOD) {
+                this.current.rMod += 0.4f * intensity * surfaceness;
+                this.current.gMod += 0.1f * intensity * surfaceness;
+                this.current.saturation += 0.125f * intensity * surfaceness;
+                this.current.exposure -= 0.125f * intensity * surfaceness;
+            } else if (activeWeather == Weathers.OVERWORLD_RAIN) {
+                this.current.bMod += 0.1f * intensity * surfaceness;
+                this.current.saturation += -0.125f * intensity * surfaceness;
+                this.current.brightness += -0.0625f * intensity * surfaceness;
+            } else if (activeWeather == Weathers.OVERWORLD_STORM) {
+                this.current.bMod += 0.1f * intensity * surfaceness;
+                this.current.saturation += -0.2f * intensity * surfaceness;
+                this.current.brightness += -0.1f * intensity * surfaceness;
+            } else if (activeWeather == Weathers.OVERWORLD_FOG && this.mc.gameSettings.fog.value) {
+                this.current.saturation += -0.4f * intensity * surfaceness;
+                this.current.contrast += -0.25f * intensity * surfaceness;
             }
         }
 
         // Perform dimension effects
-        if (mc.currentWorld.dimension == Dimension.NETHER || mc.currentWorld.getWorldType() == WorldTypes.OVERWORLD_HELL)
-        {
+        if (this.mc.currentWorld.dimension == Dimension.NETHER || this.mc.currentWorld.getWorldType() == WorldTypes.OVERWORLD_HELL) {
             float scale = 1.0f;
-            if (mc.currentWorld.dimension == Dimension.NETHER && temperature < 0.5) {
+            if (this.mc.currentWorld.dimension == Dimension.NETHER && temperature < 0.5) {
                 scale = (float) temperature * 2.0f;
             }
-            rMod += 1.2f * scale;
-            gMod += 0.3f * scale;
-            saturation += 0.125f * scale;
-            exposure -= 0.125f;
-            contrast -= 0.05f;
-            brightness -= 0.05f;
-            heatHaze = scale;
+            this.current.rMod += 1.2f * scale;
+            this.current.gMod += 0.3f * scale;
+            this.current.saturation += 0.125f * scale;
+            this.current.exposure -= 0.125f;
+            this.current.contrast -= 0.05f;
+            this.current.brightness -= 0.05f;
+            this.current.heatHaze = scale;
         }
 
         // Perform heatwave effects
-        if (mc.currentWorld.dimension == Dimension.OVERWORLD && (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SUMMER || mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_FALL))
-        {
-            if (temperature >= 0.85 && humidity <= 0.15)
-            {
-                double tPercentage = (temperature - 0.85) / 0.15;
-                double hPercentage = 1 - (humidity / 0.15);
+        if (this.mc.currentWorld.dimension == Dimension.OVERWORLD && (this.mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SUMMER || this.mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_FALL)) {
+            if (temperature >= 0.85 && humidity <= 0.15) {
+                final double tPercentage = (temperature - 0.85) / 0.15;
+                final double hPercentage = 1 - (humidity / 0.15);
                 double percentage = tPercentage * hPercentage;
                 percentage = MathHelper.clamp(percentage, 0.0, 1.0);
-                heatHaze = (float)percentage;
+                this.current.heatHaze = (float) percentage;
             }
         }
 
-
         // Scaling
-        if (mc.gameSettings.colorCorrection.value != 0)
-        {
-            brightness *= mc.gameSettings.colorCorrection.value;
-            contrast *= mc.gameSettings.colorCorrection.value;
-            exposure *= mc.gameSettings.colorCorrection.value;
-            saturation *= mc.gameSettings.colorCorrection.value;
-            rMod = 1.0f - (1.0f - rMod) * mc.gameSettings.colorCorrection.value;
-            gMod = 1.0f - (1.0f - gMod) * mc.gameSettings.colorCorrection.value;
-            bMod = 1.0f - (1.0f - bMod) * mc.gameSettings.colorCorrection.value;
+        if (this.mc.gameSettings.colorCorrection.value != 0) {
+            this.current.brightness *= this.mc.gameSettings.colorCorrection.value;
+            this.current.contrast *= this.mc.gameSettings.colorCorrection.value;
+            this.current.exposure *= this.mc.gameSettings.colorCorrection.value;
+            this.current.saturation *= this.mc.gameSettings.colorCorrection.value;
+            this.current.rMod = 1.0f - (1.0f - this.current.rMod) * this.mc.gameSettings.colorCorrection.value;
+            this.current.gMod = 1.0f - (1.0f - this.current.gMod) * this.mc.gameSettings.colorCorrection.value;
+            this.current.bMod = 1.0f - (1.0f - this.current.bMod) * this.mc.gameSettings.colorCorrection.value;
         }
+
+        this.current.brightness = smoothLerp(this.oldCurrent.brightness, this.current.brightness);
+        this.current.contrast = smoothLerp(this.oldCurrent.contrast, this.current.contrast);
+        this.current.exposure = smoothLerp(this.oldCurrent.exposure, this.current.exposure);
+        this.current.saturation = smoothLerp(this.oldCurrent.saturation, this.current.saturation);
+        this.current.rMod = smoothLerp(this.oldCurrent.rMod, this.current.rMod);
+        this.current.gMod = smoothLerp(this.oldCurrent.gMod, this.current.gMod);
+        this.current.bMod = smoothLerp(this.oldCurrent.bMod, this.current.bMod);
+        this.current.heatHaze = smoothLerp(this.oldCurrent.heatHaze, this.current.heatHaze);
+    }
+
+    public void render(final float partialTick) {
+        this.lerped.brightness = this.oldCurrent.brightness + (this.current.brightness - this.oldCurrent.brightness) * partialTick;
+        this.lerped.contrast = this.oldCurrent.contrast + (this.current.contrast - this.oldCurrent.contrast) * partialTick;
+        this.lerped.exposure = this.oldCurrent.exposure + (this.current.exposure - this.oldCurrent.exposure) * partialTick;
+        this.lerped.saturation = this.oldCurrent.saturation + (this.current.saturation - this.oldCurrent.saturation) * partialTick;
+        this.lerped.rMod = this.oldCurrent.rMod + (this.current.rMod - this.oldCurrent.rMod) * partialTick;
+        this.lerped.gMod = this.oldCurrent.gMod + (this.current.gMod - this.oldCurrent.gMod) * partialTick;
+        this.lerped.bMod = this.oldCurrent.bMod + (this.current.bMod - this.oldCurrent.bMod) * partialTick;
+        this.lerped.heatHaze = this.oldCurrent.heatHaze + (this.current.heatHaze - this.oldCurrent.heatHaze) * partialTick;
     }
 
+    private static float smoothLerp(final float oldValue, final float newValue) {
+        return oldValue + (newValue - oldValue) * 0.05f;
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/shader/Shaders.java b/game/client/src/main/java/net/minecraft/client/render/shader/Shaders.java
index 732d52dd4..097189cc0 100644
--- a/game/client/src/main/java/net/minecraft/client/render/shader/Shaders.java
+++ b/game/client/src/main/java/net/minecraft/client/render/shader/Shaders.java
@@ -72,7 +72,7 @@ public abstract class Shaders {
 		shader.uniformFloat("frameTimeCounter", frameTimeCounter);
 		shader.uniformFloat("gamma", minecraft.gameSettings.gamma.value);
 		shader.uniformFloat("fxaa", minecraft.gameSettings.fxaa.value);
-		shader.uniformFloat("heatHaze", minecraft.gameSettings.heatHaze.value ? minecraft.ppm.heatHaze : 0.0f);
+		shader.uniformFloat("heatHaze", minecraft.gameSettings.heatHaze.value ? minecraft.ppm.lerped.heatHaze : 0.0f);
 		shader.uniformInt("bloom", minecraft.gameSettings.bloom.value);
 		shader.uniformInt("dimension", minecraft.currentWorld != null && minecraft.currentWorld.dimension != null ? minecraft.currentWorld.dimension.id : 0);
 		shader.uniformInt("cbCorrectionMode", minecraft.gameSettings.colorblindnessFix.value.ordinal());
@@ -94,13 +94,13 @@ public abstract class Shaders {
 		shader.uniformFloat("celestialAngle", celestialAngle);
 		
 		if (minecraft.ppm.enabled) {
-			shader.uniformFloat("brightness", minecraft.ppm.brightness);
-			shader.uniformFloat("contrast", minecraft.ppm.contrast);
-			shader.uniformFloat("exposure", minecraft.ppm.exposure);
-			shader.uniformFloat("saturation", minecraft.ppm.saturation);
-			shader.uniformFloat("rMod", minecraft.ppm.rMod);
-			shader.uniformFloat("gMod", minecraft.ppm.gMod);
-			shader.uniformFloat("bMod", minecraft.ppm.bMod);
+			shader.uniformFloat("brightness", minecraft.ppm.lerped.brightness);
+			shader.uniformFloat("contrast", minecraft.ppm.lerped.contrast);
+			shader.uniformFloat("exposure", minecraft.ppm.lerped.exposure);
+			shader.uniformFloat("saturation", minecraft.ppm.lerped.saturation);
+			shader.uniformFloat("rMod", minecraft.ppm.lerped.rMod);
+			shader.uniformFloat("gMod", minecraft.ppm.lerped.gMod);
+			shader.uniformFloat("bMod", minecraft.ppm.lerped.bMod);
 		} else {
 			shader.uniformFloat("brightness", 0.0f);
 			shader.uniformFloat("contrast", 0.0f);
diff --git a/game/client/src/main/java/net/minecraft/client/sound/SoundEngine.java b/game/client/src/main/java/net/minecraft/client/sound/SoundEngine.java
index e49746bff..1fae690ad 100644
--- a/game/client/src/main/java/net/minecraft/client/sound/SoundEngine.java
+++ b/game/client/src/main/java/net/minecraft/client/sound/SoundEngine.java
@@ -133,6 +133,34 @@ public class SoundEngine
 		}
     }
 
+	public void playTitleScreenMusic() {
+		try {
+			lock.lock();
+			if (!isLoaded() || SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, this.options) == 0.0F) {
+				return;
+			}
+
+			if (!soundSystem.playing(BG_MUSIC) && !soundSystem.playing(STREAMING)) {
+				final @Nullable SoundEvent event = SoundRepository.SOUNDS.getRandomSoundFromCategory("music.");
+				if (event == null) {
+					return;
+				}
+
+				final @Nullable SoundEntry entry = event.getRandomEntry();
+				if (entry != null) {
+					soundSystem.backgroundMusic(BG_MUSIC, entry.getURL(), entry.name, false);
+					soundSystem.setPitch(BG_MUSIC, entry.pitch);
+					soundSystem.setVolume(BG_MUSIC, SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, this.options) * entry.volume);
+					soundSystem.play(BG_MUSIC);
+				}
+			}
+		} catch (Exception e) {
+			LOGGER.error("Unexpected exception while ticking sound engine!", e);
+		} finally {
+			lock.unlock();
+		}
+	}
+
     public void tick() {
 		try {
 			lock.lock();
diff --git a/game/core/src/main/resources/lang/en_US/options.lang b/game/core/src/main/resources/lang/en_US/options.lang
index d33a3ee39..baf3dd3a3 100644
--- a/game/core/src/main/resources/lang/en_US/options.lang
+++ b/game/core/src/main/resources/lang/en_US/options.lang
@@ -12,6 +12,7 @@ options.sound.entity=Entity Volume
 options.sound.cave=Cave Sounds Volume
 options.sound.gui=GUI Volume
 options.sound.weather=Weather Volume
+options.playTitleScreenMusic=Play Music on Title Screen
 options.invertYMouse=Invert Mouse
 options.mouseSensitivity=Sensitivity
 options.mouseSensitivity.min=*yawn*
