@@ -30,7 +30,7 @@ endif # EXPERIMENTAL_PLUGINS | |||||
# Flags for ZynAddSubFX | # Flags for ZynAddSubFX | ||||
ifeq ($(HAVE_ZYN_DEPS),true) | ifeq ($(HAVE_ZYN_DEPS),true) | ||||
ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) -Izynaddsubfx -Izynaddsubfx/rtosc | |||||
ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) -DHAVE_ASYNC -Izynaddsubfx -Izynaddsubfx/rtosc | |||||
ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml zlib) | ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml zlib) | ||||
ZYN_LD_FLAGS = $(shell pkg-config --libs liblo) | ZYN_LD_FLAGS = $(shell pkg-config --libs liblo) | ||||
ZYN_LD_FLAGS += -ldl -lpthread | ZYN_LD_FLAGS += -ldl -lpthread | ||||
@@ -5,12 +5,13 @@ | |||||
#include "../Synth/SynthNote.h" | #include "../Synth/SynthNote.h" | ||||
#include <cstring> | #include <cstring> | ||||
#include <cassert> | #include <cassert> | ||||
#include <iostream> | |||||
NotePool::NotePool(void) | NotePool::NotePool(void) | ||||
:needs_cleaning(0) | :needs_cleaning(0) | ||||
{ | { | ||||
memset(ndesc, 0, sizeof(ndesc)); | memset(ndesc, 0, sizeof(ndesc)); | ||||
memset(sdesc, 0, sizeof(ndesc)); | |||||
memset(sdesc, 0, sizeof(sdesc)); | |||||
} | } | ||||
NotePool::activeNotesIter NotePool::activeNotes(NoteDescriptor &n) | NotePool::activeNotesIter NotePool::activeNotes(NoteDescriptor &n) | ||||
{ | { | ||||
@@ -37,19 +38,21 @@ static int getMergeableDescriptor(uint8_t note, uint8_t sendto, bool legato, | |||||
if(ndesc[desc_id].status == Part::KEY_OFF) | if(ndesc[desc_id].status == Part::KEY_OFF) | ||||
break; | break; | ||||
//Out of free descriptors | |||||
if(ndesc[desc_id].status != Part::KEY_OFF) | |||||
return -1; | |||||
if(desc_id != 0) { | if(desc_id != 0) { | ||||
auto &nd = ndesc[desc_id-1]; | auto &nd = ndesc[desc_id-1]; | ||||
if(nd.age == 0 && nd.note == note && nd.sendto == sendto | if(nd.age == 0 && nd.note == note && nd.sendto == sendto | ||||
&& nd.status == Part::KEY_PLAYING && nd.legatoMirror == legato) | && nd.status == Part::KEY_PLAYING && nd.legatoMirror == legato) | ||||
return desc_id-1; | return desc_id-1; | ||||
} | } | ||||
//Out of free descriptors | |||||
if(desc_id >= POLYPHONY || ndesc[desc_id].status != Part::KEY_OFF) { | |||||
return -1; | |||||
} | |||||
return desc_id; | return desc_id; | ||||
} | } | ||||
NotePool::activeDescIter NotePool::activeDesc(void) | NotePool::activeDescIter NotePool::activeDesc(void) | ||||
{ | { | ||||
cleanup(); | cleanup(); | ||||
@@ -76,8 +79,11 @@ void NotePool::insertNote(uint8_t note, uint8_t sendto, SynthDescriptor desc, bo | |||||
//Get first free synth descriptor | //Get first free synth descriptor | ||||
int sdesc_id = 0; | int sdesc_id = 0; | ||||
while(sdesc[sdesc_id].note) | |||||
while(sdesc[sdesc_id].note && sdesc_id < POLYPHONY*EXPECTED_USAGE) | |||||
sdesc_id++; | sdesc_id++; | ||||
assert(sdesc_id < POLYPHONY*EXPECTED_USAGE); | |||||
sdesc[sdesc_id] = desc; | sdesc[sdesc_id] = desc; | ||||
}; | }; | ||||
@@ -92,8 +98,12 @@ void NotePool::upgradeToLegato(void) | |||||
void NotePool::insertLegatoNote(uint8_t note, uint8_t sendto, SynthDescriptor desc) | void NotePool::insertLegatoNote(uint8_t note, uint8_t sendto, SynthDescriptor desc) | ||||
{ | { | ||||
assert(desc.note); | assert(desc.note); | ||||
desc.note = desc.note->cloneLegato(); | |||||
insertNote(note, sendto, desc, true); | |||||
try { | |||||
desc.note = desc.note->cloneLegato(); | |||||
insertNote(note, sendto, desc, true); | |||||
} catch (std::bad_alloc &ba) { | |||||
std::cerr << "failed to insert legato note: " << ba.what() << std::endl; | |||||
} | |||||
}; | }; | ||||
//There should only be one pair of notes which are still playing | //There should only be one pair of notes which are still playing | ||||
@@ -102,7 +112,11 @@ void NotePool::applyLegato(LegatoParams &par) | |||||
for(auto &desc:activeDesc()) { | for(auto &desc:activeDesc()) { | ||||
desc.note = par.midinote; | desc.note = par.midinote; | ||||
for(auto &synth:activeNotes(desc)) | for(auto &synth:activeNotes(desc)) | ||||
synth.note->legatonote(par); | |||||
try { | |||||
synth.note->legatonote(par); | |||||
} catch (std::bad_alloc& ba) { | |||||
std::cerr << "failed to create legato note: " << ba.what() << std::endl; | |||||
} | |||||
} | } | ||||
}; | }; | ||||
@@ -114,6 +128,15 @@ bool NotePool::full(void) const | |||||
return true; | return true; | ||||
} | } | ||||
bool NotePool::synthFull(int sdesc_count) const | |||||
{ | |||||
int actually_free=sizeof(sdesc)/sizeof(sdesc[0]); | |||||
for(const auto &desc:activeDesc()) { | |||||
actually_free -= desc.size; | |||||
} | |||||
return actually_free < sdesc_count; | |||||
} | |||||
//Note that isn't KEY_PLAYING or KEY_RELASED_AND_SUSTAINING | //Note that isn't KEY_PLAYING or KEY_RELASED_AND_SUSTAINING | ||||
bool NotePool::existsRunningNote(void) const | bool NotePool::existsRunningNote(void) const | ||||
{ | { | ||||
@@ -126,7 +149,8 @@ int NotePool::getRunningNotes(void) const | |||||
bool running[256] = {0}; | bool running[256] = {0}; | ||||
for(auto &desc:activeDesc()) { | for(auto &desc:activeDesc()) { | ||||
//printf("note!(%d)\n", desc.note); | //printf("note!(%d)\n", desc.note); | ||||
if(desc.status == Part::KEY_PLAYING) | |||||
if(desc.status == Part::KEY_PLAYING || | |||||
desc.status == Part::KEY_RELEASED_AND_SUSTAINED) | |||||
running[desc.note] = true; | running[desc.note] = true; | ||||
} | } | ||||
@@ -151,7 +175,7 @@ int NotePool::enforceKeyLimit(int limit) const | |||||
//if(oldestnotepos != -1) | //if(oldestnotepos != -1) | ||||
// ReleaseNotePos(oldestnotepos); | // ReleaseNotePos(oldestnotepos); | ||||
//} | //} | ||||
printf("Unimplemented enforceKeyLimit()\n"); | |||||
//printf("Unimplemented enforceKeyLimit()\n"); | |||||
return -1; | return -1; | ||||
} | } | ||||
@@ -94,6 +94,7 @@ class NotePool | |||||
void applyLegato(LegatoParams &par); | void applyLegato(LegatoParams &par); | ||||
bool full(void) const; | bool full(void) const; | ||||
bool synthFull(int sdesc_count) const; | |||||
//Note that isn't KEY_PLAYING or KEY_RELASED_AND_SUSTAINING | //Note that isn't KEY_PLAYING or KEY_RELASED_AND_SUSTAINING | ||||
bool existsRunningNote(void) const; | bool existsRunningNote(void) const; | ||||
@@ -21,6 +21,7 @@ | |||||
*/ | */ | ||||
#include <cmath> | #include <cmath> | ||||
#include <iostream> | |||||
#include "DynamicFilter.h" | #include "DynamicFilter.h" | ||||
#include "../DSP/Filter.h" | #include "../DSP/Filter.h" | ||||
#include "../Misc/Allocator.h" | #include "../Misc/Allocator.h" | ||||
@@ -133,8 +134,18 @@ void DynamicFilter::reinitfilter(void) | |||||
{ | { | ||||
memory.dealloc(filterl); | memory.dealloc(filterl); | ||||
memory.dealloc(filterr); | memory.dealloc(filterr); | ||||
filterl = Filter::generate(memory, filterpars, samplerate, buffersize); | |||||
filterr = Filter::generate(memory, filterpars, samplerate, buffersize); | |||||
try { | |||||
filterl = Filter::generate(memory, filterpars, samplerate, buffersize); | |||||
} catch(std::bad_alloc& ba) { | |||||
std::cerr << "failed to generate left filter for dynamic filter: " << ba.what() << std::endl; | |||||
} | |||||
try { | |||||
filterr = Filter::generate(memory, filterpars, samplerate, buffersize); | |||||
} catch(std::bad_alloc& ba) { | |||||
std::cerr << "failed to generate right filter for dynamic filter: " << ba.what() << std::endl; | |||||
} | |||||
} | } | ||||
void DynamicFilter::setpreset(unsigned char npreset) | void DynamicFilter::setpreset(unsigned char npreset) | ||||
@@ -22,6 +22,7 @@ | |||||
#include <rtosc/ports.h> | #include <rtosc/ports.h> | ||||
#include <rtosc/port-sugar.h> | #include <rtosc/port-sugar.h> | ||||
#include <iostream> | |||||
#include "EffectMgr.h" | #include "EffectMgr.h" | ||||
@@ -178,35 +179,40 @@ void EffectMgr::changeeffectrt(int _nefx, bool avoidSmash) | |||||
memory.dealloc(efx); | memory.dealloc(efx); | ||||
EffectParams pars(memory, insertion, efxoutl, efxoutr, 0, | EffectParams pars(memory, insertion, efxoutl, efxoutr, 0, | ||||
synth.samplerate, synth.buffersize); | synth.samplerate, synth.buffersize); | ||||
switch(nefx) { | |||||
case 1: | |||||
efx = memory.alloc<Reverb>(pars); | |||||
break; | |||||
case 2: | |||||
efx = memory.alloc<Echo>(pars); | |||||
break; | |||||
case 3: | |||||
efx = memory.alloc<Chorus>(pars); | |||||
break; | |||||
case 4: | |||||
efx = memory.alloc<Phaser>(pars); | |||||
break; | |||||
case 5: | |||||
efx = memory.alloc<Alienwah>(pars); | |||||
break; | |||||
case 6: | |||||
efx = memory.alloc<Distorsion>(pars); | |||||
break; | |||||
case 7: | |||||
efx = memory.alloc<EQ>(pars); | |||||
break; | |||||
case 8: | |||||
efx = memory.alloc<DynamicFilter>(pars); | |||||
break; | |||||
//put more effect here | |||||
default: | |||||
efx = NULL; | |||||
break; //no effect (thru) | |||||
try { | |||||
switch (nefx) { | |||||
case 1: | |||||
efx = memory.alloc<Reverb>(pars); | |||||
break; | |||||
case 2: | |||||
efx = memory.alloc<Echo>(pars); | |||||
break; | |||||
case 3: | |||||
efx = memory.alloc<Chorus>(pars); | |||||
break; | |||||
case 4: | |||||
efx = memory.alloc<Phaser>(pars); | |||||
break; | |||||
case 5: | |||||
efx = memory.alloc<Alienwah>(pars); | |||||
break; | |||||
case 6: | |||||
efx = memory.alloc<Distorsion>(pars); | |||||
break; | |||||
case 7: | |||||
efx = memory.alloc<EQ>(pars); | |||||
break; | |||||
case 8: | |||||
efx = memory.alloc<DynamicFilter>(pars); | |||||
break; | |||||
//put more effect here | |||||
default: | |||||
efx = NULL; | |||||
break; //no effect (thru) | |||||
} | |||||
} catch (std::bad_alloc &ba) { | |||||
std::cerr << "failed to change effect " << _nefx << ": " << ba.what() << std::endl; | |||||
return; | |||||
} | } | ||||
if(efx) | if(efx) | ||||
@@ -287,7 +293,11 @@ void EffectMgr::seteffectparrt(int npar, unsigned char value) | |||||
settings[npar] = value; | settings[npar] = value; | ||||
if(!efx) | if(!efx) | ||||
return; | return; | ||||
efx->changepar(npar, value); | |||||
try { | |||||
efx->changepar(npar, value); | |||||
} catch (std::bad_alloc &ba) { | |||||
std::cerr << "failed to change effect parameter " << npar << " to " << value << ": " << ba.what() << std::endl; | |||||
} | |||||
} | } | ||||
//Change a parameter of the current effect | //Change a parameter of the current effect | ||||
@@ -407,55 +417,55 @@ void EffectMgr::paste(EffectMgr &e) | |||||
seteffectparrt(i, e.settings[i]); | seteffectparrt(i, e.settings[i]); | ||||
} | } | ||||
void EffectMgr::add2XML(XMLwrapper *xml) | |||||
void EffectMgr::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addpar("type", geteffect()); | |||||
xml.addpar("type", geteffect()); | |||||
if(!geteffect()) | if(!geteffect()) | ||||
return; | return; | ||||
xml->addpar("preset", preset); | |||||
xml.addpar("preset", preset); | |||||
xml->beginbranch("EFFECT_PARAMETERS"); | |||||
xml.beginbranch("EFFECT_PARAMETERS"); | |||||
for(int n = 0; n < 128; ++n) { | for(int n = 0; n < 128; ++n) { | ||||
int par = geteffectpar(n); | int par = geteffectpar(n); | ||||
if(par == 0) | if(par == 0) | ||||
continue; | continue; | ||||
xml->beginbranch("par_no", n); | |||||
xml->addpar("par", par); | |||||
xml->endbranch(); | |||||
xml.beginbranch("par_no", n); | |||||
xml.addpar("par", par); | |||||
xml.endbranch(); | |||||
} | } | ||||
if(filterpars) { | if(filterpars) { | ||||
xml->beginbranch("FILTER"); | |||||
xml.beginbranch("FILTER"); | |||||
filterpars->add2XML(xml); | filterpars->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
void EffectMgr::getfromXML(XMLwrapper *xml) | |||||
void EffectMgr::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
changeeffect(xml->getpar127("type", geteffect())); | |||||
changeeffect(xml.getpar127("type", geteffect())); | |||||
if(!geteffect()) | if(!geteffect()) | ||||
return; | return; | ||||
preset = xml->getpar127("preset", preset); | |||||
preset = xml.getpar127("preset", preset); | |||||
if(xml->enterbranch("EFFECT_PARAMETERS")) { | |||||
if(xml.enterbranch("EFFECT_PARAMETERS")) { | |||||
for(int n = 0; n < 128; ++n) { | for(int n = 0; n < 128; ++n) { | ||||
seteffectpar(n, 0); //erase effect parameter | seteffectpar(n, 0); //erase effect parameter | ||||
if(xml->enterbranch("par_no", n) == 0) | |||||
if(xml.enterbranch("par_no", n) == 0) | |||||
continue; | continue; | ||||
int par = geteffectpar(n); | int par = geteffectpar(n); | ||||
seteffectpar(n, xml->getpar127("par", par)); | |||||
xml->exitbranch(); | |||||
seteffectpar(n, xml.getpar127("par", par)); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(filterpars) | if(filterpars) | ||||
if(xml->enterbranch("FILTER")) { | |||||
if(xml.enterbranch("FILTER")) { | |||||
filterpars->getfromXML(xml); | filterpars->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
cleanup(); | cleanup(); | ||||
} | } |
@@ -40,9 +40,9 @@ class EffectMgr:public Presets | |||||
~EffectMgr(); | ~EffectMgr(); | ||||
void paste(EffectMgr &e); | void paste(EffectMgr &e); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void defaults(void) REALTIME; | void defaults(void) REALTIME; | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void out(float *smpsl, float *smpsr) REALTIME; | void out(float *smpsl, float *smpsr) REALTIME; | ||||
@@ -1,6 +1,7 @@ | |||||
#pragma once | #pragma once | ||||
#include <cstdlib> | #include <cstdlib> | ||||
#include <utility> | #include <utility> | ||||
#include <new> | |||||
//! Allocator Base class | //! Allocator Base class | ||||
//! subclasses must specify allocation and deallocation | //! subclasses must specify allocation and deallocation | ||||
@@ -14,21 +15,36 @@ class Allocator | |||||
virtual void *alloc_mem(size_t mem_size) = 0; | virtual void *alloc_mem(size_t mem_size) = 0; | ||||
virtual void dealloc_mem(void *memory) = 0; | virtual void dealloc_mem(void *memory) = 0; | ||||
/** | |||||
* High level allocator method, which return a pointer to a class or struct | |||||
* allocated with the specialized subclass strategy | |||||
* @param ts argument(s) for the constructor of the type T | |||||
* @return a non null pointer to a new object of type T | |||||
* @throw std::bad_alloc is no memory could be allocated | |||||
*/ | |||||
template <typename T, typename... Ts> | template <typename T, typename... Ts> | ||||
T *alloc(Ts&&... ts) | T *alloc(Ts&&... ts) | ||||
{ | { | ||||
void *data = alloc_mem(sizeof(T)); | void *data = alloc_mem(sizeof(T)); | ||||
if(!data) | if(!data) | ||||
return nullptr; | |||||
throw std::bad_alloc(); | |||||
return new (data) T(std::forward<Ts>(ts)...); | return new (data) T(std::forward<Ts>(ts)...); | ||||
} | } | ||||
/** | |||||
* High level allocator method, which return a pointer to an array of class or struct | |||||
* allocated with the specialized subclass strategy | |||||
* @param len the array length | |||||
* @param ts argument(s) for the constructor of the type T | |||||
* @return a non null pointer to an array of new object(s) of type T | |||||
* @throw std::bad_alloc is no memory could be allocated | |||||
*/ | |||||
template <typename T, typename... Ts> | template <typename T, typename... Ts> | ||||
T *valloc(size_t len, Ts&&... ts) | T *valloc(size_t len, Ts&&... ts) | ||||
{ | { | ||||
T *data = (T*)alloc_mem(len*sizeof(T)); | T *data = (T*)alloc_mem(len*sizeof(T)); | ||||
if(!data) | if(!data) | ||||
return nullptr; | |||||
throw std::bad_alloc(); | |||||
for(unsigned i=0; i<len; ++i) | for(unsigned i=0; i<len; ++i) | ||||
new ((void*)&data[i]) T(std::forward<Ts>(ts)...); | new ((void*)&data[i]) T(std::forward<Ts>(ts)...); | ||||
@@ -170,15 +170,10 @@ int Bank::savetoslot(unsigned int ninstrument, Part *part) | |||||
snprintf(tmpfilename, | snprintf(tmpfilename, | ||||
maxfilename, | maxfilename, | ||||
"%4d-%s", | |||||
"%04d-%s", | |||||
ninstrument + 1, | ninstrument + 1, | ||||
(char *)part->Pname); | (char *)part->Pname); | ||||
//add the zeroes at the start of filename | |||||
for(int i = 0; i < 4; ++i) | |||||
if(tmpfilename[i] == ' ') | |||||
tmpfilename[i] = '0'; | |||||
string filename = dirname + '/' + legalizeFilename(tmpfilename) + ".xiz"; | string filename = dirname + '/' + legalizeFilename(tmpfilename) + ".xiz"; | ||||
FILE *f = fopen(filename.c_str(), "r"); | FILE *f = fopen(filename.c_str(), "r"); | ||||
@@ -954,193 +954,187 @@ void Master::initialize_rt(void) | |||||
part[i]->initialize_rt(); | part[i]->initialize_rt(); | ||||
} | } | ||||
void Master::add2XML(XMLwrapper *xml) | |||||
void Master::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addpar("volume", Pvolume); | |||||
xml->addpar("key_shift", Pkeyshift); | |||||
xml->addparbool("nrpn_receive", ctl.NRPN.receive); | |||||
xml.addpar("volume", Pvolume); | |||||
xml.addpar("key_shift", Pkeyshift); | |||||
xml.addparbool("nrpn_receive", ctl.NRPN.receive); | |||||
xml->beginbranch("MICROTONAL"); | |||||
xml.beginbranch("MICROTONAL"); | |||||
microtonal.add2XML(xml); | microtonal.add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
for(int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { | for(int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { | ||||
xml->beginbranch("PART", npart); | |||||
xml.beginbranch("PART", npart); | |||||
part[npart]->add2XML(xml); | part[npart]->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->beginbranch("SYSTEM_EFFECTS"); | |||||
xml.beginbranch("SYSTEM_EFFECTS"); | |||||
for(int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { | for(int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { | ||||
xml->beginbranch("SYSTEM_EFFECT", nefx); | |||||
xml->beginbranch("EFFECT"); | |||||
xml.beginbranch("SYSTEM_EFFECT", nefx); | |||||
xml.beginbranch("EFFECT"); | |||||
sysefx[nefx]->add2XML(xml); | sysefx[nefx]->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
for(int pefx = 0; pefx < NUM_MIDI_PARTS; ++pefx) { | for(int pefx = 0; pefx < NUM_MIDI_PARTS; ++pefx) { | ||||
xml->beginbranch("VOLUME", pefx); | |||||
xml->addpar("vol", Psysefxvol[nefx][pefx]); | |||||
xml->endbranch(); | |||||
xml.beginbranch("VOLUME", pefx); | |||||
xml.addpar("vol", Psysefxvol[nefx][pefx]); | |||||
xml.endbranch(); | |||||
} | } | ||||
for(int tonefx = nefx + 1; tonefx < NUM_SYS_EFX; ++tonefx) { | for(int tonefx = nefx + 1; tonefx < NUM_SYS_EFX; ++tonefx) { | ||||
xml->beginbranch("SENDTO", tonefx); | |||||
xml->addpar("send_vol", Psysefxsend[nefx][tonefx]); | |||||
xml->endbranch(); | |||||
xml.beginbranch("SENDTO", tonefx); | |||||
xml.addpar("send_vol", Psysefxsend[nefx][tonefx]); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("INSERTION_EFFECTS"); | |||||
xml.beginbranch("INSERTION_EFFECTS"); | |||||
for(int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { | for(int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { | ||||
xml->beginbranch("INSERTION_EFFECT", nefx); | |||||
xml->addpar("part", Pinsparts[nefx]); | |||||
xml.beginbranch("INSERTION_EFFECT", nefx); | |||||
xml.addpar("part", Pinsparts[nefx]); | |||||
xml->beginbranch("EFFECT"); | |||||
xml.beginbranch("EFFECT"); | |||||
insefx[nefx]->add2XML(xml); | insefx[nefx]->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
int Master::getalldata(char **data) | int Master::getalldata(char **data) | ||||
{ | { | ||||
XMLwrapper *xml = new XMLwrapper(); | |||||
XMLwrapper xml; | |||||
xml->beginbranch("MASTER"); | |||||
xml.beginbranch("MASTER"); | |||||
add2XML(xml); | add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
*data = xml->getXMLdata(); | |||||
delete (xml); | |||||
*data = xml.getXMLdata(); | |||||
return strlen(*data) + 1; | return strlen(*data) + 1; | ||||
} | } | ||||
void Master::putalldata(const char *data) | void Master::putalldata(const char *data) | ||||
{ | { | ||||
XMLwrapper *xml = new XMLwrapper(); | |||||
if(!xml->putXMLdata(data)) { | |||||
delete (xml); | |||||
XMLwrapper xml; | |||||
if(!xml.putXMLdata(data)) { | |||||
return; | return; | ||||
} | } | ||||
if(xml->enterbranch("MASTER") == 0) | |||||
if(xml.enterbranch("MASTER") == 0) | |||||
return; | return; | ||||
getfromXML(xml); | getfromXML(xml); | ||||
xml->exitbranch(); | |||||
delete (xml); | |||||
xml.exitbranch(); | |||||
} | } | ||||
int Master::saveXML(const char *filename) | int Master::saveXML(const char *filename) | ||||
{ | { | ||||
XMLwrapper *xml = new XMLwrapper(); | |||||
XMLwrapper xml; | |||||
xml->beginbranch("MASTER"); | |||||
xml.beginbranch("MASTER"); | |||||
add2XML(xml); | add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
int result = xml->saveXMLfile(filename, gzip_compression); | |||||
delete (xml); | |||||
return result; | |||||
return xml.saveXMLfile(filename, gzip_compression); | |||||
} | } | ||||
int Master::loadXML(const char *filename) | int Master::loadXML(const char *filename) | ||||
{ | { | ||||
XMLwrapper *xml = new XMLwrapper(); | |||||
if(xml->loadXMLfile(filename) < 0) { | |||||
delete (xml); | |||||
XMLwrapper xml; | |||||
if(xml.loadXMLfile(filename) < 0) { | |||||
return -1; | return -1; | ||||
} | } | ||||
if(xml->enterbranch("MASTER") == 0) | |||||
if(xml.enterbranch("MASTER") == 0) | |||||
return -10; | return -10; | ||||
getfromXML(xml); | getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
delete (xml); | |||||
initialize_rt(); | initialize_rt(); | ||||
return 0; | return 0; | ||||
} | } | ||||
void Master::getfromXML(XMLwrapper *xml) | |||||
void Master::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
setPvolume(xml->getpar127("volume", Pvolume)); | |||||
setPkeyshift(xml->getpar127("key_shift", Pkeyshift)); | |||||
ctl.NRPN.receive = xml->getparbool("nrpn_receive", ctl.NRPN.receive); | |||||
setPvolume(xml.getpar127("volume", Pvolume)); | |||||
setPkeyshift(xml.getpar127("key_shift", Pkeyshift)); | |||||
ctl.NRPN.receive = xml.getparbool("nrpn_receive", ctl.NRPN.receive); | |||||
part[0]->Penabled = 0; | part[0]->Penabled = 0; | ||||
for(int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { | for(int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { | ||||
if(xml->enterbranch("PART", npart) == 0) | |||||
if(xml.enterbranch("PART", npart) == 0) | |||||
continue; | continue; | ||||
part[npart]->getfromXML(xml); | part[npart]->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("MICROTONAL")) { | |||||
if(xml.enterbranch("MICROTONAL")) { | |||||
microtonal.getfromXML(xml); | microtonal.getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
sysefx[0]->changeeffect(0); | sysefx[0]->changeeffect(0); | ||||
if(xml->enterbranch("SYSTEM_EFFECTS")) { | |||||
if(xml.enterbranch("SYSTEM_EFFECTS")) { | |||||
for(int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { | for(int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { | ||||
if(xml->enterbranch("SYSTEM_EFFECT", nefx) == 0) | |||||
if(xml.enterbranch("SYSTEM_EFFECT", nefx) == 0) | |||||
continue; | continue; | ||||
if(xml->enterbranch("EFFECT")) { | |||||
if(xml.enterbranch("EFFECT")) { | |||||
sysefx[nefx]->getfromXML(xml); | sysefx[nefx]->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
for(int partefx = 0; partefx < NUM_MIDI_PARTS; ++partefx) { | for(int partefx = 0; partefx < NUM_MIDI_PARTS; ++partefx) { | ||||
if(xml->enterbranch("VOLUME", partefx) == 0) | |||||
if(xml.enterbranch("VOLUME", partefx) == 0) | |||||
continue; | continue; | ||||
setPsysefxvol(partefx, nefx, | setPsysefxvol(partefx, nefx, | ||||
xml->getpar127("vol", Psysefxvol[partefx][nefx])); | |||||
xml->exitbranch(); | |||||
xml.getpar127("vol", Psysefxvol[partefx][nefx])); | |||||
xml.exitbranch(); | |||||
} | } | ||||
for(int tonefx = nefx + 1; tonefx < NUM_SYS_EFX; ++tonefx) { | for(int tonefx = nefx + 1; tonefx < NUM_SYS_EFX; ++tonefx) { | ||||
if(xml->enterbranch("SENDTO", tonefx) == 0) | |||||
if(xml.enterbranch("SENDTO", tonefx) == 0) | |||||
continue; | continue; | ||||
setPsysefxsend(nefx, tonefx, | setPsysefxsend(nefx, tonefx, | ||||
xml->getpar127("send_vol", | |||||
xml.getpar127("send_vol", | |||||
Psysefxsend[nefx][tonefx])); | Psysefxsend[nefx][tonefx])); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("INSERTION_EFFECTS")) { | |||||
if(xml.enterbranch("INSERTION_EFFECTS")) { | |||||
for(int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { | for(int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { | ||||
if(xml->enterbranch("INSERTION_EFFECT", nefx) == 0) | |||||
if(xml.enterbranch("INSERTION_EFFECT", nefx) == 0) | |||||
continue; | continue; | ||||
Pinsparts[nefx] = xml->getpar("part", | |||||
Pinsparts[nefx] = xml.getpar("part", | |||||
Pinsparts[nefx], | Pinsparts[nefx], | ||||
-2, | -2, | ||||
NUM_MIDI_PARTS); | NUM_MIDI_PARTS); | ||||
if(xml->enterbranch("EFFECT")) { | |||||
if(xml.enterbranch("EFFECT")) { | |||||
insefx[nefx]->getfromXML(xml); | insefx[nefx]->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } |
@@ -63,7 +63,7 @@ class Master | |||||
int saveXML(const char *filename); | int saveXML(const char *filename); | ||||
/**This adds the parameters to the XML data*/ | /**This adds the parameters to the XML data*/ | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void defaults(); | void defaults(); | ||||
@@ -78,7 +78,7 @@ class Master | |||||
//This must be called prior-to/at-the-time-of RT insertion | //This must be called prior-to/at-the-time-of RT insertion | ||||
void initialize_rt(void) REALTIME; | void initialize_rt(void) REALTIME; | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
/**get all data to a newly allocated array (used for plugin) | /**get all data to a newly allocated array (used for plugin) | ||||
* @return the datasize*/ | * @return the datasize*/ | ||||
@@ -566,87 +566,87 @@ int Microtonal::loadkbm(const char *filename) | |||||
void Microtonal::add2XML(XMLwrapper *xml) const | |||||
void Microtonal::add2XML(XMLwrapper& xml) const | |||||
{ | { | ||||
xml->addparstr("name", (char *) Pname); | |||||
xml->addparstr("comment", (char *) Pcomment); | |||||
xml.addparstr("name", (char *) Pname); | |||||
xml.addparstr("comment", (char *) Pcomment); | |||||
xml->addparbool("invert_up_down", Pinvertupdown); | |||||
xml->addpar("invert_up_down_center", Pinvertupdowncenter); | |||||
xml.addparbool("invert_up_down", Pinvertupdown); | |||||
xml.addpar("invert_up_down_center", Pinvertupdowncenter); | |||||
xml->addparbool("enabled", Penabled); | |||||
xml->addpar("global_fine_detune", Pglobalfinedetune); | |||||
xml.addparbool("enabled", Penabled); | |||||
xml.addpar("global_fine_detune", Pglobalfinedetune); | |||||
xml->addpar("a_note", PAnote); | |||||
xml->addparreal("a_freq", PAfreq); | |||||
xml.addpar("a_note", PAnote); | |||||
xml.addparreal("a_freq", PAfreq); | |||||
if((Penabled == 0) && (xml->minimal)) | |||||
if((Penabled == 0) && (xml.minimal)) | |||||
return; | return; | ||||
xml->beginbranch("SCALE"); | |||||
xml->addpar("scale_shift", Pscaleshift); | |||||
xml->addpar("first_key", Pfirstkey); | |||||
xml->addpar("last_key", Plastkey); | |||||
xml->addpar("middle_note", Pmiddlenote); | |||||
xml.beginbranch("SCALE"); | |||||
xml.addpar("scale_shift", Pscaleshift); | |||||
xml.addpar("first_key", Pfirstkey); | |||||
xml.addpar("last_key", Plastkey); | |||||
xml.addpar("middle_note", Pmiddlenote); | |||||
xml->beginbranch("OCTAVE"); | |||||
xml->addpar("octave_size", octavesize); | |||||
xml.beginbranch("OCTAVE"); | |||||
xml.addpar("octave_size", octavesize); | |||||
for(int i = 0; i < octavesize; ++i) { | for(int i = 0; i < octavesize; ++i) { | ||||
xml->beginbranch("DEGREE", i); | |||||
xml.beginbranch("DEGREE", i); | |||||
if(octave[i].type == 1) | if(octave[i].type == 1) | ||||
xml->addparreal("cents", octave[i].tuning); | |||||
xml.addparreal("cents", octave[i].tuning); | |||||
; | ; | ||||
if(octave[i].type == 2) { | if(octave[i].type == 2) { | ||||
xml->addpar("numerator", octave[i].x1); | |||||
xml->addpar("denominator", octave[i].x2); | |||||
xml.addpar("numerator", octave[i].x1); | |||||
xml.addpar("denominator", octave[i].x2); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("KEYBOARD_MAPPING"); | |||||
xml->addpar("map_size", Pmapsize); | |||||
xml->addpar("mapping_enabled", Pmappingenabled); | |||||
xml.beginbranch("KEYBOARD_MAPPING"); | |||||
xml.addpar("map_size", Pmapsize); | |||||
xml.addpar("mapping_enabled", Pmappingenabled); | |||||
for(int i = 0; i < Pmapsize; ++i) { | for(int i = 0; i < Pmapsize; ++i) { | ||||
xml->beginbranch("KEYMAP", i); | |||||
xml->addpar("degree", Pmapping[i]); | |||||
xml->endbranch(); | |||||
xml.beginbranch("KEYMAP", i); | |||||
xml.addpar("degree", Pmapping[i]); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
void Microtonal::getfromXML(XMLwrapper *xml) | |||||
void Microtonal::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->getparstr("name", (char *) Pname, MICROTONAL_MAX_NAME_LEN); | |||||
xml->getparstr("comment", (char *) Pcomment, MICROTONAL_MAX_NAME_LEN); | |||||
xml.getparstr("name", (char *) Pname, MICROTONAL_MAX_NAME_LEN); | |||||
xml.getparstr("comment", (char *) Pcomment, MICROTONAL_MAX_NAME_LEN); | |||||
Pinvertupdown = xml->getparbool("invert_up_down", Pinvertupdown); | |||||
Pinvertupdowncenter = xml->getpar127("invert_up_down_center", | |||||
Pinvertupdown = xml.getparbool("invert_up_down", Pinvertupdown); | |||||
Pinvertupdowncenter = xml.getpar127("invert_up_down_center", | |||||
Pinvertupdowncenter); | Pinvertupdowncenter); | ||||
Penabled = xml->getparbool("enabled", Penabled); | |||||
Pglobalfinedetune = xml->getpar127("global_fine_detune", Pglobalfinedetune); | |||||
Penabled = xml.getparbool("enabled", Penabled); | |||||
Pglobalfinedetune = xml.getpar127("global_fine_detune", Pglobalfinedetune); | |||||
PAnote = xml->getpar127("a_note", PAnote); | |||||
PAfreq = xml->getparreal("a_freq", PAfreq, 1.0f, 10000.0f); | |||||
PAnote = xml.getpar127("a_note", PAnote); | |||||
PAfreq = xml.getparreal("a_freq", PAfreq, 1.0f, 10000.0f); | |||||
if(xml->enterbranch("SCALE")) { | |||||
Pscaleshift = xml->getpar127("scale_shift", Pscaleshift); | |||||
Pfirstkey = xml->getpar127("first_key", Pfirstkey); | |||||
Plastkey = xml->getpar127("last_key", Plastkey); | |||||
Pmiddlenote = xml->getpar127("middle_note", Pmiddlenote); | |||||
if(xml.enterbranch("SCALE")) { | |||||
Pscaleshift = xml.getpar127("scale_shift", Pscaleshift); | |||||
Pfirstkey = xml.getpar127("first_key", Pfirstkey); | |||||
Plastkey = xml.getpar127("last_key", Plastkey); | |||||
Pmiddlenote = xml.getpar127("middle_note", Pmiddlenote); | |||||
if(xml->enterbranch("OCTAVE")) { | |||||
octavesize = xml->getpar127("octave_size", octavesize); | |||||
if(xml.enterbranch("OCTAVE")) { | |||||
octavesize = xml.getpar127("octave_size", octavesize); | |||||
for(int i = 0; i < octavesize; ++i) { | for(int i = 0; i < octavesize; ++i) { | ||||
if(xml->enterbranch("DEGREE", i) == 0) | |||||
if(xml.enterbranch("DEGREE", i) == 0) | |||||
continue; | continue; | ||||
octave[i].x2 = 0; | octave[i].x2 = 0; | ||||
octave[i].tuning = xml->getparreal("cents", octave[i].tuning); | |||||
octave[i].x1 = xml->getpar127("numerator", octave[i].x1); | |||||
octave[i].x2 = xml->getpar127("denominator", octave[i].x2); | |||||
octave[i].tuning = xml.getparreal("cents", octave[i].tuning); | |||||
octave[i].x1 = xml.getpar127("numerator", octave[i].x1); | |||||
octave[i].x2 = xml.getpar127("denominator", octave[i].x2); | |||||
if(octave[i].x2 != 0) | if(octave[i].x2 != 0) | ||||
octave[i].type = 2; | octave[i].type = 2; | ||||
@@ -659,23 +659,23 @@ void Microtonal::getfromXML(XMLwrapper *xml) | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("KEYBOARD_MAPPING")) { | |||||
Pmapsize = xml->getpar127("map_size", Pmapsize); | |||||
Pmappingenabled = xml->getpar127("mapping_enabled", Pmappingenabled); | |||||
if(xml.enterbranch("KEYBOARD_MAPPING")) { | |||||
Pmapsize = xml.getpar127("map_size", Pmapsize); | |||||
Pmappingenabled = xml.getpar127("mapping_enabled", Pmappingenabled); | |||||
for(int i = 0; i < Pmapsize; ++i) { | for(int i = 0; i < Pmapsize; ++i) { | ||||
if(xml->enterbranch("KEYMAP", i) == 0) | |||||
if(xml.enterbranch("KEYMAP", i) == 0) | |||||
continue; | continue; | ||||
Pmapping[i] = xml->getpar127("degree", Pmapping[i]); | |||||
xml->exitbranch(); | |||||
Pmapping[i] = xml.getpar127("degree", Pmapping[i]); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } | ||||
@@ -683,30 +683,26 @@ void Microtonal::getfromXML(XMLwrapper *xml) | |||||
int Microtonal::saveXML(const char *filename) const | int Microtonal::saveXML(const char *filename) const | ||||
{ | { | ||||
XMLwrapper *xml = new XMLwrapper(); | |||||
XMLwrapper xml; | |||||
xml->beginbranch("MICROTONAL"); | |||||
xml.beginbranch("MICROTONAL"); | |||||
add2XML(xml); | add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
int result = xml->saveXMLfile(filename, gzip_compression); | |||||
delete (xml); | |||||
return result; | |||||
return xml.saveXMLfile(filename, gzip_compression); | |||||
} | } | ||||
int Microtonal::loadXML(const char *filename) | int Microtonal::loadXML(const char *filename) | ||||
{ | { | ||||
XMLwrapper *xml = new XMLwrapper(); | |||||
if(xml->loadXMLfile(filename) < 0) { | |||||
delete (xml); | |||||
XMLwrapper xml; | |||||
if(xml.loadXMLfile(filename) < 0) { | |||||
return -1; | return -1; | ||||
} | } | ||||
if(xml->enterbranch("MICROTONAL") == 0) | |||||
if(xml.enterbranch("MICROTONAL") == 0) | |||||
return -10; | return -10; | ||||
getfromXML(xml); | getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
delete (xml); | |||||
return 0; | return 0; | ||||
} | } |
@@ -105,8 +105,8 @@ class Microtonal | |||||
/**Comment about the tuning*/ | /**Comment about the tuning*/ | ||||
char Pcomment[MICROTONAL_MAX_NAME_LEN]; | char Pcomment[MICROTONAL_MAX_NAME_LEN]; | ||||
void add2XML(XMLwrapper *xml) const; | |||||
void getfromXML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml) const; | |||||
void getfromXML(XMLwrapper& xml); | |||||
int saveXML(const char *filename) const; | int saveXML(const char *filename) const; | ||||
int loadXML(const char *filename); | int loadXML(const char *filename); | ||||
@@ -4,6 +4,7 @@ | |||||
#include <cstdio> | #include <cstdio> | ||||
#include <cstdlib> | #include <cstdlib> | ||||
#include <fstream> | #include <fstream> | ||||
#include <iostream> | |||||
#include <rtosc/undo-history.h> | #include <rtosc/undo-history.h> | ||||
#include <rtosc/thread-link.h> | #include <rtosc/thread-link.h> | ||||
@@ -500,6 +501,7 @@ public: | |||||
config->cfg.GzipCompression, | config->cfg.GzipCompression, | ||||
config->cfg.Interpolation, | config->cfg.Interpolation, | ||||
&master->microtonal, master->fft); | &master->microtonal, master->fft); | ||||
if(p->loadXMLinstrument(filename)) | if(p->loadXMLinstrument(filename)) | ||||
fprintf(stderr, "Warning: failed to load part<%s>!\n", filename); | fprintf(stderr, "Warning: failed to load part<%s>!\n", filename); | ||||
@@ -524,19 +526,20 @@ public: | |||||
{ | { | ||||
if(npart == -1) | if(npart == -1) | ||||
return; | return; | ||||
Part *p = new Part(*master->memory, synth, | Part *p = new Part(*master->memory, synth, | ||||
master->time, | |||||
config->cfg.GzipCompression, | |||||
config->cfg.Interpolation, | |||||
&master->microtonal, master->fft); | |||||
master->time, | |||||
config->cfg.GzipCompression, | |||||
config->cfg.Interpolation, | |||||
&master->microtonal, master->fft); | |||||
p->applyparameters(); | p->applyparameters(); | ||||
obj_store.extractPart(p, npart); | obj_store.extractPart(p, npart); | ||||
kits.extractPart(p, npart); | kits.extractPart(p, npart); | ||||
//Give it to the backend and wait for the old part to return for | //Give it to the backend and wait for the old part to return for | ||||
//deallocation | //deallocation | ||||
parent->transmitMsg("/load-part", "ib", npart, sizeof(Part*), &p); | |||||
GUI::raiseUi(ui, "/damage", "s", ("/part"+to_s(npart)+"/").c_str()); | |||||
parent->transmitMsg("/load-part", "ib", npart, sizeof(Part *), &p); | |||||
GUI::raiseUi(ui, "/damage", "s", ("/part" + to_s(npart) + "/").c_str()); | |||||
} | } | ||||
//Well, you don't get much crazier than changing out all of your RT | //Well, you don't get much crazier than changing out all of your RT | ||||
@@ -1058,7 +1061,7 @@ static rtosc::Ports middlewareReplyPorts = { | |||||
void *ptr = *(void**)rtosc_argument(msg, 1).b.data; | void *ptr = *(void**)rtosc_argument(msg, 1).b.data; | ||||
deallocate(type, ptr); | deallocate(type, ptr); | ||||
rEnd}, | rEnd}, | ||||
{"request_memory:", 0, 0, | |||||
{"request-memory:", 0, 0, | |||||
rBegin; | rBegin; | ||||
//Generate out more memory for the RT memory pool | //Generate out more memory for the RT memory pool | ||||
//5MBi chunk | //5MBi chunk | ||||
@@ -43,6 +43,7 @@ | |||||
#include <rtosc/ports.h> | #include <rtosc/ports.h> | ||||
#include <rtosc/port-sugar.h> | #include <rtosc/port-sugar.h> | ||||
#include <iostream> | |||||
using rtosc::Ports; | using rtosc::Ports; | ||||
using rtosc::RtData; | using rtosc::RtData; | ||||
@@ -376,7 +377,7 @@ Part::~Part() | |||||
} | } | ||||
} | } | ||||
void assert_kit_sanity(const Part::Kit *kits) | |||||
static void assert_kit_sanity(const Part::Kit *kits) | |||||
{ | { | ||||
for(int i=0; i<NUM_KIT_ITEMS; ++i) { | for(int i=0; i<NUM_KIT_ITEMS; ++i) { | ||||
//an enabled kit must have a corresponding parameter object | //an enabled kit must have a corresponding parameter object | ||||
@@ -386,10 +387,33 @@ void assert_kit_sanity(const Part::Kit *kits) | |||||
} | } | ||||
} | } | ||||
static int kit_usage(const Part::Kit *kits, int note, int mode) | |||||
{ | |||||
const bool non_kit = mode == 0; | |||||
const bool singl_kit = mode == 2; | |||||
int synth_usage = 0; | |||||
for(uint8_t i = 0; i < NUM_KIT_ITEMS; ++i) { | |||||
const auto &item = kits[i]; | |||||
if(!non_kit && !item.validNote(note)) | |||||
continue; | |||||
synth_usage += item.Padenabled; | |||||
synth_usage += item.Psubenabled; | |||||
synth_usage += item.Ppadenabled; | |||||
//Partial Kit Use | |||||
if(non_kit || (singl_kit && item.active())) | |||||
break; | |||||
} | |||||
return synth_usage; | |||||
} | |||||
/* | /* | ||||
* Note On Messages | * Note On Messages | ||||
*/ | */ | ||||
void Part::NoteOn(unsigned char note, | |||||
bool Part::NoteOn(unsigned char note, | |||||
unsigned char velocity, | unsigned char velocity, | ||||
int masterkeyshift) | int masterkeyshift) | ||||
{ | { | ||||
@@ -398,8 +422,9 @@ void Part::NoteOn(unsigned char note, | |||||
const bool doingLegato = isRunningNote && isLegatoMode() && | const bool doingLegato = isRunningNote && isLegatoMode() && | ||||
lastlegatomodevalid; | lastlegatomodevalid; | ||||
if(!Pnoteon || !inRange(note, Pminkey, Pmaxkey) || notePool.full()) | |||||
return; | |||||
if(!Pnoteon || !inRange(note, Pminkey, Pmaxkey) || notePool.full() || | |||||
notePool.synthFull(kit_usage(kit, note, Pkitmode))) | |||||
return false; | |||||
verifyKeyMode(); | verifyKeyMode(); | ||||
assert_kit_sanity(kit); | assert_kit_sanity(kit); | ||||
@@ -426,7 +451,7 @@ void Part::NoteOn(unsigned char note, | |||||
const float notebasefreq = getBaseFreq(note, keyshift); | const float notebasefreq = getBaseFreq(note, keyshift); | ||||
if(notebasefreq < 0) | if(notebasefreq < 0) | ||||
return; | |||||
return false; | |||||
//Portamento | //Portamento | ||||
lastnote = note; | lastnote = note; | ||||
@@ -447,7 +472,7 @@ void Part::NoteOn(unsigned char note, | |||||
if(doingLegato) { | if(doingLegato) { | ||||
LegatoParams pars = {notebasefreq, vel, portamento, note, true}; | LegatoParams pars = {notebasefreq, vel, portamento, note, true}; | ||||
notePool.applyLegato(pars); | notePool.applyLegato(pars); | ||||
return; | |||||
return true; | |||||
} | } | ||||
//Create New Notes | //Create New Notes | ||||
@@ -460,15 +485,19 @@ void Part::NoteOn(unsigned char note, | |||||
portamento, note, false}; | portamento, note, false}; | ||||
const int sendto = Pkitmode ? item.sendto() : 0; | const int sendto = Pkitmode ? item.sendto() : 0; | ||||
if(item.Padenabled) | |||||
notePool.insertNote(note, sendto, | |||||
{memory.alloc<ADnote>(kit[i].adpars, pars), 0, i}); | |||||
if(item.Psubenabled) | |||||
notePool.insertNote(note, sendto, | |||||
{memory.alloc<SUBnote>(kit[i].subpars, pars), 1, i}); | |||||
if(item.Ppadenabled) | |||||
notePool.insertNote(note, sendto, | |||||
{memory.alloc<PADnote>(kit[i].padpars, pars, interpolation), 2, i}); | |||||
try { | |||||
if(item.Padenabled) | |||||
notePool.insertNote(note, sendto, | |||||
{memory.alloc<ADnote>(kit[i].adpars, pars), 0, i}); | |||||
if(item.Psubenabled) | |||||
notePool.insertNote(note, sendto, | |||||
{memory.alloc<SUBnote>(kit[i].subpars, pars), 1, i}); | |||||
if(item.Ppadenabled) | |||||
notePool.insertNote(note, sendto, | |||||
{memory.alloc<PADnote>(kit[i].padpars, pars, interpolation), 2, i}); | |||||
} catch (std::bad_alloc & ba) { | |||||
std::cerr << "dropped new note: " << ba.what() << std::endl; | |||||
} | |||||
//Partial Kit Use | //Partial Kit Use | ||||
if(isNonKit() || (isSingleKit() && item.active())) | if(isNonKit() || (isSingleKit() && item.active())) | ||||
@@ -480,6 +509,7 @@ void Part::NoteOn(unsigned char note, | |||||
//Enforce the key limit | //Enforce the key limit | ||||
setkeylimit(Pkeylimit); | setkeylimit(Pkeylimit); | ||||
return true; | |||||
} | } | ||||
/* | /* | ||||
@@ -823,102 +853,102 @@ void Part::setkititemstatus(unsigned kititem, bool Penabled_) | |||||
} | } | ||||
} | } | ||||
void Part::add2XMLinstrument(XMLwrapper *xml) | |||||
void Part::add2XMLinstrument(XMLwrapper& xml) | |||||
{ | { | ||||
xml->beginbranch("INFO"); | |||||
xml->addparstr("name", (char *)Pname); | |||||
xml->addparstr("author", (char *)info.Pauthor); | |||||
xml->addparstr("comments", (char *)info.Pcomments); | |||||
xml->addpar("type", info.Ptype); | |||||
xml->endbranch(); | |||||
xml.beginbranch("INFO"); | |||||
xml.addparstr("name", (char *)Pname); | |||||
xml.addparstr("author", (char *)info.Pauthor); | |||||
xml.addparstr("comments", (char *)info.Pcomments); | |||||
xml.addpar("type", info.Ptype); | |||||
xml.endbranch(); | |||||
xml->beginbranch("INSTRUMENT_KIT"); | |||||
xml->addpar("kit_mode", Pkitmode); | |||||
xml->addparbool("drum_mode", Pdrummode); | |||||
xml.beginbranch("INSTRUMENT_KIT"); | |||||
xml.addpar("kit_mode", Pkitmode); | |||||
xml.addparbool("drum_mode", Pdrummode); | |||||
for(int i = 0; i < NUM_KIT_ITEMS; ++i) { | for(int i = 0; i < NUM_KIT_ITEMS; ++i) { | ||||
xml->beginbranch("INSTRUMENT_KIT_ITEM", i); | |||||
xml->addparbool("enabled", kit[i].Penabled); | |||||
xml.beginbranch("INSTRUMENT_KIT_ITEM", i); | |||||
xml.addparbool("enabled", kit[i].Penabled); | |||||
if(kit[i].Penabled != 0) { | if(kit[i].Penabled != 0) { | ||||
xml->addparstr("name", (char *)kit[i].Pname); | |||||
xml.addparstr("name", (char *)kit[i].Pname); | |||||
xml->addparbool("muted", kit[i].Pmuted); | |||||
xml->addpar("min_key", kit[i].Pminkey); | |||||
xml->addpar("max_key", kit[i].Pmaxkey); | |||||
xml.addparbool("muted", kit[i].Pmuted); | |||||
xml.addpar("min_key", kit[i].Pminkey); | |||||
xml.addpar("max_key", kit[i].Pmaxkey); | |||||
xml->addpar("send_to_instrument_effect", kit[i].Psendtoparteffect); | |||||
xml.addpar("send_to_instrument_effect", kit[i].Psendtoparteffect); | |||||
xml->addparbool("add_enabled", kit[i].Padenabled); | |||||
xml.addparbool("add_enabled", kit[i].Padenabled); | |||||
if(kit[i].Padenabled && kit[i].adpars) { | if(kit[i].Padenabled && kit[i].adpars) { | ||||
xml->beginbranch("ADD_SYNTH_PARAMETERS"); | |||||
xml.beginbranch("ADD_SYNTH_PARAMETERS"); | |||||
kit[i].adpars->add2XML(xml); | kit[i].adpars->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->addparbool("sub_enabled", kit[i].Psubenabled); | |||||
xml.addparbool("sub_enabled", kit[i].Psubenabled); | |||||
if(kit[i].Psubenabled && kit[i].subpars) { | if(kit[i].Psubenabled && kit[i].subpars) { | ||||
xml->beginbranch("SUB_SYNTH_PARAMETERS"); | |||||
xml.beginbranch("SUB_SYNTH_PARAMETERS"); | |||||
kit[i].subpars->add2XML(xml); | kit[i].subpars->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->addparbool("pad_enabled", kit[i].Ppadenabled); | |||||
xml.addparbool("pad_enabled", kit[i].Ppadenabled); | |||||
if(kit[i].Ppadenabled && kit[i].padpars) { | if(kit[i].Ppadenabled && kit[i].padpars) { | ||||
xml->beginbranch("PAD_SYNTH_PARAMETERS"); | |||||
xml.beginbranch("PAD_SYNTH_PARAMETERS"); | |||||
kit[i].padpars->add2XML(xml); | kit[i].padpars->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("INSTRUMENT_EFFECTS"); | |||||
xml.beginbranch("INSTRUMENT_EFFECTS"); | |||||
for(int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { | for(int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { | ||||
xml->beginbranch("INSTRUMENT_EFFECT", nefx); | |||||
xml->beginbranch("EFFECT"); | |||||
xml.beginbranch("INSTRUMENT_EFFECT", nefx); | |||||
xml.beginbranch("EFFECT"); | |||||
partefx[nefx]->add2XML(xml); | partefx[nefx]->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->addpar("route", Pefxroute[nefx]); | |||||
xml.addpar("route", Pefxroute[nefx]); | |||||
partefx[nefx]->setdryonly(Pefxroute[nefx] == 2); | partefx[nefx]->setdryonly(Pefxroute[nefx] == 2); | ||||
xml->addparbool("bypass", Pefxbypass[nefx]); | |||||
xml->endbranch(); | |||||
xml.addparbool("bypass", Pefxbypass[nefx]); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
void Part::add2XML(XMLwrapper *xml) | |||||
void Part::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
//parameters | //parameters | ||||
xml->addparbool("enabled", Penabled); | |||||
if((Penabled == 0) && (xml->minimal)) | |||||
xml.addparbool("enabled", Penabled); | |||||
if((Penabled == 0) && (xml.minimal)) | |||||
return; | return; | ||||
xml->addpar("volume", Pvolume); | |||||
xml->addpar("panning", Ppanning); | |||||
xml.addpar("volume", Pvolume); | |||||
xml.addpar("panning", Ppanning); | |||||
xml->addpar("min_key", Pminkey); | |||||
xml->addpar("max_key", Pmaxkey); | |||||
xml->addpar("key_shift", Pkeyshift); | |||||
xml->addpar("rcv_chn", Prcvchn); | |||||
xml.addpar("min_key", Pminkey); | |||||
xml.addpar("max_key", Pmaxkey); | |||||
xml.addpar("key_shift", Pkeyshift); | |||||
xml.addpar("rcv_chn", Prcvchn); | |||||
xml->addpar("velocity_sensing", Pvelsns); | |||||
xml->addpar("velocity_offset", Pveloffs); | |||||
xml.addpar("velocity_sensing", Pvelsns); | |||||
xml.addpar("velocity_offset", Pveloffs); | |||||
xml->addparbool("note_on", Pnoteon); | |||||
xml->addparbool("poly_mode", Ppolymode); | |||||
xml->addpar("legato_mode", Plegatomode); | |||||
xml->addpar("key_limit", Pkeylimit); | |||||
xml.addparbool("note_on", Pnoteon); | |||||
xml.addparbool("poly_mode", Ppolymode); | |||||
xml.addpar("legato_mode", Plegatomode); | |||||
xml.addpar("key_limit", Pkeylimit); | |||||
xml->beginbranch("INSTRUMENT"); | |||||
xml.beginbranch("INSTRUMENT"); | |||||
add2XMLinstrument(xml); | add2XMLinstrument(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("CONTROLLER"); | |||||
xml.beginbranch("CONTROLLER"); | |||||
ctl.add2XML(xml); | ctl.add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
int Part::saveXML(const char *filename) | int Part::saveXML(const char *filename) | ||||
@@ -926,7 +956,7 @@ int Part::saveXML(const char *filename) | |||||
XMLwrapper xml; | XMLwrapper xml; | ||||
xml.beginbranch("INSTRUMENT"); | xml.beginbranch("INSTRUMENT"); | ||||
add2XMLinstrument(&xml); | |||||
add2XMLinstrument(xml); | |||||
xml.endbranch(); | xml.endbranch(); | ||||
int result = xml.saveXMLfile(filename, gzip_compression); | int result = xml.saveXMLfile(filename, gzip_compression); | ||||
@@ -942,7 +972,7 @@ int Part::loadXMLinstrument(const char *filename) | |||||
if(xml.enterbranch("INSTRUMENT") == 0) | if(xml.enterbranch("INSTRUMENT") == 0) | ||||
return -10; | return -10; | ||||
getfromXMLinstrument(&xml); | |||||
getfromXMLinstrument(xml); | |||||
xml.exitbranch(); | xml.exitbranch(); | ||||
return 0; | return 0; | ||||
@@ -1013,127 +1043,127 @@ void Part::monomemClear(void) | |||||
monomemnotes[i] = -1; | monomemnotes[i] = -1; | ||||
} | } | ||||
void Part::getfromXMLinstrument(XMLwrapper *xml) | |||||
void Part::getfromXMLinstrument(XMLwrapper& xml) | |||||
{ | { | ||||
if(xml->enterbranch("INFO")) { | |||||
xml->getparstr("name", (char *)Pname, PART_MAX_NAME_LEN); | |||||
xml->getparstr("author", (char *)info.Pauthor, MAX_INFO_TEXT_SIZE); | |||||
xml->getparstr("comments", (char *)info.Pcomments, MAX_INFO_TEXT_SIZE); | |||||
info.Ptype = xml->getpar("type", info.Ptype, 0, 16); | |||||
if(xml.enterbranch("INFO")) { | |||||
xml.getparstr("name", (char *)Pname, PART_MAX_NAME_LEN); | |||||
xml.getparstr("author", (char *)info.Pauthor, MAX_INFO_TEXT_SIZE); | |||||
xml.getparstr("comments", (char *)info.Pcomments, MAX_INFO_TEXT_SIZE); | |||||
info.Ptype = xml.getpar("type", info.Ptype, 0, 16); | |||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("INSTRUMENT_KIT")) { | |||||
Pkitmode = xml->getpar127("kit_mode", Pkitmode); | |||||
Pdrummode = xml->getparbool("drum_mode", Pdrummode); | |||||
if(xml.enterbranch("INSTRUMENT_KIT")) { | |||||
Pkitmode = xml.getpar127("kit_mode", Pkitmode); | |||||
Pdrummode = xml.getparbool("drum_mode", Pdrummode); | |||||
setkititemstatus(0, 0); | setkititemstatus(0, 0); | ||||
for(int i = 0; i < NUM_KIT_ITEMS; ++i) { | for(int i = 0; i < NUM_KIT_ITEMS; ++i) { | ||||
if(xml->enterbranch("INSTRUMENT_KIT_ITEM", i) == 0) | |||||
if(xml.enterbranch("INSTRUMENT_KIT_ITEM", i) == 0) | |||||
continue; | continue; | ||||
setkititemstatus(i, xml->getparbool("enabled", kit[i].Penabled)); | |||||
setkititemstatus(i, xml.getparbool("enabled", kit[i].Penabled)); | |||||
if(kit[i].Penabled == 0) { | if(kit[i].Penabled == 0) { | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
continue; | continue; | ||||
} | } | ||||
xml->getparstr("name", (char *)kit[i].Pname, PART_MAX_NAME_LEN); | |||||
xml.getparstr("name", (char *)kit[i].Pname, PART_MAX_NAME_LEN); | |||||
kit[i].Pmuted = xml->getparbool("muted", kit[i].Pmuted); | |||||
kit[i].Pminkey = xml->getpar127("min_key", kit[i].Pminkey); | |||||
kit[i].Pmaxkey = xml->getpar127("max_key", kit[i].Pmaxkey); | |||||
kit[i].Pmuted = xml.getparbool("muted", kit[i].Pmuted); | |||||
kit[i].Pminkey = xml.getpar127("min_key", kit[i].Pminkey); | |||||
kit[i].Pmaxkey = xml.getpar127("max_key", kit[i].Pmaxkey); | |||||
kit[i].Psendtoparteffect = xml->getpar127( | |||||
kit[i].Psendtoparteffect = xml.getpar127( | |||||
"send_to_instrument_effect", | "send_to_instrument_effect", | ||||
kit[i].Psendtoparteffect); | kit[i].Psendtoparteffect); | ||||
kit[i].Padenabled = xml->getparbool("add_enabled", | |||||
kit[i].Padenabled = xml.getparbool("add_enabled", | |||||
kit[i].Padenabled); | kit[i].Padenabled); | ||||
if(xml->enterbranch("ADD_SYNTH_PARAMETERS")) { | |||||
if(xml.enterbranch("ADD_SYNTH_PARAMETERS")) { | |||||
if(!kit[i].adpars) | if(!kit[i].adpars) | ||||
kit[i].adpars = new ADnoteParameters(synth, fft); | kit[i].adpars = new ADnoteParameters(synth, fft); | ||||
kit[i].adpars->getfromXML(xml); | kit[i].adpars->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
kit[i].Psubenabled = xml->getparbool("sub_enabled", | |||||
kit[i].Psubenabled = xml.getparbool("sub_enabled", | |||||
kit[i].Psubenabled); | kit[i].Psubenabled); | ||||
if(xml->enterbranch("SUB_SYNTH_PARAMETERS")) { | |||||
if(xml.enterbranch("SUB_SYNTH_PARAMETERS")) { | |||||
if(!kit[i].subpars) | if(!kit[i].subpars) | ||||
kit[i].subpars = new SUBnoteParameters(); | kit[i].subpars = new SUBnoteParameters(); | ||||
kit[i].subpars->getfromXML(xml); | kit[i].subpars->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
kit[i].Ppadenabled = xml->getparbool("pad_enabled", | |||||
kit[i].Ppadenabled = xml.getparbool("pad_enabled", | |||||
kit[i].Ppadenabled); | kit[i].Ppadenabled); | ||||
if(xml->enterbranch("PAD_SYNTH_PARAMETERS")) { | |||||
if(xml.enterbranch("PAD_SYNTH_PARAMETERS")) { | |||||
if(!kit[i].padpars) | if(!kit[i].padpars) | ||||
kit[i].padpars = new PADnoteParameters(synth, fft); | kit[i].padpars = new PADnoteParameters(synth, fft); | ||||
kit[i].padpars->getfromXML(xml); | kit[i].padpars->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("INSTRUMENT_EFFECTS")) { | |||||
if(xml.enterbranch("INSTRUMENT_EFFECTS")) { | |||||
for(int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { | for(int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { | ||||
if(xml->enterbranch("INSTRUMENT_EFFECT", nefx) == 0) | |||||
if(xml.enterbranch("INSTRUMENT_EFFECT", nefx) == 0) | |||||
continue; | continue; | ||||
if(xml->enterbranch("EFFECT")) { | |||||
if(xml.enterbranch("EFFECT")) { | |||||
partefx[nefx]->getfromXML(xml); | partefx[nefx]->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
Pefxroute[nefx] = xml->getpar("route", | |||||
Pefxroute[nefx] = xml.getpar("route", | |||||
Pefxroute[nefx], | Pefxroute[nefx], | ||||
0, | 0, | ||||
NUM_PART_EFX); | NUM_PART_EFX); | ||||
partefx[nefx]->setdryonly(Pefxroute[nefx] == 2); | partefx[nefx]->setdryonly(Pefxroute[nefx] == 2); | ||||
Pefxbypass[nefx] = xml->getparbool("bypass", Pefxbypass[nefx]); | |||||
xml->exitbranch(); | |||||
Pefxbypass[nefx] = xml.getparbool("bypass", Pefxbypass[nefx]); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } | ||||
void Part::getfromXML(XMLwrapper *xml) | |||||
void Part::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
Penabled = xml->getparbool("enabled", Penabled); | |||||
Penabled = xml.getparbool("enabled", Penabled); | |||||
setPvolume(xml->getpar127("volume", Pvolume)); | |||||
setPpanning(xml->getpar127("panning", Ppanning)); | |||||
setPvolume(xml.getpar127("volume", Pvolume)); | |||||
setPpanning(xml.getpar127("panning", Ppanning)); | |||||
Pminkey = xml->getpar127("min_key", Pminkey); | |||||
Pmaxkey = xml->getpar127("max_key", Pmaxkey); | |||||
Pkeyshift = xml->getpar127("key_shift", Pkeyshift); | |||||
Prcvchn = xml->getpar127("rcv_chn", Prcvchn); | |||||
Pminkey = xml.getpar127("min_key", Pminkey); | |||||
Pmaxkey = xml.getpar127("max_key", Pmaxkey); | |||||
Pkeyshift = xml.getpar127("key_shift", Pkeyshift); | |||||
Prcvchn = xml.getpar127("rcv_chn", Prcvchn); | |||||
Pvelsns = xml->getpar127("velocity_sensing", Pvelsns); | |||||
Pveloffs = xml->getpar127("velocity_offset", Pveloffs); | |||||
Pvelsns = xml.getpar127("velocity_sensing", Pvelsns); | |||||
Pveloffs = xml.getpar127("velocity_offset", Pveloffs); | |||||
Pnoteon = xml->getparbool("note_on", Pnoteon); | |||||
Ppolymode = xml->getparbool("poly_mode", Ppolymode); | |||||
Plegatomode = xml->getparbool("legato_mode", Plegatomode); //older versions | |||||
Pnoteon = xml.getparbool("note_on", Pnoteon); | |||||
Ppolymode = xml.getparbool("poly_mode", Ppolymode); | |||||
Plegatomode = xml.getparbool("legato_mode", Plegatomode); //older versions | |||||
if(!Plegatomode) | if(!Plegatomode) | ||||
Plegatomode = xml->getpar127("legato_mode", Plegatomode); | |||||
Pkeylimit = xml->getpar127("key_limit", Pkeylimit); | |||||
Plegatomode = xml.getpar127("legato_mode", Plegatomode); | |||||
Pkeylimit = xml.getpar127("key_limit", Pkeylimit); | |||||
if(xml->enterbranch("INSTRUMENT")) { | |||||
if(xml.enterbranch("INSTRUMENT")) { | |||||
getfromXMLinstrument(xml); | getfromXMLinstrument(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("CONTROLLER")) { | |||||
if(xml.enterbranch("CONTROLLER")) { | |||||
ctl.getfromXML(xml); | ctl.getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } | ||||
@@ -48,7 +48,9 @@ class Part | |||||
void cloneTraits(Part &part) const REALTIME; | void cloneTraits(Part &part) const REALTIME; | ||||
// Midi commands implemented | // Midi commands implemented | ||||
void NoteOn(unsigned char note, | |||||
//returns true when note is successfully applied | |||||
bool NoteOn(unsigned char note, | |||||
unsigned char velocity, | unsigned char velocity, | ||||
int masterkeyshift) REALTIME; | int masterkeyshift) REALTIME; | ||||
void NoteOff(unsigned char note) REALTIME; | void NoteOff(unsigned char note) REALTIME; | ||||
@@ -69,8 +71,8 @@ class Part | |||||
int saveXML(const char *filename); | int saveXML(const char *filename); | ||||
int loadXMLinstrument(const char *filename); | int loadXMLinstrument(const char *filename); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XMLinstrument(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void add2XMLinstrument(XMLwrapper& xml); | |||||
void defaults(); | void defaults(); | ||||
void defaultsinstrument(); | void defaultsinstrument(); | ||||
@@ -81,8 +83,8 @@ class Part | |||||
void initialize_rt(void) REALTIME; | void initialize_rt(void) REALTIME; | ||||
void kill_rt(void) REALTIME; | void kill_rt(void) REALTIME; | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXMLinstrument(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void getfromXMLinstrument(XMLwrapper& xml); | |||||
void cleanup(bool final = false); | void cleanup(bool final = false); | ||||
@@ -222,7 +222,7 @@ void doPaste(MiddleWare &mw, string url, string type, XMLwrapper &xml, Ts&&... a | |||||
if(xml.enterbranch(type) == 0) | if(xml.enterbranch(type) == 0) | ||||
return; | return; | ||||
t->getfromXML(&xml); | |||||
t->getfromXML(xml); | |||||
//Send the pointer | //Send the pointer | ||||
string path = url+"paste"; | string path = url+"paste"; | ||||
@@ -264,7 +264,7 @@ void doArrayPaste(MiddleWare &mw, int field, string url, string type, | |||||
return; | return; | ||||
} | } | ||||
t->defaults(field); | t->defaults(field); | ||||
t->getfromXMLsection(&xml, field); | |||||
t->getfromXMLsection(xml, field); | |||||
xml.exitbranch(); | xml.exitbranch(); | ||||
//Send the pointer | //Send the pointer | ||||
@@ -219,7 +219,7 @@ char *rtosc_splat(const char *path, std::set<std::string> v) | |||||
char argT[v.size()+1]; | char argT[v.size()+1]; | ||||
rtosc_arg_t arg[v.size()]; | rtosc_arg_t arg[v.size()]; | ||||
unsigned i=0; | unsigned i=0; | ||||
for(auto vv : v) { | |||||
for(auto &vv : v) { | |||||
argT[i] = 's'; | argT[i] = 's'; | ||||
arg[i].s = vv.c_str(); | arg[i].s = vv.c_str(); | ||||
i++; | i++; | ||||
@@ -161,11 +161,14 @@ char *rtosc_splat(const char *path, std::set<std::string>); | |||||
[](const char *, rtosc::RtData &d){ \ | [](const char *, rtosc::RtData &d){ \ | ||||
d.reply(d.loc, "b", sizeof(d.obj), &d.obj);}}\ | d.reply(d.loc, "b", sizeof(d.obj), &d.obj);}}\ | ||||
#define rPaste \ | |||||
#define rPresetType \ | |||||
{"preset-type:", rProp(internal) rDoc("clipboard type of object"), 0, \ | {"preset-type:", rProp(internal) rDoc("clipboard type of object"), 0, \ | ||||
[](const char *, rtosc::RtData &d){ \ | [](const char *, rtosc::RtData &d){ \ | ||||
rObject *obj = (rObject*)d.obj; \ | rObject *obj = (rObject*)d.obj; \ | ||||
d.reply(d.loc, "s", obj->type);}},\ | |||||
d.reply(d.loc, "s", obj->type);}} | |||||
#define rPaste \ | |||||
rPresetType, \ | |||||
{"paste:b", rProp(internal) rDoc("paste port"), 0, \ | {"paste:b", rProp(internal) rDoc("paste port"), 0, \ | ||||
[](const char *m, rtosc::RtData &d){ \ | [](const char *m, rtosc::RtData &d){ \ | ||||
printf("rPaste...\n"); \ | printf("rPaste...\n"); \ | ||||
@@ -98,7 +98,7 @@ XMLwrapper::XMLwrapper() | |||||
{ | { | ||||
version.Major = 2; | version.Major = 2; | ||||
version.Minor = 5; | version.Minor = 5; | ||||
version.Revision = 1; | |||||
version.Revision = 2; | |||||
minimal = true; | minimal = true; | ||||
@@ -88,11 +88,15 @@ void InMgr::flush(unsigned frameStart, unsigned frameStop) | |||||
break; | break; | ||||
case M_CONTROLLER: | case M_CONTROLLER: | ||||
if(ev.num == C_bankselectmsb) // Change current bank | |||||
if(ev.num == C_bankselectmsb) { // Change current bank | |||||
middleware->spawnMaster()->bToU->write("/forward", ""); | |||||
middleware->spawnMaster()->bToU->write("/bank/msb", "i", ev.value); | middleware->spawnMaster()->bToU->write("/bank/msb", "i", ev.value); | ||||
else if(ev.num == C_bankselectlsb) // Change current bank (LSB) | |||||
middleware->spawnMaster()->bToU->write("/bank/bank_select", "i", ev.value); | |||||
} else if(ev.num == C_bankselectlsb) {// Change current bank (LSB) | |||||
middleware->spawnMaster()->bToU->write("/forward", ""); | |||||
middleware->spawnMaster()->bToU->write("/bank/lsb", "i", ev.value); | middleware->spawnMaster()->bToU->write("/bank/lsb", "i", ev.value); | ||||
else | |||||
} else | |||||
master->setController(ev.channel, ev.num, ev.value); | master->setController(ev.channel, ev.num, ev.value); | ||||
break; | break; | ||||
@@ -567,7 +567,7 @@ ADnoteParameters::~ADnoteParameters() | |||||
KillVoice(nvoice); | KillVoice(nvoice); | ||||
} | } | ||||
void ADnoteParameters::add2XMLsection(XMLwrapper *xml, int n) | |||||
void ADnoteParameters::add2XMLsection(XMLwrapper& xml, int n) | |||||
{ | { | ||||
int nvoice = n; | int nvoice = n; | ||||
if(nvoice >= NUM_VOICES) | if(nvoice >= NUM_VOICES) | ||||
@@ -582,321 +582,321 @@ void ADnoteParameters::add2XMLsection(XMLwrapper *xml, int n) | |||||
fmoscilused = 1; | fmoscilused = 1; | ||||
} | } | ||||
xml->addparbool("enabled", VoicePar[nvoice].Enabled); | |||||
xml.addparbool("enabled", VoicePar[nvoice].Enabled); | |||||
if(((VoicePar[nvoice].Enabled == 0) && (oscilused == 0) | if(((VoicePar[nvoice].Enabled == 0) && (oscilused == 0) | ||||
&& (fmoscilused == 0)) && (xml->minimal)) | |||||
&& (fmoscilused == 0)) && (xml.minimal)) | |||||
return; | return; | ||||
VoicePar[nvoice].add2XML(xml, fmoscilused); | VoicePar[nvoice].add2XML(xml, fmoscilused); | ||||
} | } | ||||
void ADnoteVoiceParam::add2XML(XMLwrapper *xml, bool fmoscilused) | |||||
void ADnoteVoiceParam::add2XML(XMLwrapper& xml, bool fmoscilused) | |||||
{ | { | ||||
xml->addpar("type", Type); | |||||
xml.addpar("type", Type); | |||||
xml->addpar("unison_size", Unison_size); | |||||
xml->addpar("unison_frequency_spread", | |||||
xml.addpar("unison_size", Unison_size); | |||||
xml.addpar("unison_frequency_spread", | |||||
Unison_frequency_spread); | Unison_frequency_spread); | ||||
xml->addpar("unison_stereo_spread", Unison_stereo_spread); | |||||
xml->addpar("unison_vibratto", Unison_vibratto); | |||||
xml->addpar("unison_vibratto_speed", Unison_vibratto_speed); | |||||
xml->addpar("unison_invert_phase", Unison_invert_phase); | |||||
xml->addpar("unison_phase_randomness", Unison_phase_randomness); | |||||
xml.addpar("unison_stereo_spread", Unison_stereo_spread); | |||||
xml.addpar("unison_vibratto", Unison_vibratto); | |||||
xml.addpar("unison_vibratto_speed", Unison_vibratto_speed); | |||||
xml.addpar("unison_invert_phase", Unison_invert_phase); | |||||
xml.addpar("unison_phase_randomness", Unison_phase_randomness); | |||||
xml->addpar("delay", PDelay); | |||||
xml->addparbool("resonance", Presonance); | |||||
xml.addpar("delay", PDelay); | |||||
xml.addparbool("resonance", Presonance); | |||||
xml->addpar("ext_oscil", Pextoscil); | |||||
xml->addpar("ext_fm_oscil", PextFMoscil); | |||||
xml.addpar("ext_oscil", Pextoscil); | |||||
xml.addpar("ext_fm_oscil", PextFMoscil); | |||||
xml->addpar("oscil_phase", Poscilphase); | |||||
xml->addpar("oscil_fm_phase", PFMoscilphase); | |||||
xml.addpar("oscil_phase", Poscilphase); | |||||
xml.addpar("oscil_fm_phase", PFMoscilphase); | |||||
xml->addparbool("filter_enabled", PFilterEnabled); | |||||
xml->addparbool("filter_bypass", Pfilterbypass); | |||||
xml.addparbool("filter_enabled", PFilterEnabled); | |||||
xml.addparbool("filter_bypass", Pfilterbypass); | |||||
xml->addpar("fm_enabled", PFMEnabled); | |||||
xml.addpar("fm_enabled", PFMEnabled); | |||||
xml->beginbranch("OSCIL"); | |||||
xml.beginbranch("OSCIL"); | |||||
OscilSmp->add2XML(xml); | OscilSmp->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("AMPLITUDE_PARAMETERS"); | |||||
xml->addpar("panning", PPanning); | |||||
xml->addpar("volume", PVolume); | |||||
xml->addparbool("volume_minus", PVolumeminus); | |||||
xml->addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||||
xml.beginbranch("AMPLITUDE_PARAMETERS"); | |||||
xml.addpar("panning", PPanning); | |||||
xml.addpar("volume", PVolume); | |||||
xml.addparbool("volume_minus", PVolumeminus); | |||||
xml.addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||||
xml->addparbool("amp_envelope_enabled", | |||||
xml.addparbool("amp_envelope_enabled", | |||||
PAmpEnvelopeEnabled); | PAmpEnvelopeEnabled); | ||||
if((PAmpEnvelopeEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("AMPLITUDE_ENVELOPE"); | |||||
if((PAmpEnvelopeEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("AMPLITUDE_ENVELOPE"); | |||||
AmpEnvelope->add2XML(xml); | AmpEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->addparbool("amp_lfo_enabled", PAmpLfoEnabled); | |||||
if((PAmpLfoEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("AMPLITUDE_LFO"); | |||||
xml.addparbool("amp_lfo_enabled", PAmpLfoEnabled); | |||||
if((PAmpLfoEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("AMPLITUDE_LFO"); | |||||
AmpLfo->add2XML(xml); | AmpLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FREQUENCY_PARAMETERS"); | |||||
xml->addparbool("fixed_freq", Pfixedfreq); | |||||
xml->addpar("fixed_freq_et", PfixedfreqET); | |||||
xml->addpar("detune", PDetune); | |||||
xml->addpar("coarse_detune", PCoarseDetune); | |||||
xml->addpar("detune_type", PDetuneType); | |||||
xml.beginbranch("FREQUENCY_PARAMETERS"); | |||||
xml.addparbool("fixed_freq", Pfixedfreq); | |||||
xml.addpar("fixed_freq_et", PfixedfreqET); | |||||
xml.addpar("detune", PDetune); | |||||
xml.addpar("coarse_detune", PCoarseDetune); | |||||
xml.addpar("detune_type", PDetuneType); | |||||
xml->addparbool("freq_envelope_enabled", | |||||
xml.addparbool("freq_envelope_enabled", | |||||
PFreqEnvelopeEnabled); | PFreqEnvelopeEnabled); | ||||
if((PFreqEnvelopeEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("FREQUENCY_ENVELOPE"); | |||||
if((PFreqEnvelopeEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("FREQUENCY_ENVELOPE"); | |||||
FreqEnvelope->add2XML(xml); | FreqEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->addparbool("freq_lfo_enabled", PFreqLfoEnabled); | |||||
if((PFreqLfoEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("FREQUENCY_LFO"); | |||||
xml.addparbool("freq_lfo_enabled", PFreqLfoEnabled); | |||||
if((PFreqLfoEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("FREQUENCY_LFO"); | |||||
FreqLfo->add2XML(xml); | FreqLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
if((PFilterEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("FILTER_PARAMETERS"); | |||||
xml->addpar("velocity_sensing_amplitude", PFilterVelocityScale); | |||||
xml->addpar("velocity_sensing", PFilterVelocityScaleFunction); | |||||
xml->beginbranch("FILTER"); | |||||
if((PFilterEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("FILTER_PARAMETERS"); | |||||
xml.addpar("velocity_sensing_amplitude", PFilterVelocityScale); | |||||
xml.addpar("velocity_sensing", PFilterVelocityScaleFunction); | |||||
xml.beginbranch("FILTER"); | |||||
VoiceFilter->add2XML(xml); | VoiceFilter->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->addparbool("filter_envelope_enabled", | |||||
xml.addparbool("filter_envelope_enabled", | |||||
PFilterEnvelopeEnabled); | PFilterEnvelopeEnabled); | ||||
if((PFilterEnvelopeEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("FILTER_ENVELOPE"); | |||||
if((PFilterEnvelopeEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("FILTER_ENVELOPE"); | |||||
FilterEnvelope->add2XML(xml); | FilterEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->addparbool("filter_lfo_enabled", | |||||
xml.addparbool("filter_lfo_enabled", | |||||
PFilterLfoEnabled); | PFilterLfoEnabled); | ||||
if((PFilterLfoEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("FILTER_LFO"); | |||||
if((PFilterLfoEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("FILTER_LFO"); | |||||
FilterLfo->add2XML(xml); | FilterLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
if((PFMEnabled != 0) || (fmoscilused != 0) | if((PFMEnabled != 0) || (fmoscilused != 0) | ||||
|| (!xml->minimal)) { | |||||
xml->beginbranch("FM_PARAMETERS"); | |||||
xml->addpar("input_voice", PFMVoice); | |||||
|| (!xml.minimal)) { | |||||
xml.beginbranch("FM_PARAMETERS"); | |||||
xml.addpar("input_voice", PFMVoice); | |||||
xml->addpar("volume", PFMVolume); | |||||
xml->addpar("volume_damp", PFMVolumeDamp); | |||||
xml->addpar("velocity_sensing", | |||||
xml.addpar("volume", PFMVolume); | |||||
xml.addpar("volume_damp", PFMVolumeDamp); | |||||
xml.addpar("velocity_sensing", | |||||
PFMVelocityScaleFunction); | PFMVelocityScaleFunction); | ||||
xml->addparbool("amp_envelope_enabled", | |||||
xml.addparbool("amp_envelope_enabled", | |||||
PFMAmpEnvelopeEnabled); | PFMAmpEnvelopeEnabled); | ||||
if((PFMAmpEnvelopeEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("AMPLITUDE_ENVELOPE"); | |||||
if((PFMAmpEnvelopeEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("AMPLITUDE_ENVELOPE"); | |||||
FMAmpEnvelope->add2XML(xml); | FMAmpEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->beginbranch("MODULATOR"); | |||||
xml->addpar("detune", PFMDetune); | |||||
xml->addpar("coarse_detune", PFMCoarseDetune); | |||||
xml->addpar("detune_type", PFMDetuneType); | |||||
xml.beginbranch("MODULATOR"); | |||||
xml.addpar("detune", PFMDetune); | |||||
xml.addpar("coarse_detune", PFMCoarseDetune); | |||||
xml.addpar("detune_type", PFMDetuneType); | |||||
xml->addparbool("freq_envelope_enabled", | |||||
xml.addparbool("freq_envelope_enabled", | |||||
PFMFreqEnvelopeEnabled); | PFMFreqEnvelopeEnabled); | ||||
if((PFMFreqEnvelopeEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("FREQUENCY_ENVELOPE"); | |||||
if((PFMFreqEnvelopeEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("FREQUENCY_ENVELOPE"); | |||||
FMFreqEnvelope->add2XML(xml); | FMFreqEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->beginbranch("OSCIL"); | |||||
xml.beginbranch("OSCIL"); | |||||
FMSmp->add2XML(xml); | FMSmp->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
void ADnoteGlobalParam::add2XML(XMLwrapper *xml) | |||||
void ADnoteGlobalParam::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addparbool("stereo", PStereo); | |||||
xml->beginbranch("AMPLITUDE_PARAMETERS"); | |||||
xml->addpar("volume", PVolume); | |||||
xml->addpar("panning", PPanning); | |||||
xml->addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||||
xml->addpar("fadein_adjustment", Fadein_adjustment); | |||||
xml->addpar("punch_strength", PPunchStrength); | |||||
xml->addpar("punch_time", PPunchTime); | |||||
xml->addpar("punch_stretch", PPunchStretch); | |||||
xml->addpar("punch_velocity_sensing", PPunchVelocitySensing); | |||||
xml->addpar("harmonic_randomness_grouping", Hrandgrouping); | |||||
xml->beginbranch("AMPLITUDE_ENVELOPE"); | |||||
xml.addparbool("stereo", PStereo); | |||||
xml.beginbranch("AMPLITUDE_PARAMETERS"); | |||||
xml.addpar("volume", PVolume); | |||||
xml.addpar("panning", PPanning); | |||||
xml.addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||||
xml.addpar("fadein_adjustment", Fadein_adjustment); | |||||
xml.addpar("punch_strength", PPunchStrength); | |||||
xml.addpar("punch_time", PPunchTime); | |||||
xml.addpar("punch_stretch", PPunchStretch); | |||||
xml.addpar("punch_velocity_sensing", PPunchVelocitySensing); | |||||
xml.addpar("harmonic_randomness_grouping", Hrandgrouping); | |||||
xml.beginbranch("AMPLITUDE_ENVELOPE"); | |||||
AmpEnvelope->add2XML(xml); | AmpEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("AMPLITUDE_LFO"); | |||||
xml.beginbranch("AMPLITUDE_LFO"); | |||||
AmpLfo->add2XML(xml); | AmpLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FREQUENCY_PARAMETERS"); | |||||
xml->addpar("detune", PDetune); | |||||
xml.beginbranch("FREQUENCY_PARAMETERS"); | |||||
xml.addpar("detune", PDetune); | |||||
xml->addpar("coarse_detune", PCoarseDetune); | |||||
xml->addpar("detune_type", PDetuneType); | |||||
xml.addpar("coarse_detune", PCoarseDetune); | |||||
xml.addpar("detune_type", PDetuneType); | |||||
xml->addpar("bandwidth", PBandwidth); | |||||
xml.addpar("bandwidth", PBandwidth); | |||||
xml->beginbranch("FREQUENCY_ENVELOPE"); | |||||
xml.beginbranch("FREQUENCY_ENVELOPE"); | |||||
FreqEnvelope->add2XML(xml); | FreqEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FREQUENCY_LFO"); | |||||
xml.beginbranch("FREQUENCY_LFO"); | |||||
FreqLfo->add2XML(xml); | FreqLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FILTER_PARAMETERS"); | |||||
xml->addpar("velocity_sensing_amplitude", PFilterVelocityScale); | |||||
xml->addpar("velocity_sensing", PFilterVelocityScaleFunction); | |||||
xml.beginbranch("FILTER_PARAMETERS"); | |||||
xml.addpar("velocity_sensing_amplitude", PFilterVelocityScale); | |||||
xml.addpar("velocity_sensing", PFilterVelocityScaleFunction); | |||||
xml->beginbranch("FILTER"); | |||||
xml.beginbranch("FILTER"); | |||||
GlobalFilter->add2XML(xml); | GlobalFilter->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FILTER_ENVELOPE"); | |||||
xml.beginbranch("FILTER_ENVELOPE"); | |||||
FilterEnvelope->add2XML(xml); | FilterEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FILTER_LFO"); | |||||
xml.beginbranch("FILTER_LFO"); | |||||
FilterLfo->add2XML(xml); | FilterLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("RESONANCE"); | |||||
xml.beginbranch("RESONANCE"); | |||||
Reson->add2XML(xml); | Reson->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
void ADnoteParameters::add2XML(XMLwrapper *xml) | |||||
void ADnoteParameters::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
GlobalPar.add2XML(xml); | GlobalPar.add2XML(xml); | ||||
for(int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { | for(int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { | ||||
xml->beginbranch("VOICE", nvoice); | |||||
xml.beginbranch("VOICE", nvoice); | |||||
add2XMLsection(xml, nvoice); | add2XMLsection(xml, nvoice); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
void ADnoteGlobalParam::getfromXML(XMLwrapper *xml) | |||||
void ADnoteGlobalParam::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
PStereo = xml->getparbool("stereo", PStereo); | |||||
PStereo = xml.getparbool("stereo", PStereo); | |||||
if(xml->enterbranch("AMPLITUDE_PARAMETERS")) { | |||||
PVolume = xml->getpar127("volume", PVolume); | |||||
PPanning = xml->getpar127("panning", PPanning); | |||||
PAmpVelocityScaleFunction = xml->getpar127("velocity_sensing", | |||||
if(xml.enterbranch("AMPLITUDE_PARAMETERS")) { | |||||
PVolume = xml.getpar127("volume", PVolume); | |||||
PPanning = xml.getpar127("panning", PPanning); | |||||
PAmpVelocityScaleFunction = xml.getpar127("velocity_sensing", | |||||
PAmpVelocityScaleFunction); | PAmpVelocityScaleFunction); | ||||
Fadein_adjustment = xml->getpar127("fadein_adjustment", Fadein_adjustment); | |||||
PPunchStrength = xml->getpar127("punch_strength", PPunchStrength); | |||||
PPunchTime = xml->getpar127("punch_time", PPunchTime); | |||||
PPunchStretch = xml->getpar127("punch_stretch", PPunchStretch); | |||||
PPunchVelocitySensing = xml->getpar127("punch_velocity_sensing", | |||||
Fadein_adjustment = xml.getpar127("fadein_adjustment", Fadein_adjustment); | |||||
PPunchStrength = xml.getpar127("punch_strength", PPunchStrength); | |||||
PPunchTime = xml.getpar127("punch_time", PPunchTime); | |||||
PPunchStretch = xml.getpar127("punch_stretch", PPunchStretch); | |||||
PPunchVelocitySensing = xml.getpar127("punch_velocity_sensing", | |||||
PPunchVelocitySensing); | PPunchVelocitySensing); | ||||
Hrandgrouping = xml->getpar127("harmonic_randomness_grouping", | |||||
Hrandgrouping = xml.getpar127("harmonic_randomness_grouping", | |||||
Hrandgrouping); | Hrandgrouping); | ||||
if(xml->enterbranch("AMPLITUDE_ENVELOPE")) { | |||||
if(xml.enterbranch("AMPLITUDE_ENVELOPE")) { | |||||
AmpEnvelope->getfromXML(xml); | AmpEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("AMPLITUDE_LFO")) { | |||||
if(xml.enterbranch("AMPLITUDE_LFO")) { | |||||
AmpLfo->getfromXML(xml); | AmpLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FREQUENCY_PARAMETERS")) { | |||||
PDetune = xml->getpar("detune", PDetune, 0, 16383); | |||||
PCoarseDetune = xml->getpar("coarse_detune", PCoarseDetune, 0, 16383); | |||||
PDetuneType = xml->getpar127("detune_type", PDetuneType); | |||||
PBandwidth = xml->getpar127("bandwidth", PBandwidth); | |||||
if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | |||||
PDetune = xml.getpar("detune", PDetune, 0, 16383); | |||||
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | |||||
PDetuneType = xml.getpar127("detune_type", PDetuneType); | |||||
PBandwidth = xml.getpar127("bandwidth", PBandwidth); | |||||
xml->enterbranch("FREQUENCY_ENVELOPE"); | |||||
xml.enterbranch("FREQUENCY_ENVELOPE"); | |||||
FreqEnvelope->getfromXML(xml); | FreqEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->enterbranch("FREQUENCY_LFO"); | |||||
xml.enterbranch("FREQUENCY_LFO"); | |||||
FreqLfo->getfromXML(xml); | FreqLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FILTER_PARAMETERS")) { | |||||
PFilterVelocityScale = xml->getpar127("velocity_sensing_amplitude", | |||||
if(xml.enterbranch("FILTER_PARAMETERS")) { | |||||
PFilterVelocityScale = xml.getpar127("velocity_sensing_amplitude", | |||||
PFilterVelocityScale); | PFilterVelocityScale); | ||||
PFilterVelocityScaleFunction = xml->getpar127( | |||||
PFilterVelocityScaleFunction = xml.getpar127( | |||||
"velocity_sensing", | "velocity_sensing", | ||||
PFilterVelocityScaleFunction); | PFilterVelocityScaleFunction); | ||||
xml->enterbranch("FILTER"); | |||||
xml.enterbranch("FILTER"); | |||||
GlobalFilter->getfromXML(xml); | GlobalFilter->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->enterbranch("FILTER_ENVELOPE"); | |||||
xml.enterbranch("FILTER_ENVELOPE"); | |||||
FilterEnvelope->getfromXML(xml); | FilterEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->enterbranch("FILTER_LFO"); | |||||
xml.enterbranch("FILTER_LFO"); | |||||
FilterLfo->getfromXML(xml); | FilterLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("RESONANCE")) { | |||||
if(xml.enterbranch("RESONANCE")) { | |||||
Reson->getfromXML(xml); | Reson->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } | ||||
void ADnoteParameters::getfromXML(XMLwrapper *xml) | |||||
void ADnoteParameters::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
GlobalPar.getfromXML(xml); | GlobalPar.getfromXML(xml); | ||||
for(int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { | for(int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { | ||||
VoicePar[nvoice].Enabled = 0; | VoicePar[nvoice].Enabled = 0; | ||||
if(xml->enterbranch("VOICE", nvoice) == 0) | |||||
if(xml.enterbranch("VOICE", nvoice) == 0) | |||||
continue; | continue; | ||||
getfromXMLsection(xml, nvoice); | getfromXMLsection(xml, nvoice); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } | ||||
void ADnoteParameters::getfromXMLsection(XMLwrapper *xml, int n) | |||||
void ADnoteParameters::getfromXMLsection(XMLwrapper& xml, int n) | |||||
{ | { | ||||
int nvoice = n; | int nvoice = n; | ||||
if(nvoice >= NUM_VOICES) | if(nvoice >= NUM_VOICES) | ||||
@@ -1042,149 +1042,149 @@ void ADnoteGlobalParam::paste(ADnoteGlobalParam &a) | |||||
#undef copy | #undef copy | ||||
#undef RCopy | #undef RCopy | ||||
void ADnoteVoiceParam::getfromXML(XMLwrapper *xml, unsigned nvoice) | |||||
void ADnoteVoiceParam::getfromXML(XMLwrapper& xml, unsigned nvoice) | |||||
{ | { | ||||
Enabled = xml->getparbool("enabled", 0); | |||||
Unison_size = xml->getpar127("unison_size", Unison_size); | |||||
Unison_frequency_spread = xml->getpar127("unison_frequency_spread", | |||||
Enabled = xml.getparbool("enabled", 0); | |||||
Unison_size = xml.getpar127("unison_size", Unison_size); | |||||
Unison_frequency_spread = xml.getpar127("unison_frequency_spread", | |||||
Unison_frequency_spread); | Unison_frequency_spread); | ||||
Unison_stereo_spread = xml->getpar127("unison_stereo_spread", | |||||
Unison_stereo_spread = xml.getpar127("unison_stereo_spread", | |||||
Unison_stereo_spread); | Unison_stereo_spread); | ||||
Unison_vibratto = xml->getpar127("unison_vibratto", Unison_vibratto); | |||||
Unison_vibratto_speed = xml->getpar127("unison_vibratto_speed", | |||||
Unison_vibratto = xml.getpar127("unison_vibratto", Unison_vibratto); | |||||
Unison_vibratto_speed = xml.getpar127("unison_vibratto_speed", | |||||
Unison_vibratto_speed); | Unison_vibratto_speed); | ||||
Unison_invert_phase = xml->getpar127("unison_invert_phase", | |||||
Unison_invert_phase = xml.getpar127("unison_invert_phase", | |||||
Unison_invert_phase); | Unison_invert_phase); | ||||
Unison_phase_randomness = xml->getpar127("unison_phase_randomness", | |||||
Unison_phase_randomness = xml.getpar127("unison_phase_randomness", | |||||
Unison_phase_randomness); | Unison_phase_randomness); | ||||
Type = xml->getpar127("type", Type); | |||||
PDelay = xml->getpar127("delay", PDelay); | |||||
Presonance = xml->getparbool("resonance", Presonance); | |||||
Type = xml.getpar127("type", Type); | |||||
PDelay = xml.getpar127("delay", PDelay); | |||||
Presonance = xml.getparbool("resonance", Presonance); | |||||
Pextoscil = xml->getpar("ext_oscil", -1, -1, nvoice - 1); | |||||
PextFMoscil = xml->getpar("ext_fm_oscil", -1, -1, nvoice - 1); | |||||
Pextoscil = xml.getpar("ext_oscil", -1, -1, nvoice - 1); | |||||
PextFMoscil = xml.getpar("ext_fm_oscil", -1, -1, nvoice - 1); | |||||
Poscilphase = xml->getpar127("oscil_phase", Poscilphase); | |||||
PFMoscilphase = xml->getpar127("oscil_fm_phase", PFMoscilphase); | |||||
PFilterEnabled = xml->getparbool("filter_enabled", PFilterEnabled); | |||||
Pfilterbypass = xml->getparbool("filter_bypass", Pfilterbypass); | |||||
PFMEnabled = xml->getpar127("fm_enabled", PFMEnabled); | |||||
Poscilphase = xml.getpar127("oscil_phase", Poscilphase); | |||||
PFMoscilphase = xml.getpar127("oscil_fm_phase", PFMoscilphase); | |||||
PFilterEnabled = xml.getparbool("filter_enabled", PFilterEnabled); | |||||
Pfilterbypass = xml.getparbool("filter_bypass", Pfilterbypass); | |||||
PFMEnabled = xml.getpar127("fm_enabled", PFMEnabled); | |||||
if(xml->enterbranch("OSCIL")) { | |||||
if(xml.enterbranch("OSCIL")) { | |||||
OscilSmp->getfromXML(xml); | OscilSmp->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("AMPLITUDE_PARAMETERS")) { | |||||
PPanning = xml->getpar127("panning", PPanning); | |||||
PVolume = xml->getpar127("volume", PVolume); | |||||
PVolumeminus = xml->getparbool("volume_minus", PVolumeminus); | |||||
PAmpVelocityScaleFunction = xml->getpar127("velocity_sensing", | |||||
if(xml.enterbranch("AMPLITUDE_PARAMETERS")) { | |||||
PPanning = xml.getpar127("panning", PPanning); | |||||
PVolume = xml.getpar127("volume", PVolume); | |||||
PVolumeminus = xml.getparbool("volume_minus", PVolumeminus); | |||||
PAmpVelocityScaleFunction = xml.getpar127("velocity_sensing", | |||||
PAmpVelocityScaleFunction); | PAmpVelocityScaleFunction); | ||||
PAmpEnvelopeEnabled = xml->getparbool("amp_envelope_enabled", | |||||
PAmpEnvelopeEnabled = xml.getparbool("amp_envelope_enabled", | |||||
PAmpEnvelopeEnabled); | PAmpEnvelopeEnabled); | ||||
if(xml->enterbranch("AMPLITUDE_ENVELOPE")) { | |||||
if(xml.enterbranch("AMPLITUDE_ENVELOPE")) { | |||||
AmpEnvelope->getfromXML(xml); | AmpEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
PAmpLfoEnabled = xml->getparbool("amp_lfo_enabled", PAmpLfoEnabled); | |||||
if(xml->enterbranch("AMPLITUDE_LFO")) { | |||||
PAmpLfoEnabled = xml.getparbool("amp_lfo_enabled", PAmpLfoEnabled); | |||||
if(xml.enterbranch("AMPLITUDE_LFO")) { | |||||
AmpLfo->getfromXML(xml); | AmpLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FREQUENCY_PARAMETERS")) { | |||||
Pfixedfreq = xml->getparbool("fixed_freq", Pfixedfreq); | |||||
PfixedfreqET = xml->getpar127("fixed_freq_et", PfixedfreqET); | |||||
PDetune = xml->getpar("detune", PDetune, 0, 16383); | |||||
PCoarseDetune = xml->getpar("coarse_detune", PCoarseDetune, 0, 16383); | |||||
PDetuneType = xml->getpar127("detune_type", PDetuneType); | |||||
PFreqEnvelopeEnabled = xml->getparbool("freq_envelope_enabled", | |||||
if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | |||||
Pfixedfreq = xml.getparbool("fixed_freq", Pfixedfreq); | |||||
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | |||||
PDetune = xml.getpar("detune", PDetune, 0, 16383); | |||||
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | |||||
PDetuneType = xml.getpar127("detune_type", PDetuneType); | |||||
PFreqEnvelopeEnabled = xml.getparbool("freq_envelope_enabled", | |||||
PFreqEnvelopeEnabled); | PFreqEnvelopeEnabled); | ||||
if(xml->enterbranch("FREQUENCY_ENVELOPE")) { | |||||
if(xml.enterbranch("FREQUENCY_ENVELOPE")) { | |||||
FreqEnvelope->getfromXML(xml); | FreqEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
PFreqLfoEnabled = xml->getparbool("freq_lfo_enabled", PFreqLfoEnabled); | |||||
PFreqLfoEnabled = xml.getparbool("freq_lfo_enabled", PFreqLfoEnabled); | |||||
if(xml->enterbranch("FREQUENCY_LFO")) { | |||||
if(xml.enterbranch("FREQUENCY_LFO")) { | |||||
FreqLfo->getfromXML(xml); | FreqLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FILTER_PARAMETERS")) { | |||||
PFilterVelocityScale = xml->getpar127("velocity_sensing_amplitude", | |||||
if(xml.enterbranch("FILTER_PARAMETERS")) { | |||||
PFilterVelocityScale = xml.getpar127("velocity_sensing_amplitude", | |||||
PFilterVelocityScale); | PFilterVelocityScale); | ||||
PFilterVelocityScaleFunction = xml->getpar127( | |||||
PFilterVelocityScaleFunction = xml.getpar127( | |||||
"velocity_sensing", | "velocity_sensing", | ||||
PFilterVelocityScaleFunction); | PFilterVelocityScaleFunction); | ||||
if(xml->enterbranch("FILTER")) { | |||||
if(xml.enterbranch("FILTER")) { | |||||
VoiceFilter->getfromXML(xml); | VoiceFilter->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
PFilterEnvelopeEnabled = xml->getparbool("filter_envelope_enabled", | |||||
PFilterEnvelopeEnabled = xml.getparbool("filter_envelope_enabled", | |||||
PFilterEnvelopeEnabled); | PFilterEnvelopeEnabled); | ||||
if(xml->enterbranch("FILTER_ENVELOPE")) { | |||||
if(xml.enterbranch("FILTER_ENVELOPE")) { | |||||
FilterEnvelope->getfromXML(xml); | FilterEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
PFilterLfoEnabled = xml->getparbool("filter_lfo_enabled", | |||||
PFilterLfoEnabled = xml.getparbool("filter_lfo_enabled", | |||||
PFilterLfoEnabled); | PFilterLfoEnabled); | ||||
if(xml->enterbranch("FILTER_LFO")) { | |||||
if(xml.enterbranch("FILTER_LFO")) { | |||||
FilterLfo->getfromXML(xml); | FilterLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FM_PARAMETERS")) { | |||||
PFMVoice = xml->getpar("input_voice", PFMVoice, -1, nvoice - 1); | |||||
PFMVolume = xml->getpar127("volume", PFMVolume); | |||||
PFMVolumeDamp = xml->getpar127("volume_damp", PFMVolumeDamp); | |||||
PFMVelocityScaleFunction = xml->getpar127("velocity_sensing", | |||||
if(xml.enterbranch("FM_PARAMETERS")) { | |||||
PFMVoice = xml.getpar("input_voice", PFMVoice, -1, nvoice - 1); | |||||
PFMVolume = xml.getpar127("volume", PFMVolume); | |||||
PFMVolumeDamp = xml.getpar127("volume_damp", PFMVolumeDamp); | |||||
PFMVelocityScaleFunction = xml.getpar127("velocity_sensing", | |||||
PFMVelocityScaleFunction); | PFMVelocityScaleFunction); | ||||
PFMAmpEnvelopeEnabled = xml->getparbool("amp_envelope_enabled", | |||||
PFMAmpEnvelopeEnabled = xml.getparbool("amp_envelope_enabled", | |||||
PFMAmpEnvelopeEnabled); | PFMAmpEnvelopeEnabled); | ||||
if(xml->enterbranch("AMPLITUDE_ENVELOPE")) { | |||||
if(xml.enterbranch("AMPLITUDE_ENVELOPE")) { | |||||
FMAmpEnvelope->getfromXML(xml); | FMAmpEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("MODULATOR")) { | |||||
PFMDetune = xml->getpar("detune", PFMDetune, 0, 16383); | |||||
PFMCoarseDetune = xml->getpar("coarse_detune", | |||||
if(xml.enterbranch("MODULATOR")) { | |||||
PFMDetune = xml.getpar("detune", PFMDetune, 0, 16383); | |||||
PFMCoarseDetune = xml.getpar("coarse_detune", | |||||
PFMCoarseDetune, | PFMCoarseDetune, | ||||
0, | 0, | ||||
16383); | 16383); | ||||
PFMDetuneType = xml->getpar127("detune_type", PFMDetuneType); | |||||
PFMDetuneType = xml.getpar127("detune_type", PFMDetuneType); | |||||
PFMFreqEnvelopeEnabled = xml->getparbool("freq_envelope_enabled", | |||||
PFMFreqEnvelopeEnabled = xml.getparbool("freq_envelope_enabled", | |||||
PFMFreqEnvelopeEnabled); | PFMFreqEnvelopeEnabled); | ||||
if(xml->enterbranch("FREQUENCY_ENVELOPE")) { | |||||
if(xml.enterbranch("FREQUENCY_ENVELOPE")) { | |||||
FMFreqEnvelope->getfromXML(xml); | FMFreqEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("OSCIL")) { | |||||
if(xml.enterbranch("OSCIL")) { | |||||
FMSmp->getfromXML(xml); | FMSmp->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } |
@@ -38,8 +38,8 @@ struct ADnoteGlobalParam { | |||||
ADnoteGlobalParam(); | ADnoteGlobalParam(); | ||||
~ADnoteGlobalParam(); | ~ADnoteGlobalParam(); | ||||
void defaults(); | void defaults(); | ||||
void add2XML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void paste(ADnoteGlobalParam &a); | void paste(ADnoteGlobalParam &a); | ||||
/* The instrument type - MONO/STEREO | /* The instrument type - MONO/STEREO | ||||
If the mode is MONO, the panning of voices are not used | If the mode is MONO, the panning of voices are not used | ||||
@@ -115,8 +115,8 @@ struct ADnoteGlobalParam { | |||||
/* VOICE PARAMETERS */ | /* VOICE PARAMETERS */ | ||||
/***********************************************************/ | /***********************************************************/ | ||||
struct ADnoteVoiceParam { | struct ADnoteVoiceParam { | ||||
void getfromXML(XMLwrapper *xml, unsigned nvoice); | |||||
void add2XML(XMLwrapper *xml, bool fmoscilused); | |||||
void getfromXML(XMLwrapper& xml, unsigned nvoice); | |||||
void add2XML(XMLwrapper& xml, bool fmoscilused); | |||||
void paste(ADnoteVoiceParam &p); | void paste(ADnoteVoiceParam &p); | ||||
void defaults(void); | void defaults(void); | ||||
void enable(const SYNTH_T &synth, FFTwrapper *fft, Resonance *Reson); | void enable(const SYNTH_T &synth, FFTwrapper *fft, Resonance *Reson); | ||||
@@ -306,8 +306,8 @@ class ADnoteParameters:public PresetsArray | |||||
ADnoteVoiceParam VoicePar[NUM_VOICES]; | ADnoteVoiceParam VoicePar[NUM_VOICES]; | ||||
void defaults(); | void defaults(); | ||||
void add2XML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void paste(ADnoteParameters &a); | void paste(ADnoteParameters &a); | ||||
void pasteArray(ADnoteParameters &a, int section); | void pasteArray(ADnoteParameters &a, int section); | ||||
@@ -317,8 +317,8 @@ class ADnoteParameters:public PresetsArray | |||||
float getUnisonFrequencySpreadCents(int nvoice) const; | float getUnisonFrequencySpreadCents(int nvoice) const; | ||||
static const rtosc::Ports &ports; | static const rtosc::Ports &ports; | ||||
void defaults(int n); //n is the nvoice | void defaults(int n); //n is the nvoice | ||||
void add2XMLsection(XMLwrapper *xml, int n); | |||||
void getfromXMLsection(XMLwrapper *xml, int n); | |||||
void add2XMLsection(XMLwrapper& xml, int n); | |||||
void getfromXMLsection(XMLwrapper& xml, int n); | |||||
private: | private: | ||||
void EnableVoice(const SYNTH_T &synth, int nvoice); | void EnableVoice(const SYNTH_T &synth, int nvoice); | ||||
@@ -384,90 +384,90 @@ void Controller::setparameternumber(unsigned int type, int value) | |||||
void Controller::add2XML(XMLwrapper *xml) | |||||
void Controller::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addpar("pitchwheel_bendrange", pitchwheel.bendrange); | |||||
xml->addpar("pitchwheel_bendrange_down", pitchwheel.bendrange_down); | |||||
xml->addparbool("pitchwheel_split", pitchwheel.is_split); | |||||
xml->addparbool("expression_receive", expression.receive); | |||||
xml->addpar("panning_depth", panning.depth); | |||||
xml->addpar("filter_cutoff_depth", filtercutoff.depth); | |||||
xml->addpar("filter_q_depth", filterq.depth); | |||||
xml->addpar("bandwidth_depth", bandwidth.depth); | |||||
xml->addpar("mod_wheel_depth", modwheel.depth); | |||||
xml->addparbool("mod_wheel_exponential", modwheel.exponential); | |||||
xml->addparbool("fm_amp_receive", fmamp.receive); | |||||
xml->addparbool("volume_receive", volume.receive); | |||||
xml->addparbool("sustain_receive", sustain.receive); | |||||
xml->addparbool("portamento_receive", portamento.receive); | |||||
xml->addpar("portamento_time", portamento.time); | |||||
xml->addpar("portamento_pitchthresh", portamento.pitchthresh); | |||||
xml->addpar("portamento_pitchthreshtype", portamento.pitchthreshtype); | |||||
xml->addpar("portamento_portamento", portamento.portamento); | |||||
xml->addpar("portamento_updowntimestretch", portamento.updowntimestretch); | |||||
xml->addpar("portamento_proportional", portamento.proportional); | |||||
xml->addpar("portamento_proprate", portamento.propRate); | |||||
xml->addpar("portamento_propdepth", portamento.propDepth); | |||||
xml->addpar("resonance_center_depth", resonancecenter.depth); | |||||
xml->addpar("resonance_bandwidth_depth", resonancebandwidth.depth); | |||||
xml.addpar("pitchwheel_bendrange", pitchwheel.bendrange); | |||||
xml.addpar("pitchwheel_bendrange_down", pitchwheel.bendrange_down); | |||||
xml.addparbool("pitchwheel_split", pitchwheel.is_split); | |||||
xml.addparbool("expression_receive", expression.receive); | |||||
xml.addpar("panning_depth", panning.depth); | |||||
xml.addpar("filter_cutoff_depth", filtercutoff.depth); | |||||
xml.addpar("filter_q_depth", filterq.depth); | |||||
xml.addpar("bandwidth_depth", bandwidth.depth); | |||||
xml.addpar("mod_wheel_depth", modwheel.depth); | |||||
xml.addparbool("mod_wheel_exponential", modwheel.exponential); | |||||
xml.addparbool("fm_amp_receive", fmamp.receive); | |||||
xml.addparbool("volume_receive", volume.receive); | |||||
xml.addparbool("sustain_receive", sustain.receive); | |||||
xml.addparbool("portamento_receive", portamento.receive); | |||||
xml.addpar("portamento_time", portamento.time); | |||||
xml.addpar("portamento_pitchthresh", portamento.pitchthresh); | |||||
xml.addpar("portamento_pitchthreshtype", portamento.pitchthreshtype); | |||||
xml.addpar("portamento_portamento", portamento.portamento); | |||||
xml.addpar("portamento_updowntimestretch", portamento.updowntimestretch); | |||||
xml.addpar("portamento_proportional", portamento.proportional); | |||||
xml.addpar("portamento_proprate", portamento.propRate); | |||||
xml.addpar("portamento_propdepth", portamento.propDepth); | |||||
xml.addpar("resonance_center_depth", resonancecenter.depth); | |||||
xml.addpar("resonance_bandwidth_depth", resonancebandwidth.depth); | |||||
} | } | ||||
void Controller::getfromXML(XMLwrapper *xml) | |||||
void Controller::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
pitchwheel.bendrange = xml->getpar("pitchwheel_bendrange", | |||||
pitchwheel.bendrange = xml.getpar("pitchwheel_bendrange", | |||||
pitchwheel.bendrange, | pitchwheel.bendrange, | ||||
-6400, | -6400, | ||||
6400); | 6400); | ||||
pitchwheel.bendrange_down = xml->getpar("pitchwheel_bendrange_down", | |||||
pitchwheel.bendrange_down = xml.getpar("pitchwheel_bendrange_down", | |||||
pitchwheel.bendrange_down, | pitchwheel.bendrange_down, | ||||
-6400, | -6400, | ||||
6400); | 6400); | ||||
pitchwheel.is_split = xml->getparbool("pitchwheel_split", | |||||
pitchwheel.is_split = xml.getparbool("pitchwheel_split", | |||||
pitchwheel.is_split); | pitchwheel.is_split); | ||||
expression.receive = xml->getparbool("expression_receive", | |||||
expression.receive = xml.getparbool("expression_receive", | |||||
expression.receive); | expression.receive); | ||||
panning.depth = xml->getpar127("panning_depth", panning.depth); | |||||
filtercutoff.depth = xml->getpar127("filter_cutoff_depth", | |||||
panning.depth = xml.getpar127("panning_depth", panning.depth); | |||||
filtercutoff.depth = xml.getpar127("filter_cutoff_depth", | |||||
filtercutoff.depth); | filtercutoff.depth); | ||||
filterq.depth = xml->getpar127("filter_q_depth", filterq.depth); | |||||
bandwidth.depth = xml->getpar127("bandwidth_depth", bandwidth.depth); | |||||
modwheel.depth = xml->getpar127("mod_wheel_depth", modwheel.depth); | |||||
modwheel.exponential = xml->getparbool("mod_wheel_exponential", | |||||
filterq.depth = xml.getpar127("filter_q_depth", filterq.depth); | |||||
bandwidth.depth = xml.getpar127("bandwidth_depth", bandwidth.depth); | |||||
modwheel.depth = xml.getpar127("mod_wheel_depth", modwheel.depth); | |||||
modwheel.exponential = xml.getparbool("mod_wheel_exponential", | |||||
modwheel.exponential); | modwheel.exponential); | ||||
fmamp.receive = xml->getparbool("fm_amp_receive", | |||||
fmamp.receive = xml.getparbool("fm_amp_receive", | |||||
fmamp.receive); | fmamp.receive); | ||||
volume.receive = xml->getparbool("volume_receive", | |||||
volume.receive = xml.getparbool("volume_receive", | |||||
volume.receive); | volume.receive); | ||||
sustain.receive = xml->getparbool("sustain_receive", | |||||
sustain.receive = xml.getparbool("sustain_receive", | |||||
sustain.receive); | sustain.receive); | ||||
portamento.receive = xml->getparbool("portamento_receive", | |||||
portamento.receive = xml.getparbool("portamento_receive", | |||||
portamento.receive); | portamento.receive); | ||||
portamento.time = xml->getpar127("portamento_time", | |||||
portamento.time = xml.getpar127("portamento_time", | |||||
portamento.time); | portamento.time); | ||||
portamento.pitchthresh = xml->getpar127("portamento_pitchthresh", | |||||
portamento.pitchthresh = xml.getpar127("portamento_pitchthresh", | |||||
portamento.pitchthresh); | portamento.pitchthresh); | ||||
portamento.pitchthreshtype = xml->getpar127("portamento_pitchthreshtype", | |||||
portamento.pitchthreshtype = xml.getpar127("portamento_pitchthreshtype", | |||||
portamento.pitchthreshtype); | portamento.pitchthreshtype); | ||||
portamento.portamento = xml->getpar127("portamento_portamento", | |||||
portamento.portamento = xml.getpar127("portamento_portamento", | |||||
portamento.portamento); | portamento.portamento); | ||||
portamento.updowntimestretch = xml->getpar127( | |||||
portamento.updowntimestretch = xml.getpar127( | |||||
"portamento_updowntimestretch", | "portamento_updowntimestretch", | ||||
portamento.updowntimestretch); | portamento.updowntimestretch); | ||||
portamento.proportional = xml->getpar127("portamento_proportional", | |||||
portamento.proportional = xml.getpar127("portamento_proportional", | |||||
portamento.proportional); | portamento.proportional); | ||||
portamento.propRate = xml->getpar127("portamento_proprate", | |||||
portamento.propRate = xml.getpar127("portamento_proprate", | |||||
portamento.propRate); | portamento.propRate); | ||||
portamento.propDepth = xml->getpar127("portamento_propdepth", | |||||
portamento.propDepth = xml.getpar127("portamento_propdepth", | |||||
portamento.propDepth); | portamento.propDepth); | ||||
resonancecenter.depth = xml->getpar127("resonance_center_depth", | |||||
resonancecenter.depth = xml.getpar127("resonance_center_depth", | |||||
resonancecenter.depth); | resonancecenter.depth); | ||||
resonancebandwidth.depth = xml->getpar127("resonance_bandwidth_depth", | |||||
resonancebandwidth.depth = xml.getpar127("resonance_bandwidth_depth", | |||||
resonancebandwidth.depth); | resonancebandwidth.depth); | ||||
} | } |
@@ -35,9 +35,9 @@ class Controller | |||||
~Controller(); | ~Controller(); | ||||
void resetall(); | void resetall(); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void defaults(); | void defaults(); | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
//Controllers functions | //Controllers functions | ||||
void setpitchwheel(int value); | void setpitchwheel(int value); | ||||
@@ -304,58 +304,58 @@ void EnvelopeParams::converttofree() | |||||
void EnvelopeParams::add2XML(XMLwrapper *xml) | |||||
void EnvelopeParams::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addparbool("free_mode", Pfreemode); | |||||
xml->addpar("env_points", Penvpoints); | |||||
xml->addpar("env_sustain", Penvsustain); | |||||
xml->addpar("env_stretch", Penvstretch); | |||||
xml->addparbool("forced_release", Pforcedrelease); | |||||
xml->addparbool("linear_envelope", Plinearenvelope); | |||||
xml->addpar("A_dt", PA_dt); | |||||
xml->addpar("D_dt", PD_dt); | |||||
xml->addpar("R_dt", PR_dt); | |||||
xml->addpar("A_val", PA_val); | |||||
xml->addpar("D_val", PD_val); | |||||
xml->addpar("S_val", PS_val); | |||||
xml->addpar("R_val", PR_val); | |||||
if((Pfreemode != 0) || (!xml->minimal)) | |||||
xml.addparbool("free_mode", Pfreemode); | |||||
xml.addpar("env_points", Penvpoints); | |||||
xml.addpar("env_sustain", Penvsustain); | |||||
xml.addpar("env_stretch", Penvstretch); | |||||
xml.addparbool("forced_release", Pforcedrelease); | |||||
xml.addparbool("linear_envelope", Plinearenvelope); | |||||
xml.addpar("A_dt", PA_dt); | |||||
xml.addpar("D_dt", PD_dt); | |||||
xml.addpar("R_dt", PR_dt); | |||||
xml.addpar("A_val", PA_val); | |||||
xml.addpar("D_val", PD_val); | |||||
xml.addpar("S_val", PS_val); | |||||
xml.addpar("R_val", PR_val); | |||||
if((Pfreemode != 0) || (!xml.minimal)) | |||||
for(int i = 0; i < Penvpoints; ++i) { | for(int i = 0; i < Penvpoints; ++i) { | ||||
xml->beginbranch("POINT", i); | |||||
xml.beginbranch("POINT", i); | |||||
if(i != 0) | if(i != 0) | ||||
xml->addpar("dt", Penvdt[i]); | |||||
xml->addpar("val", Penvval[i]); | |||||
xml->endbranch(); | |||||
xml.addpar("dt", Penvdt[i]); | |||||
xml.addpar("val", Penvval[i]); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
void EnvelopeParams::getfromXML(XMLwrapper *xml) | |||||
void EnvelopeParams::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
Pfreemode = xml->getparbool("free_mode", Pfreemode); | |||||
Penvpoints = xml->getpar127("env_points", Penvpoints); | |||||
Penvsustain = xml->getpar127("env_sustain", Penvsustain); | |||||
Penvstretch = xml->getpar127("env_stretch", Penvstretch); | |||||
Pforcedrelease = xml->getparbool("forced_release", Pforcedrelease); | |||||
Plinearenvelope = xml->getparbool("linear_envelope", Plinearenvelope); | |||||
PA_dt = xml->getpar127("A_dt", PA_dt); | |||||
PD_dt = xml->getpar127("D_dt", PD_dt); | |||||
PR_dt = xml->getpar127("R_dt", PR_dt); | |||||
PA_val = xml->getpar127("A_val", PA_val); | |||||
PD_val = xml->getpar127("D_val", PD_val); | |||||
PS_val = xml->getpar127("S_val", PS_val); | |||||
PR_val = xml->getpar127("R_val", PR_val); | |||||
Pfreemode = xml.getparbool("free_mode", Pfreemode); | |||||
Penvpoints = xml.getpar127("env_points", Penvpoints); | |||||
Penvsustain = xml.getpar127("env_sustain", Penvsustain); | |||||
Penvstretch = xml.getpar127("env_stretch", Penvstretch); | |||||
Pforcedrelease = xml.getparbool("forced_release", Pforcedrelease); | |||||
Plinearenvelope = xml.getparbool("linear_envelope", Plinearenvelope); | |||||
PA_dt = xml.getpar127("A_dt", PA_dt); | |||||
PD_dt = xml.getpar127("D_dt", PD_dt); | |||||
PR_dt = xml.getpar127("R_dt", PR_dt); | |||||
PA_val = xml.getpar127("A_val", PA_val); | |||||
PD_val = xml.getpar127("D_val", PD_val); | |||||
PS_val = xml.getpar127("S_val", PS_val); | |||||
PR_val = xml.getpar127("R_val", PR_val); | |||||
for(int i = 0; i < Penvpoints; ++i) { | for(int i = 0; i < Penvpoints; ++i) { | ||||
if(xml->enterbranch("POINT", i) == 0) | |||||
if(xml.enterbranch("POINT", i) == 0) | |||||
continue; | continue; | ||||
if(i != 0) | if(i != 0) | ||||
Penvdt[i] = xml->getpar127("dt", Penvdt[i]); | |||||
Penvval[i] = xml->getpar127("val", Penvval[i]); | |||||
xml->exitbranch(); | |||||
Penvdt[i] = xml.getpar127("dt", Penvdt[i]); | |||||
Penvval[i] = xml.getpar127("val", Penvval[i]); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(!Pfreemode) | if(!Pfreemode) | ||||
@@ -46,9 +46,9 @@ class EnvelopeParams:public Presets | |||||
void ASRinit_bw(char A_val, char A_dt, char R_val, char R_dt); | void ASRinit_bw(char A_val, char A_dt, char R_val, char R_dt); | ||||
void converttofree(); | void converttofree(); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void defaults(); | void defaults(); | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
float getdt(char i) const; | float getdt(char i) const; | ||||
static float dt(char val); | static float dt(char val); | ||||
@@ -309,114 +309,114 @@ float FilterParams::getformantq(unsigned char q) | |||||
void FilterParams::add2XMLsection(XMLwrapper *xml, int n) | |||||
void FilterParams::add2XMLsection(XMLwrapper& xml, int n) | |||||
{ | { | ||||
int nvowel = n; | int nvowel = n; | ||||
for(int nformant = 0; nformant < FF_MAX_FORMANTS; ++nformant) { | for(int nformant = 0; nformant < FF_MAX_FORMANTS; ++nformant) { | ||||
xml->beginbranch("FORMANT", nformant); | |||||
xml->addpar("freq", Pvowels[nvowel].formants[nformant].freq); | |||||
xml->addpar("amp", Pvowels[nvowel].formants[nformant].amp); | |||||
xml->addpar("q", Pvowels[nvowel].formants[nformant].q); | |||||
xml->endbranch(); | |||||
xml.beginbranch("FORMANT", nformant); | |||||
xml.addpar("freq", Pvowels[nvowel].formants[nformant].freq); | |||||
xml.addpar("amp", Pvowels[nvowel].formants[nformant].amp); | |||||
xml.addpar("q", Pvowels[nvowel].formants[nformant].q); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
void FilterParams::add2XML(XMLwrapper *xml) | |||||
void FilterParams::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
//filter parameters | //filter parameters | ||||
xml->addpar("category", Pcategory); | |||||
xml->addpar("type", Ptype); | |||||
xml->addpar("freq", Pfreq); | |||||
xml->addpar("q", Pq); | |||||
xml->addpar("stages", Pstages); | |||||
xml->addpar("freq_track", Pfreqtrack); | |||||
xml->addpar("gain", Pgain); | |||||
xml.addpar("category", Pcategory); | |||||
xml.addpar("type", Ptype); | |||||
xml.addpar("freq", Pfreq); | |||||
xml.addpar("q", Pq); | |||||
xml.addpar("stages", Pstages); | |||||
xml.addpar("freq_track", Pfreqtrack); | |||||
xml.addpar("gain", Pgain); | |||||
//formant filter parameters | //formant filter parameters | ||||
if((Pcategory == 1) || (!xml->minimal)) { | |||||
xml->beginbranch("FORMANT_FILTER"); | |||||
xml->addpar("num_formants", Pnumformants); | |||||
xml->addpar("formant_slowness", Pformantslowness); | |||||
xml->addpar("vowel_clearness", Pvowelclearness); | |||||
xml->addpar("center_freq", Pcenterfreq); | |||||
xml->addpar("octaves_freq", Poctavesfreq); | |||||
if((Pcategory == 1) || (!xml.minimal)) { | |||||
xml.beginbranch("FORMANT_FILTER"); | |||||
xml.addpar("num_formants", Pnumformants); | |||||
xml.addpar("formant_slowness", Pformantslowness); | |||||
xml.addpar("vowel_clearness", Pvowelclearness); | |||||
xml.addpar("center_freq", Pcenterfreq); | |||||
xml.addpar("octaves_freq", Poctavesfreq); | |||||
for(int nvowel = 0; nvowel < FF_MAX_VOWELS; ++nvowel) { | for(int nvowel = 0; nvowel < FF_MAX_VOWELS; ++nvowel) { | ||||
xml->beginbranch("VOWEL", nvowel); | |||||
xml.beginbranch("VOWEL", nvowel); | |||||
add2XMLsection(xml, nvowel); | add2XMLsection(xml, nvowel); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->addpar("sequence_size", Psequencesize); | |||||
xml->addpar("sequence_stretch", Psequencestretch); | |||||
xml->addparbool("sequence_reversed", Psequencereversed); | |||||
xml.addpar("sequence_size", Psequencesize); | |||||
xml.addpar("sequence_stretch", Psequencestretch); | |||||
xml.addparbool("sequence_reversed", Psequencereversed); | |||||
for(int nseq = 0; nseq < FF_MAX_SEQUENCE; ++nseq) { | for(int nseq = 0; nseq < FF_MAX_SEQUENCE; ++nseq) { | ||||
xml->beginbranch("SEQUENCE_POS", nseq); | |||||
xml->addpar("vowel_id", Psequence[nseq].nvowel); | |||||
xml->endbranch(); | |||||
xml.beginbranch("SEQUENCE_POS", nseq); | |||||
xml.addpar("vowel_id", Psequence[nseq].nvowel); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
void FilterParams::getfromXMLsection(XMLwrapper *xml, int n) | |||||
void FilterParams::getfromXMLsection(XMLwrapper& xml, int n) | |||||
{ | { | ||||
int nvowel = n; | int nvowel = n; | ||||
for(int nformant = 0; nformant < FF_MAX_FORMANTS; ++nformant) { | for(int nformant = 0; nformant < FF_MAX_FORMANTS; ++nformant) { | ||||
if(xml->enterbranch("FORMANT", nformant) == 0) | |||||
if(xml.enterbranch("FORMANT", nformant) == 0) | |||||
continue; | continue; | ||||
Pvowels[nvowel].formants[nformant].freq = xml->getpar127( | |||||
Pvowels[nvowel].formants[nformant].freq = xml.getpar127( | |||||
"freq", | "freq", | ||||
Pvowels[nvowel | Pvowels[nvowel | ||||
].formants[nformant].freq); | ].formants[nformant].freq); | ||||
Pvowels[nvowel].formants[nformant].amp = xml->getpar127( | |||||
Pvowels[nvowel].formants[nformant].amp = xml.getpar127( | |||||
"amp", | "amp", | ||||
Pvowels[nvowel | Pvowels[nvowel | ||||
].formants[nformant].amp); | ].formants[nformant].amp); | ||||
Pvowels[nvowel].formants[nformant].q = | Pvowels[nvowel].formants[nformant].q = | ||||
xml->getpar127("q", Pvowels[nvowel].formants[nformant].q); | |||||
xml->exitbranch(); | |||||
xml.getpar127("q", Pvowels[nvowel].formants[nformant].q); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } | ||||
void FilterParams::getfromXML(XMLwrapper *xml) | |||||
void FilterParams::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
//filter parameters | //filter parameters | ||||
Pcategory = xml->getpar127("category", Pcategory); | |||||
Ptype = xml->getpar127("type", Ptype); | |||||
Pfreq = xml->getpar127("freq", Pfreq); | |||||
Pq = xml->getpar127("q", Pq); | |||||
Pstages = xml->getpar127("stages", Pstages); | |||||
Pfreqtrack = xml->getpar127("freq_track", Pfreqtrack); | |||||
Pgain = xml->getpar127("gain", Pgain); | |||||
Pcategory = xml.getpar127("category", Pcategory); | |||||
Ptype = xml.getpar127("type", Ptype); | |||||
Pfreq = xml.getpar127("freq", Pfreq); | |||||
Pq = xml.getpar127("q", Pq); | |||||
Pstages = xml.getpar127("stages", Pstages); | |||||
Pfreqtrack = xml.getpar127("freq_track", Pfreqtrack); | |||||
Pgain = xml.getpar127("gain", Pgain); | |||||
//formant filter parameters | //formant filter parameters | ||||
if(xml->enterbranch("FORMANT_FILTER")) { | |||||
Pnumformants = xml->getpar127("num_formants", Pnumformants); | |||||
Pformantslowness = xml->getpar127("formant_slowness", Pformantslowness); | |||||
Pvowelclearness = xml->getpar127("vowel_clearness", Pvowelclearness); | |||||
Pcenterfreq = xml->getpar127("center_freq", Pcenterfreq); | |||||
Poctavesfreq = xml->getpar127("octaves_freq", Poctavesfreq); | |||||
if(xml.enterbranch("FORMANT_FILTER")) { | |||||
Pnumformants = xml.getpar127("num_formants", Pnumformants); | |||||
Pformantslowness = xml.getpar127("formant_slowness", Pformantslowness); | |||||
Pvowelclearness = xml.getpar127("vowel_clearness", Pvowelclearness); | |||||
Pcenterfreq = xml.getpar127("center_freq", Pcenterfreq); | |||||
Poctavesfreq = xml.getpar127("octaves_freq", Poctavesfreq); | |||||
for(int nvowel = 0; nvowel < FF_MAX_VOWELS; ++nvowel) { | for(int nvowel = 0; nvowel < FF_MAX_VOWELS; ++nvowel) { | ||||
if(xml->enterbranch("VOWEL", nvowel) == 0) | |||||
if(xml.enterbranch("VOWEL", nvowel) == 0) | |||||
continue; | continue; | ||||
getfromXMLsection(xml, nvowel); | getfromXMLsection(xml, nvowel); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
Psequencesize = xml->getpar127("sequence_size", Psequencesize); | |||||
Psequencestretch = xml->getpar127("sequence_stretch", Psequencestretch); | |||||
Psequencereversed = xml->getparbool("sequence_reversed", | |||||
Psequencesize = xml.getpar127("sequence_size", Psequencesize); | |||||
Psequencestretch = xml.getpar127("sequence_stretch", Psequencestretch); | |||||
Psequencereversed = xml.getparbool("sequence_reversed", | |||||
Psequencereversed); | Psequencereversed); | ||||
for(int nseq = 0; nseq < FF_MAX_SEQUENCE; ++nseq) { | for(int nseq = 0; nseq < FF_MAX_SEQUENCE; ++nseq) { | ||||
if(xml->enterbranch("SEQUENCE_POS", nseq) == 0) | |||||
if(xml.enterbranch("SEQUENCE_POS", nseq) == 0) | |||||
continue; | continue; | ||||
Psequence[nseq].nvowel = xml->getpar("vowel_id", | |||||
Psequence[nseq].nvowel = xml.getpar("vowel_id", | |||||
Psequence[nseq].nvowel, | Psequence[nseq].nvowel, | ||||
0, | 0, | ||||
FF_MAX_VOWELS - 1); | FF_MAX_VOWELS - 1); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } | ||||
@@ -36,11 +36,11 @@ class FilterParams:public PresetsArray | |||||
unsigned char Pq_); | unsigned char Pq_); | ||||
~FilterParams(); | ~FilterParams(); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XMLsection(XMLwrapper *xml, int n); | |||||
void add2XML(XMLwrapper& xml); | |||||
void add2XMLsection(XMLwrapper& xml, int n); | |||||
void defaults(); | void defaults(); | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXMLsection(XMLwrapper *xml, int n); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void getfromXMLsection(XMLwrapper& xml, int n); | |||||
void paste(FilterParams &); | void paste(FilterParams &); | ||||
void pasteArray(FilterParams &, int section); | void pasteArray(FilterParams &, int section); | ||||
@@ -116,30 +116,30 @@ void LFOParams::defaults() | |||||
} | } | ||||
void LFOParams::add2XML(XMLwrapper *xml) | |||||
void LFOParams::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addparreal("freq", Pfreq); | |||||
xml->addpar("intensity", Pintensity); | |||||
xml->addpar("start_phase", Pstartphase); | |||||
xml->addpar("lfo_type", PLFOtype); | |||||
xml->addpar("randomness_amplitude", Prandomness); | |||||
xml->addpar("randomness_frequency", Pfreqrand); | |||||
xml->addpar("delay", Pdelay); | |||||
xml->addpar("stretch", Pstretch); | |||||
xml->addparbool("continous", Pcontinous); | |||||
xml.addparreal("freq", Pfreq); | |||||
xml.addpar("intensity", Pintensity); | |||||
xml.addpar("start_phase", Pstartphase); | |||||
xml.addpar("lfo_type", PLFOtype); | |||||
xml.addpar("randomness_amplitude", Prandomness); | |||||
xml.addpar("randomness_frequency", Pfreqrand); | |||||
xml.addpar("delay", Pdelay); | |||||
xml.addpar("stretch", Pstretch); | |||||
xml.addparbool("continous", Pcontinous); | |||||
} | } | ||||
void LFOParams::getfromXML(XMLwrapper *xml) | |||||
void LFOParams::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
Pfreq = xml->getparreal("freq", Pfreq, 0.0f, 1.0f); | |||||
Pintensity = xml->getpar127("intensity", Pintensity); | |||||
Pstartphase = xml->getpar127("start_phase", Pstartphase); | |||||
PLFOtype = xml->getpar127("lfo_type", PLFOtype); | |||||
Prandomness = xml->getpar127("randomness_amplitude", Prandomness); | |||||
Pfreqrand = xml->getpar127("randomness_frequency", Pfreqrand); | |||||
Pdelay = xml->getpar127("delay", Pdelay); | |||||
Pstretch = xml->getpar127("stretch", Pstretch); | |||||
Pcontinous = xml->getparbool("continous", Pcontinous); | |||||
Pfreq = xml.getparreal("freq", Pfreq, 0.0f, 1.0f); | |||||
Pintensity = xml.getpar127("intensity", Pintensity); | |||||
Pstartphase = xml.getpar127("start_phase", Pstartphase); | |||||
PLFOtype = xml.getpar127("lfo_type", PLFOtype); | |||||
Prandomness = xml.getpar127("randomness_amplitude", Prandomness); | |||||
Pfreqrand = xml.getpar127("randomness_frequency", Pfreqrand); | |||||
Pdelay = xml.getpar127("delay", Pdelay); | |||||
Pstretch = xml.getpar127("stretch", Pstretch); | |||||
Pcontinous = xml.getparbool("continous", Pcontinous); | |||||
} | } | ||||
#define COPY(y) this->y=x.y | #define COPY(y) this->y=x.y | ||||
@@ -50,10 +50,10 @@ class LFOParams:public Presets | |||||
char fel_); | char fel_); | ||||
~LFOParams(); | ~LFOParams(); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void defaults(); | void defaults(); | ||||
/**Loads the LFO from the xml*/ | /**Loads the LFO from the xml*/ | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void paste(LFOParams &); | void paste(LFOParams &); | ||||
/* MIDI Parameters*/ | /* MIDI Parameters*/ | ||||
@@ -35,7 +35,7 @@ using namespace rtosc; | |||||
#define rObject PADnoteParameters | #define rObject PADnoteParameters | ||||
static const rtosc::Ports realtime_ports = | |||||
static const rtosc::Ports realtime_ports = | |||||
{ | { | ||||
rRecurp(FreqLfo, "Frequency LFO"), | rRecurp(FreqLfo, "Frequency LFO"), | ||||
rRecurp(AmpLfo, "Amplitude LFO"), | rRecurp(AmpLfo, "Amplitude LFO"), | ||||
@@ -119,10 +119,24 @@ static const rtosc::Ports realtime_ports = | |||||
obj->PCoarseDetune = k + (obj->PCoarseDetune/1024)*1024; | obj->PCoarseDetune = k + (obj->PCoarseDetune/1024)*1024; | ||||
} | } | ||||
}}, | }}, | ||||
{"paste:b", rProp(internal) rDoc("paste port"), 0, | |||||
[](const char *m, rtosc::RtData &d){ | |||||
rObject &paste = **(rObject **)rtosc_argument(m,0).b.data; | |||||
rObject &o = *(rObject*)d.obj; | |||||
o.pasteRT(paste);}} | |||||
}; | }; | ||||
static const rtosc::Ports non_realtime_ports = | static const rtosc::Ports non_realtime_ports = | ||||
{ | { | ||||
rSelf(PADnoteParameters), | |||||
rPresetType, | |||||
{"paste:b", rProp(internal) rDoc("paste port"), 0, | |||||
[](const char *m, rtosc::RtData &d){ | |||||
rObject &paste = **(rObject **)rtosc_argument(m,0).b.data; | |||||
rObject &o = *(rObject*)d.obj; | |||||
o.paste(paste); | |||||
//avoid the match to forward the request along | |||||
d.matches--;}}, | |||||
//Harmonic Source Distribution | //Harmonic Source Distribution | ||||
rRecurp(oscilgen, "Oscillator"), | rRecurp(oscilgen, "Oscillator"), | ||||
rRecurp(resonance, "Resonance"), | rRecurp(resonance, "Resonance"), | ||||
@@ -227,8 +241,8 @@ const rtosc::Ports &PADnoteParameters::realtime_ports = ::realtime_ports; | |||||
const rtosc::MergePorts PADnoteParameters::ports = | const rtosc::MergePorts PADnoteParameters::ports = | ||||
{ | { | ||||
&non_realtime_ports, | |||||
&realtime_ports | |||||
&realtime_ports, | |||||
&non_realtime_ports | |||||
}; | }; | ||||
@@ -901,221 +915,294 @@ void PADnoteParameters::export2wav(std::string basefilename) | |||||
} | } | ||||
} | } | ||||
void PADnoteParameters::add2XML(XMLwrapper *xml) | |||||
void PADnoteParameters::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->setPadSynth(true); | |||||
xml->addparbool("stereo", PStereo); | |||||
xml->addpar("mode", Pmode); | |||||
xml->addpar("bandwidth", Pbandwidth); | |||||
xml->addpar("bandwidth_scale", Pbwscale); | |||||
xml->beginbranch("HARMONIC_PROFILE"); | |||||
xml->addpar("base_type", Php.base.type); | |||||
xml->addpar("base_par1", Php.base.par1); | |||||
xml->addpar("frequency_multiplier", Php.freqmult); | |||||
xml->addpar("modulator_par1", Php.modulator.par1); | |||||
xml->addpar("modulator_frequency", Php.modulator.freq); | |||||
xml->addpar("width", Php.width); | |||||
xml->addpar("amplitude_multiplier_type", Php.amp.type); | |||||
xml->addpar("amplitude_multiplier_mode", Php.amp.mode); | |||||
xml->addpar("amplitude_multiplier_par1", Php.amp.par1); | |||||
xml->addpar("amplitude_multiplier_par2", Php.amp.par2); | |||||
xml->addparbool("autoscale", Php.autoscale); | |||||
xml->addpar("one_half", Php.onehalf); | |||||
xml->endbranch(); | |||||
xml->beginbranch("OSCIL"); | |||||
xml.setPadSynth(true); | |||||
xml.addparbool("stereo", PStereo); | |||||
xml.addpar("mode", Pmode); | |||||
xml.addpar("bandwidth", Pbandwidth); | |||||
xml.addpar("bandwidth_scale", Pbwscale); | |||||
xml.beginbranch("HARMONIC_PROFILE"); | |||||
xml.addpar("base_type", Php.base.type); | |||||
xml.addpar("base_par1", Php.base.par1); | |||||
xml.addpar("frequency_multiplier", Php.freqmult); | |||||
xml.addpar("modulator_par1", Php.modulator.par1); | |||||
xml.addpar("modulator_frequency", Php.modulator.freq); | |||||
xml.addpar("width", Php.width); | |||||
xml.addpar("amplitude_multiplier_type", Php.amp.type); | |||||
xml.addpar("amplitude_multiplier_mode", Php.amp.mode); | |||||
xml.addpar("amplitude_multiplier_par1", Php.amp.par1); | |||||
xml.addpar("amplitude_multiplier_par2", Php.amp.par2); | |||||
xml.addparbool("autoscale", Php.autoscale); | |||||
xml.addpar("one_half", Php.onehalf); | |||||
xml.endbranch(); | |||||
xml.beginbranch("OSCIL"); | |||||
oscilgen->add2XML(xml); | oscilgen->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("RESONANCE"); | |||||
xml.beginbranch("RESONANCE"); | |||||
resonance->add2XML(xml); | resonance->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml->beginbranch("HARMONIC_POSITION"); | |||||
xml->addpar("type", Phrpos.type); | |||||
xml->addpar("parameter1", Phrpos.par1); | |||||
xml->addpar("parameter2", Phrpos.par2); | |||||
xml->addpar("parameter3", Phrpos.par3); | |||||
xml->endbranch(); | |||||
xml->beginbranch("SAMPLE_QUALITY"); | |||||
xml->addpar("samplesize", Pquality.samplesize); | |||||
xml->addpar("basenote", Pquality.basenote); | |||||
xml->addpar("octaves", Pquality.oct); | |||||
xml->addpar("samples_per_octave", Pquality.smpoct); | |||||
xml->endbranch(); | |||||
xml->beginbranch("AMPLITUDE_PARAMETERS"); | |||||
xml->addpar("volume", PVolume); | |||||
xml->addpar("panning", PPanning); | |||||
xml->addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||||
xml->addpar("fadein_adjustment", Fadein_adjustment); | |||||
xml->addpar("punch_strength", PPunchStrength); | |||||
xml->addpar("punch_time", PPunchTime); | |||||
xml->addpar("punch_stretch", PPunchStretch); | |||||
xml->addpar("punch_velocity_sensing", PPunchVelocitySensing); | |||||
xml->beginbranch("AMPLITUDE_ENVELOPE"); | |||||
xml.endbranch(); | |||||
xml.beginbranch("HARMONIC_POSITION"); | |||||
xml.addpar("type", Phrpos.type); | |||||
xml.addpar("parameter1", Phrpos.par1); | |||||
xml.addpar("parameter2", Phrpos.par2); | |||||
xml.addpar("parameter3", Phrpos.par3); | |||||
xml.endbranch(); | |||||
xml.beginbranch("SAMPLE_QUALITY"); | |||||
xml.addpar("samplesize", Pquality.samplesize); | |||||
xml.addpar("basenote", Pquality.basenote); | |||||
xml.addpar("octaves", Pquality.oct); | |||||
xml.addpar("samples_per_octave", Pquality.smpoct); | |||||
xml.endbranch(); | |||||
xml.beginbranch("AMPLITUDE_PARAMETERS"); | |||||
xml.addpar("volume", PVolume); | |||||
xml.addpar("panning", PPanning); | |||||
xml.addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||||
xml.addpar("fadein_adjustment", Fadein_adjustment); | |||||
xml.addpar("punch_strength", PPunchStrength); | |||||
xml.addpar("punch_time", PPunchTime); | |||||
xml.addpar("punch_stretch", PPunchStretch); | |||||
xml.addpar("punch_velocity_sensing", PPunchVelocitySensing); | |||||
xml.beginbranch("AMPLITUDE_ENVELOPE"); | |||||
AmpEnvelope->add2XML(xml); | AmpEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("AMPLITUDE_LFO"); | |||||
xml.beginbranch("AMPLITUDE_LFO"); | |||||
AmpLfo->add2XML(xml); | AmpLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FREQUENCY_PARAMETERS"); | |||||
xml->addpar("fixed_freq", Pfixedfreq); | |||||
xml->addpar("fixed_freq_et", PfixedfreqET); | |||||
xml->addpar("detune", PDetune); | |||||
xml->addpar("coarse_detune", PCoarseDetune); | |||||
xml->addpar("detune_type", PDetuneType); | |||||
xml.beginbranch("FREQUENCY_PARAMETERS"); | |||||
xml.addpar("fixed_freq", Pfixedfreq); | |||||
xml.addpar("fixed_freq_et", PfixedfreqET); | |||||
xml.addpar("detune", PDetune); | |||||
xml.addpar("coarse_detune", PCoarseDetune); | |||||
xml.addpar("detune_type", PDetuneType); | |||||
xml->beginbranch("FREQUENCY_ENVELOPE"); | |||||
xml.beginbranch("FREQUENCY_ENVELOPE"); | |||||
FreqEnvelope->add2XML(xml); | FreqEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FREQUENCY_LFO"); | |||||
xml.beginbranch("FREQUENCY_LFO"); | |||||
FreqLfo->add2XML(xml); | FreqLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FILTER_PARAMETERS"); | |||||
xml->addpar("velocity_sensing_amplitude", PFilterVelocityScale); | |||||
xml->addpar("velocity_sensing", PFilterVelocityScaleFunction); | |||||
xml.beginbranch("FILTER_PARAMETERS"); | |||||
xml.addpar("velocity_sensing_amplitude", PFilterVelocityScale); | |||||
xml.addpar("velocity_sensing", PFilterVelocityScaleFunction); | |||||
xml->beginbranch("FILTER"); | |||||
xml.beginbranch("FILTER"); | |||||
GlobalFilter->add2XML(xml); | GlobalFilter->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FILTER_ENVELOPE"); | |||||
xml.beginbranch("FILTER_ENVELOPE"); | |||||
FilterEnvelope->add2XML(xml); | FilterEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FILTER_LFO"); | |||||
xml.beginbranch("FILTER_LFO"); | |||||
FilterLfo->add2XML(xml); | FilterLfo->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
void PADnoteParameters::getfromXML(XMLwrapper *xml) | |||||
void PADnoteParameters::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
PStereo = xml->getparbool("stereo", PStereo); | |||||
Pmode = xml->getpar127("mode", 0); | |||||
Pbandwidth = xml->getpar("bandwidth", Pbandwidth, 0, 1000); | |||||
Pbwscale = xml->getpar127("bandwidth_scale", Pbwscale); | |||||
if(xml->enterbranch("HARMONIC_PROFILE")) { | |||||
Php.base.type = xml->getpar127("base_type", Php.base.type); | |||||
Php.base.par1 = xml->getpar127("base_par1", Php.base.par1); | |||||
Php.freqmult = xml->getpar127("frequency_multiplier", | |||||
PStereo = xml.getparbool("stereo", PStereo); | |||||
Pmode = xml.getpar127("mode", 0); | |||||
Pbandwidth = xml.getpar("bandwidth", Pbandwidth, 0, 1000); | |||||
Pbwscale = xml.getpar127("bandwidth_scale", Pbwscale); | |||||
if(xml.enterbranch("HARMONIC_PROFILE")) { | |||||
Php.base.type = xml.getpar127("base_type", Php.base.type); | |||||
Php.base.par1 = xml.getpar127("base_par1", Php.base.par1); | |||||
Php.freqmult = xml.getpar127("frequency_multiplier", | |||||
Php.freqmult); | Php.freqmult); | ||||
Php.modulator.par1 = xml->getpar127("modulator_par1", | |||||
Php.modulator.par1 = xml.getpar127("modulator_par1", | |||||
Php.modulator.par1); | Php.modulator.par1); | ||||
Php.modulator.freq = xml->getpar127("modulator_frequency", | |||||
Php.modulator.freq = xml.getpar127("modulator_frequency", | |||||
Php.modulator.freq); | Php.modulator.freq); | ||||
Php.width = xml->getpar127("width", Php.width); | |||||
Php.amp.type = xml->getpar127("amplitude_multiplier_type", | |||||
Php.width = xml.getpar127("width", Php.width); | |||||
Php.amp.type = xml.getpar127("amplitude_multiplier_type", | |||||
Php.amp.type); | Php.amp.type); | ||||
Php.amp.mode = xml->getpar127("amplitude_multiplier_mode", | |||||
Php.amp.mode = xml.getpar127("amplitude_multiplier_mode", | |||||
Php.amp.mode); | Php.amp.mode); | ||||
Php.amp.par1 = xml->getpar127("amplitude_multiplier_par1", | |||||
Php.amp.par1 = xml.getpar127("amplitude_multiplier_par1", | |||||
Php.amp.par1); | Php.amp.par1); | ||||
Php.amp.par2 = xml->getpar127("amplitude_multiplier_par2", | |||||
Php.amp.par2 = xml.getpar127("amplitude_multiplier_par2", | |||||
Php.amp.par2); | Php.amp.par2); | ||||
Php.autoscale = xml->getparbool("autoscale", Php.autoscale); | |||||
Php.onehalf = xml->getpar127("one_half", Php.onehalf); | |||||
xml->exitbranch(); | |||||
Php.autoscale = xml.getparbool("autoscale", Php.autoscale); | |||||
Php.onehalf = xml.getpar127("one_half", Php.onehalf); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("OSCIL")) { | |||||
if(xml.enterbranch("OSCIL")) { | |||||
oscilgen->getfromXML(xml); | oscilgen->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("RESONANCE")) { | |||||
if(xml.enterbranch("RESONANCE")) { | |||||
resonance->getfromXML(xml); | resonance->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("HARMONIC_POSITION")) { | |||||
Phrpos.type = xml->getpar127("type", Phrpos.type); | |||||
Phrpos.par1 = xml->getpar("parameter1", Phrpos.par1, 0, 255); | |||||
Phrpos.par2 = xml->getpar("parameter2", Phrpos.par2, 0, 255); | |||||
Phrpos.par3 = xml->getpar("parameter3", Phrpos.par3, 0, 255); | |||||
xml->exitbranch(); | |||||
if(xml.enterbranch("HARMONIC_POSITION")) { | |||||
Phrpos.type = xml.getpar127("type", Phrpos.type); | |||||
Phrpos.par1 = xml.getpar("parameter1", Phrpos.par1, 0, 255); | |||||
Phrpos.par2 = xml.getpar("parameter2", Phrpos.par2, 0, 255); | |||||
Phrpos.par3 = xml.getpar("parameter3", Phrpos.par3, 0, 255); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("SAMPLE_QUALITY")) { | |||||
Pquality.samplesize = xml->getpar127("samplesize", Pquality.samplesize); | |||||
Pquality.basenote = xml->getpar127("basenote", Pquality.basenote); | |||||
Pquality.oct = xml->getpar127("octaves", Pquality.oct); | |||||
Pquality.smpoct = xml->getpar127("samples_per_octave", | |||||
if(xml.enterbranch("SAMPLE_QUALITY")) { | |||||
Pquality.samplesize = xml.getpar127("samplesize", Pquality.samplesize); | |||||
Pquality.basenote = xml.getpar127("basenote", Pquality.basenote); | |||||
Pquality.oct = xml.getpar127("octaves", Pquality.oct); | |||||
Pquality.smpoct = xml.getpar127("samples_per_octave", | |||||
Pquality.smpoct); | Pquality.smpoct); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("AMPLITUDE_PARAMETERS")) { | |||||
PVolume = xml->getpar127("volume", PVolume); | |||||
PPanning = xml->getpar127("panning", PPanning); | |||||
PAmpVelocityScaleFunction = xml->getpar127("velocity_sensing", | |||||
if(xml.enterbranch("AMPLITUDE_PARAMETERS")) { | |||||
PVolume = xml.getpar127("volume", PVolume); | |||||
PPanning = xml.getpar127("panning", PPanning); | |||||
PAmpVelocityScaleFunction = xml.getpar127("velocity_sensing", | |||||
PAmpVelocityScaleFunction); | PAmpVelocityScaleFunction); | ||||
Fadein_adjustment = xml->getpar127("fadein_adjustment", Fadein_adjustment); | |||||
PPunchStrength = xml->getpar127("punch_strength", PPunchStrength); | |||||
PPunchTime = xml->getpar127("punch_time", PPunchTime); | |||||
PPunchStretch = xml->getpar127("punch_stretch", PPunchStretch); | |||||
PPunchVelocitySensing = xml->getpar127("punch_velocity_sensing", | |||||
Fadein_adjustment = xml.getpar127("fadein_adjustment", Fadein_adjustment); | |||||
PPunchStrength = xml.getpar127("punch_strength", PPunchStrength); | |||||
PPunchTime = xml.getpar127("punch_time", PPunchTime); | |||||
PPunchStretch = xml.getpar127("punch_stretch", PPunchStretch); | |||||
PPunchVelocitySensing = xml.getpar127("punch_velocity_sensing", | |||||
PPunchVelocitySensing); | PPunchVelocitySensing); | ||||
xml->enterbranch("AMPLITUDE_ENVELOPE"); | |||||
xml.enterbranch("AMPLITUDE_ENVELOPE"); | |||||
AmpEnvelope->getfromXML(xml); | AmpEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->enterbranch("AMPLITUDE_LFO"); | |||||
xml.enterbranch("AMPLITUDE_LFO"); | |||||
AmpLfo->getfromXML(xml); | AmpLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FREQUENCY_PARAMETERS")) { | |||||
Pfixedfreq = xml->getpar127("fixed_freq", Pfixedfreq); | |||||
PfixedfreqET = xml->getpar127("fixed_freq_et", PfixedfreqET); | |||||
PDetune = xml->getpar("detune", PDetune, 0, 16383); | |||||
PCoarseDetune = xml->getpar("coarse_detune", PCoarseDetune, 0, 16383); | |||||
PDetuneType = xml->getpar127("detune_type", PDetuneType); | |||||
if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | |||||
Pfixedfreq = xml.getpar127("fixed_freq", Pfixedfreq); | |||||
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | |||||
PDetune = xml.getpar("detune", PDetune, 0, 16383); | |||||
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | |||||
PDetuneType = xml.getpar127("detune_type", PDetuneType); | |||||
xml->enterbranch("FREQUENCY_ENVELOPE"); | |||||
xml.enterbranch("FREQUENCY_ENVELOPE"); | |||||
FreqEnvelope->getfromXML(xml); | FreqEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->enterbranch("FREQUENCY_LFO"); | |||||
xml.enterbranch("FREQUENCY_LFO"); | |||||
FreqLfo->getfromXML(xml); | FreqLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FILTER_PARAMETERS")) { | |||||
PFilterVelocityScale = xml->getpar127("velocity_sensing_amplitude", | |||||
if(xml.enterbranch("FILTER_PARAMETERS")) { | |||||
PFilterVelocityScale = xml.getpar127("velocity_sensing_amplitude", | |||||
PFilterVelocityScale); | PFilterVelocityScale); | ||||
PFilterVelocityScaleFunction = xml->getpar127( | |||||
PFilterVelocityScaleFunction = xml.getpar127( | |||||
"velocity_sensing", | "velocity_sensing", | ||||
PFilterVelocityScaleFunction); | PFilterVelocityScaleFunction); | ||||
xml->enterbranch("FILTER"); | |||||
xml.enterbranch("FILTER"); | |||||
GlobalFilter->getfromXML(xml); | GlobalFilter->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->enterbranch("FILTER_ENVELOPE"); | |||||
xml.enterbranch("FILTER_ENVELOPE"); | |||||
FilterEnvelope->getfromXML(xml); | FilterEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml->enterbranch("FILTER_LFO"); | |||||
xml.enterbranch("FILTER_LFO"); | |||||
FilterLfo->getfromXML(xml); | FilterLfo->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } | ||||
#define COPY(y) this->y = x.y | |||||
void PADnoteParameters::paste(PADnoteParameters &x) | |||||
{ | |||||
COPY(Pmode); | |||||
COPY(Php.base.type); | |||||
COPY(Php.base.par1); | |||||
COPY(Php.freqmult); | |||||
COPY(Php.modulator.par1); | |||||
COPY(Php.modulator.freq); | |||||
COPY(Php.width); | |||||
COPY(Php.amp.mode); | |||||
COPY(Php.amp.type); | |||||
COPY(Php.amp.par1); | |||||
COPY(Php.amp.par2); | |||||
COPY(Php.autoscale); | |||||
COPY(Php.onehalf); | |||||
COPY(Pbandwidth); | |||||
COPY(Pbwscale); | |||||
COPY(Phrpos.type); | |||||
COPY(Phrpos.par1); | |||||
COPY(Phrpos.par2); | |||||
COPY(Phrpos.par3); | |||||
COPY(Pquality.samplesize); | |||||
COPY(Pquality.basenote); | |||||
COPY(Pquality.oct); | |||||
COPY(Pquality.smpoct); | |||||
oscilgen->paste(*x.oscilgen); | |||||
resonance->paste(*x.resonance); | |||||
} | |||||
void PADnoteParameters::pasteRT(PADnoteParameters &x) | |||||
{ | |||||
//Realtime stuff | |||||
COPY(Pfixedfreq); | |||||
COPY(PfixedfreqET); | |||||
COPY(PDetune); | |||||
COPY(PCoarseDetune); | |||||
COPY(PDetuneType); | |||||
FreqEnvelope->paste(*x.FreqEnvelope); | |||||
FreqLfo->paste(*x.FreqLfo); | |||||
COPY(PStereo); | |||||
COPY(PPanning); | |||||
COPY(PVolume); | |||||
COPY(PAmpVelocityScaleFunction); | |||||
AmpEnvelope->paste(*x.AmpEnvelope); | |||||
AmpLfo->paste(*x.AmpLfo); | |||||
COPY(Fadein_adjustment); | |||||
COPY(PPunchStrength); | |||||
COPY(PPunchTime); | |||||
COPY(PPunchStretch); | |||||
COPY(PPunchVelocitySensing); | |||||
GlobalFilter->paste(*x.GlobalFilter); | |||||
COPY(PFilterVelocityScale); | |||||
COPY(PFilterVelocityScaleFunction); | |||||
FilterEnvelope->paste(*x.FilterEnvelope); | |||||
FilterLfo->paste(*x.FilterLfo); | |||||
} | |||||
#undef COPY |
@@ -46,8 +46,11 @@ class PADnoteParameters:public Presets | |||||
~PADnoteParameters(); | ~PADnoteParameters(); | ||||
void defaults(); | void defaults(); | ||||
void add2XML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void paste(PADnoteParameters &p); | |||||
void pasteRT(PADnoteParameters &p); | |||||
//returns a value between 0.0f-1.0f that represents the estimation perceived bandwidth | //returns a value between 0.0f-1.0f that represents the estimation perceived bandwidth | ||||
float getprofile(float *smp, int size); | float getprofile(float *smp, int size); | ||||
@@ -55,7 +55,7 @@ void Presets::copy(PresetsStore &ps, const char *name) | |||||
strcpy(type, "Plfo"); | strcpy(type, "Plfo"); | ||||
xml.beginbranch(type); | xml.beginbranch(type); | ||||
add2XML(&xml); | |||||
add2XML(xml); | |||||
xml.endbranch(); | xml.endbranch(); | ||||
if(name == NULL) | if(name == NULL) | ||||
@@ -44,7 +44,7 @@ class Presets | |||||
protected: | protected: | ||||
void setpresettype(const char *type); | void setpresettype(const char *type); | ||||
private: | private: | ||||
virtual void add2XML(XMLwrapper *xml) = 0; | |||||
virtual void add2XML(XMLwrapper& xml) = 0; | |||||
//virtual void getfromXML(XMLwrapper *xml) = 0; | //virtual void getfromXML(XMLwrapper *xml) = 0; | ||||
//virtual void defaults() = 0; | //virtual void defaults() = 0; | ||||
}; | }; | ||||
@@ -61,9 +61,9 @@ void PresetsArray::copy(PresetsStore &ps, int nelement, const char *name) | |||||
xml.beginbranch(type); | xml.beginbranch(type); | ||||
if(nelement == -1) | if(nelement == -1) | ||||
add2XML(&xml); | |||||
add2XML(xml); | |||||
else | else | ||||
add2XMLsection(&xml, nelement); | |||||
add2XMLsection(xml, nelement); | |||||
xml.endbranch(); | xml.endbranch(); | ||||
if(name == NULL) | if(name == NULL) | ||||
@@ -42,7 +42,7 @@ class PresetsArray:public Presets | |||||
protected: | protected: | ||||
void setpresettype(const char *type); | void setpresettype(const char *type); | ||||
private: | private: | ||||
virtual void add2XMLsection(XMLwrapper *xml, int n) = 0; | |||||
virtual void add2XMLsection(XMLwrapper& xml, int n) = 0; | |||||
//virtual void getfromXMLsection(XMLwrapper *xml, int n) = 0; | //virtual void getfromXMLsection(XMLwrapper *xml, int n) = 0; | ||||
//virtual void defaults() = 0; | //virtual void defaults() = 0; | ||||
//virtual void defaults(int n) = 0; | //virtual void defaults(int n) = 0; | ||||
@@ -202,80 +202,80 @@ SUBnoteParameters::~SUBnoteParameters() | |||||
void SUBnoteParameters::add2XML(XMLwrapper *xml) | |||||
void SUBnoteParameters::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addpar("num_stages", Pnumstages); | |||||
xml->addpar("harmonic_mag_type", Phmagtype); | |||||
xml->addpar("start", Pstart); | |||||
xml.addpar("num_stages", Pnumstages); | |||||
xml.addpar("harmonic_mag_type", Phmagtype); | |||||
xml.addpar("start", Pstart); | |||||
xml->beginbranch("HARMONICS"); | |||||
xml.beginbranch("HARMONICS"); | |||||
for(int i = 0; i < MAX_SUB_HARMONICS; ++i) { | for(int i = 0; i < MAX_SUB_HARMONICS; ++i) { | ||||
if((Phmag[i] == 0) && (xml->minimal)) | |||||
if((Phmag[i] == 0) && (xml.minimal)) | |||||
continue; | continue; | ||||
xml->beginbranch("HARMONIC", i); | |||||
xml->addpar("mag", Phmag[i]); | |||||
xml->addpar("relbw", Phrelbw[i]); | |||||
xml->endbranch(); | |||||
xml.beginbranch("HARMONIC", i); | |||||
xml.addpar("mag", Phmag[i]); | |||||
xml.addpar("relbw", Phrelbw[i]); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml->beginbranch("AMPLITUDE_PARAMETERS"); | |||||
xml->addparbool("stereo", Pstereo); | |||||
xml->addpar("volume", PVolume); | |||||
xml->addpar("panning", PPanning); | |||||
xml->addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||||
xml->beginbranch("AMPLITUDE_ENVELOPE"); | |||||
xml.endbranch(); | |||||
xml.beginbranch("AMPLITUDE_PARAMETERS"); | |||||
xml.addparbool("stereo", Pstereo); | |||||
xml.addpar("volume", PVolume); | |||||
xml.addpar("panning", PPanning); | |||||
xml.addpar("velocity_sensing", PAmpVelocityScaleFunction); | |||||
xml.beginbranch("AMPLITUDE_ENVELOPE"); | |||||
AmpEnvelope->add2XML(xml); | AmpEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml->endbranch(); | |||||
xml->beginbranch("FREQUENCY_PARAMETERS"); | |||||
xml->addparbool("fixed_freq", Pfixedfreq); | |||||
xml->addpar("fixed_freq_et", PfixedfreqET); | |||||
xml->addpar("detune", PDetune); | |||||
xml->addpar("coarse_detune", PCoarseDetune); | |||||
xml->addpar("overtone_spread_type", POvertoneSpread.type); | |||||
xml->addpar("overtone_spread_par1", POvertoneSpread.par1); | |||||
xml->addpar("overtone_spread_par2", POvertoneSpread.par2); | |||||
xml->addpar("overtone_spread_par3", POvertoneSpread.par3); | |||||
xml->addpar("detune_type", PDetuneType); | |||||
xml->addpar("bandwidth", Pbandwidth); | |||||
xml->addpar("bandwidth_scale", Pbwscale); | |||||
xml->addparbool("freq_envelope_enabled", PFreqEnvelopeEnabled); | |||||
if((PFreqEnvelopeEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("FREQUENCY_ENVELOPE"); | |||||
xml.endbranch(); | |||||
xml.endbranch(); | |||||
xml.beginbranch("FREQUENCY_PARAMETERS"); | |||||
xml.addparbool("fixed_freq", Pfixedfreq); | |||||
xml.addpar("fixed_freq_et", PfixedfreqET); | |||||
xml.addpar("detune", PDetune); | |||||
xml.addpar("coarse_detune", PCoarseDetune); | |||||
xml.addpar("overtone_spread_type", POvertoneSpread.type); | |||||
xml.addpar("overtone_spread_par1", POvertoneSpread.par1); | |||||
xml.addpar("overtone_spread_par2", POvertoneSpread.par2); | |||||
xml.addpar("overtone_spread_par3", POvertoneSpread.par3); | |||||
xml.addpar("detune_type", PDetuneType); | |||||
xml.addpar("bandwidth", Pbandwidth); | |||||
xml.addpar("bandwidth_scale", Pbwscale); | |||||
xml.addparbool("freq_envelope_enabled", PFreqEnvelopeEnabled); | |||||
if((PFreqEnvelopeEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("FREQUENCY_ENVELOPE"); | |||||
FreqEnvelope->add2XML(xml); | FreqEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->addparbool("band_width_envelope_enabled", PBandWidthEnvelopeEnabled); | |||||
if((PBandWidthEnvelopeEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("BANDWIDTH_ENVELOPE"); | |||||
xml.addparbool("band_width_envelope_enabled", PBandWidthEnvelopeEnabled); | |||||
if((PBandWidthEnvelopeEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("BANDWIDTH_ENVELOPE"); | |||||
BandWidthEnvelope->add2XML(xml); | BandWidthEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->beginbranch("FILTER_PARAMETERS"); | |||||
xml->addparbool("enabled", PGlobalFilterEnabled); | |||||
if((PGlobalFilterEnabled != 0) || (!xml->minimal)) { | |||||
xml->beginbranch("FILTER"); | |||||
xml.beginbranch("FILTER_PARAMETERS"); | |||||
xml.addparbool("enabled", PGlobalFilterEnabled); | |||||
if((PGlobalFilterEnabled != 0) || (!xml.minimal)) { | |||||
xml.beginbranch("FILTER"); | |||||
GlobalFilter->add2XML(xml); | GlobalFilter->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
xml->addpar("filter_velocity_sensing", | |||||
xml.addpar("filter_velocity_sensing", | |||||
PGlobalFilterVelocityScaleFunction); | PGlobalFilterVelocityScaleFunction); | ||||
xml->addpar("filter_velocity_sensing_amplitude", | |||||
xml.addpar("filter_velocity_sensing_amplitude", | |||||
PGlobalFilterVelocityScale); | PGlobalFilterVelocityScale); | ||||
xml->beginbranch("FILTER_ENVELOPE"); | |||||
xml.beginbranch("FILTER_ENVELOPE"); | |||||
GlobalFilterEnvelope->add2XML(xml); | GlobalFilterEnvelope->add2XML(xml); | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
@@ -389,94 +389,94 @@ void SUBnoteParameters::paste(SUBnoteParameters &sub) | |||||
doPaste(Pstart); | doPaste(Pstart); | ||||
} | } | ||||
void SUBnoteParameters::getfromXML(XMLwrapper *xml) | |||||
void SUBnoteParameters::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
Pnumstages = xml->getpar127("num_stages", Pnumstages); | |||||
Phmagtype = xml->getpar127("harmonic_mag_type", Phmagtype); | |||||
Pstart = xml->getpar127("start", Pstart); | |||||
Pnumstages = xml.getpar127("num_stages", Pnumstages); | |||||
Phmagtype = xml.getpar127("harmonic_mag_type", Phmagtype); | |||||
Pstart = xml.getpar127("start", Pstart); | |||||
if(xml->enterbranch("HARMONICS")) { | |||||
if(xml.enterbranch("HARMONICS")) { | |||||
Phmag[0] = 0; | Phmag[0] = 0; | ||||
for(int i = 0; i < MAX_SUB_HARMONICS; ++i) { | for(int i = 0; i < MAX_SUB_HARMONICS; ++i) { | ||||
if(xml->enterbranch("HARMONIC", i) == 0) | |||||
if(xml.enterbranch("HARMONIC", i) == 0) | |||||
continue; | continue; | ||||
Phmag[i] = xml->getpar127("mag", Phmag[i]); | |||||
Phrelbw[i] = xml->getpar127("relbw", Phrelbw[i]); | |||||
xml->exitbranch(); | |||||
Phmag[i] = xml.getpar127("mag", Phmag[i]); | |||||
Phrelbw[i] = xml.getpar127("relbw", Phrelbw[i]); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("AMPLITUDE_PARAMETERS")) { | |||||
Pstereo = xml->getparbool("stereo", Pstereo); | |||||
PVolume = xml->getpar127("volume", PVolume); | |||||
PPanning = xml->getpar127("panning", PPanning); | |||||
PAmpVelocityScaleFunction = xml->getpar127("velocity_sensing", | |||||
if(xml.enterbranch("AMPLITUDE_PARAMETERS")) { | |||||
Pstereo = xml.getparbool("stereo", Pstereo); | |||||
PVolume = xml.getpar127("volume", PVolume); | |||||
PPanning = xml.getpar127("panning", PPanning); | |||||
PAmpVelocityScaleFunction = xml.getpar127("velocity_sensing", | |||||
PAmpVelocityScaleFunction); | PAmpVelocityScaleFunction); | ||||
if(xml->enterbranch("AMPLITUDE_ENVELOPE")) { | |||||
if(xml.enterbranch("AMPLITUDE_ENVELOPE")) { | |||||
AmpEnvelope->getfromXML(xml); | AmpEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FREQUENCY_PARAMETERS")) { | |||||
Pfixedfreq = xml->getparbool("fixed_freq", Pfixedfreq); | |||||
PfixedfreqET = xml->getpar127("fixed_freq_et", PfixedfreqET); | |||||
if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | |||||
Pfixedfreq = xml.getparbool("fixed_freq", Pfixedfreq); | |||||
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | |||||
PDetune = xml->getpar("detune", PDetune, 0, 16383); | |||||
PCoarseDetune = xml->getpar("coarse_detune", PCoarseDetune, 0, 16383); | |||||
PDetune = xml.getpar("detune", PDetune, 0, 16383); | |||||
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | |||||
POvertoneSpread.type = | POvertoneSpread.type = | ||||
xml->getpar127("overtone_spread_type", POvertoneSpread.type); | |||||
xml.getpar127("overtone_spread_type", POvertoneSpread.type); | |||||
POvertoneSpread.par1 = | POvertoneSpread.par1 = | ||||
xml->getpar("overtone_spread_par1", POvertoneSpread.par1, 0, 255); | |||||
xml.getpar("overtone_spread_par1", POvertoneSpread.par1, 0, 255); | |||||
POvertoneSpread.par2 = | POvertoneSpread.par2 = | ||||
xml->getpar("overtone_spread_par2", POvertoneSpread.par2, 0, 255); | |||||
xml.getpar("overtone_spread_par2", POvertoneSpread.par2, 0, 255); | |||||
POvertoneSpread.par3 = | POvertoneSpread.par3 = | ||||
xml->getpar("overtone_spread_par3", POvertoneSpread.par3, 0, 255); | |||||
xml.getpar("overtone_spread_par3", POvertoneSpread.par3, 0, 255); | |||||
updateFrequencyMultipliers(); | updateFrequencyMultipliers(); | ||||
PDetuneType = xml->getpar127("detune_type", PDetuneType); | |||||
PDetuneType = xml.getpar127("detune_type", PDetuneType); | |||||
Pbandwidth = xml->getpar127("bandwidth", Pbandwidth); | |||||
Pbwscale = xml->getpar127("bandwidth_scale", Pbwscale); | |||||
Pbandwidth = xml.getpar127("bandwidth", Pbandwidth); | |||||
Pbwscale = xml.getpar127("bandwidth_scale", Pbwscale); | |||||
PFreqEnvelopeEnabled = xml->getparbool("freq_envelope_enabled", | |||||
PFreqEnvelopeEnabled = xml.getparbool("freq_envelope_enabled", | |||||
PFreqEnvelopeEnabled); | PFreqEnvelopeEnabled); | ||||
if(xml->enterbranch("FREQUENCY_ENVELOPE")) { | |||||
if(xml.enterbranch("FREQUENCY_ENVELOPE")) { | |||||
FreqEnvelope->getfromXML(xml); | FreqEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
PBandWidthEnvelopeEnabled = xml->getparbool( | |||||
PBandWidthEnvelopeEnabled = xml.getparbool( | |||||
"band_width_envelope_enabled", | "band_width_envelope_enabled", | ||||
PBandWidthEnvelopeEnabled); | PBandWidthEnvelopeEnabled); | ||||
if(xml->enterbranch("BANDWIDTH_ENVELOPE")) { | |||||
if(xml.enterbranch("BANDWIDTH_ENVELOPE")) { | |||||
BandWidthEnvelope->getfromXML(xml); | BandWidthEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(xml->enterbranch("FILTER_PARAMETERS")) { | |||||
PGlobalFilterEnabled = xml->getparbool("enabled", PGlobalFilterEnabled); | |||||
if(xml->enterbranch("FILTER")) { | |||||
if(xml.enterbranch("FILTER_PARAMETERS")) { | |||||
PGlobalFilterEnabled = xml.getparbool("enabled", PGlobalFilterEnabled); | |||||
if(xml.enterbranch("FILTER")) { | |||||
GlobalFilter->getfromXML(xml); | GlobalFilter->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
PGlobalFilterVelocityScaleFunction = xml->getpar127( | |||||
PGlobalFilterVelocityScaleFunction = xml.getpar127( | |||||
"filter_velocity_sensing", | "filter_velocity_sensing", | ||||
PGlobalFilterVelocityScaleFunction); | PGlobalFilterVelocityScaleFunction); | ||||
PGlobalFilterVelocityScale = xml->getpar127( | |||||
PGlobalFilterVelocityScale = xml.getpar127( | |||||
"filter_velocity_sensing_amplitude", | "filter_velocity_sensing_amplitude", | ||||
PGlobalFilterVelocityScale); | PGlobalFilterVelocityScale); | ||||
if(xml->enterbranch("FILTER_ENVELOPE")) { | |||||
if(xml.enterbranch("FILTER_ENVELOPE")) { | |||||
GlobalFilterEnvelope->getfromXML(xml); | GlobalFilterEnvelope->getfromXML(xml); | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } |
@@ -32,9 +32,9 @@ class SUBnoteParameters:public Presets | |||||
SUBnoteParameters(); | SUBnoteParameters(); | ||||
~SUBnoteParameters(); | ~SUBnoteParameters(); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void defaults(); | void defaults(); | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void updateFrequencyMultipliers(void); | void updateFrequencyMultipliers(void); | ||||
void paste(SUBnoteParameters &sub); | void paste(SUBnoteParameters &sub); | ||||
@@ -286,6 +286,18 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
getvoicebasefreq(nvoice), | getvoicebasefreq(nvoice), | ||||
pars.VoicePar[nvoice].Presonance); | pars.VoicePar[nvoice].Presonance); | ||||
//Find range of generated wave | |||||
float min = NoteVoicePar[nvoice].OscilSmp[0]; | |||||
float max = min; | |||||
float *smpls = &(NoteVoicePar[nvoice].OscilSmp[1]); | |||||
for (int i = synth.oscilsize-1; i--; smpls++) | |||||
if (*smpls > max) | |||||
max = *smpls; | |||||
else if (*smpls < min) | |||||
min = *smpls; | |||||
NoteVoicePar[nvoice].OscilSmpMin = min; | |||||
NoteVoicePar[nvoice].OscilSmpMax = max; | |||||
//I store the first elments to the last position for speedups | //I store the first elments to the last position for speedups | ||||
for(int i = 0; i < OSCIL_SMP_EXTRA_SAMPLES; ++i) | for(int i = 0; i < OSCIL_SMP_EXTRA_SAMPLES; ++i) | ||||
NoteVoicePar[nvoice].OscilSmp[synth.oscilsize | NoteVoicePar[nvoice].OscilSmp[synth.oscilsize | ||||
@@ -295,12 +307,12 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
oscposhi_start += | oscposhi_start += | ||||
(int)((pars.VoicePar[nvoice].Poscilphase | (int)((pars.VoicePar[nvoice].Poscilphase | ||||
- 64.0f) / 128.0f * synth.oscilsize + synth.oscilsize * 4); | - 64.0f) / 128.0f * synth.oscilsize + synth.oscilsize * 4); | ||||
oscposhi_start %= synth.oscilsize; | |||||
int kth_start = oscposhi_start; | |||||
for(int k = 0; k < unison; ++k) { | for(int k = 0; k < unison; ++k) { | ||||
oscposhi[nvoice][k] = oscposhi_start; | |||||
oscposhi[nvoice][k] = kth_start % synth.oscilsize; | |||||
//put random starting point for other subvoices | //put random starting point for other subvoices | ||||
oscposhi_start = | |||||
kth_start = oscposhi_start + | |||||
(int)(RND * pars.VoicePar[nvoice].Unison_phase_randomness / | (int)(RND * pars.VoicePar[nvoice].Unison_phase_randomness / | ||||
127.0f * (synth.oscilsize - 1)); | 127.0f * (synth.oscilsize - 1)); | ||||
} | } | ||||
@@ -187,6 +187,9 @@ class ADnote:public SynthNote | |||||
/* Waveform of the Voice */ | /* Waveform of the Voice */ | ||||
float *OscilSmp; | float *OscilSmp; | ||||
/* Range of waveform */ | |||||
float OscilSmpMin, OscilSmpMax; | |||||
/************************************ | /************************************ | ||||
* FREQUENCY PARAMETERS * | * FREQUENCY PARAMETERS * | ||||
************************************/ | ************************************/ | ||||
@@ -1227,161 +1227,161 @@ void OscilGen::paste(OscilGen &o) | |||||
} | } | ||||
#undef COPY | #undef COPY | ||||
void OscilGen::add2XML(XMLwrapper *xml) | |||||
void OscilGen::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addpar("harmonic_mag_type", Phmagtype); | |||||
xml.addpar("harmonic_mag_type", Phmagtype); | |||||
xml->addpar("base_function", Pcurrentbasefunc); | |||||
xml->addpar("base_function_par", Pbasefuncpar); | |||||
xml->addpar("base_function_modulation", Pbasefuncmodulation); | |||||
xml->addpar("base_function_modulation_par1", Pbasefuncmodulationpar1); | |||||
xml->addpar("base_function_modulation_par2", Pbasefuncmodulationpar2); | |||||
xml->addpar("base_function_modulation_par3", Pbasefuncmodulationpar3); | |||||
xml.addpar("base_function", Pcurrentbasefunc); | |||||
xml.addpar("base_function_par", Pbasefuncpar); | |||||
xml.addpar("base_function_modulation", Pbasefuncmodulation); | |||||
xml.addpar("base_function_modulation_par1", Pbasefuncmodulationpar1); | |||||
xml.addpar("base_function_modulation_par2", Pbasefuncmodulationpar2); | |||||
xml.addpar("base_function_modulation_par3", Pbasefuncmodulationpar3); | |||||
xml->addpar("modulation", Pmodulation); | |||||
xml->addpar("modulation_par1", Pmodulationpar1); | |||||
xml->addpar("modulation_par2", Pmodulationpar2); | |||||
xml->addpar("modulation_par3", Pmodulationpar3); | |||||
xml.addpar("modulation", Pmodulation); | |||||
xml.addpar("modulation_par1", Pmodulationpar1); | |||||
xml.addpar("modulation_par2", Pmodulationpar2); | |||||
xml.addpar("modulation_par3", Pmodulationpar3); | |||||
xml->addpar("wave_shaping", Pwaveshaping); | |||||
xml->addpar("wave_shaping_function", Pwaveshapingfunction); | |||||
xml.addpar("wave_shaping", Pwaveshaping); | |||||
xml.addpar("wave_shaping_function", Pwaveshapingfunction); | |||||
xml->addpar("filter_type", Pfiltertype); | |||||
xml->addpar("filter_par1", Pfilterpar1); | |||||
xml->addpar("filter_par2", Pfilterpar2); | |||||
xml->addpar("filter_before_wave_shaping", Pfilterbeforews); | |||||
xml.addpar("filter_type", Pfiltertype); | |||||
xml.addpar("filter_par1", Pfilterpar1); | |||||
xml.addpar("filter_par2", Pfilterpar2); | |||||
xml.addpar("filter_before_wave_shaping", Pfilterbeforews); | |||||
xml->addpar("spectrum_adjust_type", Psatype); | |||||
xml->addpar("spectrum_adjust_par", Psapar); | |||||
xml.addpar("spectrum_adjust_type", Psatype); | |||||
xml.addpar("spectrum_adjust_par", Psapar); | |||||
xml->addpar("rand", Prand); | |||||
xml->addpar("amp_rand_type", Pamprandtype); | |||||
xml->addpar("amp_rand_power", Pamprandpower); | |||||
xml.addpar("rand", Prand); | |||||
xml.addpar("amp_rand_type", Pamprandtype); | |||||
xml.addpar("amp_rand_power", Pamprandpower); | |||||
xml->addpar("harmonic_shift", Pharmonicshift); | |||||
xml->addparbool("harmonic_shift_first", Pharmonicshiftfirst); | |||||
xml.addpar("harmonic_shift", Pharmonicshift); | |||||
xml.addparbool("harmonic_shift_first", Pharmonicshiftfirst); | |||||
xml->addpar("adaptive_harmonics", Padaptiveharmonics); | |||||
xml->addpar("adaptive_harmonics_base_frequency", Padaptiveharmonicsbasefreq); | |||||
xml->addpar("adaptive_harmonics_power", Padaptiveharmonicspower); | |||||
xml.addpar("adaptive_harmonics", Padaptiveharmonics); | |||||
xml.addpar("adaptive_harmonics_base_frequency", Padaptiveharmonicsbasefreq); | |||||
xml.addpar("adaptive_harmonics_power", Padaptiveharmonicspower); | |||||
xml->beginbranch("HARMONICS"); | |||||
xml.beginbranch("HARMONICS"); | |||||
for(int n = 0; n < MAX_AD_HARMONICS; ++n) { | for(int n = 0; n < MAX_AD_HARMONICS; ++n) { | ||||
if((Phmag[n] == 64) && (Phphase[n] == 64)) | if((Phmag[n] == 64) && (Phphase[n] == 64)) | ||||
continue; | continue; | ||||
xml->beginbranch("HARMONIC", n + 1); | |||||
xml->addpar("mag", Phmag[n]); | |||||
xml->addpar("phase", Phphase[n]); | |||||
xml->endbranch(); | |||||
xml.beginbranch("HARMONIC", n + 1); | |||||
xml.addpar("mag", Phmag[n]); | |||||
xml.addpar("phase", Phphase[n]); | |||||
xml.endbranch(); | |||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
if(Pcurrentbasefunc == 127) { | if(Pcurrentbasefunc == 127) { | ||||
normalize(basefuncFFTfreqs, synth.oscilsize); | normalize(basefuncFFTfreqs, synth.oscilsize); | ||||
xml->beginbranch("BASE_FUNCTION"); | |||||
xml.beginbranch("BASE_FUNCTION"); | |||||
for(int i = 1; i < synth.oscilsize / 2; ++i) { | for(int i = 1; i < synth.oscilsize / 2; ++i) { | ||||
float xc = basefuncFFTfreqs[i].real(); | float xc = basefuncFFTfreqs[i].real(); | ||||
float xs = basefuncFFTfreqs[i].imag(); | float xs = basefuncFFTfreqs[i].imag(); | ||||
if((fabs(xs) > 1e-6f) || (fabs(xc) > 1e-6f)) { | if((fabs(xs) > 1e-6f) || (fabs(xc) > 1e-6f)) { | ||||
xml->beginbranch("BF_HARMONIC", i); | |||||
xml->addparreal("cos", xc); | |||||
xml->addparreal("sin", xs); | |||||
xml->endbranch(); | |||||
xml.beginbranch("BF_HARMONIC", i); | |||||
xml.addparreal("cos", xc); | |||||
xml.addparreal("sin", xs); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
xml->endbranch(); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
void OscilGen::getfromXML(XMLwrapper *xml) | |||||
void OscilGen::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
Phmagtype = xml->getpar127("harmonic_mag_type", Phmagtype); | |||||
Phmagtype = xml.getpar127("harmonic_mag_type", Phmagtype); | |||||
Pcurrentbasefunc = xml->getpar127("base_function", Pcurrentbasefunc); | |||||
Pbasefuncpar = xml->getpar127("base_function_par", Pbasefuncpar); | |||||
Pcurrentbasefunc = xml.getpar127("base_function", Pcurrentbasefunc); | |||||
Pbasefuncpar = xml.getpar127("base_function_par", Pbasefuncpar); | |||||
Pbasefuncmodulation = xml->getpar127("base_function_modulation", | |||||
Pbasefuncmodulation = xml.getpar127("base_function_modulation", | |||||
Pbasefuncmodulation); | Pbasefuncmodulation); | ||||
Pbasefuncmodulationpar1 = xml->getpar127("base_function_modulation_par1", | |||||
Pbasefuncmodulationpar1 = xml.getpar127("base_function_modulation_par1", | |||||
Pbasefuncmodulationpar1); | Pbasefuncmodulationpar1); | ||||
Pbasefuncmodulationpar2 = xml->getpar127("base_function_modulation_par2", | |||||
Pbasefuncmodulationpar2 = xml.getpar127("base_function_modulation_par2", | |||||
Pbasefuncmodulationpar2); | Pbasefuncmodulationpar2); | ||||
Pbasefuncmodulationpar3 = xml->getpar127("base_function_modulation_par3", | |||||
Pbasefuncmodulationpar3 = xml.getpar127("base_function_modulation_par3", | |||||
Pbasefuncmodulationpar3); | Pbasefuncmodulationpar3); | ||||
Pmodulation = xml->getpar127("modulation", Pmodulation); | |||||
Pmodulationpar1 = xml->getpar127("modulation_par1", | |||||
Pmodulation = xml.getpar127("modulation", Pmodulation); | |||||
Pmodulationpar1 = xml.getpar127("modulation_par1", | |||||
Pmodulationpar1); | Pmodulationpar1); | ||||
Pmodulationpar2 = xml->getpar127("modulation_par2", | |||||
Pmodulationpar2 = xml.getpar127("modulation_par2", | |||||
Pmodulationpar2); | Pmodulationpar2); | ||||
Pmodulationpar3 = xml->getpar127("modulation_par3", | |||||
Pmodulationpar3 = xml.getpar127("modulation_par3", | |||||
Pmodulationpar3); | Pmodulationpar3); | ||||
Pwaveshaping = xml->getpar127("wave_shaping", Pwaveshaping); | |||||
Pwaveshapingfunction = xml->getpar127("wave_shaping_function", | |||||
Pwaveshaping = xml.getpar127("wave_shaping", Pwaveshaping); | |||||
Pwaveshapingfunction = xml.getpar127("wave_shaping_function", | |||||
Pwaveshapingfunction); | Pwaveshapingfunction); | ||||
Pfiltertype = xml->getpar127("filter_type", Pfiltertype); | |||||
Pfilterpar1 = xml->getpar127("filter_par1", Pfilterpar1); | |||||
Pfilterpar2 = xml->getpar127("filter_par2", Pfilterpar2); | |||||
Pfilterbeforews = xml->getpar127("filter_before_wave_shaping", | |||||
Pfiltertype = xml.getpar127("filter_type", Pfiltertype); | |||||
Pfilterpar1 = xml.getpar127("filter_par1", Pfilterpar1); | |||||
Pfilterpar2 = xml.getpar127("filter_par2", Pfilterpar2); | |||||
Pfilterbeforews = xml.getpar127("filter_before_wave_shaping", | |||||
Pfilterbeforews); | Pfilterbeforews); | ||||
Psatype = xml->getpar127("spectrum_adjust_type", Psatype); | |||||
Psapar = xml->getpar127("spectrum_adjust_par", Psapar); | |||||
Psatype = xml.getpar127("spectrum_adjust_type", Psatype); | |||||
Psapar = xml.getpar127("spectrum_adjust_par", Psapar); | |||||
Prand = xml->getpar127("rand", Prand); | |||||
Pamprandtype = xml->getpar127("amp_rand_type", Pamprandtype); | |||||
Pamprandpower = xml->getpar127("amp_rand_power", Pamprandpower); | |||||
Prand = xml.getpar127("rand", Prand); | |||||
Pamprandtype = xml.getpar127("amp_rand_type", Pamprandtype); | |||||
Pamprandpower = xml.getpar127("amp_rand_power", Pamprandpower); | |||||
Pharmonicshift = xml->getpar("harmonic_shift", | |||||
Pharmonicshift = xml.getpar("harmonic_shift", | |||||
Pharmonicshift, | Pharmonicshift, | ||||
-64, | -64, | ||||
64); | 64); | ||||
Pharmonicshiftfirst = xml->getparbool("harmonic_shift_first", | |||||
Pharmonicshiftfirst = xml.getparbool("harmonic_shift_first", | |||||
Pharmonicshiftfirst); | Pharmonicshiftfirst); | ||||
Padaptiveharmonics = xml->getpar("adaptive_harmonics", | |||||
Padaptiveharmonics = xml.getpar("adaptive_harmonics", | |||||
Padaptiveharmonics, | Padaptiveharmonics, | ||||
0, | 0, | ||||
127); | 127); | ||||
Padaptiveharmonicsbasefreq = xml->getpar( | |||||
Padaptiveharmonicsbasefreq = xml.getpar( | |||||
"adaptive_harmonics_base_frequency", | "adaptive_harmonics_base_frequency", | ||||
Padaptiveharmonicsbasefreq, | Padaptiveharmonicsbasefreq, | ||||
0, | 0, | ||||
255); | 255); | ||||
Padaptiveharmonicspower = xml->getpar("adaptive_harmonics_power", | |||||
Padaptiveharmonicspower = xml.getpar("adaptive_harmonics_power", | |||||
Padaptiveharmonicspower, | Padaptiveharmonicspower, | ||||
0, | 0, | ||||
200); | 200); | ||||
if(xml->enterbranch("HARMONICS")) { | |||||
if(xml.enterbranch("HARMONICS")) { | |||||
Phmag[0] = 64; | Phmag[0] = 64; | ||||
Phphase[0] = 64; | Phphase[0] = 64; | ||||
for(int n = 0; n < MAX_AD_HARMONICS; ++n) { | for(int n = 0; n < MAX_AD_HARMONICS; ++n) { | ||||
if(xml->enterbranch("HARMONIC", n + 1) == 0) | |||||
if(xml.enterbranch("HARMONIC", n + 1) == 0) | |||||
continue; | continue; | ||||
Phmag[n] = xml->getpar127("mag", 64); | |||||
Phphase[n] = xml->getpar127("phase", 64); | |||||
xml->exitbranch(); | |||||
Phmag[n] = xml.getpar127("mag", 64); | |||||
Phphase[n] = xml.getpar127("phase", 64); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
} | } | ||||
if(Pcurrentbasefunc != 0) | if(Pcurrentbasefunc != 0) | ||||
changebasefunction(); | changebasefunction(); | ||||
if(xml->enterbranch("BASE_FUNCTION")) { | |||||
if(xml.enterbranch("BASE_FUNCTION")) { | |||||
for(int i = 1; i < synth.oscilsize / 2; ++i) | for(int i = 1; i < synth.oscilsize / 2; ++i) | ||||
if(xml->enterbranch("BF_HARMONIC", i)) { | |||||
if(xml.enterbranch("BF_HARMONIC", i)) { | |||||
basefuncFFTfreqs[i] = | basefuncFFTfreqs[i] = | ||||
std::complex<float>(xml->getparreal("cos", 0.0f), | |||||
xml->getparreal("sin", 0.0f)); | |||||
xml->exitbranch(); | |||||
std::complex<float>(xml.getparreal("cos", 0.0f), | |||||
xml.getparreal("sin", 0.0f)); | |||||
xml.exitbranch(); | |||||
} | } | ||||
xml->exitbranch(); | |||||
xml.exitbranch(); | |||||
clearDC(basefuncFFTfreqs); | clearDC(basefuncFFTfreqs); | ||||
normalize(basefuncFFTfreqs, synth.oscilsize); | normalize(basefuncFFTfreqs, synth.oscilsize); | ||||
@@ -52,9 +52,9 @@ class OscilGen:public Presets | |||||
void useasbase(); | void useasbase(); | ||||
void paste(OscilGen &o); | void paste(OscilGen &o); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void defaults(); | void defaults(); | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
void convert2sine(); | void convert2sine(); | ||||
@@ -267,39 +267,39 @@ void Resonance::paste(Resonance &r) | |||||
} | } | ||||
#undef COPY | #undef COPY | ||||
void Resonance::add2XML(XMLwrapper *xml) | |||||
void Resonance::add2XML(XMLwrapper& xml) | |||||
{ | { | ||||
xml->addparbool("enabled", Penabled); | |||||
xml.addparbool("enabled", Penabled); | |||||
if((Penabled == 0) && (xml->minimal)) | |||||
if((Penabled == 0) && (xml.minimal)) | |||||
return; | return; | ||||
xml->addpar("max_db", PmaxdB); | |||||
xml->addpar("center_freq", Pcenterfreq); | |||||
xml->addpar("octaves_freq", Poctavesfreq); | |||||
xml->addparbool("protect_fundamental_frequency", Pprotectthefundamental); | |||||
xml->addpar("resonance_points", N_RES_POINTS); | |||||
xml.addpar("max_db", PmaxdB); | |||||
xml.addpar("center_freq", Pcenterfreq); | |||||
xml.addpar("octaves_freq", Poctavesfreq); | |||||
xml.addparbool("protect_fundamental_frequency", Pprotectthefundamental); | |||||
xml.addpar("resonance_points", N_RES_POINTS); | |||||
for(int i = 0; i < N_RES_POINTS; ++i) { | for(int i = 0; i < N_RES_POINTS; ++i) { | ||||
xml->beginbranch("RESPOINT", i); | |||||
xml->addpar("val", Prespoints[i]); | |||||
xml->endbranch(); | |||||
xml.beginbranch("RESPOINT", i); | |||||
xml.addpar("val", Prespoints[i]); | |||||
xml.endbranch(); | |||||
} | } | ||||
} | } | ||||
void Resonance::getfromXML(XMLwrapper *xml) | |||||
void Resonance::getfromXML(XMLwrapper& xml) | |||||
{ | { | ||||
Penabled = xml->getparbool("enabled", Penabled); | |||||
Penabled = xml.getparbool("enabled", Penabled); | |||||
PmaxdB = xml->getpar127("max_db", PmaxdB); | |||||
Pcenterfreq = xml->getpar127("center_freq", Pcenterfreq); | |||||
Poctavesfreq = xml->getpar127("octaves_freq", Poctavesfreq); | |||||
Pprotectthefundamental = xml->getparbool("protect_fundamental_frequency", | |||||
PmaxdB = xml.getpar127("max_db", PmaxdB); | |||||
Pcenterfreq = xml.getpar127("center_freq", Pcenterfreq); | |||||
Poctavesfreq = xml.getpar127("octaves_freq", Poctavesfreq); | |||||
Pprotectthefundamental = xml.getparbool("protect_fundamental_frequency", | |||||
Pprotectthefundamental); | Pprotectthefundamental); | ||||
for(int i = 0; i < N_RES_POINTS; ++i) { | for(int i = 0; i < N_RES_POINTS; ++i) { | ||||
if(xml->enterbranch("RESPOINT", i) == 0) | |||||
if(xml.enterbranch("RESPOINT", i) == 0) | |||||
continue; | continue; | ||||
Prespoints[i] = xml->getpar127("val", Prespoints[i]); | |||||
xml->exitbranch(); | |||||
Prespoints[i] = xml.getpar127("val", Prespoints[i]); | |||||
xml.exitbranch(); | |||||
} | } | ||||
} | } |
@@ -43,9 +43,9 @@ class Resonance:public Presets | |||||
void zero(void); | void zero(void); | ||||
void paste(Resonance &r); | void paste(Resonance &r); | ||||
void add2XML(XMLwrapper *xml); | |||||
void add2XML(XMLwrapper& xml); | |||||
void defaults(void); | void defaults(void); | ||||
void getfromXML(XMLwrapper *xml); | |||||
void getfromXML(XMLwrapper& xml); | |||||
//TODO remove unused methods | //TODO remove unused methods | ||||
@@ -24,6 +24,7 @@ | |||||
#include <cstdlib> | #include <cstdlib> | ||||
#include <cstdio> | #include <cstdio> | ||||
#include <cassert> | #include <cassert> | ||||
#include <iostream> | |||||
#include "../globals.h" | #include "../globals.h" | ||||
#include "SUBnote.h" | #include "SUBnote.h" | ||||
#include "Envelope.h" | #include "Envelope.h" | ||||
@@ -224,8 +225,12 @@ void SUBnote::legatonote(LegatoParams pars) | |||||
if(legato.update(pars)) | if(legato.update(pars)) | ||||
return; | return; | ||||
setup(pars.frequency, pars.velocity, pars.portamento, pars.midinote, | |||||
true); | |||||
try { | |||||
setup(pars.frequency, pars.velocity, pars.portamento, pars.midinote, | |||||
true); | |||||
} catch (std::bad_alloc &ba) { | |||||
std::cerr << "failed to set legato note parameter in SUBnote: " << ba.what() << std::endl; | |||||
} | |||||
} | } | ||||
SUBnote::~SUBnote() | SUBnote::~SUBnote() | ||||
@@ -1,6 +1,8 @@ | |||||
#include "SynthNote.h" | #include "SynthNote.h" | ||||
#include "../globals.h" | #include "../globals.h" | ||||
#include <cstring> | #include <cstring> | ||||
#include <new> | |||||
#include <iostream> | |||||
SynthNote::SynthNote(SynthParams &pars) | SynthNote::SynthNote(SynthParams &pars) | ||||
:memory(pars.memory), | :memory(pars.memory), | ||||
@@ -61,72 +63,76 @@ void SynthNote::Legato::apply(SynthNote ¬e, float *outl, float *outr) | |||||
memset(outl, 0, synth.bufferbytes); | memset(outl, 0, synth.bufferbytes); | ||||
memset(outr, 0, synth.bufferbytes); | memset(outr, 0, synth.bufferbytes); | ||||
} | } | ||||
switch(msg) { | |||||
case LM_CatchUp: // Continue the catch-up... | |||||
if(decounter == -10) | |||||
decounter = fade.length; | |||||
//Yea, could be done without the loop... | |||||
for(int i = 0; i < synth.buffersize; ++i) { | |||||
decounter--; | |||||
if(decounter < 1) { | |||||
// Catching-up done, we can finally set | |||||
// the note to the actual parameters. | |||||
decounter = -10; | |||||
msg = LM_ToNorm; | |||||
LegatoParams pars{param.freq, param.vel, param.portamento, | |||||
param.midinote, false}; | |||||
note.legatonote(pars); | |||||
break; | |||||
} | |||||
} | |||||
break; | |||||
case LM_FadeIn: // Fade-in | |||||
if(decounter == -10) | |||||
decounter = fade.length; | |||||
silent = false; | |||||
for(int i = 0; i < synth.buffersize; ++i) { | |||||
decounter--; | |||||
if(decounter < 1) { | |||||
decounter = -10; | |||||
msg = LM_Norm; | |||||
break; | |||||
try { | |||||
switch (msg) { | |||||
case LM_CatchUp: // Continue the catch-up... | |||||
if (decounter == -10) | |||||
decounter = fade.length; | |||||
//Yea, could be done without the loop... | |||||
for (int i = 0; i < synth.buffersize; ++i) { | |||||
decounter--; | |||||
if (decounter < 1) { | |||||
// Catching-up done, we can finally set | |||||
// the note to the actual parameters. | |||||
decounter = -10; | |||||
msg = LM_ToNorm; | |||||
LegatoParams pars{param.freq, param.vel, param.portamento, | |||||
param.midinote, false}; | |||||
note.legatonote(pars); | |||||
break; | |||||
} | |||||
} | } | ||||
fade.m += fade.step; | |||||
outl[i] *= fade.m; | |||||
outr[i] *= fade.m; | |||||
} | |||||
break; | |||||
case LM_FadeOut: // Fade-out, then set the catch-up | |||||
if(decounter == -10) | |||||
decounter = fade.length; | |||||
for(int i = 0; i < synth.buffersize; ++i) { | |||||
decounter--; | |||||
if(decounter < 1) { | |||||
for(int j = i; j < synth.buffersize; ++j) { | |||||
outl[j] = 0.0f; | |||||
outr[j] = 0.0f; | |||||
break; | |||||
case LM_FadeIn: // Fade-in | |||||
if (decounter == -10) | |||||
decounter = fade.length; | |||||
silent = false; | |||||
for (int i = 0; i < synth.buffersize; ++i) { | |||||
decounter--; | |||||
if (decounter < 1) { | |||||
decounter = -10; | |||||
msg = LM_Norm; | |||||
break; | |||||
} | } | ||||
decounter = -10; | |||||
silent = true; | |||||
// Fading-out done, now set the catch-up : | |||||
fade.m += fade.step; | |||||
outl[i] *= fade.m; | |||||
outr[i] *= fade.m; | |||||
} | |||||
break; | |||||
case LM_FadeOut: // Fade-out, then set the catch-up | |||||
if (decounter == -10) | |||||
decounter = fade.length; | decounter = fade.length; | ||||
msg = LM_CatchUp; | |||||
//This freq should make this now silent note to catch-up/resync | |||||
//with the heard note for the same length it stayed at the | |||||
//previous freq during the fadeout. | |||||
float catchupfreq = param.freq * (param.freq / lastfreq); | |||||
LegatoParams pars{catchupfreq, param.vel, param.portamento, | |||||
param.midinote, false}; | |||||
note.legatonote(pars); | |||||
break; | |||||
for (int i = 0; i < synth.buffersize; ++i) { | |||||
decounter--; | |||||
if (decounter < 1) { | |||||
for (int j = i; j < synth.buffersize; ++j) { | |||||
outl[j] = 0.0f; | |||||
outr[j] = 0.0f; | |||||
} | |||||
decounter = -10; | |||||
silent = true; | |||||
// Fading-out done, now set the catch-up : | |||||
decounter = fade.length; | |||||
msg = LM_CatchUp; | |||||
//This freq should make this now silent note to catch-up/resync | |||||
//with the heard note for the same length it stayed at the | |||||
//previous freq during the fadeout. | |||||
float catchupfreq = param.freq * (param.freq / lastfreq); | |||||
LegatoParams pars{catchupfreq, param.vel, param.portamento, | |||||
param.midinote, false}; | |||||
note.legatonote(pars); | |||||
break; | |||||
} | |||||
fade.m -= fade.step; | |||||
outl[i] *= fade.m; | |||||
outr[i] *= fade.m; | |||||
} | } | ||||
fade.m -= fade.step; | |||||
outl[i] *= fade.m; | |||||
outr[i] *= fade.m; | |||||
} | |||||
break; | |||||
default: | |||||
break; | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
} catch (std::bad_alloc &ba) { | |||||
std::cerr << "failed to apply legato: " << ba.what() << std::endl; | |||||
} | } | ||||
} | } | ||||
@@ -134,6 +140,10 @@ void SynthNote::setVelocity(float velocity_) { | |||||
legato.setSilent(true); //Let legato.update(...) returns 0. | legato.setSilent(true); //Let legato.update(...) returns 0. | ||||
LegatoParams pars{legato.getFreq(), velocity_, | LegatoParams pars{legato.getFreq(), velocity_, | ||||
legato.getPortamento(), legato.getMidinote(), true}; | legato.getPortamento(), legato.getMidinote(), true}; | ||||
legatonote(pars); | |||||
try { | |||||
legatonote(pars); | |||||
} catch (std::bad_alloc &ba) { | |||||
std::cerr << "failed to set velocity to legato note: " << ba.what() << std::endl; | |||||
} | |||||
legato.setDecounter(0); //avoid chopping sound due fade-in | legato.setDecounter(0); //avoid chopping sound due fade-in | ||||
} | } |
@@ -34,7 +34,12 @@ void BankList::OSC_raw(const char *msg) | |||||
this->add(path); | this->add(path); | ||||
} | } | ||||
if(!strcmp(msg, "/bank/bank_select")&& !strcmp(rtosc_argument_string(msg),"i")) { | if(!strcmp(msg, "/bank/bank_select")&& !strcmp(rtosc_argument_string(msg),"i")) { | ||||
value(rtosc_argument(msg, 0).i); | |||||
int val = rtosc_argument(msg, 0).i; | |||||
if(value() != val) { | |||||
value(val); | |||||
for(int i=0; i<160; ++i) | |||||
osc->write("/bank/slot"+to_s(i), ""); | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -11,7 +11,7 @@ | |||||
class Bank; | class Bank; | ||||
class BankView; | class BankView; | ||||
class Fl_Light_Button; | |||||
class Fl_Check_Button; | |||||
class BankList : public Fl_Osc_Choice | class BankList : public Fl_Osc_Choice | ||||
{ | { | ||||
@@ -63,9 +63,9 @@ class BankViewControls: public Fl_Group | |||||
//4 -> swap | //4 -> swap | ||||
int mode_; | int mode_; | ||||
static void cb_clearbutton(Fl_Light_Button*, void*); | |||||
static void cb_readbutton(Fl_Light_Button*, void*); | |||||
static void cb_writebutton(Fl_Light_Button*, void*); | |||||
static void cb_clearbutton(Fl_Check_Button*, void*); | |||||
static void cb_readbutton(Fl_Check_Button*, void*); | |||||
static void cb_writebutton(Fl_Check_Button*, void*); | |||||
}; | }; | ||||
class BankView: public Fl_Group, public Fl_Osc_Widget | class BankView: public Fl_Group, public Fl_Osc_Widget | ||||
@@ -26,20 +26,28 @@ | |||||
using namespace GUI; | using namespace GUI; | ||||
class MasterUI *ui; | class MasterUI *ui; | ||||
#ifdef NTK_GUI | #ifdef NTK_GUI | ||||
static Fl_Tiled_Image *module_backdrop; | static Fl_Tiled_Image *module_backdrop; | ||||
#endif | #endif | ||||
int undo_redo_handler(int) | |||||
int kb_shortcut_handler(int) | |||||
{ | { | ||||
const bool undo_ = Fl::event_ctrl() && Fl::event_key() == 'z'; | const bool undo_ = Fl::event_ctrl() && Fl::event_key() == 'z'; | ||||
const bool redo = Fl::event_ctrl() && Fl::event_key() == 'r'; | const bool redo = Fl::event_ctrl() && Fl::event_key() == 'r'; | ||||
const bool show = Fl::event_ctrl() && Fl::event_shift() && | |||||
Fl::event_key() == 's'; | |||||
const bool panel = Fl::event_ctrl() && Fl::event_shift() && | |||||
Fl::event_key() == 'p'; | |||||
if(undo_) | if(undo_) | ||||
ui->osc->write("/undo", ""); | ui->osc->write("/undo", ""); | ||||
else if(redo) | else if(redo) | ||||
ui->osc->write("/redo", ""); | ui->osc->write("/redo", ""); | ||||
return undo_ || redo; | |||||
else if (show) { | |||||
ui->simplemasterwindow->hide(); | |||||
ui->masterwindow->show(); | |||||
} else if (panel) | |||||
ui->panelwindow->show(); | |||||
return undo_ || redo || show; | |||||
} | } | ||||
void | void | ||||
@@ -118,7 +126,7 @@ ui_handle_t GUI::createUi(Fl_Osc_Interface *osc, void *exit) | |||||
//tree->osc = osc; | //tree->osc = osc; | ||||
//midi_win->show(); | //midi_win->show(); | ||||
Fl::add_handler(undo_redo_handler); | |||||
Fl::add_handler(kb_shortcut_handler); | |||||
return (void*) (ui = new MasterUI((int*)exit, osc)); | return (void*) (ui = new MasterUI((int*)exit, osc)); | ||||
} | } | ||||
void GUI::destroyUi(ui_handle_t ui) | void GUI::destroyUi(ui_handle_t ui) | ||||
@@ -361,40 +361,40 @@ formantfiltergraph->redraw();} | |||||
label {Num.Formants} | label {Num.Formants} | ||||
callback {update_formant_window(); | callback {update_formant_window(); | ||||
formantfiltergraph->redraw();} | formantfiltergraph->redraw();} | ||||
xywh {485 15 65 20} type Simple labelfont 1 labelsize 10 align 5 minimum 0 maximum 127 step 1 | |||||
xywh {485 15 65 20} type Simple labelfont 0 labelsize 10 align 5 minimum 0 maximum 127 step 1 | |||||
code0 {o->bounds(1,FF_MAX_FORMANTS);} | code0 {o->bounds(1,FF_MAX_FORMANTS);} | ||||
code1 {o->init("Pnumformants");} | code1 {o->init("Pnumformants");} | ||||
class Fl_Osc_Counter | class Fl_Osc_Counter | ||||
} | } | ||||
Fl_Dial frsldial { | Fl_Dial frsldial { | ||||
label {Fr.Sl.} | label {Fr.Sl.} | ||||
tooltip {Formant's Slowness (Morphing)} xywh {565 15 25 25} box ROUND_UP_BOX labelfont 1 labelsize 10 align 1 maximum 127 step 1 | |||||
tooltip {Formant's Slowness (Morphing)} xywh {565 15 25 25} box ROUND_UP_BOX labelfont 0 labelsize 10 align 1 maximum 127 step 1 | |||||
code0 {o->init("Pformantslowness");} | code0 {o->init("Pformantslowness");} | ||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Value_Output centerfreqvo { | Fl_Value_Output centerfreqvo { | ||||
label {C.f.} | label {C.f.} | ||||
callback {o->value(o->newvalue()/1000.0);} | callback {o->value(o->newvalue()/1000.0);} | ||||
tooltip {Center Frequency (kHz)} xywh {515 164 33 18} when 3 minimum 1 maximum 10 step 0.01 value 1 textfont 1 | |||||
tooltip {Center Frequency (kHz)} xywh {511 164 40 18} when 3 minimum 1 maximum 10 step 0.01 value 1 textfont 1 textsize 11 labelsize 13 | |||||
code0 {o->init("centerfreq");} | code0 {o->init("centerfreq");} | ||||
class Fl_Osc_Output | class Fl_Osc_Output | ||||
} | } | ||||
Fl_Value_Output octavesfreqvo { | Fl_Value_Output octavesfreqvo { | ||||
label {Oct.} | label {Oct.} | ||||
callback {o->value(o->newvalue());} | callback {o->value(o->newvalue());} | ||||
tooltip {No. of octaves} xywh {515 182 33 18} when 3 minimum 1 maximum 127 step 1 value 5 textfont 1 | |||||
tooltip {No. of octaves} xywh {511 182 40 18} when 3 minimum 1 maximum 127 step 0.01 value 5 textfont 1 textsize 11 labelsize 13 | |||||
code0 {o->init("octavesfreq");} | code0 {o->init("octavesfreq");} | ||||
class Fl_Osc_Output | class Fl_Osc_Output | ||||
} | } | ||||
Fl_Slider cfknob { | Fl_Slider cfknob { | ||||
callback {/*formantfiltergraph->redraw();*/} | |||||
xywh {551 167 84 15} type {Horz Knob} box FLAT_BOX maximum 127 | |||||
callback {centerfreqvo->update();} | |||||
xywh {555 167 84 15} type {Horz Knob} box FLAT_BOX maximum 127 | |||||
code0 {o->init("Pcenterfreq", 'i');} | code0 {o->init("Pcenterfreq", 'i');} | ||||
class Fl_Osc_Slider | class Fl_Osc_Slider | ||||
} | } | ||||
Fl_Slider octknob { | Fl_Slider octknob { | ||||
callback {/*formantfiltergraph->redraw();*/} | |||||
xywh {551 185 84 15} type {Horz Knob} box FLAT_BOX maximum 127 | |||||
callback {octavesfreqvo->update();} | |||||
xywh {555 185 84 15} type {Horz Knob} box FLAT_BOX maximum 127 | |||||
code0 {o->init("Poctavesfreq", 'i');} | code0 {o->init("Poctavesfreq", 'i');} | ||||
class Fl_Osc_Slider | class Fl_Osc_Slider | ||||
} | } | ||||
@@ -405,7 +405,7 @@ formantfiltergraph->redraw();} | |||||
} | } | ||||
Fl_Dial wvknob { | Fl_Dial wvknob { | ||||
label {Vw.Cl.} | label {Vw.Cl.} | ||||
tooltip {Vowel "clearness" (how the mixed vowels are avoided)} xywh {600 15 25 25} box ROUND_UP_BOX labelfont 1 labelsize 10 align 1 maximum 127 step 1 | |||||
tooltip {Vowel "clearness" (how the mixed vowels are avoided)} xywh {600 15 25 25} box ROUND_UP_BOX labelfont 0 labelsize 10 align 1 maximum 127 step 1 | |||||
code0 {o->init("Pvowelclearness");} | code0 {o->init("Pvowelclearness");} | ||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
@@ -421,7 +421,7 @@ formantfiltergraph->redraw();} | |||||
} | } | ||||
Fl_Box {} { | Fl_Box {} { | ||||
label Vowel | label Vowel | ||||
xywh {635 10 55 15} | |||||
xywh {635 6 55 15} labelfont 1 | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -63,7 +63,7 @@ void Fl_Osc_Dial::callback(Fl_Callback *cb, void *p) | |||||
int Fl_Osc_Dial::handle(int ev) | int Fl_Osc_Dial::handle(int ev) | ||||
{ | { | ||||
bool middle_mouse = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && !Fl::event_shift()); | bool middle_mouse = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && !Fl::event_shift()); | ||||
bool ctl_click = (ev == FL_PUSH && Fl::event_state(FL_BUTTON1) && Fl::event_ctrl()); | |||||
bool ctl_click = (ev == FL_PUSH && Fl::event_state(FL_BUTTON3) && Fl::event_ctrl()); | |||||
bool shift_middle = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && Fl::event_shift()); | bool shift_middle = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && Fl::event_shift()); | ||||
if(middle_mouse || ctl_click) { | if(middle_mouse || ctl_click) { | ||||
printf("Trying to learn...\n"); | printf("Trying to learn...\n"); | ||||
@@ -54,7 +54,7 @@ void Fl_Osc_DialF::callback(Fl_Callback *cb, void *p) | |||||
int Fl_Osc_DialF::handle(int ev) | int Fl_Osc_DialF::handle(int ev) | ||||
{ | { | ||||
bool middle_mouse = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && !Fl::event_shift()); | bool middle_mouse = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && !Fl::event_shift()); | ||||
bool ctl_click = (ev == FL_PUSH && Fl::event_state(FL_BUTTON1) && Fl::event_ctrl()); | |||||
bool ctl_click = (ev == FL_PUSH && Fl::event_state(FL_BUTTON3) && Fl::event_ctrl()); | |||||
bool shift_middle = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && Fl::event_shift()); | bool shift_middle = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && Fl::event_shift()); | ||||
if(middle_mouse || ctl_click) { | if(middle_mouse || ctl_click) { | ||||
printf("Trying to learn...\n"); | printf("Trying to learn...\n"); | ||||
@@ -33,6 +33,9 @@ class Fl_Osc_Slider:public Fl_Slider, public Fl_Osc_Widget | |||||
private: | private: | ||||
float old_value; | float old_value; | ||||
int mod_state; | |||||
int slow_state; | |||||
int start_pos; | int start_pos; | ||||
bool just_pushed; | |||||
float denominator; | float denominator; | ||||
}; | }; |
@@ -16,7 +16,7 @@ static double min__(double a, double b) | |||||
Fl_Osc_Slider::Fl_Osc_Slider(int X, int Y, int W, int H, const char *label) | Fl_Osc_Slider::Fl_Osc_Slider(int X, int Y, int W, int H, const char *label) | ||||
:Fl_Slider(X,Y,W,H,label), Fl_Osc_Widget(this), reset_value(0), | :Fl_Slider(X,Y,W,H,label), Fl_Osc_Widget(this), reset_value(0), | ||||
cb_data(NULL, NULL) | |||||
cb_data(NULL, NULL), just_pushed(true) | |||||
{ | { | ||||
//bounds(0.0f,1.0f); | //bounds(0.0f,1.0f); | ||||
Fl_Slider::callback(Fl_Osc_Slider::_cb); | Fl_Slider::callback(Fl_Osc_Slider::_cb); | ||||
@@ -74,10 +74,12 @@ void Fl_Osc_Slider::callback(Fl_Callback *cb, void *p) | |||||
cb_data.second = p; | cb_data.second = p; | ||||
} | } | ||||
#define MOD_MASK (FL_CTRL | FL_SHIFT) | |||||
int Fl_Osc_Slider::handle(int ev, int X, int Y, int W, int H) | int Fl_Osc_Slider::handle(int ev, int X, int Y, int W, int H) | ||||
{ | { | ||||
bool middle_mouse = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && !Fl::event_shift()); | bool middle_mouse = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && !Fl::event_shift()); | ||||
bool ctl_click = (ev == FL_PUSH && Fl::event_state(FL_BUTTON1) && Fl::event_ctrl()); | |||||
bool ctl_click = (ev == FL_PUSH && Fl::event_state(FL_BUTTON3) && Fl::event_ctrl()); | |||||
bool shift_middle = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && Fl::event_shift()); | bool shift_middle = (ev == FL_PUSH && Fl::event_state(FL_BUTTON2) && Fl::event_shift()); | ||||
if(middle_mouse || ctl_click) { | if(middle_mouse || ctl_click) { | ||||
printf("Trying to learn...\n"); | printf("Trying to learn...\n"); | ||||
@@ -91,46 +93,46 @@ int Fl_Osc_Slider::handle(int ev, int X, int Y, int W, int H) | |||||
int handled; | int handled; | ||||
float rounded; | float rounded; | ||||
if (ev != FL_MOUSEWHEEL) | |||||
handled = Fl_Slider::handle(ev, X, Y, W, H); | |||||
const float range = maximum() - minimum(); | |||||
const float absrange = (range > 0 ? range : -range)+1; | |||||
int old_mod_state; | |||||
const float normal_step = range / W; | |||||
switch (ev) { | switch (ev) { | ||||
case FL_PUSH: | case FL_PUSH: | ||||
denominator = 2.0; | |||||
old_value = value(); | |||||
start_pos = horizontal() ? Fl::event_x() : Fl::event_y(); | |||||
{ | |||||
float range = maximum() - minimum(); | |||||
float absrng = range > 0 ? range : -range; | |||||
if (absrng / W / step() > 32 && Fl::event_button1()) | |||||
denominator = 0.25; | |||||
if (range < 0) | |||||
denominator *= -1; | |||||
} | |||||
just_pushed = true; | |||||
mod_state = Fl::event_state() & MOD_MASK; | |||||
slow_state = 0; | |||||
handled = mod_state ? 1 : Fl_Slider::handle(ev, X, Y, W, H); | |||||
break; | break; | ||||
case FL_MOUSEWHEEL: | case FL_MOUSEWHEEL: | ||||
mod_state = Fl::event_state() & MOD_MASK; | |||||
if (Fl::event_buttons()) | |||||
return 1; | |||||
if (this == Fl::belowmouse() && Fl::e_dy != 0) { | if (this == Fl::belowmouse() && Fl::e_dy != 0) { | ||||
int step = 1, divisor = 16; | |||||
switch (Fl::event_state() & ( FL_CTRL | FL_SHIFT)) { | |||||
int step_ = 1, divisor = 16; | |||||
switch (mod_state) { | |||||
case FL_SHIFT: | case FL_SHIFT: | ||||
step = 8; | |||||
if (absrange > divisor * 8) | |||||
step_ = 8; | |||||
case FL_SHIFT | FL_CTRL: | case FL_SHIFT | FL_CTRL: | ||||
break; | break; | ||||
case FL_CTRL: | case FL_CTRL: | ||||
divisor = 128; | divisor = 128; | ||||
default: | default: | ||||
step = (fabs(maximum() - minimum()) + 1) / divisor; | |||||
if (step < 1) | |||||
step = 1; | |||||
step_ = absrange / divisor; | |||||
if (step_ < 1) | |||||
step_ = 1; | |||||
} | } | ||||
int dy = minimum() <= maximum() ? -Fl::e_dy : Fl::e_dy; | int dy = minimum() <= maximum() ? -Fl::e_dy : Fl::e_dy; | ||||
// Flip sense for vertical sliders. | // Flip sense for vertical sliders. | ||||
dy = this->horizontal() ? dy : -dy; | dy = this->horizontal() ? dy : -dy; | ||||
handle_drag(clamp(value() + step * dy)); | |||||
handle_drag(clamp(value() + step_ * dy)); | |||||
} | } | ||||
return 1; | return 1; | ||||
case FL_RELEASE: | case FL_RELEASE: | ||||
handled = Fl_Slider::handle(ev, X, Y, W, H); | |||||
if (Fl::event_clicks() == 1) { | if (Fl::event_clicks() == 1) { | ||||
Fl::event_clicks(0); | Fl::event_clicks(0); | ||||
value(reset_value); | value(reset_value); | ||||
@@ -141,15 +143,75 @@ int Fl_Osc_Slider::handle(int ev, int X, int Y, int W, int H) | |||||
value_damage(); | value_damage(); | ||||
do_callback(); | do_callback(); | ||||
break; | break; | ||||
case FL_DRAG: | |||||
if (Fl::event_shift()) { | |||||
int delta = (horizontal() ? Fl::event_x() : Fl::event_y()) - | |||||
start_pos; | |||||
rounded = floor(clamp(old_value + delta/denominator) + 0.5); | |||||
value(rounded); | |||||
value_damage(); | |||||
do_callback(); | |||||
case FL_DRAG: { | |||||
old_mod_state = mod_state; | |||||
mod_state = Fl::event_state() & MOD_MASK; | |||||
if (slow_state == 0 && mod_state == 0) | |||||
return Fl_Slider::handle(ev, X, Y, W, H); | |||||
if (mod_state != 0) { | |||||
slow_state = 1; | |||||
} else if (slow_state == 1) | |||||
slow_state = 2; | |||||
if (just_pushed || old_mod_state != mod_state) { | |||||
just_pushed = false; | |||||
old_value = value(); | |||||
start_pos = horizontal() ? Fl::event_x() : Fl::event_y(); | |||||
if (slow_state == 1) { | |||||
denominator = 2.0; | |||||
float step_ = step(); | |||||
if (step_ == 0) step_ = 1; | |||||
if (absrange / W / step_ > 32) | |||||
switch (mod_state) { | |||||
case FL_CTRL: | |||||
denominator = 0.15; | |||||
break; | |||||
case FL_SHIFT: | |||||
denominator = 0.7; | |||||
break; | |||||
case MOD_MASK: | |||||
denominator = 3.0; | |||||
break; | |||||
} | |||||
else if (mod_state & FL_SHIFT) | |||||
denominator = 5.0; | |||||
if (range < 0) | |||||
denominator *= -1; | |||||
} | |||||
} | |||||
int delta = (horizontal() ? Fl::event_x() : Fl::event_y()) | |||||
- start_pos; | |||||
float new_value; | |||||
if (slow_state == 1) { | |||||
new_value = old_value + delta / denominator; | |||||
} else { | |||||
new_value = old_value + delta * normal_step; | |||||
} | |||||
const float clamped_value = clamp(new_value); | |||||
rounded = floor(clamped_value + 0.5); | |||||
if (new_value != clamped_value) { | |||||
start_pos = horizontal() ? Fl::event_x() : Fl::event_y(); | |||||
old_value = rounded; | |||||
if (slow_state == 2 && | |||||
((horizontal() && | |||||
(Fl::event_x() < X || Fl::event_x() > X + W)) || | |||||
(!horizontal() && | |||||
(Fl::event_y() < Y || Fl::event_y() > Y + H)))) | |||||
slow_state = 0; | |||||
} | } | ||||
value(rounded); | |||||
value_damage(); | |||||
do_callback(); | |||||
handled = 1; | |||||
break; | |||||
} | |||||
default: | |||||
handled = Fl_Slider::handle(ev, X, Y, W, H); | |||||
} | } | ||||
return handled; | return handled; | ||||
@@ -644,9 +644,9 @@ redrawoscil();} | |||||
code0 {o->value(wshpar->value());} | code0 {o->value(wshpar->value());} | ||||
} | } | ||||
} | } | ||||
Fl_Light_Button autoclearbutton { | |||||
Fl_Check_Button autoclearbutton { | |||||
label {Clr.} | label {Clr.} | ||||
tooltip {Auto clear when using the oscillator as base function} xywh {100 318 35 20} box THIN_UP_BOX value 1 labelfont 1 labelsize 10 | |||||
tooltip {Auto clear when using the oscillator as base function} xywh {98 318 40 20} box THIN_UP_BOX value 1 labelfont 1 labelsize 10 | |||||
} | } | ||||
Fl_Group {} { | Fl_Group {} { | ||||
xywh {290 313 155 30} box UP_FRAME | xywh {290 313 155 30} box UP_FRAME | ||||
@@ -531,7 +531,9 @@ else {bendrng->oscMove("pitchwheel.bendrange");}} | |||||
} | } | ||||
Fl_Button {} { | Fl_Button {} { | ||||
label {Reset all controllers} | label {Reset all controllers} | ||||
callback {o->oscWrite("defaults");//part->SetController(C_resetallcontrollers,0);} | |||||
callback {o->oscWrite("defaults");//part->SetController(C_resetallcontrollers,0); | |||||
ctlwindow->update(); | |||||
} | |||||
xywh {5 110 210 20} box THIN_UP_BOX | xywh {5 110 210 20} box THIN_UP_BOX | ||||
class Fl_Osc_Button | class Fl_Osc_Button | ||||
} | } | ||||
@@ -102,13 +102,13 @@ redrawPADnoteApply();} | |||||
Fl_Slider maxdb { | Fl_Slider maxdb { | ||||
callback {maxdbvo->value(o->value()); | callback {maxdbvo->value(o->value()); | ||||
redrawPADnoteApply();} | redrawPADnoteApply();} | ||||
xywh {90 282 84 15} type Horizontal minimum 1 maximum 90 step 1 value 30 | |||||
xywh {90 285 84 15} box FLAT_BOX type {Horz Knob} minimum 1 maximum 90 step 1 value 30 | |||||
code0 {o->init("PmaxdB", 'i'); o->reset_value = 30;} | code0 {o->init("PmaxdB", 'i'); o->reset_value = 30;} | ||||
class Fl_Osc_Slider | class Fl_Osc_Slider | ||||
} | } | ||||
Fl_Value_Output maxdbvo { | Fl_Value_Output maxdbvo { | ||||
label {Max.} | label {Max.} | ||||
tooltip {The Maximum amplitude (dB)} xywh {126 264 24 18} labelsize 12 minimum 1 maximum 127 step 1 value 30 textfont 1 textsize 12 | |||||
tooltip {The Maximum amplitude (dB)} xywh {126 264 24 18} labelsize 12 minimum 1 maximum 127 step 1 value 30 textfont 0 textsize 12 | |||||
} | } | ||||
Fl_Box {} { | Fl_Box {} { | ||||
label dB | label dB | ||||
@@ -117,14 +117,14 @@ redrawPADnoteApply();} | |||||
Fl_Value_Output centerfreqvo { | Fl_Value_Output centerfreqvo { | ||||
label {C.f.} | label {C.f.} | ||||
callback {o->value(o->newvalue()/1000.0);} | callback {o->value(o->newvalue()/1000.0);} | ||||
tooltip {Center Frequency (kHz)} xywh {210 264 33 18} labelsize 12 when 3 minimum 1 maximum 10 step 0.01 value 1 textfont 1 textsize 12 | |||||
tooltip {Center Frequency (kHz)} xywh {210 264 45 18} labelsize 12 when 3 minimum 1 maximum 10 step 0.01 value 1 textfont 1 textsize 12 | |||||
code0 {o->init("centerfreq");} | code0 {o->init("centerfreq");} | ||||
class Fl_Osc_Output | class Fl_Osc_Output | ||||
} | } | ||||
Fl_Value_Output octavesfreqvo { | Fl_Value_Output octavesfreqvo { | ||||
label {Oct.} | label {Oct.} | ||||
callback {o->value(o->newvalue());} | callback {o->value(o->newvalue());} | ||||
tooltip {No. of octaves} xywh {210 282 33 18} labelsize 12 when 3 minimum 1 maximum 127 step 1 value 30 textfont 1 textsize 12 | |||||
tooltip {No. of octaves} xywh {210 282 45 18} labelsize 12 when 3 minimum 0 maximum 11 step 0.01 value 5 textfont 1 textsize 12 | |||||
code0 {o->init("octavesfreq");} | code0 {o->init("octavesfreq");} | ||||
class Fl_Osc_Output | class Fl_Osc_Output | ||||
} | } | ||||
@@ -165,21 +165,19 @@ redrawPADnoteApply();} | |||||
tooltip {Interpolate the peaks} xywh {365 265 46 15} box THIN_UP_BOX labelfont 1 labelsize 10 | tooltip {Interpolate the peaks} xywh {365 265 46 15} box THIN_UP_BOX labelfont 1 labelsize 10 | ||||
class Fl_Osc_Button | class Fl_Osc_Button | ||||
} | } | ||||
Fl_Dial centerfreq { | |||||
label {C.f.} | |||||
Fl_Slider centerfreq { | |||||
callback {centerfreqvo->do_callback(); | callback {centerfreqvo->do_callback(); | ||||
redrawPADnoteApply();} | redrawPADnoteApply();} | ||||
xywh {245 265 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | |||||
code0 {o->init("Pcenterfreq");} | |||||
class Fl_Osc_Dial | |||||
xywh {260 268 90 14} box FLAT_BOX type {Horz Knob} labelsize 10 maximum 127 step 1 | |||||
code0 {o->init("Pcenterfreq", 'i');} | |||||
class Fl_Osc_Slider | |||||
} | } | ||||
Fl_Dial octavesfreq { | |||||
label {Oct.} | |||||
Fl_Slider octavesfreq { | |||||
callback {octavesfreqvo->do_callback(); | callback {octavesfreqvo->do_callback(); | ||||
redrawPADnoteApply();} | redrawPADnoteApply();} | ||||
xywh {280 265 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | |||||
code0 {o->init("Poctavesfreq");} | |||||
class Fl_Osc_Dial | |||||
xywh {260 286 90 14} box FLAT_BOX type {Horz Knob} labelsize 10 maximum 127 step 1 | |||||
code0 {o->init("Poctavesfreq", 'i');} | |||||
class Fl_Osc_Slider | |||||
} | } | ||||
Fl_Button {} { | Fl_Button {} { | ||||
label C | label C | ||||
@@ -33,6 +33,8 @@ void WidgetPDial::setRounding(unsigned int digits) | |||||
tipwin->setRounding(digits); | tipwin->setRounding(digits); | ||||
} | } | ||||
#define MOD_MASK (FL_CTRL | FL_SHIFT) | |||||
int WidgetPDial::handle(int event) | int WidgetPDial::handle(int event) | ||||
{ | { | ||||
double dragsize, min = minimum(), max = maximum(), result; | double dragsize, min = minimum(), max = maximum(), result; | ||||
@@ -47,25 +49,50 @@ int WidgetPDial::handle(int event) | |||||
do_callback(); | do_callback(); | ||||
return 1; | return 1; | ||||
} | } | ||||
int old_mod_state; | |||||
switch(event) { | switch(event) { | ||||
case FL_PUSH: | case FL_PUSH: | ||||
mod_state = Fl::event_state() & MOD_MASK; | |||||
if (integer_step) | if (integer_step) | ||||
setRounding(0); | setRounding(0); | ||||
else if (Fl::event_shift()) | |||||
else if (mod_state == MOD_MASK) | |||||
setRounding(5); | |||||
else if (mod_state == FL_SHIFT) | |||||
setRounding(4); | setRounding(4); | ||||
else | else | ||||
setRounding(Fl::event_button1() ? 2 : 3); | |||||
setRounding((Fl::event_button3() || mod_state & FL_CTRL) | |||||
? 3 : 2); | |||||
oldvalue = value(); | oldvalue = value(); | ||||
old_y = Fl::event_y(); | old_y = Fl::event_y(); | ||||
case FL_DRAG: | case FL_DRAG: | ||||
getPos(); | getPos(); | ||||
old_mod_state = mod_state; | |||||
mod_state = Fl::event_state() & MOD_MASK; | |||||
if (old_mod_state != mod_state) { | |||||
oldvalue = value(); | |||||
old_y = Fl::event_y(); | |||||
if (integer_step) | |||||
setRounding(0); | |||||
else if (mod_state == MOD_MASK) | |||||
setRounding(5); | |||||
else if (mod_state == FL_SHIFT) | |||||
setRounding(4); | |||||
else | |||||
setRounding((Fl::event_button3() || mod_state & FL_CTRL) | |||||
? 3 : 2); | |||||
break; | |||||
} | |||||
dy = old_y - Fl::event_y(); | dy = old_y - Fl::event_y(); | ||||
if (Fl::event_shift()) | |||||
if (!integer_step && mod_state == MOD_MASK) | |||||
dragsize = 200000.0f; | |||||
else if (!integer_step && mod_state == FL_SHIFT) | |||||
dragsize = 20000.0f; | dragsize = 20000.0f; | ||||
else | else | ||||
dragsize = Fl::event_button1() ? 200.0f : 2000.0f; | |||||
dragsize = (Fl::event_button3() || mod_state & MOD_MASK) | |||||
? 1000.0f : 200.0f; | |||||
value(clamp(oldvalue + dy / dragsize * (max - min))); | value(clamp(oldvalue + dy / dragsize * (max - min))); | ||||
tipwin->showValue(transform(value())); | tipwin->showValue(transform(value())); | ||||
@@ -74,19 +101,25 @@ int WidgetPDial::handle(int event) | |||||
do_callback(); | do_callback(); | ||||
return 1; | return 1; | ||||
case FL_MOUSEWHEEL: | case FL_MOUSEWHEEL: | ||||
if (Fl::belowmouse() != this) | |||||
if (Fl::event_buttons() || Fl::belowmouse() != this) | |||||
return 1; | return 1; | ||||
mod_state = Fl::event_state() & MOD_MASK; | |||||
dy = - Fl::event_dy(); | dy = - Fl::event_dy(); | ||||
if (integer_step) { | if (integer_step) { | ||||
setRounding(0); | setRounding(0); | ||||
result = (int)(value() + dy * (Fl::event_ctrl() ? 1 : 8)); | |||||
result = (int)(value() + | |||||
dy * ((Fl::event_ctrl() || | |||||
Fl::event_shift()) ? 1 : 8)); | |||||
} else { | } else { | ||||
float dragsize; | float dragsize; | ||||
if (Fl::event_shift()) { | |||||
if (mod_state == MOD_MASK) { | |||||
dragsize = 100000.0; | |||||
setRounding(5); | |||||
} else if (mod_state == FL_SHIFT) { | |||||
dragsize = 10000.0; | dragsize = 10000.0; | ||||
setRounding(4); | setRounding(4); | ||||
} else if (Fl::event_ctrl()) { | |||||
} else if (mod_state == FL_CTRL) { | |||||
dragsize = 1000.0; | dragsize = 1000.0; | ||||
setRounding(3); | setRounding(3); | ||||
} else { | } else { | ||||
@@ -121,7 +154,6 @@ int WidgetPDial::handle(int event) | |||||
if(this->when() == 0) | if(this->when() == 0) | ||||
do_callback(); | do_callback(); | ||||
return 1; | return 1; | ||||
break; | |||||
} | } | ||||
return 0; | return 0; | ||||
//#endif | //#endif | ||||
@@ -31,5 +31,6 @@ class WidgetPDial:public Fl_Dial | |||||
class TipWin * tipwin; | class TipWin * tipwin; | ||||
float value_offset; | float value_offset; | ||||
float value_scale; | float value_scale; | ||||
int mod_state; | |||||
}; | }; | ||||
#endif | #endif |
@@ -89,15 +89,25 @@ class MasterUI *ui=0; | |||||
static Fl_Tiled_Image *module_backdrop; | static Fl_Tiled_Image *module_backdrop; | ||||
#endif | #endif | ||||
int undo_redo_handler(int) | |||||
int kb_shortcut_handler(int) | |||||
{ | { | ||||
const bool undo_ = Fl::event_ctrl() && Fl::event_key() == 'z'; | const bool undo_ = Fl::event_ctrl() && Fl::event_key() == 'z'; | ||||
const bool redo = Fl::event_ctrl() && Fl::event_key() == 'r'; | const bool redo = Fl::event_ctrl() && Fl::event_key() == 'r'; | ||||
const bool show = Fl::event_ctrl() && Fl::event_shift() && | |||||
Fl::event_key() == 's'; | |||||
const bool panel = Fl::event_ctrl() && Fl::event_shift() && | |||||
Fl::event_key() == 'p'; | |||||
if(undo_) | if(undo_) | ||||
ui->osc->write("/undo", ""); | ui->osc->write("/undo", ""); | ||||
else if(redo) | else if(redo) | ||||
ui->osc->write("/redo", ""); | ui->osc->write("/redo", ""); | ||||
return undo_ || redo; | |||||
else if (show) { | |||||
ui->simplemasterwindow->hide(); | |||||
ui->masterwindow->show(); | |||||
} | |||||
else if (panel) | |||||
ui->panelwindow->show(); | |||||
return undo_ || redo || show; | |||||
} | } | ||||
void | void | ||||
@@ -176,7 +186,7 @@ ui_handle_t GUI::createUi(Fl_Osc_Interface *osc, void *exit) | |||||
//tree->osc = osc; | //tree->osc = osc; | ||||
//midi_win->show(); | //midi_win->show(); | ||||
Fl::add_handler(undo_redo_handler); | |||||
Fl::add_handler(kb_shortcut_handler); | |||||
return (void*) (ui = new MasterUI((int*)exit, osc)); | return (void*) (ui = new MasterUI((int*)exit, osc)); | ||||
} | } | ||||
void GUI::destroyUi(ui_handle_t ui) | void GUI::destroyUi(ui_handle_t ui) | ||||
@@ -511,7 +521,7 @@ Fl_Osc_Interface *GUI::genOscInterface(MiddleWare *) | |||||
return new UI_Interface(); | return new UI_Interface(); | ||||
} | } | ||||
rtosc::ThreadLink lo_buffer(4096, 1000); | |||||
rtosc::ThreadLink lo_buffer(4096*2, 1000); | |||||
static void liblo_error_cb(int i, const char *m, const char *loc) | static void liblo_error_cb(int i, const char *m, const char *loc) | ||||
{ | { | ||||
@@ -135,7 +135,7 @@ int main(int argc, char *argv[]) | |||||
<< "\nZynAddSubFX - Copyright (c) 2002-2013 Nasca Octavian Paul and others" | << "\nZynAddSubFX - Copyright (c) 2002-2013 Nasca Octavian Paul and others" | ||||
<< endl; | << endl; | ||||
cerr | cerr | ||||
<< " Copyright (c) 2009-2014 Mark McCurry [active maintainer]" | |||||
<< " Copyright (c) 2009-2015 Mark McCurry [active maintainer]" | |||||
<< endl; | << endl; | ||||
cerr << "Compiled: " << __DATE__ << " " << __TIME__ << endl; | cerr << "Compiled: " << __DATE__ << " " << __TIME__ << endl; | ||||
cerr << "This program is free software (GNU GPL v2 or later) and \n"; | cerr << "This program is free software (GNU GPL v2 or later) and \n"; | ||||