Merge pull request #12 from Bottinator22/main

Move instruments to their own audio group and volume setting
This commit is contained in:
Kae 2024-01-03 20:09:39 +11:00 committed by GitHub
commit ea28fc8071
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 42 additions and 10 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1017 B

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -2,13 +2,13 @@
"paneLayout" : { "paneLayout" : {
"voiceLabel" : { "voiceLabel" : {
"type" : "label", "type" : "label",
"position" : [119, 186], "position" : [119, 202],
"hAnchor" : "mid", "hAnchor" : "mid",
"value" : "VOICE" "value" : "VOICE"
}, },
"showVoiceSettings" : { "showVoiceSettings" : {
"type" : "button", "type" : "button",
"position" : [30, 169], "position" : [30, 185],
"caption" : "Settings", "caption" : "Settings",
"base" : "/interface/optionsmenu/duocontrolsbutton.png", "base" : "/interface/optionsmenu/duocontrolsbutton.png",
"hover" : "/interface/optionsmenu/duocontrolsbuttonhover.png" "hover" : "/interface/optionsmenu/duocontrolsbuttonhover.png"
@ -16,7 +16,7 @@
"showVoicePlayers" : { "showVoicePlayers" : {
"type" : "button", "type" : "button",
"disabled" : true, "disabled" : true,
"position" : [133, 169], "position" : [133, 185],
"caption" : "^#a0a000,font=iosevka-semiboldoblique;TODO^#aa7;:^reset; Players", "caption" : "^#a0a000,font=iosevka-semiboldoblique;TODO^#aa7;:^reset; Players",
"base" : "/interface/optionsmenu/duocontrolsbutton.png", "base" : "/interface/optionsmenu/duocontrolsbutton.png",
"hover" : "/interface/optionsmenu/duocontrolsbuttonhover.png" "hover" : "/interface/optionsmenu/duocontrolsbuttonhover.png"
@ -42,7 +42,15 @@
"base" : "/interface/optionsmenu/tricontrolsbutton.png", "base" : "/interface/optionsmenu/tricontrolsbutton.png",
"hover" : "/interface/optionsmenu/tricontrolsbuttonhover.png" "hover" : "/interface/optionsmenu/tricontrolsbuttonhover.png"
}, },
"sfxValueLabel" : { "position" : [192, 142] }, // this is 2px too low in vanilla lol
"musicSlider" : { "position" : [62, 126] } "volumeLabel" : { "position" : [119, 173] },
"musicSlider" : { "position" : [62, 126] },
"sfxLabel" : { "position" : [32, 142], "value" : "Sound" },
"sfxValueLabel" : { "position" : [192, 142] },
"instrumentSlider" : { "type" : "slider", "position" : [62, 158], "gridImage" : "/interface/optionsmenu/largeselection.png" },
"instrumentLabel" : { "type" : "label", "position" : [32, 158], "value" : "Tunes" },
"instrumentValueLabel" : { "type" : "label", "position" : [192, 158], "hAnchor" : "mid", "value" : "Replace Me" }
} }
} }

View File

@ -172,6 +172,7 @@ Mixer::Mixer(unsigned sampleRate, unsigned channels) {
m_groupVolumes[MixerGroup::Effects] = {1.0f, 1.0f, 0}; m_groupVolumes[MixerGroup::Effects] = {1.0f, 1.0f, 0};
m_groupVolumes[MixerGroup::Music] = {1.0f, 1.0f, 0}; m_groupVolumes[MixerGroup::Music] = {1.0f, 1.0f, 0};
m_groupVolumes[MixerGroup::Cinematic] = {1.0f, 1.0f, 0}; m_groupVolumes[MixerGroup::Cinematic] = {1.0f, 1.0f, 0};
m_groupVolumes[MixerGroup::Instruments] = {1.0f, 1.0f, 0};
m_speed = 1.0f; m_speed = 1.0f;
} }
@ -296,7 +297,7 @@ void Mixer::read(int16_t* outBuffer, size_t frameCount, ExtraMixFunction extraMi
? approach(audioInstance->m_pitchMultiplierTarget, audioInstance->m_pitchMultiplier, audioInstance->m_pitchMultiplierVelocity * time) ? approach(audioInstance->m_pitchMultiplierTarget, audioInstance->m_pitchMultiplier, audioInstance->m_pitchMultiplierVelocity * time)
: audioInstance->m_pitchMultiplier; : audioInstance->m_pitchMultiplier;
if (audioInstance->m_mixerGroup == MixerGroup::Effects) if (audioInstance->m_mixerGroup == MixerGroup::Effects || audioInstance->m_mixerGroup == MixerGroup::Instruments)
pitchMultiplier *= speed; pitchMultiplier *= speed;
if (audioStopVolEnd == 0.0f && audioInstance->m_stopping) if (audioStopVolEnd == 0.0f && audioInstance->m_stopping)

View File

@ -23,7 +23,8 @@ struct RampedValue {
enum class MixerGroup : uint8_t { enum class MixerGroup : uint8_t {
Effects, Effects,
Music, Music,
Cinematic Cinematic,
Instruments
}; };
class AudioInstance { class AudioInstance {

View File

@ -44,6 +44,7 @@ Json const AdditionalDefaultConfiguration = Json::parseJson(R"JSON(
"audioChannelSeparation" : [-25, 25], "audioChannelSeparation" : [-25, 25],
"sfxVol" : 100, "sfxVol" : 100,
"instrumentVol" : 100,
"musicVol" : 70, "musicVol" : 70,
"windowedResolution" : [1000, 600], "windowedResolution" : [1000, 600],
"fullscreenResolution" : [1920, 1080], "fullscreenResolution" : [1920, 1080],

View File

@ -47,16 +47,16 @@ void MainMixer::update(float dt, bool muteSfx, bool muteMusic) {
updateGroupVolume(MixerGroup::Effects, muteSfx, "sfxVol"); updateGroupVolume(MixerGroup::Effects, muteSfx, "sfxVol");
updateGroupVolume(MixerGroup::Music, muteMusic, "musicVol"); updateGroupVolume(MixerGroup::Music, muteMusic, "musicVol");
updateGroupVolume(MixerGroup::Cinematic, false, "sfxVol"); updateGroupVolume(MixerGroup::Cinematic, false, "sfxVol");
updateGroupVolume(MixerGroup::Instruments, muteSfx, "instrumentVol");
WorldClientPtr currentWorld; WorldClientPtr currentWorld;
if (m_universeClient) if (m_universeClient)
currentWorld = m_universeClient->worldClient(); currentWorld = m_universeClient->worldClient();
if (currentWorld) { if (currentWorld) {
for (auto audioInstance : currentWorld->pullPendingAudio()) { for (auto audioInstance : currentWorld->pullPendingAudio())
audioInstance->setMixerGroup(MixerGroup::Effects);
m_mixer->play(audioInstance); m_mixer->play(audioInstance);
}
for (auto audioInstance : currentWorld->pullPendingMusic()) { for (auto audioInstance : currentWorld->pullPendingMusic()) {
audioInstance->setMixerGroup(MixerGroup::Music); audioInstance->setMixerGroup(MixerGroup::Music);
m_mixer->play(audioInstance); m_mixer->play(audioInstance);

View File

@ -20,6 +20,9 @@ OptionsMenu::OptionsMenu(PaneManager* manager)
GuiReader reader; GuiReader reader;
reader.registerCallback("instrumentSlider", [=](Widget*) {
updateInstrumentVol();
});
reader.registerCallback("sfxSlider", [=](Widget*) { reader.registerCallback("sfxSlider", [=](Widget*) {
updateSFXVol(); updateSFXVol();
}); });
@ -67,6 +70,7 @@ OptionsMenu::OptionsMenu(PaneManager* manager)
reader.construct(config.get("paneLayout"), this); reader.construct(config.get("paneLayout"), this);
m_instrumentSlider = fetchChild<SliderBarWidget>("instrumentSlider");
m_sfxSlider = fetchChild<SliderBarWidget>("sfxSlider"); m_sfxSlider = fetchChild<SliderBarWidget>("sfxSlider");
m_musicSlider = fetchChild<SliderBarWidget>("musicSlider"); m_musicSlider = fetchChild<SliderBarWidget>("musicSlider");
m_tutorialMessagesButton = fetchChild<ButtonWidget>("tutorialMessagesCheckbox"); m_tutorialMessagesButton = fetchChild<ButtonWidget>("tutorialMessagesCheckbox");
@ -74,10 +78,12 @@ OptionsMenu::OptionsMenu(PaneManager* manager)
m_clientP2PJoinableButton = fetchChild<ButtonWidget>("clientP2PJoinableCheckbox"); m_clientP2PJoinableButton = fetchChild<ButtonWidget>("clientP2PJoinableCheckbox");
m_allowAssetsMismatchButton = fetchChild<ButtonWidget>("allowAssetsMismatchCheckbox"); m_allowAssetsMismatchButton = fetchChild<ButtonWidget>("allowAssetsMismatchCheckbox");
m_instrumentLabel = fetchChild<LabelWidget>("instrumentValueLabel");
m_sfxLabel = fetchChild<LabelWidget>("sfxValueLabel"); m_sfxLabel = fetchChild<LabelWidget>("sfxValueLabel");
m_musicLabel = fetchChild<LabelWidget>("musicValueLabel"); m_musicLabel = fetchChild<LabelWidget>("musicValueLabel");
m_p2pJoinableLabel = fetchChild<LabelWidget>("clientP2PJoinableLabel"); m_p2pJoinableLabel = fetchChild<LabelWidget>("clientP2PJoinableLabel");
m_instrumentSlider->setRange(m_sfxRange, assets->json("/interface/optionsmenu/optionsmenu.config:sfxDelta").toInt());
m_sfxSlider->setRange(m_sfxRange, assets->json("/interface/optionsmenu/optionsmenu.config:sfxDelta").toInt()); m_sfxSlider->setRange(m_sfxRange, assets->json("/interface/optionsmenu/optionsmenu.config:sfxDelta").toInt());
m_musicSlider->setRange(m_musicRange, assets->json("/interface/optionsmenu/optionsmenu.config:musicDelta").toInt()); m_musicSlider->setRange(m_musicRange, assets->json("/interface/optionsmenu/optionsmenu.config:musicDelta").toInt());
@ -103,6 +109,7 @@ void OptionsMenu::toggleFullscreen() {
} }
StringList const OptionsMenu::ConfigKeys = { StringList const OptionsMenu::ConfigKeys = {
"instrumentVol",
"sfxVol", "sfxVol",
"musicVol", "musicVol",
"tutorialMessages", "tutorialMessages",
@ -120,6 +127,12 @@ void OptionsMenu::initConfig() {
} }
} }
void OptionsMenu::updateInstrumentVol() {
m_localChanges.set("instrumentVol", m_instrumentSlider->val());
Root::singleton().configuration()->set("instrumentVol", m_instrumentSlider->val());
m_instrumentLabel->setText(toString(m_instrumentSlider->val()));
}
void OptionsMenu::updateSFXVol() { void OptionsMenu::updateSFXVol() {
m_localChanges.set("sfxVol", m_sfxSlider->val()); m_localChanges.set("sfxVol", m_sfxSlider->val());
Root::singleton().configuration()->set("sfxVol", m_sfxSlider->val()); Root::singleton().configuration()->set("sfxVol", m_sfxSlider->val());
@ -154,6 +167,9 @@ void OptionsMenu::updateAllowAssetsMismatch() {
} }
void OptionsMenu::syncGuiToConf() { void OptionsMenu::syncGuiToConf() {
m_instrumentSlider->setVal(m_localChanges.get("instrumentVol").toInt(), false);
m_instrumentLabel->setText(toString(m_instrumentSlider->val()));
m_sfxSlider->setVal(m_localChanges.get("sfxVol").toInt(), false); m_sfxSlider->setVal(m_localChanges.get("sfxVol").toInt(), false);
m_sfxLabel->setText(toString(m_sfxSlider->val())); m_sfxLabel->setText(toString(m_sfxSlider->val()));

View File

@ -29,6 +29,7 @@ private:
void initConfig(); void initConfig();
void updateInstrumentVol();
void updateSFXVol(); void updateSFXVol();
void updateMusicVol(); void updateMusicVol();
void updateTutorialMessages(); void updateTutorialMessages();
@ -43,6 +44,7 @@ private:
void displayModBindings(); void displayModBindings();
void displayGraphics(); void displayGraphics();
SliderBarWidgetPtr m_instrumentSlider;
SliderBarWidgetPtr m_sfxSlider; SliderBarWidgetPtr m_sfxSlider;
SliderBarWidgetPtr m_musicSlider; SliderBarWidgetPtr m_musicSlider;
ButtonWidgetPtr m_tutorialMessagesButton; ButtonWidgetPtr m_tutorialMessagesButton;
@ -51,10 +53,12 @@ private:
ButtonWidgetPtr m_clientP2PJoinableButton; ButtonWidgetPtr m_clientP2PJoinableButton;
ButtonWidgetPtr m_allowAssetsMismatchButton; ButtonWidgetPtr m_allowAssetsMismatchButton;
LabelWidgetPtr m_instrumentLabel;
LabelWidgetPtr m_sfxLabel; LabelWidgetPtr m_sfxLabel;
LabelWidgetPtr m_musicLabel; LabelWidgetPtr m_musicLabel;
LabelWidgetPtr m_p2pJoinableLabel; LabelWidgetPtr m_p2pJoinableLabel;
//TODO: add instrument range (or just use one range for all 3, it's kinda silly.)
Vec2I m_sfxRange; Vec2I m_sfxRange;
Vec2I m_musicRange; Vec2I m_musicRange;

View File

@ -138,6 +138,7 @@ void Songbook::playback() {
} }
AudioInstancePtr audioInstance = make_shared<AudioInstance>(*m_uncompressedSamples[note.file]); AudioInstancePtr audioInstance = make_shared<AudioInstance>(*m_uncompressedSamples[note.file]);
audioInstance->setMixerGroup(MixerGroup::Instruments);
audioInstance->setPitchMultiplier(note.velocity); audioInstance->setPitchMultiplier(note.velocity);
auto start = m_timeSourceInstance->epoch + (int64_t)(note.timecode * 1000.0); auto start = m_timeSourceInstance->epoch + (int64_t)(note.timecode * 1000.0);