commit 71f3a65c61f3f0410901dcf9090d185c5b01ab72
parent 5829c8c17bd90794723f36c25238ec0f1c8b7e5c
Author: Daniel Sheeler <dsheeler@pobox.com>
Date: Sun, 17 Mar 2019 22:40:31 -0500
replace global volume 0-127 with float dB
Diffstat:
3 files changed, 40 insertions(+), 30 deletions(-)
diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp
@@ -430,18 +430,20 @@ static const Ports master_ports = {
rDefault(80) rDoc("Master Volume"), 0,
[](const char *m, rtosc::RtData &d) {
if(rtosc_narguments(m)==0) {
- d.reply(d.loc, "i", ((Master*)d.obj)->Pvolume);
+ d.reply(d.loc, "i", (int) roundf(96.0f * ((Master*)d.obj)->volume / 40.0f + 96.0f));
} else if(rtosc_narguments(m)==1 && rtosc_type(m,0)=='i') {
- ((Master*)d.obj)->setPvolume(limit<char>(rtosc_argument(m,0).i,0,127));
- d.broadcast(d.loc, "i", ((Master*)d.obj)->Pvolume);}}},
- {"volume::i", rShort("volume") rProp(parameter) rLinear(0,127)
- rDoc("Master Volume"), 0,
- [](const char *m, rtosc::RtData &d) {
- if(rtosc_narguments(m)==0) {
- d.reply(d.loc, "i", ((Master*)d.obj)->Pvolume);
- } else if(rtosc_narguments(m)==1 && rtosc_type(m,0)=='i') {
- ((Master*)d.obj)->setPvolume(limit<char>(rtosc_argument(m,0).i,0,127));
- d.broadcast(d.loc, "i", ((Master*)d.obj)->Pvolume);}}},
+ ((Master*)d.obj)->volume = 40.0f * (limit<char>(rtosc_argument(m,0).i,0,127) - 96.0f) / 96.0f;
+ d.broadcast(d.loc, "i", limit<char>(rtosc_argument(m, 0).i, 0, 127));
+ }}},
+ {"volume::f", rShort("volume") rProp(parameter) rDefault(-6.667f) rLinear(-40.0f,12.917f)
+ rDoc("Master Volume"), 0,
+ [](const char *m, rtosc::RtData &d) {
+ if(rtosc_narguments(m)==0) {
+ d.reply(d.loc, "f", ((Master*)d.obj)->volume);
+ } else if(rtosc_narguments(m)==1 && rtosc_type(m,0)=='f') {
+ ((Master*)d.obj)->setPvolume((int) roundf(96.0f * rtosc_argument(m,0).f) / 40.0f + 96.0f);
+ d.broadcast(d.loc, "f", ((Master*)d.obj)->volume);
+ }}},
{"Psysefxvol#" STRINGIFY(NUM_SYS_EFX) "/::i", 0, &sysefxPort,
[](const char *msg, rtosc::RtData &d) {
SNIP;
@@ -852,7 +854,7 @@ bool Master::applyOscEvent(const char *msg, bool nio, int msg_id)
void Master::defaults()
{
- volume = 1.0f;
+ volume = -6.667;
setPvolume(80);
setPkeyshift(64);
@@ -1008,7 +1010,7 @@ void Master::vuUpdate(const float *outl, const float *outr)
if(tmp > vuoutpeakpart[npart])
vuoutpeakpart[npart] = tmp;
}
- vuoutpeakpart[npart] *= volume;
+ vuoutpeakpart[npart] *= dB2rap(volume);
}
else
if(fakepeakpart[npart] > 1)
@@ -1290,9 +1292,10 @@ bool Master::AudioOut(float *outr, float *outl)
//Master Volume
+ float v = dB2rap(volume);
for(int i = 0; i < synth.buffersize; ++i) {
- outl[i] *= volume;
- outr[i] *= volume;
+ outl[i] *= v;
+ outr[i] *= v;
}
vuUpdate(outl, outr);
@@ -1392,7 +1395,7 @@ Master::~Master()
void Master::setPvolume(char Pvolume_)
{
Pvolume = Pvolume_;
- volume = dB2rap((Pvolume - 96.0f) / 96.0f * 40.0f);
+ volume = (Pvolume - 96.0f) / 96.0f * 40.0f;
}
void Master::setPkeyshift(char Pkeyshift_)
@@ -1465,7 +1468,7 @@ void Master::initialize_rt(void)
void Master::add2XML(XMLwrapper& xml)
{
- xml.addpar("volume", Pvolume);
+ xml.addparreal("volume", volume);
xml.addpar("key_shift", Pkeyshift);
xml.addparbool("nrpn_receive", ctl.NRPN.receive);
@@ -1581,7 +1584,14 @@ int Master::loadXML(const char *filename)
void Master::getfromXML(XMLwrapper& xml)
{
- setPvolume(xml.getpar127("volume", Pvolume));
+ if (xml.hasparreal("volume")) {
+ xml.getparreal("volume", volume);
+ printf("getparreal\n");
+ } else {
+ setPvolume(xml.getpar127("volume", Pvolume));
+ printf("getpar127\n");
+ }
+ printf("volume %f\n", volume);
setPkeyshift(xml.getpar127("key_shift", Pkeyshift));
ctl.NRPN.receive = xml.getparbool("nrpn_receive", ctl.NRPN.receive);
diff --git a/src/Tests/MessageTest.h b/src/Tests/MessageTest.h
@@ -150,9 +150,9 @@ class MessageTest:public CxxTest::TestSuite
void testMidiLearn(void)
{
- mw->transmitMsg("/learn", "s", "/Pvolume");
+ mw->transmitMsg("/learn", "s", "/Pkeyshift");
mw->transmitMsg("/virtual_midi_cc", "iii", 0, 23, 108);
- TS_ASSERT_EQUALS(ms->Pvolume, 80);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 64);
//Perform a learning operation
@@ -164,35 +164,35 @@ class MessageTest:public CxxTest::TestSuite
//Verify that the learning actually worked
mw->transmitMsg("/virtual_midi_cc", "iii", 0, 23, 13);
run_realtime();
- TS_ASSERT_EQUALS(ms->Pvolume, 13);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 13);
mw->transmitMsg("/virtual_midi_cc", "iii", 0, 23, 2);
run_realtime();
- TS_ASSERT_EQUALS(ms->Pvolume, 2);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 2);
mw->transmitMsg("/virtual_midi_cc", "iii", 0, 23, 0);
run_realtime();
- TS_ASSERT_EQUALS(ms->Pvolume, 0);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 0);
mw->transmitMsg("/virtual_midi_cc", "iii", 0, 23, 127);
run_realtime();
- TS_ASSERT_EQUALS(ms->Pvolume, 127);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 127);
}
void testMidiLearnSave(void)
{
- mw->transmitMsg("/learn", "s", "/Pvolume");
+ mw->transmitMsg("/learn", "s", "/Pkeyshift");
mw->transmitMsg("/virtual_midi_cc", "iii", 0, 23, 108);
//param is at default until rt-thread is run
- TS_ASSERT_EQUALS(ms->Pvolume, 80);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 64);
//Perform a learning operation
run_realtime();
//Verify binding affects control
- TS_ASSERT_EQUALS(ms->Pvolume, 108);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 108);
printf("# Trying to save automations\n");
@@ -216,7 +216,7 @@ class MessageTest:public CxxTest::TestSuite
run_realtime();
//Verify automation table is clear
- TS_ASSERT_EQUALS(ms->Pvolume, 108);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 108);
printf("# Loading automation\n");
mw->transmitMsg("/load_xlz", "s", "test-midi-learn.xlz");
@@ -225,7 +225,7 @@ class MessageTest:public CxxTest::TestSuite
run_realtime();
//Verify automation table is restored
- TS_ASSERT_EQUALS(ms->Pvolume, 28);
+ TS_ASSERT_EQUALS(ms->Pkeyshift, 28);
}
void testLfoPaste(void)
diff --git a/src/Tests/guitar-adnote.xmz b/src/Tests/guitar-adnote.xmz
@@ -15,7 +15,7 @@ version-revision="4" ZynAddSubFX-author="Nasca Octavian Paul">
<par name="max_addsynth_voices" value="8" />
</BASE_PARAMETERS>
<MASTER>
-<par name="volume" value="80" />
+<par_real name="volume" value="-6.66667" exact_value="0xC0D55556" />
<par name="key_shift" value="64" />
<par_bool name="nrpn_receive" value="yes" />
<MICROTONAL>