zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

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:
Msrc/Misc/Master.cpp | 46++++++++++++++++++++++++++++------------------
Msrc/Tests/MessageTest.h | 22+++++++++++-----------
Msrc/Tests/guitar-adnote.xmz | 2+-
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>