Skip to content

Commit ad1f890

Browse files
authored
Added capability of overriding AmpMinimumLevel in the .cmb file #782 (#2089)
1 parent 18e3d86 commit ad1f890

File tree

5 files changed

+82
-53
lines changed

5 files changed

+82
-53
lines changed

src/grandorgue/combinations/GOSetter.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2006 Milan Digital Audio LLC
3-
* Copyright 2009-2024 GrandOrgue contributors (see AUTHORS)
3+
* Copyright 2009-2025 GrandOrgue contributors (see AUTHORS)
44
* License GPL-2.0 or later
55
* (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
66
*/
@@ -1174,7 +1174,7 @@ void GOSetter::Crescendo(int newpos, bool force) {
11741174

11751175
void GOSetter::ControlChanged(GOControl *control) {
11761176
if (control == &m_CrescendoCtrl)
1177-
Crescendo(m_CrescendoCtrl.GetValue() * CRESCENDO_STEPS / 128);
1177+
Crescendo(m_CrescendoCtrl.GetMidiValue() * CRESCENDO_STEPS / 128);
11781178
}
11791179

11801180
void GOSetter::UpdateTranspose() {

src/grandorgue/gui/panels/GOGUIEnclosure.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2006 Milan Digital Audio LLC
3-
* Copyright 2009-2024 GrandOrgue contributors (see AUTHORS)
3+
* Copyright 2009-2025 GrandOrgue contributors (see AUTHORS)
44
* License GPL-2.0 or later
55
* (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
66
*/
@@ -305,8 +305,9 @@ void GOGUIEnclosure::PrepareDraw(double scale, GOBitmap *background) {
305305
}
306306

307307
void GOGUIEnclosure::Draw(GODC &dc) {
308-
GOBitmap &bmp
309-
= m_Bitmaps[((m_Bitmaps.size() - 1) * m_enclosure->GetValue()) / 127];
308+
GOBitmap &bmp = m_Bitmaps
309+
[((m_Bitmaps.size() - 1) * m_enclosure->GetMidiValue())
310+
/ GOEnclosure::MAX_MIDI_VALUE];
310311
dc.DrawBitmap(bmp, m_BoundingRect);
311312

312313
if (m_TextWidth)
@@ -341,7 +342,7 @@ bool GOGUIEnclosure::HandleMousePress(
341342
state.SetControl(this);
342343
state.SetIndex(value);
343344

344-
m_enclosure->Set(value);
345+
m_enclosure->SetIntMidiValue(value);
345346
return true;
346347
}
347348
}

src/grandorgue/model/GOEnclosure.cpp

+45-34
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2006 Milan Digital Audio LLC
3-
* Copyright 2009-2024 GrandOrgue contributors (see AUTHORS)
3+
* Copyright 2009-2025 GrandOrgue contributors (see AUTHORS)
44
* License GPL-2.0 or later
55
* (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
66
*/
@@ -22,103 +22,114 @@ GOEnclosure::GOEnclosure(GOOrganModel &organModel)
2222
m_midi(organModel, MIDI_RECV_ENCLOSURE),
2323
m_sender(organModel, MIDI_SEND_ENCLOSURE),
2424
m_shortcut(KEY_RECV_ENCLOSURE),
25-
m_AmpMinimumLevel(0),
26-
m_MIDIInputNumber(0),
27-
m_MIDIValue(0),
2825
m_Name(),
26+
m_DefaultAmpMinimumLevel(0),
27+
m_MIDIInputNumber(0),
2928
m_Displayed1(false),
30-
m_Displayed2(false) {
29+
m_Displayed2(false),
30+
m_AmpMinimumLevel(0),
31+
m_MIDIValue(0) {
3132
organModel.RegisterEventHandler(this);
3233
organModel.RegisterMidiConfigurator(this);
3334
organModel.RegisterSoundStateHandler(this);
3435
}
3536

3637
void GOEnclosure::Init(
37-
GOConfigReader &cfg, wxString group, wxString Name, unsigned def_value) {
38+
GOConfigReader &cfg,
39+
const wxString &group,
40+
const wxString &name,
41+
uint8_t defaultValue) {
3842
r_OrganModel.RegisterSaveableObject(this);
3943
m_group = group;
40-
m_Name = Name;
41-
Set(cfg.ReadInteger(
42-
CMBSetting, m_group, wxT("Value"), 0, 127, false, def_value));
44+
m_Name = name;
45+
m_DefaultAmpMinimumLevel = 0;
46+
LoadFromCmb(cfg, defaultValue);
47+
}
48+
49+
static const wxString WX_AMP_MINIMUM_LEVEL = wxT("AmpMinimumLevel");
50+
static const wxString WX_VALUE = wxT("Value");
51+
52+
void GOEnclosure::LoadFromCmb(GOConfigReader &cfg, uint8_t defaultValue) {
4353
m_midi.Load(cfg, m_group, r_MidiMap);
4454
m_sender.Load(cfg, m_group, r_MidiMap);
4555
m_shortcut.Load(cfg, m_group);
46-
m_AmpMinimumLevel = 0;
47-
}
48-
49-
void GOEnclosure::Load(GOConfigReader &cfg, wxString group, int enclosure_nb) {
56+
m_AmpMinimumLevel = cfg.ReadInteger(
57+
CMBSetting,
58+
m_group,
59+
WX_AMP_MINIMUM_LEVEL,
60+
0,
61+
100,
62+
false,
63+
m_DefaultAmpMinimumLevel);
64+
SetMidiValue(cfg.ReadInteger(
65+
CMBSetting, m_group, WX_VALUE, 0, MAX_MIDI_VALUE, false, defaultValue));
66+
}
67+
68+
void GOEnclosure::Load(
69+
GOConfigReader &cfg, const wxString &group, int enclosure_nb) {
5070
r_OrganModel.RegisterSaveableObject(this);
5171
m_group = group;
5272
m_Name = cfg.ReadStringNotEmpty(ODFSetting, m_group, wxT("Name"));
5373
m_Displayed1
5474
= cfg.ReadBoolean(ODFSetting, m_group, wxT("Displayed"), false, true);
5575
m_Displayed2
5676
= cfg.ReadBoolean(ODFSetting, m_group, wxT("Displayed"), false, false);
57-
m_AmpMinimumLevel
58-
= cfg.ReadInteger(ODFSetting, m_group, wxT("AmpMinimumLevel"), 0, 100);
77+
m_DefaultAmpMinimumLevel
78+
= cfg.ReadInteger(ODFSetting, m_group, WX_AMP_MINIMUM_LEVEL, 0, 100);
5979
m_MIDIInputNumber = cfg.ReadInteger(
6080
ODFSetting, m_group, wxT("MIDIInputNumber"), 0, 200, false, 0);
61-
Set(cfg.ReadInteger(CMBSetting, m_group, wxT("Value"), 0, 127, false, 127));
6281
m_midi.SetIndex(enclosure_nb);
63-
m_midi.Load(cfg, m_group, r_MidiMap);
64-
m_sender.Load(cfg, m_group, r_MidiMap);
65-
m_shortcut.Load(cfg, m_group);
82+
LoadFromCmb(cfg, MAX_MIDI_VALUE);
6683
}
6784

6885
void GOEnclosure::Save(GOConfigWriter &cfg) {
6986
m_midi.Save(cfg, m_group, r_MidiMap);
7087
m_sender.Save(cfg, m_group, r_MidiMap);
7188
m_shortcut.Save(cfg, m_group);
72-
cfg.WriteInteger(m_group, wxT("Value"), m_MIDIValue);
89+
cfg.WriteInteger(m_group, WX_AMP_MINIMUM_LEVEL, m_AmpMinimumLevel);
90+
cfg.WriteInteger(m_group, WX_VALUE, m_MIDIValue);
7391
}
7492

75-
void GOEnclosure::Set(int n) {
76-
if (n < 0)
77-
n = 0;
78-
if (n > 127)
79-
n = 127;
93+
void GOEnclosure::SetMidiValue(uint8_t n) {
8094
if (n != m_MIDIValue) {
8195
m_MIDIValue = n;
82-
m_sender.SetValue(m_MIDIValue);
96+
m_sender.SetValue(n);
8397
}
8498
r_OrganModel.UpdateVolume();
8599
r_OrganModel.SendControlChanged(this);
86100
}
87101

88-
int GOEnclosure::GetMIDIInputNumber() { return m_MIDIInputNumber; }
89-
90102
float GOEnclosure::GetAttenuation() {
91103
static const float scale = 1.0 / 12700.0;
92104
return (float)(m_MIDIValue * (100 - m_AmpMinimumLevel) + 127 * m_AmpMinimumLevel)
93105
* scale;
94106
}
95107

96108
void GOEnclosure::Scroll(bool scroll_up) {
97-
Set(m_MIDIValue + (scroll_up ? 4 : -4));
109+
SetIntMidiValue(m_MIDIValue + (scroll_up ? 4 : -4));
98110
}
99111

100112
void GOEnclosure::ProcessMidi(const GOMidiEvent &event) {
101113
int value;
114+
102115
if (m_midi.Match(event, value) == MIDI_MATCH_CHANGE)
103-
Set(value);
116+
SetIntMidiValue(value);
104117
}
105118

106119
void GOEnclosure::HandleKey(int key) {
107120
switch (m_shortcut.Match(key)) {
108121
case KEY_MATCH:
109-
Set(m_MIDIValue + 8);
122+
SetIntMidiValue(m_MIDIValue + 8);
110123
break;
111124

112125
case KEY_MATCH_MINUS:
113-
Set(m_MIDIValue - 8);
126+
SetIntMidiValue(m_MIDIValue - 8);
114127
break;
115128
default:
116129
break;
117130
}
118131
}
119132

120-
int GOEnclosure::GetValue() { return m_MIDIValue; }
121-
122133
bool GOEnclosure::IsDisplayed(bool new_format) {
123134
if (new_format)
124135
return m_Displayed2;

src/grandorgue/model/GOEnclosure.h

+26-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
/*
22
* Copyright 2006 Milan Digital Audio LLC
3-
* Copyright 2009-2024 GrandOrgue contributors (see AUTHORS)
3+
* Copyright 2009-2025 GrandOrgue contributors (see AUTHORS)
44
* License GPL-2.0 or later
55
* (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
66
*/
77

88
#ifndef GOENCLOSURE_H_
99
#define GOENCLOSURE_H_
1010

11+
#include <algorithm>
12+
#include <cstdint>
13+
1114
#include <wx/string.h>
1215

1316
#include "control/GOControl.h"
@@ -38,16 +41,20 @@ class GOEnclosure : public GOControl,
3841
GOMidiReceiver m_midi;
3942
GOMidiSender m_sender;
4043
GOMidiShortcutReceiver m_shortcut;
41-
int m_AmpMinimumLevel;
42-
int m_MIDIInputNumber;
43-
int m_MIDIValue;
4444
wxString m_Name;
45+
uint8_t m_DefaultAmpMinimumLevel;
46+
uint8_t m_MIDIInputNumber;
4547
bool m_Displayed1;
4648
bool m_Displayed2;
4749

50+
uint8_t m_AmpMinimumLevel;
51+
uint8_t m_MIDIValue;
52+
4853
void ProcessMidi(const GOMidiEvent &event) override;
4954
void HandleKey(int key) override;
5055

56+
// Load all customizable values from the .cmb file
57+
void LoadFromCmb(GOConfigReader &cfg, uint8_t defaultValue);
5158
void Save(GOConfigWriter &cfg) override;
5259

5360
void AbortPlayback() override;
@@ -61,14 +68,24 @@ class GOEnclosure : public GOControl,
6168
}
6269

6370
public:
71+
static constexpr uint8_t MAX_MIDI_VALUE = 127;
72+
6473
GOEnclosure(GOOrganModel &organModel);
6574
void Init(
66-
GOConfigReader &cfg, wxString group, wxString Name, unsigned def_value);
67-
void Load(GOConfigReader &cfg, wxString group, int enclosure_nb);
68-
void Set(int n);
75+
GOConfigReader &cfg,
76+
const wxString &group,
77+
const wxString &name,
78+
uint8_t defaultValue);
79+
void Load(GOConfigReader &cfg, const wxString &group, int enclosure_nb);
6980
const wxString &GetName() const { return m_Name; }
70-
int GetValue();
71-
int GetMIDIInputNumber();
81+
uint8_t GetAmpMinimumLevel() const { return m_AmpMinimumLevel; }
82+
void SetAmpMinimumLevel(uint8_t v) { m_AmpMinimumLevel = v; }
83+
uint8_t GetMIDIInputNumber() const { return m_MIDIInputNumber; }
84+
uint8_t GetMidiValue() const { return m_MIDIValue; }
85+
void SetMidiValue(uint8_t n);
86+
void SetIntMidiValue(int n) {
87+
SetMidiValue((uint8_t)std::clamp(n, 0, (int)MAX_MIDI_VALUE));
88+
}
7289
float GetAttenuation();
7390

7491
void Scroll(bool scroll_up);

src/tests/testing/model/GOTestWindchest.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023-2024 GrandOrgue contributors (see AUTHORS)
2+
* Copyright 2023-2025 GrandOrgue contributors (see AUTHORS)
33
* License GPL-2.0 or later
44
* (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
55
*/
@@ -47,20 +47,20 @@ void GOTestWindchest::run() {
4747
GOEnclosure *enclosure = new GOEnclosure(*this->controller);
4848
windchest->AddEnclosure(enclosure);
4949

50-
enclosure->Set(127);
50+
enclosure->SetMidiValue(127);
5151
float volume = windchest->GetVolume();
5252
message = "The Windchest volume is not 1 but ";
5353
message = message + std::to_string(volume);
5454
this->GOAssert(volume == 1, message);
5555

56-
enclosure->Set(0);
56+
enclosure->SetMidiValue(0);
5757
volume = windchest->GetVolume();
5858
message = "The Windchest volume is not 0 but ";
5959
message = message + std::to_string(volume);
6060
this->GOAssert(volume == 0, message);
6161

6262
// Check a MIDI value of 50 (50/127)
63-
enclosure->Set(50);
63+
enclosure->SetMidiValue(50);
6464
volume = windchest->GetVolume();
6565
message = "The Windchest volume is not 0.393701 but ";
6666
message = message + std::to_string(volume);

0 commit comments

Comments
 (0)