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