From 44eb4e8fc917ef0a99f7657dbaf93d8169dc4e9d Mon Sep 17 00:00:00 2001 From: 20kdc Date: Sun, 14 Nov 2021 09:44:36 +0000 Subject: [PATCH] MIDI volume slider in settings (#5327) The Fluid soundfont is too quiet, the Windows one might be too loud... --- .../EscapeMenu/UI/Tabs/AudioTab.xaml | 14 +++++++ .../EscapeMenu/UI/Tabs/AudioTab.xaml.cs | 39 ++++++++++++++++--- .../en-US/escape-menu/ui/options-menu.ftl | 1 + 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/Content.Client/EscapeMenu/UI/Tabs/AudioTab.xaml b/Content.Client/EscapeMenu/UI/Tabs/AudioTab.xaml index 19c24ec270..dffb932b78 100644 --- a/Content.Client/EscapeMenu/UI/Tabs/AudioTab.xaml +++ b/Content.Client/EscapeMenu/UI/Tabs/AudioTab.xaml @@ -22,6 +22,20 @@ + + + diff --git a/Content.Client/EscapeMenu/UI/Tabs/AudioTab.xaml.cs b/Content.Client/EscapeMenu/UI/Tabs/AudioTab.xaml.cs index 22e905b032..629a457264 100644 --- a/Content.Client/EscapeMenu/UI/Tabs/AudioTab.xaml.cs +++ b/Content.Client/EscapeMenu/UI/Tabs/AudioTab.xaml.cs @@ -1,10 +1,13 @@ +using System; using Content.Shared.CCVar; +using Robust.Client.Audio.Midi; using Robust.Client.AutoGenerated; using Robust.Client.Graphics; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared; +using Robust.Shared.Maths; using Robust.Shared.Configuration; using Robust.Shared.IoC; using Robust.Shared.Localization; @@ -28,6 +31,7 @@ namespace Content.Client.EscapeMenu.UI.Tabs ApplyButton.OnPressed += OnApplyButtonPressed; ResetButton.OnPressed += OnResetButtonPressed; MasterVolumeSlider.OnValueChanged += OnMasterVolumeSliderChanged; + MidiVolumeSlider.OnValueChanged += OnMidiVolumeSliderChanged; AmbienceCheckBox.OnToggled += OnAmbienceCheckToggled; LobbyMusicCheckBox.OnToggled += OnLobbyMusicCheckToggled; @@ -39,18 +43,22 @@ namespace Content.Client.EscapeMenu.UI.Tabs ApplyButton.OnPressed -= OnApplyButtonPressed; ResetButton.OnPressed -= OnResetButtonPressed; MasterVolumeSlider.OnValueChanged -= OnMasterVolumeSliderChanged; + MidiVolumeSlider.OnValueChanged -= OnMidiVolumeSliderChanged; AmbienceCheckBox.OnToggled -= OnAmbienceCheckToggled; base.Dispose(disposing); } - private void OnMasterVolumeSliderChanged(Range range) + private void OnMasterVolumeSliderChanged(Robust.Client.UserInterface.Controls.Range range) { - MasterVolumeLabel.Text = - Loc.GetString("ui-options-volume-percent", ("volume", MasterVolumeSlider.Value / 100)); _clydeAudio.SetMasterVolume(MasterVolumeSlider.Value / 100); UpdateChanges(); } + private void OnMidiVolumeSliderChanged(Robust.Client.UserInterface.Controls.Range range) + { + UpdateChanges(); + } + private void OnAmbienceCheckToggled(BaseButton.ButtonEventArgs args) { UpdateChanges(); @@ -64,6 +72,7 @@ namespace Content.Client.EscapeMenu.UI.Tabs private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args) { _cfg.SetCVar(CVars.AudioMasterVolume, MasterVolumeSlider.Value / 100); + _cfg.SetCVar(CVars.MidiVolume, LV100ToDB(MidiVolumeSlider.Value)); _cfg.SetCVar(CCVars.AmbienceBasicEnabled, AmbienceCheckBox.Pressed); _cfg.SetCVar(CCVars.LobbyMusicEnabled, LobbyMusicCheckBox.Pressed); _cfg.SaveToFile(); @@ -78,22 +87,40 @@ namespace Content.Client.EscapeMenu.UI.Tabs private void Reset() { MasterVolumeSlider.Value = _cfg.GetCVar(CVars.AudioMasterVolume) * 100; - MasterVolumeLabel.Text = - Loc.GetString("ui-options-volume-percent", ("volume", MasterVolumeSlider.Value / 100)); + MidiVolumeSlider.Value = DBToLV100(_cfg.GetCVar(CVars.MidiVolume)); AmbienceCheckBox.Pressed = _cfg.GetCVar(CCVars.AmbienceBasicEnabled); LobbyMusicCheckBox.Pressed = _cfg.GetCVar(CCVars.LobbyMusicEnabled); UpdateChanges(); } + // Note: Rather than moving these functions somewhere, instead switch MidiManager to using linear units rather than dB + // Do be sure to rename the setting though + private float DBToLV100(float db) + { + return (MathF.Pow(10, (db / 10)) * 100); + } + + private float LV100ToDB(float lv100) + { + // Saving negative infinity doesn't work, so use -10000000 instead (MidiManager does it) + return MathF.Max(-10000000, MathF.Log(lv100 / 100, 10) * 10); + } + private void UpdateChanges() { var isMasterVolumeSame = System.Math.Abs(MasterVolumeSlider.Value - _cfg.GetCVar(CVars.AudioMasterVolume) * 100) < 0.01f; + var isMidiVolumeSame = + System.Math.Abs(MidiVolumeSlider.Value - DBToLV100(_cfg.GetCVar(CVars.MidiVolume))) < 0.01f; var isAmbienceSame = AmbienceCheckBox.Pressed == _cfg.GetCVar(CCVars.AmbienceBasicEnabled); var isLobbySame = LobbyMusicCheckBox.Pressed == _cfg.GetCVar(CCVars.LobbyMusicEnabled); - var isEverythingSame = isMasterVolumeSame && isAmbienceSame && isLobbySame; + var isEverythingSame = isMasterVolumeSame && isMidiVolumeSame && isAmbienceSame && isLobbySame; ApplyButton.Disabled = isEverythingSame; ResetButton.Disabled = isEverythingSame; + MasterVolumeLabel.Text = + Loc.GetString("ui-options-volume-percent", ("volume", MasterVolumeSlider.Value / 100)); + MidiVolumeLabel.Text = + Loc.GetString("ui-options-volume-percent", ("volume", MidiVolumeSlider.Value / 100)); } } } diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 1122090f48..680668c3a9 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -11,6 +11,7 @@ ui-options-reset-all = Reset All ## Audio menu ui-options-master-volume = Master Volume: +ui-options-midi-volume = MIDI (Instrument) Volume: ui-options-ambient-hum = Ambient Hum ui-options-lobby-music = Lobby Music ui-options-volume-label = Volume