@@ -1071,8 +1071,9 @@ static rtosc::Ports middlewareReplyPorts = { | |||||
rEnd}, | rEnd}, | ||||
{"setprogram:cc:ii", 0, 0, | {"setprogram:cc:ii", 0, 0, | ||||
rBegin; | rBegin; | ||||
Bank &bank = impl.master->bank; | |||||
const int part = rtosc_argument(msg, 0).i; | const int part = rtosc_argument(msg, 0).i; | ||||
const int program = rtosc_argument(msg, 1).i; | |||||
const int program = rtosc_argument(msg, 1).i + 128*bank.bank_lsb; | |||||
impl.loadPart(part, impl.master->bank.ins[program].filename.c_str(), impl.master); | impl.loadPart(part, impl.master->bank.ins[program].filename.c_str(), impl.master); | ||||
impl.uToB->write(("/part"+to_s(part)+"/Pname").c_str(), "s", impl.master->bank.ins[program].name.c_str()); | impl.uToB->write(("/part"+to_s(part)+"/Pname").c_str(), "s", impl.master->bank.ins[program].name.c_str()); | ||||
rEnd}, | rEnd}, | ||||
@@ -93,6 +93,8 @@ static const Ports voicePorts = { | |||||
//Freq Stuff | //Freq Stuff | ||||
rToggle(Pfixedfreq, "If frequency is fixed"), | rToggle(Pfixedfreq, "If frequency is fixed"), | ||||
rParamZyn(PfixedfreqET, "Equal Tempermant Parameter"), | rParamZyn(PfixedfreqET, "Equal Tempermant Parameter"), | ||||
rParamZyn(PBendAdjust, "Pitch bend adjustment"), | |||||
rParamZyn(POffsetHz, "Voice constant offset"), | |||||
rParamI(PDetune, "Fine Detune"), | rParamI(PDetune, "Fine Detune"), | ||||
rParamI(PCoarseDetune, "Coarse Detune"), | rParamI(PCoarseDetune, "Coarse Detune"), | ||||
rParamZyn(PDetuneType, "Magnitude of Detune"), | rParamZyn(PDetuneType, "Magnitude of Detune"), | ||||
@@ -125,6 +127,7 @@ static const Ports voicePorts = { | |||||
rParamI(PFMDetune, "Modulator Fine Detune"), | rParamI(PFMDetune, "Modulator Fine Detune"), | ||||
rParamI(PFMCoarseDetune, "Modulator Coarse Detune"), | rParamI(PFMCoarseDetune, "Modulator Coarse Detune"), | ||||
rParamZyn(PFMDetuneType, "Modulator Detune Magnitude"), | rParamZyn(PFMDetuneType, "Modulator Detune Magnitude"), | ||||
rToggle(PFMFixedFreq, "Modulator Frequency Fixed"), | |||||
rToggle(PFMFreqEnvelopeEnabled, "Modulator Frequency Envelope"), | rToggle(PFMFreqEnvelopeEnabled, "Modulator Frequency Envelope"), | ||||
rToggle(PFMAmpEnvelopeEnabled, "Modulator Amplitude Envelope"), | rToggle(PFMAmpEnvelopeEnabled, "Modulator Amplitude Envelope"), | ||||
@@ -256,7 +259,7 @@ static const Ports globalPorts = { | |||||
//Resonance | //Resonance | ||||
rParamZyn(Hrandgrouping, "How randomness is applied to multiple voices using the same oscil"), | |||||
rToggle(Hrandgrouping, "How randomness is applied to multiple voices using the same oscil"), | |||||
//weird stuff for PCoarseDetune | //weird stuff for PCoarseDetune | ||||
{"detunevalue:", rMap(unit,cents) rDoc("Get detune in cents"), NULL, | {"detunevalue:", rMap(unit,cents) rDoc("Get detune in cents"), NULL, | ||||
@@ -409,6 +412,8 @@ void ADnoteVoiceParam::defaults() | |||||
Type = 0; | Type = 0; | ||||
Pfixedfreq = 0; | Pfixedfreq = 0; | ||||
PfixedfreqET = 0; | PfixedfreqET = 0; | ||||
PBendAdjust = 88; // 64 + 24 | |||||
POffsetHz = 64; | |||||
Presonance = 1; | Presonance = 1; | ||||
Pfilterbypass = 0; | Pfilterbypass = 0; | ||||
Pextoscil = -1; | Pextoscil = -1; | ||||
@@ -433,6 +438,7 @@ void ADnoteVoiceParam::defaults() | |||||
PFilterVelocityScale = 0; | PFilterVelocityScale = 0; | ||||
PFilterVelocityScaleFunction = 64; | PFilterVelocityScaleFunction = 64; | ||||
PFMEnabled = 0; | PFMEnabled = 0; | ||||
PFMFixedFreq = false; | |||||
//I use the internal oscillator (-1) | //I use the internal oscillator (-1) | ||||
PFMVoice = -1; | PFMVoice = -1; | ||||
@@ -646,6 +652,8 @@ void ADnoteVoiceParam::add2XML(XMLwrapper& xml, bool fmoscilused) | |||||
xml.beginbranch("FREQUENCY_PARAMETERS"); | xml.beginbranch("FREQUENCY_PARAMETERS"); | ||||
xml.addparbool("fixed_freq", Pfixedfreq); | xml.addparbool("fixed_freq", Pfixedfreq); | ||||
xml.addpar("fixed_freq_et", PfixedfreqET); | xml.addpar("fixed_freq_et", PfixedfreqET); | ||||
xml.addpar("bend_adjust", PBendAdjust); | |||||
xml.addpar("offset_hz", POffsetHz); | |||||
xml.addpar("detune", PDetune); | xml.addpar("detune", PDetune); | ||||
xml.addpar("coarse_detune", PCoarseDetune); | xml.addpar("coarse_detune", PCoarseDetune); | ||||
xml.addpar("detune_type", PDetuneType); | xml.addpar("detune_type", PDetuneType); | ||||
@@ -716,6 +724,7 @@ void ADnoteVoiceParam::add2XML(XMLwrapper& xml, bool fmoscilused) | |||||
xml.addparbool("freq_envelope_enabled", | xml.addparbool("freq_envelope_enabled", | ||||
PFMFreqEnvelopeEnabled); | PFMFreqEnvelopeEnabled); | ||||
xml.addparbool("fixed_freq", PFMFixedFreq); | |||||
if((PFMFreqEnvelopeEnabled != 0) || (!xml.minimal)) { | if((PFMFreqEnvelopeEnabled != 0) || (!xml.minimal)) { | ||||
xml.beginbranch("FREQUENCY_ENVELOPE"); | xml.beginbranch("FREQUENCY_ENVELOPE"); | ||||
FMFreqEnvelope->add2XML(xml); | FMFreqEnvelope->add2XML(xml); | ||||
@@ -944,6 +953,7 @@ void ADnoteVoiceParam::paste(ADnoteVoiceParam &a) | |||||
copy(PFilterEnabled); | copy(PFilterEnabled); | ||||
copy(Pfilterbypass); | copy(Pfilterbypass); | ||||
copy(PFMEnabled); | copy(PFMEnabled); | ||||
copy(PFMFixedFreq); | |||||
RCopy(OscilSmp); | RCopy(OscilSmp); | ||||
@@ -965,6 +975,8 @@ void ADnoteVoiceParam::paste(ADnoteVoiceParam &a) | |||||
copy(PDetune); | copy(PDetune); | ||||
copy(PCoarseDetune); | copy(PCoarseDetune); | ||||
copy(PDetuneType); | copy(PDetuneType); | ||||
copy(PBendAdjust); | |||||
copy(POffsetHz); | |||||
copy(PFreqEnvelopeEnabled); | copy(PFreqEnvelopeEnabled); | ||||
RCopy(FreqEnvelope); | RCopy(FreqEnvelope); | ||||
@@ -1102,6 +1114,8 @@ void ADnoteVoiceParam::getfromXML(XMLwrapper& xml, unsigned nvoice) | |||||
if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | ||||
Pfixedfreq = xml.getparbool("fixed_freq", Pfixedfreq); | Pfixedfreq = xml.getparbool("fixed_freq", Pfixedfreq); | ||||
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | ||||
PBendAdjust = xml.getpar127("bend_adjust", PBendAdjust); | |||||
POffsetHz = xml.getpar127("offset_hz", POffsetHz); | |||||
PDetune = xml.getpar("detune", PDetune, 0, 16383); | PDetune = xml.getpar("detune", PDetune, 0, 16383); | ||||
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | ||||
PDetuneType = xml.getpar127("detune_type", PDetuneType); | PDetuneType = xml.getpar127("detune_type", PDetuneType); | ||||
@@ -1173,6 +1187,8 @@ void ADnoteVoiceParam::getfromXML(XMLwrapper& xml, unsigned nvoice) | |||||
PFMFreqEnvelopeEnabled = xml.getparbool("freq_envelope_enabled", | PFMFreqEnvelopeEnabled = xml.getparbool("freq_envelope_enabled", | ||||
PFMFreqEnvelopeEnabled); | PFMFreqEnvelopeEnabled); | ||||
PFMFixedFreq = xml.getparbool("fixed_freq", | |||||
PFMFixedFreq); | |||||
if(xml.enterbranch("FREQUENCY_ENVELOPE")) { | if(xml.enterbranch("FREQUENCY_ENVELOPE")) { | ||||
FMFreqEnvelope->getfromXML(xml); | FMFreqEnvelope->getfromXML(xml); | ||||
xml.exitbranch(); | xml.exitbranch(); | ||||
@@ -27,7 +27,7 @@ | |||||
#include "PresetsArray.h" | #include "PresetsArray.h" | ||||
enum FMTYPE { | enum FMTYPE { | ||||
NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PITCH_MOD | |||||
NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PW_MOD | |||||
}; | }; | ||||
/*****************************************************************/ | /*****************************************************************/ | ||||
@@ -189,6 +189,12 @@ struct ADnoteVoiceParam { | |||||
/** Detune type */ | /** Detune type */ | ||||
unsigned char PDetuneType; | unsigned char PDetuneType; | ||||
/** Pitch bend adjustment */ | |||||
unsigned char PBendAdjust; | |||||
/** Pitch offset Hz */ | |||||
unsigned char POffsetHz; | |||||
/* Frequency Envelope */ | /* Frequency Envelope */ | ||||
unsigned char PFreqEnvelopeEnabled; | unsigned char PFreqEnvelopeEnabled; | ||||
EnvelopeParams *FreqEnvelope; | EnvelopeParams *FreqEnvelope; | ||||
@@ -283,6 +289,9 @@ struct ADnoteVoiceParam { | |||||
/* The detune type */ | /* The detune type */ | ||||
unsigned char PFMDetuneType; | unsigned char PFMDetuneType; | ||||
/* FM base freq fixed at 440Hz */ | |||||
unsigned char PFMFixedFreq; | |||||
/* Frequency Envelope of the Modullator */ | /* Frequency Envelope of the Modullator */ | ||||
unsigned char PFMFreqEnvelopeEnabled; | unsigned char PFMFreqEnvelopeEnabled; | ||||
EnvelopeParams *FMFreqEnvelope; | EnvelopeParams *FMFreqEnvelope; | ||||
@@ -39,7 +39,7 @@ const rtosc::Ports Controller::ports = { | |||||
rToggle(bandwidth.exponential, "Bandwidth Exponential Mode"), | rToggle(bandwidth.exponential, "Bandwidth Exponential Mode"), | ||||
rParamZyn(modwheel.depth, "Depth of Modwheel MIDI Control"), | rParamZyn(modwheel.depth, "Depth of Modwheel MIDI Control"), | ||||
rToggle(modwheel.exponential, "Modwheel Exponential Mode"), | rToggle(modwheel.exponential, "Modwheel Exponential Mode"), | ||||
rToggle(pitchwheel.is_split, "If PitchWheel Has unified blendrange or not"), | |||||
rToggle(pitchwheel.is_split, "If PitchWheel Has unified bendrange or not"), | |||||
rParamI(pitchwheel.bendrange, "Range of MIDI Pitch Wheel"), | rParamI(pitchwheel.bendrange, "Range of MIDI Pitch Wheel"), | ||||
rParamI(pitchwheel.bendrange_down, "Lower Range of MIDI Pitch Wheel"), | rParamI(pitchwheel.bendrange_down, "Lower Range of MIDI Pitch Wheel"), | ||||
rToggle(expression.receive, "Expression MIDI Receive"), | rToggle(expression.receive, "Expression MIDI Receive"), | ||||
@@ -35,6 +35,7 @@ class XMLwrapper; | |||||
#define LFO_RAMPDOWN 4 | #define LFO_RAMPDOWN 4 | ||||
#define LFO_EXP_DOWN1 5 | #define LFO_EXP_DOWN1 5 | ||||
#define LFO_EXP_DOWN2 6 | #define LFO_EXP_DOWN2 6 | ||||
#define LFO_RANDOM 7 | |||||
class LFOParams:public Presets | class LFOParams:public Presets | ||||
{ | { | ||||
@@ -66,7 +66,8 @@ static const rtosc::Ports realtime_ports = | |||||
//Freq | //Freq | ||||
rToggle(Pfixedfreq, "Base frequency fixed frequency enable"), | rToggle(Pfixedfreq, "Base frequency fixed frequency enable"), | ||||
rParamZyn(PfixedfreqET, "Equal temeperate control for fixed frequency operation"), | rParamZyn(PfixedfreqET, "Equal temeperate control for fixed frequency operation"), | ||||
rParamZyn(PBendAdjust, "Pitch bend adjustment"), | |||||
rParamZyn(POffsetHz, "Voice constant offset"), | |||||
rParamI(PDetune, "Fine Detune"), | rParamI(PDetune, "Fine Detune"), | ||||
rParamI(PCoarseDetune, "Coarse Detune"), | rParamI(PCoarseDetune, "Coarse Detune"), | ||||
rParamZyn(PDetuneType, "Magnitude of Detune"), | rParamZyn(PDetuneType, "Magnitude of Detune"), | ||||
@@ -233,6 +234,8 @@ static const rtosc::Ports non_realtime_ports = | |||||
d.reply(d.loc, "b", n*sizeof(float), tmp); | d.reply(d.loc, "b", n*sizeof(float), tmp); | ||||
d.reply(d.loc, "i", realbw); | d.reply(d.loc, "i", realbw); | ||||
delete[] tmp;}}, | delete[] tmp;}}, | ||||
{"needPrepare:", rDoc("Unimplemented Stub"), | |||||
NULL, [](const char *, rtosc::RtData&) {}}, | |||||
}; | }; | ||||
const rtosc::Ports &PADnoteParameters::non_realtime_ports = ::non_realtime_ports; | const rtosc::Ports &PADnoteParameters::non_realtime_ports = ::non_realtime_ports; | ||||
@@ -327,6 +330,8 @@ void PADnoteParameters::defaults() | |||||
/* Frequency Global Parameters */ | /* Frequency Global Parameters */ | ||||
Pfixedfreq = 0; | Pfixedfreq = 0; | ||||
PfixedfreqET = 0; | PfixedfreqET = 0; | ||||
PBendAdjust = 88; // 64 + 24 | |||||
POffsetHz = 64; | |||||
PDetune = 8192; //zero | PDetune = 8192; //zero | ||||
PCoarseDetune = 0; | PCoarseDetune = 0; | ||||
PDetuneType = 1; | PDetuneType = 1; | ||||
@@ -984,6 +989,8 @@ void PADnoteParameters::add2XML(XMLwrapper& xml) | |||||
xml.beginbranch("FREQUENCY_PARAMETERS"); | xml.beginbranch("FREQUENCY_PARAMETERS"); | ||||
xml.addpar("fixed_freq", Pfixedfreq); | xml.addpar("fixed_freq", Pfixedfreq); | ||||
xml.addpar("fixed_freq_et", PfixedfreqET); | xml.addpar("fixed_freq_et", PfixedfreqET); | ||||
xml.addpar("bend_adjust", PBendAdjust); | |||||
xml.addpar("offset_hz", POffsetHz); | |||||
xml.addpar("detune", PDetune); | xml.addpar("detune", PDetune); | ||||
xml.addpar("coarse_detune", PCoarseDetune); | xml.addpar("coarse_detune", PCoarseDetune); | ||||
xml.addpar("detune_type", PDetuneType); | xml.addpar("detune_type", PDetuneType); | ||||
@@ -1098,6 +1105,8 @@ void PADnoteParameters::getfromXML(XMLwrapper& xml) | |||||
if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | ||||
Pfixedfreq = xml.getpar127("fixed_freq", Pfixedfreq); | Pfixedfreq = xml.getpar127("fixed_freq", Pfixedfreq); | ||||
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | ||||
PBendAdjust = xml.getpar127("bend_adjust", PBendAdjust); | |||||
POffsetHz = xml.getpar127("offset_hz", POffsetHz); | |||||
PDetune = xml.getpar("detune", PDetune, 0, 16383); | PDetune = xml.getpar("detune", PDetune, 0, 16383); | ||||
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | ||||
PDetuneType = xml.getpar127("detune_type", PDetuneType); | PDetuneType = xml.getpar127("detune_type", PDetuneType); | ||||
@@ -1176,6 +1185,8 @@ void PADnoteParameters::pasteRT(PADnoteParameters &x) | |||||
COPY(Pfixedfreq); | COPY(Pfixedfreq); | ||||
COPY(PfixedfreqET); | COPY(PfixedfreqET); | ||||
COPY(PBendAdjust); | |||||
COPY(POffsetHz); | |||||
COPY(PDetune); | COPY(PDetune); | ||||
COPY(PCoarseDetune); | COPY(PCoarseDetune); | ||||
COPY(PDetuneType); | COPY(PDetuneType); | ||||
@@ -106,6 +106,8 @@ class PADnoteParameters:public Presets | |||||
If this parameter is 0, the frequency is fixed (to 440 Hz); | If this parameter is 0, the frequency is fixed (to 440 Hz); | ||||
if this parameter is 64, 1 MIDI halftone -> 1 frequency halftone */ | if this parameter is 64, 1 MIDI halftone -> 1 frequency halftone */ | ||||
unsigned char PfixedfreqET; | unsigned char PfixedfreqET; | ||||
unsigned char PBendAdjust; | |||||
unsigned char POffsetHz; | |||||
unsigned short int PDetune; //fine detune | unsigned short int PDetune; //fine detune | ||||
unsigned short int PCoarseDetune; //coarse detune+octave | unsigned short int PCoarseDetune; //coarse detune+octave | ||||
unsigned char PDetuneType; //detune type | unsigned char PDetuneType; //detune type | ||||
@@ -53,6 +53,8 @@ static const rtosc::Ports SUBnotePorts = { | |||||
//rToggle(),//continue | //rToggle(),//continue | ||||
rToggle(Pfixedfreq, "Base frequency fixed frequency enable"), | rToggle(Pfixedfreq, "Base frequency fixed frequency enable"), | ||||
rParamZyn(PfixedfreqET, "Equal temeperate control for fixed frequency operation"), | rParamZyn(PfixedfreqET, "Equal temeperate control for fixed frequency operation"), | ||||
rParamZyn(PBendAdjust, "Pitch bend adjustment"), | |||||
rParamZyn(POffsetHz, "Voice constant offset"), | |||||
#undef rChangeCb | #undef rChangeCb | ||||
#define rChangeCb obj->updateFrequencyMultipliers(); | #define rChangeCb obj->updateFrequencyMultipliers(); | ||||
rParamI(POvertoneSpread.type, rMap(min, 0), rMap(max, 7), | rParamI(POvertoneSpread.type, rMap(min, 0), rMap(max, 7), | ||||
@@ -152,6 +154,8 @@ void SUBnoteParameters::defaults() | |||||
Pfixedfreq = 0; | Pfixedfreq = 0; | ||||
PfixedfreqET = 0; | PfixedfreqET = 0; | ||||
PBendAdjust = 88; // 64 + 24 | |||||
POffsetHz = 64; | |||||
Pnumstages = 2; | Pnumstages = 2; | ||||
Pbandwidth = 40; | Pbandwidth = 40; | ||||
Phmagtype = 0; | Phmagtype = 0; | ||||
@@ -232,6 +236,8 @@ void SUBnoteParameters::add2XML(XMLwrapper& xml) | |||||
xml.beginbranch("FREQUENCY_PARAMETERS"); | xml.beginbranch("FREQUENCY_PARAMETERS"); | ||||
xml.addparbool("fixed_freq", Pfixedfreq); | xml.addparbool("fixed_freq", Pfixedfreq); | ||||
xml.addpar("fixed_freq_et", PfixedfreqET); | xml.addpar("fixed_freq_et", PfixedfreqET); | ||||
xml.addpar("bend_adjust", PBendAdjust); | |||||
xml.addpar("offset_hz", POffsetHz); | |||||
xml.addpar("detune", PDetune); | xml.addpar("detune", PDetune); | ||||
xml.addpar("coarse_detune", PCoarseDetune); | xml.addpar("coarse_detune", PCoarseDetune); | ||||
@@ -352,6 +358,8 @@ void SUBnoteParameters::paste(SUBnoteParameters &sub) | |||||
doPaste(PDetune); | doPaste(PDetune); | ||||
doPaste(PCoarseDetune); | doPaste(PCoarseDetune); | ||||
doPaste(PDetuneType); | doPaste(PDetuneType); | ||||
doPaste(PBendAdjust); | |||||
doPaste(POffsetHz); | |||||
doPaste(PFreqEnvelopeEnabled); | doPaste(PFreqEnvelopeEnabled); | ||||
doPPaste(FreqEnvelope); | doPPaste(FreqEnvelope); | ||||
doPaste(PBandWidthEnvelopeEnabled); | doPaste(PBandWidthEnvelopeEnabled); | ||||
@@ -423,6 +431,8 @@ void SUBnoteParameters::getfromXML(XMLwrapper& xml) | |||||
if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | if(xml.enterbranch("FREQUENCY_PARAMETERS")) { | ||||
Pfixedfreq = xml.getparbool("fixed_freq", Pfixedfreq); | Pfixedfreq = xml.getparbool("fixed_freq", Pfixedfreq); | ||||
PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | PfixedfreqET = xml.getpar127("fixed_freq_et", PfixedfreqET); | ||||
PBendAdjust = xml.getpar127("bend_adjust", PBendAdjust); | |||||
POffsetHz = xml.getpar127("offset_hz", POffsetHz); | |||||
PDetune = xml.getpar("detune", PDetune, 0, 16383); | PDetune = xml.getpar("detune", PDetune, 0, 16383); | ||||
PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | PCoarseDetune = xml.getpar("coarse_detune", PCoarseDetune, 0, 16383); | ||||
@@ -54,6 +54,8 @@ class SUBnoteParameters:public Presets | |||||
EnvelopeParams *FreqEnvelope; | EnvelopeParams *FreqEnvelope; | ||||
unsigned char PBandWidthEnvelopeEnabled; | unsigned char PBandWidthEnvelopeEnabled; | ||||
EnvelopeParams *BandWidthEnvelope; | EnvelopeParams *BandWidthEnvelope; | ||||
unsigned char PBendAdjust; | |||||
unsigned char POffsetHz; | |||||
//Filter Parameters (Global) | //Filter Parameters (Global) | ||||
unsigned char PGlobalFilterEnabled; | unsigned char PGlobalFilterEnabled; | ||||
@@ -105,15 +105,36 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
continue; //the voice is disabled | continue; //the voice is disabled | ||||
} | } | ||||
int BendAdj = pars.VoicePar[nvoice].PBendAdjust - 64; | |||||
if (BendAdj % 24 == 0) | |||||
NoteVoicePar[nvoice].BendAdjust = BendAdj / 24; | |||||
else | |||||
NoteVoicePar[nvoice].BendAdjust = BendAdj / 24.0f; | |||||
float offset_val = (pars.VoicePar[nvoice].POffsetHz - 64)/64.0f; | |||||
NoteVoicePar[nvoice].OffsetHz = | |||||
15.0f*(offset_val * sqrtf(fabsf(offset_val))); | |||||
unison_stereo_spread[nvoice] = | unison_stereo_spread[nvoice] = | ||||
pars.VoicePar[nvoice].Unison_stereo_spread / 127.0f; | pars.VoicePar[nvoice].Unison_stereo_spread / 127.0f; | ||||
int unison = pars.VoicePar[nvoice].Unison_size; | int unison = pars.VoicePar[nvoice].Unison_size; | ||||
if(unison < 1) | if(unison < 1) | ||||
unison = 1; | unison = 1; | ||||
// Since noise unison of greater than two is touch goofy... | |||||
if (pars.VoicePar[nvoice].Type != 0 && unison > 2) | |||||
unison = 2; | |||||
bool is_pwm = pars.VoicePar[nvoice].PFMEnabled == PW_MOD; | |||||
if (pars.VoicePar[nvoice].Type != 0) { | |||||
// Since noise unison of greater than two is touch goofy... | |||||
if (unison > 2) | |||||
unison = 2; | |||||
} else if (is_pwm) { | |||||
/* Pulse width mod uses pairs of subvoices. */ | |||||
unison *= 2; | |||||
// This many is likely to sound like noise anyhow. | |||||
if (unison > 64) | |||||
unison = 64; | |||||
} | |||||
//compute unison | //compute unison | ||||
unison_size[nvoice] = unison; | unison_size[nvoice] = unison; | ||||
@@ -127,8 +148,8 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
float unison_vibratto_a = | float unison_vibratto_a = | ||||
pars.VoicePar[nvoice].Unison_vibratto / 127.0f; //0.0f .. 1.0f | pars.VoicePar[nvoice].Unison_vibratto / 127.0f; //0.0f .. 1.0f | ||||
switch(unison) { | |||||
int true_unison = unison / (is_pwm ? 2 : 1); | |||||
switch(true_unison) { | |||||
case 1: | case 1: | ||||
unison_base_freq_rap[nvoice][0] = 1.0f; //if the unison is not used, always make the only subvoice to have the default note | unison_base_freq_rap[nvoice][0] = 1.0f; //if the unison is not used, always make the only subvoice to have the default note | ||||
break; | break; | ||||
@@ -138,11 +159,11 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
}; | }; | ||||
break; | break; | ||||
default: { //unison for more than 2 subvoices | default: { //unison for more than 2 subvoices | ||||
float unison_values[unison]; | |||||
float unison_values[true_unison]; | |||||
float min = -1e-6, max = 1e-6; | float min = -1e-6, max = 1e-6; | ||||
for(int k = 0; k < unison; ++k) { | |||||
float step = (k / (float) (unison - 1)) * 2.0f - 1.0f; //this makes the unison spread more uniform | |||||
float val = step + (RND * 2.0f - 1.0f) / (unison - 1); | |||||
for(int k = 0; k < true_unison; ++k) { | |||||
float step = (k / (float) (true_unison - 1)) * 2.0f - 1.0f; //this makes the unison spread more uniform | |||||
float val = step + (RND * 2.0f - 1.0f) / (true_unison - 1); | |||||
unison_values[k] = val; | unison_values[k] = val; | ||||
if (min > val) { | if (min > val) { | ||||
min = val; | min = val; | ||||
@@ -152,7 +173,7 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
} | } | ||||
} | } | ||||
float diff = max - min; | float diff = max - min; | ||||
for(int k = 0; k < unison; ++k) { | |||||
for(int k = 0; k < true_unison; ++k) { | |||||
unison_values[k] = | unison_values[k] = | ||||
(unison_values[k] - (max + min) * 0.5f) / diff; //the lowest value will be -1 and the highest will be 1 | (unison_values[k] - (max + min) * 0.5f) / diff; //the lowest value will be -1 and the highest will be 1 | ||||
unison_base_freq_rap[nvoice][k] = | unison_base_freq_rap[nvoice][k] = | ||||
@@ -160,9 +181,16 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
} | } | ||||
}; | }; | ||||
} | } | ||||
if (is_pwm) | |||||
for (int i = true_unison - 1; i >= 0; i--) { | |||||
unison_base_freq_rap[nvoice][2*i + 1] = | |||||
unison_base_freq_rap[nvoice][i]; | |||||
unison_base_freq_rap[nvoice][2*i] = | |||||
unison_base_freq_rap[nvoice][i]; | |||||
} | |||||
//unison vibrattos | //unison vibrattos | ||||
if(unison > 1) | |||||
if(unison > 2 || (!is_pwm && unison > 1)) | |||||
for(int k = 0; k < unison; ++k) //reduce the frequency difference for larger vibrattos | for(int k = 0; k < unison; ++k) //reduce the frequency difference for larger vibrattos | ||||
unison_base_freq_rap[nvoice][k] = 1.0f | unison_base_freq_rap[nvoice][k] = 1.0f | ||||
+ (unison_base_freq_rap[ | + (unison_base_freq_rap[ | ||||
@@ -186,12 +214,27 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
if(RND < 0.5f) | if(RND < 0.5f) | ||||
m = -m; | m = -m; | ||||
unison_vibratto[nvoice].step[k] = m; | unison_vibratto[nvoice].step[k] = m; | ||||
// Ugly, but the alternative is likely uglier. | |||||
if (is_pwm) | |||||
for (int i = 0; i < unison; i += 2) { | |||||
unison_vibratto[nvoice].step[i+1] = | |||||
unison_vibratto[nvoice].step[i]; | |||||
unison_vibratto[nvoice].position[i+1] = | |||||
unison_vibratto[nvoice].position[i]; | |||||
} | |||||
} | } | ||||
if(unison == 1) { //no vibratto for a single voice | |||||
unison_vibratto[nvoice].step[0] = 0.0f; | |||||
unison_vibratto[nvoice].position[0] = 0.0f; | |||||
unison_vibratto[nvoice].amplitude = 0.0f; | |||||
if(unison <= 2) { //no vibratto for a single voice | |||||
if (is_pwm) { | |||||
unison_vibratto[nvoice].step[1] = 0.0f; | |||||
unison_vibratto[nvoice].position[1] = 0.0f; | |||||
} | |||||
if (is_pwm || unison == 1) { | |||||
unison_vibratto[nvoice].step[0] = 0.0f; | |||||
unison_vibratto[nvoice].position[0] = 0.0f; | |||||
unison_vibratto[nvoice].amplitude = 0.0f; | |||||
} | |||||
} | } | ||||
//phase invert for unison | //phase invert for unison | ||||
@@ -286,17 +329,21 @@ 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; | |||||
// This code was planned for biasing the carrier in MOD_RING | |||||
// but that's on hold for the moment. Disabled 'cos small | |||||
// machines run this stuff too. | |||||
// | |||||
// //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) | ||||
@@ -304,9 +351,11 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
+ i] = | + i] = | ||||
NoteVoicePar[nvoice].OscilSmp[i]; | NoteVoicePar[nvoice].OscilSmp[i]; | ||||
oscposhi_start += | |||||
NoteVoicePar[nvoice].phase_offset = | |||||
(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 += NoteVoicePar[nvoice].phase_offset; | |||||
int kth_start = oscposhi_start; | int kth_start = oscposhi_start; | ||||
for(int k = 0; k < unison; ++k) { | for(int k = 0; k < unison; ++k) { | ||||
@@ -337,29 +386,34 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
NoteVoicePar[nvoice].filterbypass = | NoteVoicePar[nvoice].filterbypass = | ||||
pars.VoicePar[nvoice].Pfilterbypass; | pars.VoicePar[nvoice].Pfilterbypass; | ||||
switch(pars.VoicePar[nvoice].PFMEnabled) { | |||||
case 1: | |||||
NoteVoicePar[nvoice].FMEnabled = MORPH; | |||||
break; | |||||
case 2: | |||||
NoteVoicePar[nvoice].FMEnabled = RING_MOD; | |||||
break; | |||||
case 3: | |||||
NoteVoicePar[nvoice].FMEnabled = PHASE_MOD; | |||||
break; | |||||
case 4: | |||||
NoteVoicePar[nvoice].FMEnabled = FREQ_MOD; | |||||
break; | |||||
case 5: | |||||
NoteVoicePar[nvoice].FMEnabled = PITCH_MOD; | |||||
break; | |||||
default: | |||||
NoteVoicePar[nvoice].FMEnabled = NONE; | |||||
} | |||||
if (pars.VoicePar[nvoice].Type != 0) | |||||
NoteVoicePar[nvoice].FMEnabled = NONE; | |||||
else | |||||
switch(pars.VoicePar[nvoice].PFMEnabled) { | |||||
case 1: | |||||
NoteVoicePar[nvoice].FMEnabled = MORPH; | |||||
break; | |||||
case 2: | |||||
NoteVoicePar[nvoice].FMEnabled = RING_MOD; | |||||
break; | |||||
case 3: | |||||
NoteVoicePar[nvoice].FMEnabled = PHASE_MOD; | |||||
break; | |||||
case 4: | |||||
NoteVoicePar[nvoice].FMEnabled = FREQ_MOD; | |||||
break; | |||||
case 5: | |||||
NoteVoicePar[nvoice].FMEnabled = PW_MOD; | |||||
break; | |||||
default: | |||||
NoteVoicePar[nvoice].FMEnabled = NONE; | |||||
} | |||||
NoteVoicePar[nvoice].FMVoice = pars.VoicePar[nvoice].PFMVoice; | NoteVoicePar[nvoice].FMVoice = pars.VoicePar[nvoice].PFMVoice; | ||||
NoteVoicePar[nvoice].FMFreqEnvelope = NULL; | NoteVoicePar[nvoice].FMFreqEnvelope = NULL; | ||||
NoteVoicePar[nvoice].FMAmpEnvelope = NULL; | NoteVoicePar[nvoice].FMAmpEnvelope = NULL; | ||||
NoteVoicePar[nvoice].FMFreqFixed = pars.VoicePar[nvoice].PFMFixedFreq; | |||||
//Compute the Voice's modulator volume (incl. damping) | //Compute the Voice's modulator volume (incl. damping) | ||||
float fmvoldamp = powf(440.0f / getvoicebasefreq( | float fmvoldamp = powf(440.0f / getvoicebasefreq( | ||||
@@ -368,6 +422,7 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
- 1.0f); | - 1.0f); | ||||
switch(NoteVoicePar[nvoice].FMEnabled) { | switch(NoteVoicePar[nvoice].FMEnabled) { | ||||
case PHASE_MOD: | case PHASE_MOD: | ||||
case PW_MOD: | |||||
fmvoldamp = | fmvoldamp = | ||||
powf(440.0f / getvoicebasefreq( | powf(440.0f / getvoicebasefreq( | ||||
nvoice), pars.VoicePar[nvoice].PFMVolumeDamp | nvoice), pars.VoicePar[nvoice].PFMVolumeDamp | ||||
@@ -381,8 +436,6 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars) | |||||
(expf(pars.VoicePar[nvoice].PFMVolume / 127.0f | (expf(pars.VoicePar[nvoice].PFMVolume / 127.0f | ||||
* FM_AMP_MULTIPLIER) - 1.0f) * fmvoldamp * 4.0f; | * FM_AMP_MULTIPLIER) - 1.0f) * fmvoldamp * 4.0f; | ||||
break; | break; | ||||
// case PITCH_MOD:NoteVoicePar[nvoice].FMVolume=(pars.VoicePar[nvoice].PFMVolume/127.0f*8.0f)*fmvoldamp;//??????????? | |||||
// break; | |||||
default: | default: | ||||
if(fmvoldamp > 1.0f) | if(fmvoldamp > 1.0f) | ||||
fmvoldamp = 1.0f; | fmvoldamp = 1.0f; | ||||
@@ -546,6 +599,7 @@ void ADnote::legatonote(LegatoParams lpars) | |||||
switch(NoteVoicePar[nvoice].FMEnabled) { | switch(NoteVoicePar[nvoice].FMEnabled) { | ||||
case PHASE_MOD: | case PHASE_MOD: | ||||
case PW_MOD: | |||||
fmvoldamp = | fmvoldamp = | ||||
powf(440.0f / getvoicebasefreq( | powf(440.0f / getvoicebasefreq( | ||||
nvoice), pars.VoicePar[nvoice].PFMVolumeDamp | nvoice), pars.VoicePar[nvoice].PFMVolumeDamp | ||||
@@ -559,8 +613,6 @@ void ADnote::legatonote(LegatoParams lpars) | |||||
(expf(pars.VoicePar[nvoice].PFMVolume / 127.0f | (expf(pars.VoicePar[nvoice].PFMVolume / 127.0f | ||||
* FM_AMP_MULTIPLIER) - 1.0f) * fmvoldamp * 4.0f; | * FM_AMP_MULTIPLIER) - 1.0f) * fmvoldamp * 4.0f; | ||||
break; | break; | ||||
// case PITCH_MOD:NoteVoicePar[nvoice].FMVolume=(pars.VoicePar[nvoice].PFMVolume/127.0f*8.0f)*fmvoldamp;//??????????? | |||||
// break; | |||||
default: | default: | ||||
if(fmvoldamp > 1.0f) | if(fmvoldamp > 1.0f) | ||||
fmvoldamp = 1.0f; | fmvoldamp = 1.0f; | ||||
@@ -1084,20 +1136,28 @@ void ADnote::computecurrentparameters() | |||||
/ 100.0f; | / 100.0f; | ||||
voicefreq = getvoicebasefreq(nvoice) | voicefreq = getvoicebasefreq(nvoice) | ||||
* powf(2, (voicepitch + globalpitch) / 12.0f); //Hz frequency | * powf(2, (voicepitch + globalpitch) / 12.0f); //Hz frequency | ||||
voicefreq *= ctl.pitchwheel.relfreq; //change the frequency by the controller | |||||
setfreq(nvoice, voicefreq * portamentofreqrap); | |||||
voicefreq *= | |||||
powf(ctl.pitchwheel.relfreq, NoteVoicePar[nvoice].BendAdjust); //change the frequency by the controller | |||||
setfreq(nvoice, voicefreq * portamentofreqrap + NoteVoicePar[nvoice].OffsetHz); | |||||
/***************/ | /***************/ | ||||
/* Modulator */ | /* Modulator */ | ||||
/***************/ | /***************/ | ||||
if(NoteVoicePar[nvoice].FMEnabled != NONE) { | if(NoteVoicePar[nvoice].FMEnabled != NONE) { | ||||
FMrelativepitch = NoteVoicePar[nvoice].FMDetune / 100.0f; | FMrelativepitch = NoteVoicePar[nvoice].FMDetune / 100.0f; | ||||
if(NoteVoicePar[nvoice].FMFreqEnvelope) | if(NoteVoicePar[nvoice].FMFreqEnvelope) | ||||
FMrelativepitch += | FMrelativepitch += | ||||
NoteVoicePar[nvoice].FMFreqEnvelope->envout() / 100; | NoteVoicePar[nvoice].FMFreqEnvelope->envout() / 100; | ||||
FMfreq = | |||||
powf(2.0f, FMrelativepitch | |||||
/ 12.0f) * voicefreq * portamentofreqrap; | |||||
if (NoteVoicePar[nvoice].FMFreqFixed) | |||||
FMfreq = | |||||
powf(2.0f, FMrelativepitch | |||||
/ 12.0f) * 440.0f; | |||||
else | |||||
FMfreq = | |||||
powf(2.0f, FMrelativepitch | |||||
/ 12.0f) * voicefreq * portamentofreqrap; | |||||
setfreqFM(nvoice, FMfreq); | setfreqFM(nvoice, FMfreq); | ||||
FMoldamplitude[nvoice] = FMnewamplitude[nvoice]; | FMoldamplitude[nvoice] = FMnewamplitude[nvoice]; | ||||
@@ -1332,7 +1392,11 @@ inline void ADnote::ComputeVoiceOscillatorFrequencyModulation(int nvoice, | |||||
for(int k = 0; k < unison_size[nvoice]; ++k) { | for(int k = 0; k < unison_size[nvoice]; ++k) { | ||||
float *tw = tmpwave_unison[k]; | float *tw = tmpwave_unison[k]; | ||||
const float *smps = NoteVoicePar[NoteVoicePar[nvoice].FMVoice].VoiceOut; | const float *smps = NoteVoicePar[NoteVoicePar[nvoice].FMVoice].VoiceOut; | ||||
memcpy(tw, smps, synth.bufferbytes); | |||||
if (FMmode == PW_MOD && (k & 1)) | |||||
for (int i = 0; i < synth.buffersize; ++i) | |||||
tw[i] = -smps[i]; | |||||
else | |||||
memcpy(tw, smps, synth.bufferbytes); | |||||
} | } | ||||
} else { | } else { | ||||
//Compute the modulator and store it in tmpwave_unison[][] | //Compute the modulator and store it in tmpwave_unison[][] | ||||
@@ -1346,7 +1410,10 @@ inline void ADnote::ComputeVoiceOscillatorFrequencyModulation(int nvoice, | |||||
for(int i = 0; i < synth.buffersize; ++i) { | for(int i = 0; i < synth.buffersize; ++i) { | ||||
tw[i] = (smps[poshiFM] * ((1<<24) - posloFM) | tw[i] = (smps[poshiFM] * ((1<<24) - posloFM) | ||||
+ smps[poshiFM + 1] * posloFM) / (1.0f*(1<<24)); | |||||
+ smps[poshiFM + 1] * posloFM) / (1.0f*(1<<24)); | |||||
if (FMmode == PW_MOD && (k & 1)) | |||||
tw[i] = -tw[i]; | |||||
posloFM += freqloFM; | posloFM += freqloFM; | ||||
if(posloFM >= (1<<24)) { | if(posloFM >= (1<<24)) { | ||||
posloFM &= 0xffffff;//fmod(posloFM, 1.0f); | posloFM &= 0xffffff;//fmod(posloFM, 1.0f); | ||||
@@ -1380,7 +1447,7 @@ inline void ADnote::ComputeVoiceOscillatorFrequencyModulation(int nvoice, | |||||
//normalize: makes all sample-rates, oscil_sizes to produce same sound | //normalize: makes all sample-rates, oscil_sizes to produce same sound | ||||
if(FMmode != 0) { //Frequency modulation | |||||
if(FMmode == FREQ_MOD) { //Frequency modulation | |||||
const float normalize = synth.oscilsize_f / 262144.0f * 44100.0f | const float normalize = synth.oscilsize_f / 262144.0f * 44100.0f | ||||
/ synth.samplerate_f; | / synth.samplerate_f; | ||||
for(int k = 0; k < unison_size[nvoice]; ++k) { | for(int k = 0; k < unison_size[nvoice]; ++k) { | ||||
@@ -1393,7 +1460,7 @@ inline void ADnote::ComputeVoiceOscillatorFrequencyModulation(int nvoice, | |||||
FMoldsmp[nvoice][k] = fmold; | FMoldsmp[nvoice][k] = fmold; | ||||
} | } | ||||
} | } | ||||
else { //Phase modulation | |||||
else { //Phase or PWM modulation | |||||
const float normalize = synth.oscilsize_f / 262144.0f; | const float normalize = synth.oscilsize_f / 262144.0f; | ||||
for(int k = 0; k < unison_size[nvoice]; ++k) { | for(int k = 0; k < unison_size[nvoice]; ++k) { | ||||
float *tw = tmpwave_unison[k]; | float *tw = tmpwave_unison[k]; | ||||
@@ -1421,6 +1488,8 @@ inline void ADnote::ComputeVoiceOscillatorFrequencyModulation(int nvoice, | |||||
//carrier | //carrier | ||||
int carposhi = poshi + FMmodfreqhi; | int carposhi = poshi + FMmodfreqhi; | ||||
int carposlo = poslo + FMmodfreqlo; | int carposlo = poslo + FMmodfreqlo; | ||||
if (FMmode == PW_MOD && (k & 1)) | |||||
carposhi += NoteVoicePar[nvoice].phase_offset; | |||||
if(carposlo >= (1<<24)) { | if(carposlo >= (1<<24)) { | ||||
carposhi++; | carposhi++; | ||||
@@ -1446,12 +1515,6 @@ inline void ADnote::ComputeVoiceOscillatorFrequencyModulation(int nvoice, | |||||
} | } | ||||
/*Calculeaza Oscilatorul cu PITCH MODULATION*/ | |||||
inline void ADnote::ComputeVoiceOscillatorPitchModulation(int /*nvoice*/) | |||||
{ | |||||
//TODO | |||||
} | |||||
/* | /* | ||||
* Computes the Noise | * Computes the Noise | ||||
*/ | */ | ||||
@@ -1514,13 +1577,12 @@ int ADnote::noteout(float *outl, float *outr) | |||||
case RING_MOD: | case RING_MOD: | ||||
ComputeVoiceOscillatorRingModulation(nvoice); | ComputeVoiceOscillatorRingModulation(nvoice); | ||||
break; | break; | ||||
case PHASE_MOD: | |||||
ComputeVoiceOscillatorFrequencyModulation(nvoice, 0); | |||||
break; | |||||
case FREQ_MOD: | case FREQ_MOD: | ||||
ComputeVoiceOscillatorFrequencyModulation(nvoice, 1); | |||||
case PHASE_MOD: | |||||
case PW_MOD: | |||||
ComputeVoiceOscillatorFrequencyModulation(nvoice, | |||||
NoteVoicePar[nvoice].FMEnabled); | |||||
break; | break; | ||||
//case PITCH_MOD:ComputeVoiceOscillatorPitchModulation(nvoice);break; | |||||
default: | default: | ||||
ComputeVoiceOscillator_LinearInterpolation(nvoice); | ComputeVoiceOscillator_LinearInterpolation(nvoice); | ||||
//if (config.cfg.Interpolation) ComputeVoiceOscillator_CubicInterpolation(nvoice); | //if (config.cfg.Interpolation) ComputeVoiceOscillator_CubicInterpolation(nvoice); | ||||
@@ -1544,10 +1606,17 @@ int ADnote::noteout(float *outl, float *outr) | |||||
float *tw = tmpwave_unison[k]; | float *tw = tmpwave_unison[k]; | ||||
if(stereo) { | if(stereo) { | ||||
float stereo_pos = 0; | float stereo_pos = 0; | ||||
if(unison_size[nvoice] > 1) | |||||
bool is_pwm = NoteVoicePar[nvoice].FMEnabled == PW_MOD; | |||||
if (is_pwm) { | |||||
if(unison_size[nvoice] > 2) | |||||
stereo_pos = k/2 | |||||
/ (float)(unison_size[nvoice]/2 | |||||
- 1) * 2.0f - 1.0f; | |||||
} else if(unison_size[nvoice] > 1) { | |||||
stereo_pos = k | stereo_pos = k | ||||
/ (float)(unison_size[nvoice] | |||||
- 1) * 2.0f - 1.0f; | |||||
/ (float)(unison_size[nvoice] | |||||
- 1) * 2.0f - 1.0f; | |||||
} | |||||
float stereo_spread = unison_stereo_spread[nvoice] * 2.0f; //between 0 and 2.0f | float stereo_spread = unison_stereo_spread[nvoice] * 2.0f; //between 0 and 2.0f | ||||
if(stereo_spread > 1.0f) { | if(stereo_spread > 1.0f) { | ||||
float stereo_pos_1 = (stereo_pos >= 0.0f) ? 1.0f : -1.0f; | float stereo_pos_1 = (stereo_pos >= 0.0f) ? 1.0f : -1.0f; | ||||
@@ -1559,7 +1628,8 @@ int ADnote::noteout(float *outl, float *outr) | |||||
else | else | ||||
stereo_pos *= stereo_spread; | stereo_pos *= stereo_spread; | ||||
if(unison_size[nvoice] == 1) | |||||
if(unison_size[nvoice] == 1 || | |||||
(is_pwm && unison_size[nvoice] == 2)) | |||||
stereo_pos = 0.0f; | stereo_pos = 0.0f; | ||||
float panning = (stereo_pos + 1.0f) * 0.5f; | float panning = (stereo_pos + 1.0f) * 0.5f; | ||||
@@ -105,7 +105,6 @@ class ADnote:public SynthNote | |||||
/**Fadein in a way that removes clicks but keep sound "punchy"*/ | /**Fadein in a way that removes clicks but keep sound "punchy"*/ | ||||
inline void fadein(float *smps) const; | inline void fadein(float *smps) const; | ||||
//GLOBALS | //GLOBALS | ||||
ADnoteParameters &pars; | ADnoteParameters &pars; | ||||
unsigned char stereo; //if the note is stereo (allows note Panning) | unsigned char stereo; //if the note is stereo (allows note Panning) | ||||
@@ -187,6 +186,9 @@ class ADnote:public SynthNote | |||||
/* Waveform of the Voice */ | /* Waveform of the Voice */ | ||||
float *OscilSmp; | float *OscilSmp; | ||||
/* preserved for phase mod PWM emulation. */ | |||||
int phase_offset; | |||||
/* Range of waveform */ | /* Range of waveform */ | ||||
float OscilSmpMin, OscilSmpMax; | float OscilSmpMin, OscilSmpMax; | ||||
@@ -199,6 +201,11 @@ class ADnote:public SynthNote | |||||
// cents = basefreq*VoiceDetune | // cents = basefreq*VoiceDetune | ||||
float Detune, FineDetune; | float Detune, FineDetune; | ||||
// Bend adjustment | |||||
float BendAdjust; | |||||
float OffsetHz; | |||||
Envelope *FreqEnvelope; | Envelope *FreqEnvelope; | ||||
LFO *FreqLfo; | LFO *FreqLfo; | ||||
@@ -234,6 +241,8 @@ class ADnote:public SynthNote | |||||
FMTYPE FMEnabled; | FMTYPE FMEnabled; | ||||
unsigned char FMFreqFixed; | |||||
int FMVoice; | int FMVoice; | ||||
// Voice Output used by other voices if use this as modullator | // Voice Output used by other voices if use this as modullator | ||||
@@ -29,7 +29,8 @@ | |||||
#include <cmath> | #include <cmath> | ||||
LFO::LFO(const LFOParams &lfopars, float basefreq, const AbsTime &t) | LFO::LFO(const LFOParams &lfopars, float basefreq, const AbsTime &t) | ||||
:delayTime(t, lfopars.Pdelay / 127.0f * 4.0f), //0..4 sec | |||||
:first_half(-1), | |||||
delayTime(t, lfopars.Pdelay / 127.0f * 4.0f), //0..4 sec | |||||
waveShape(lfopars.PLFOtype), | waveShape(lfopars.PLFOtype), | ||||
deterministic(!lfopars.Pfreqrand), | deterministic(!lfopars.Pfreqrand), | ||||
dt_(t.dt()), | dt_(t.dt()), | ||||
@@ -88,7 +89,7 @@ LFO::LFO(const LFOParams &lfopars, float basefreq, const AbsTime &t) | |||||
LFO::~LFO() | LFO::~LFO() | ||||
{} | {} | ||||
float LFO::baseOut(const char waveShape, const float phase) const | |||||
float LFO::baseOut(const char waveShape, const float phase) | |||||
{ | { | ||||
switch(waveShape) { | switch(waveShape) { | ||||
case LFO_TRIANGLE: | case LFO_TRIANGLE: | ||||
@@ -109,6 +110,12 @@ float LFO::baseOut(const char waveShape, const float phase) const | |||||
case LFO_RAMPDOWN: return (0.5f - phase) * 2.0f; | case LFO_RAMPDOWN: return (0.5f - phase) * 2.0f; | ||||
case LFO_EXP_DOWN1: return powf(0.05f, phase) * 2.0f - 1.0f; | case LFO_EXP_DOWN1: return powf(0.05f, phase) * 2.0f - 1.0f; | ||||
case LFO_EXP_DOWN2: return powf(0.001f, phase) * 2.0f - 1.0f; | case LFO_EXP_DOWN2: return powf(0.001f, phase) * 2.0f - 1.0f; | ||||
case LFO_RANDOM: | |||||
if ((phase < 0.5) != first_half) { | |||||
first_half = phase < 0.5; | |||||
last_random = 2*RND-1; | |||||
} | |||||
return last_random; | |||||
default: return cosf(phase * 2.0f * PI); //LFO_SINE | default: return cosf(phase * 2.0f * PI); //LFO_SINE | ||||
} | } | ||||
} | } | ||||
@@ -41,7 +41,7 @@ class LFO | |||||
float lfoout(); | float lfoout(); | ||||
float amplfoout(); | float amplfoout(); | ||||
private: | private: | ||||
float baseOut(const char waveShape, const float phase) const; | |||||
float baseOut(const char waveShape, const float phase); | |||||
//Phase of Oscillator | //Phase of Oscillator | ||||
float phase; | float phase; | ||||
//Phase Increment Per Frame | //Phase Increment Per Frame | ||||
@@ -51,6 +51,10 @@ class LFO | |||||
//Amplitude Randomness | //Amplitude Randomness | ||||
float amp1, amp2; | float amp1, amp2; | ||||
// RND mode | |||||
int first_half; | |||||
float last_random; | |||||
//Intensity of the wave | //Intensity of the wave | ||||
float lfointensity; | float lfointensity; | ||||
//Amount Randomness | //Amount Randomness | ||||
@@ -171,6 +171,7 @@ const rtosc::Ports OscilGen::non_realtime_ports = { | |||||
printf("fowarding...\n"); d.forward();} | printf("fowarding...\n"); d.forward();} | ||||
const rtosc::Ports OscilGen::realtime_ports{ | const rtosc::Ports OscilGen::realtime_ports{ | ||||
rSelf(OscilGen), | rSelf(OscilGen), | ||||
rPresetType, | |||||
rParamZyn(Prand, "Oscilator Phase Randomness: smaller than 0 is \"" | rParamZyn(Prand, "Oscilator Phase Randomness: smaller than 0 is \"" | ||||
"group\", larger than 0 is for each harmonic"), | "group\", larger than 0 is for each harmonic"), | ||||
rParamZyn(Pamprandpower, | rParamZyn(Pamprandpower, | ||||
@@ -63,7 +63,13 @@ void PADnote::setup(float freq, | |||||
basefreq *= powf(3.0f, tmp); | basefreq *= powf(3.0f, tmp); | ||||
} | } | ||||
} | } | ||||
int BendAdj = pars.PBendAdjust - 64; | |||||
if (BendAdj % 24 == 0) | |||||
BendAdjust = BendAdj / 24; | |||||
else | |||||
BendAdjust = BendAdj / 24.0f; | |||||
float offset_val = (pars.POffsetHz - 64)/64.0f; | |||||
OffsetHz = 15.0f*(offset_val * sqrtf(fabsf(offset_val))); | |||||
firsttime = true; | firsttime = true; | ||||
realfreq = basefreq; | realfreq = basefreq; | ||||
if(!legato) | if(!legato) | ||||
@@ -255,7 +261,8 @@ void PADnote::computecurrentparameters() | |||||
} | } | ||||
realfreq = basefreq * portamentofreqrap | realfreq = basefreq * portamentofreqrap | ||||
* powf(2.0f, globalpitch / 12.0f) * ctl.pitchwheel.relfreq; | |||||
* powf(2.0f, globalpitch / 12.0f) | |||||
* powf(ctl.pitchwheel.relfreq, BendAdjust) + OffsetHz; | |||||
} | } | ||||
@@ -52,6 +52,8 @@ class PADnote:public SynthNote | |||||
float poslo; | float poslo; | ||||
float basefreq; | float basefreq; | ||||
float BendAdjust; | |||||
float OffsetHz; | |||||
bool firsttime; | bool firsttime; | ||||
int nsample, portamento; | int nsample, portamento; | ||||
@@ -78,6 +78,13 @@ void SUBnote::setup(float freq, | |||||
basefreq *= powf(3.0f, tmp); | basefreq *= powf(3.0f, tmp); | ||||
} | } | ||||
} | } | ||||
int BendAdj = pars.PBendAdjust - 64; | |||||
if (BendAdj % 24 == 0) | |||||
BendAdjust = BendAdj / 24; | |||||
else | |||||
BendAdjust = BendAdj / 24.0f; | |||||
float offset_val = (pars.POffsetHz - 64)/64.0f; | |||||
OffsetHz = 15.0f*(offset_val * sqrtf(fabsf(offset_val))); | |||||
float detune = getdetune(pars.PDetuneType, | float detune = getdetune(pars.PDetuneType, | ||||
pars.PCoarseDetune, | pars.PCoarseDetune, | ||||
pars.PDetune); | pars.PDetune); | ||||
@@ -178,9 +185,11 @@ void SUBnote::setup(float freq, | |||||
float amp = 1.0f; | float amp = 1.0f; | ||||
if(nph == 0) | if(nph == 0) | ||||
amp = gain; | amp = gain; | ||||
initfilter(lfilter[nph + n * numstages], freq, bw, amp, hgain); | |||||
initfilter(lfilter[nph + n * numstages], freq + OffsetHz, bw, | |||||
amp, hgain); | |||||
if(stereo) | if(stereo) | ||||
initfilter(rfilter[nph + n * numstages], freq, bw, amp, hgain); | |||||
initfilter(rfilter[nph + n * numstages], freq + OffsetHz, bw, | |||||
amp, hgain); | |||||
} | } | ||||
} | } | ||||
@@ -432,7 +441,8 @@ void SUBnote::computecurrentparameters() | |||||
envfreq = FreqEnvelope->envout() / 1200; | envfreq = FreqEnvelope->envout() / 1200; | ||||
envfreq = powf(2.0f, envfreq); | envfreq = powf(2.0f, envfreq); | ||||
} | } | ||||
envfreq *= ctl.pitchwheel.relfreq; //pitch wheel | |||||
envfreq *= | |||||
powf(ctl.pitchwheel.relfreq, BendAdjust); //pitch wheel | |||||
if(portamento) { //portamento is used | if(portamento) { //portamento is used | ||||
envfreq *= ctl.portamento.freqrap; | envfreq *= ctl.portamento.freqrap; | ||||
if(!ctl.portamento.used) //the portamento has finished | if(!ctl.portamento.used) //the portamento has finished | ||||
@@ -59,6 +59,8 @@ class SUBnote:public SynthNote | |||||
int firstnumharmonics; //To keep track of the first note's numharmonics value, useful in legato mode. | int firstnumharmonics; //To keep track of the first note's numharmonics value, useful in legato mode. | ||||
int start; //how the harmonics start | int start; //how the harmonics start | ||||
float basefreq; | float basefreq; | ||||
float BendAdjust; | |||||
float OffsetHz; | |||||
float panning; | float panning; | ||||
Envelope *AmpEnvelope; | Envelope *AmpEnvelope; | ||||
Envelope *FreqEnvelope; | Envelope *FreqEnvelope; | ||||
@@ -87,9 +87,9 @@ class PhaseSlider {: {public Fl_Osc_TSlider} | |||||
Function {PhaseSlider(int x,int y, int w, int h, const char *label=0) | Function {PhaseSlider(int x,int y, int w, int h, const char *label=0) | ||||
:Fl_Osc_TSlider(x,y,w,h,label)} {open | :Fl_Osc_TSlider(x,y,w,h,label)} {open | ||||
} { code { | } { code { | ||||
setRounding(1); | |||||
set_rounding(1); | |||||
reset_value=0; | reset_value=0; | ||||
setTransform(180.0/64, 0); | |||||
set_transform([](float x){return 180.0f*x/64.0f;}); | |||||
} {}} | } {}} | ||||
Function {set_scope(Fl_Oscilloscope *newscope)} { | Function {set_scope(Fl_Oscilloscope *newscope)} { | ||||
} { code { oscope = newscope; } {} } | } { code { oscope = newscope; } {} } | ||||
@@ -127,7 +127,7 @@ class ADvoicelistitem {open : {public Fl_Osc_Group} | |||||
} { | } { | ||||
Fl_Value_Slider voicevolume { | Fl_Value_Slider voicevolume { | ||||
tooltip Volume xywh {132 5 115 20} type {Horz Knob} box NO_BOX labelsize 8 align 5 maximum 127 step 1 | tooltip Volume xywh {132 5 115 20} type {Horz Knob} box NO_BOX labelsize 8 align 5 maximum 127 step 1 | ||||
code1 {o->init("PVolume");} | |||||
code1 {o->init("PVolume"); o->reset_value=100;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Check_Button voiceresonanceenabled { | Fl_Check_Button voiceresonanceenabled { | ||||
@@ -137,12 +137,12 @@ class ADvoicelistitem {open : {public Fl_Osc_Group} | |||||
} | } | ||||
Fl_Value_Slider voicelfofreq { | Fl_Value_Slider voicelfofreq { | ||||
tooltip {Frequency LFO amount} xywh {542 5 115 20} type {Horz Knob} box NO_BOX labelsize 8 align 5 maximum 127 step 1 | tooltip {Frequency LFO amount} xywh {542 5 115 20} type {Horz Knob} box NO_BOX labelsize 8 align 5 maximum 127 step 1 | ||||
code0 {o->init("FreqLfo/Pintensity", 'i');} | |||||
code0 {o->init("FreqLfo/Pintensity", 'i');o->reset_value=40;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Dial voicepanning { | Fl_Dial voicepanning { | ||||
tooltip {Panning (leftmost is Random)} xywh {257 5 20 20} box ROUND_UP_BOX labelsize 10 align 4 maximum 127 step 1 | tooltip {Panning (leftmost is Random)} xywh {257 5 20 20} box ROUND_UP_BOX labelsize 10 align 4 maximum 127 step 1 | ||||
code0 {o->init("PPanning");} | |||||
code0 {o->init("PPanning");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Group voiceoscil {open | Fl_Group voiceoscil {open | ||||
@@ -214,6 +214,7 @@ else | |||||
case 0: | case 0: | ||||
whitenoiselabel->hide(); | whitenoiselabel->hide(); | ||||
pinknoiselabel->hide(); | pinknoiselabel->hide(); | ||||
oscil->Overlay = NULL; | |||||
voiceresonanceenabled->activate(); | voiceresonanceenabled->activate(); | ||||
detunevalueoutput->activate(); | detunevalueoutput->activate(); | ||||
voicedetune->activate(); | voicedetune->activate(); | ||||
@@ -223,10 +224,12 @@ else | |||||
case 1: | case 1: | ||||
whitenoiselabel->show(); | whitenoiselabel->show(); | ||||
pinknoiselabel->hide(); | pinknoiselabel->hide(); | ||||
oscil->Overlay = whitenoiselabel; | |||||
break; | break; | ||||
default: | default: | ||||
pinknoiselabel->show(); | pinknoiselabel->show(); | ||||
whitenoiselabel->hide(); | whitenoiselabel->hide(); | ||||
oscil->Overlay = pinknoiselabel; | |||||
} | } | ||||
voiceresonanceenabled->deactivate(); | voiceresonanceenabled->deactivate(); | ||||
@@ -310,15 +313,15 @@ class ADvoiceUI {open : {public Fl_Group} | |||||
} { | } { | ||||
Fl_Group voiceFMparametersgroup { | Fl_Group voiceFMparametersgroup { | ||||
label MODULATOR open | label MODULATOR open | ||||
xywh {530 5 230 580} box UP_FRAME color 48 labeltype EMBOSSED_LABEL labelfont 1 labelsize 13 align 17 | |||||
xywh {530 5 230 585} box UP_FRAME color 48 labeltype EMBOSSED_LABEL labelfont 1 labelsize 13 align 17 | |||||
} { | } { | ||||
Fl_Group modfrequency { | Fl_Group modfrequency { | ||||
label {Mod.FREQUENCY} | label {Mod.FREQUENCY} | ||||
xywh {535 220 220 155} box UP_FRAME labeltype EMBOSSED_LABEL labelfont 1 labelsize 13 align 17 | |||||
xywh {535 219 220 174} box UP_FRAME labeltype EMBOSSED_LABEL labelfont 1 labelsize 13 align 17 | |||||
} { | } { | ||||
Fl_Group voiceFMfreqenvgroup { | Fl_Group voiceFMfreqenvgroup { | ||||
label {ADSynth Modulator - Frequency Envelope} | label {ADSynth Modulator - Frequency Envelope} | ||||
xywh {540 300 210 70} box FLAT_BOX color 51 align 144 | |||||
xywh {540 315 210 70} box FLAT_BOX color 51 align 144 | |||||
code0 {o->init(ENV_ASR, osc_i, loc, "FMFreqEnvelope/");} | code0 {o->init(ENV_ASR, osc_i, loc, "FMFreqEnvelope/");} | ||||
class EnvelopeUI | class EnvelopeUI | ||||
} {} | } {} | ||||
@@ -327,20 +330,20 @@ class ADvoiceUI {open : {public Fl_Group} | |||||
callback {if (o->value()==0) voiceFMfreqenvgroup->deactivate(); | callback {if (o->value()==0) voiceFMfreqenvgroup->deactivate(); | ||||
else voiceFMfreqenvgroup->activate(); | else voiceFMfreqenvgroup->activate(); | ||||
o->redraw();} | o->redraw();} | ||||
tooltip {Forced Release} xywh {545 305 50 10} down_box DOWN_BOX labelfont 1 labelsize 11 | |||||
tooltip {Forced Release} xywh {545 322 50 10} down_box DOWN_BOX labelfont 1 labelsize 11 | |||||
code0 {o->init("PFMFreqEnvelopeEnabled");} | code0 {o->init("PFMFreqEnvelopeEnabled");} | ||||
class Fl_Osc_Check | class Fl_Osc_Check | ||||
} | } | ||||
Fl_Counter {} { | Fl_Counter {} { | ||||
label {Coarse Det.} | label {Coarse Det.} | ||||
tooltip {Coarse Detune} xywh {685 280 60 15} labelsize 10 align 1 minimum -64 maximum 63 step 1 textfont 1 textsize 11 | |||||
tooltip {Coarse Detune} xywh {685 295 60 15} labelsize 10 align 1 minimum -64 maximum 63 step 1 textfont 1 textsize 11 | |||||
code0 {o->init("FMcoarsedetune");} | code0 {o->init("FMcoarsedetune");} | ||||
code3 {o->lstep(10);} | code3 {o->lstep(10);} | ||||
class Fl_Osc_Counter | class Fl_Osc_Counter | ||||
} | } | ||||
Fl_Counter {} { | Fl_Counter {} { | ||||
label Octave | label Octave | ||||
tooltip Octave xywh {625 280 45 15} type Simple labelsize 10 align 1 minimum -8 maximum 7 step 1 textfont 1 textsize 11 | |||||
tooltip Octave xywh {625 295 45 15} type Simple labelsize 10 align 1 minimum -8 maximum 7 step 1 textfont 1 textsize 11 | |||||
code0 {o->init("FMoctave");} | code0 {o->init("FMoctave");} | ||||
class Fl_Osc_Counter | class Fl_Osc_Counter | ||||
} | } | ||||
@@ -352,18 +355,26 @@ o->redraw();} | |||||
} | } | ||||
Fl_Value_Output fmdetunevalueoutput { | Fl_Value_Output fmdetunevalueoutput { | ||||
label Detune | label Detune | ||||
xywh {540 245 45 18} labelsize 8 align 5 minimum -5000 maximum 5000 step 0.01 textfont 1 textsize 8 | |||||
xywh {540 247 45 18} labelsize 8 align 5 minimum -5000 maximum 5000 step 0.01 textfont 1 textsize 8 | |||||
code0 {o->init("FMdetunevalue");} | code0 {o->init("FMdetunevalue");} | ||||
class Fl_Osc_Output | class Fl_Osc_Output | ||||
} | } | ||||
Fl_Choice {} { | Fl_Choice {} { | ||||
label {Detune Type} | label {Detune Type} | ||||
callback {fmdetunevalueoutput->update();} open | callback {fmdetunevalueoutput->update();} open | ||||
xywh {540 280 75 15} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10 | |||||
xywh {540 294 75 15} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10 | |||||
code0 {o->add("Default");o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} | code0 {o->add("Default");o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} | ||||
code1 {o->init("PFMDetuneType");} | code1 {o->init("PFMDetuneType");} | ||||
class Fl_Osc_Choice | class Fl_Osc_Choice | ||||
} {} | } {} | ||||
Fl_Check_Button {} { | |||||
label 440Hz | |||||
callback {if (o->value()==0) fixedfreqetdial->deactivate(); | |||||
else fixedfreqetdial->activate();} selected | |||||
tooltip {Set the modulator base frequency to 440Hz} xywh {683 266 55 15} down_box DOWN_BOX labelfont 1 labelsize 11 | |||||
code0 {o->init("PFMFixedFreq");} | |||||
class Fl_Osc_Check | |||||
} | |||||
} | } | ||||
Fl_Group {} { | Fl_Group {} { | ||||
label {Mod.AMPLITUDE} | label {Mod.AMPLITUDE} | ||||
@@ -371,19 +382,19 @@ o->redraw();} | |||||
} { | } { | ||||
Fl_Value_Slider {} { | Fl_Value_Slider {} { | ||||
label Vol | label Vol | ||||
tooltip Volume xywh {540 80 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | |||||
code0 {o->init("PFMVolume", 'i');} | |||||
tooltip Volume xywh {540 80 155 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | |||||
code0 {o->init("PFMVolume", 'i');o->reset_value=90;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Value_Slider {} { | Fl_Value_Slider {} { | ||||
label {V.Sns} | label {V.Sns} | ||||
tooltip {Velocity Sensing Function (rightmost to disable)} xywh {540 100 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip {Velocity Sensing Function (rightmost to disable)} xywh {540 100 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PFMVelocityScaleFunction");} | |||||
code0 {o->init("PFMVelocityScaleFunction");o->reset_value=64;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Group voiceFMampenvgroup { | Fl_Group voiceFMampenvgroup { | ||||
label {ADSynth Modulator - Amplitude Envelope} open | label {ADSynth Modulator - Amplitude Envelope} open | ||||
xywh {540 145 205 70} box FLAT_BOX color 51 align 144 | |||||
xywh {540 140 205 70} box FLAT_BOX color 51 align 144 | |||||
code0 {o->init(//pars->VoicePar[nvoice].FMAmpEnvelope, | code0 {o->init(//pars->VoicePar[nvoice].FMAmpEnvelope, | ||||
ENV_ADSR, osc_i, loc, "FMAmpEnvelope/");} | ENV_ADSR, osc_i, loc, "FMAmpEnvelope/");} | ||||
class EnvelopeUI | class EnvelopeUI | ||||
@@ -405,10 +416,10 @@ o->redraw();} | |||||
} | } | ||||
} | } | ||||
Fl_Group modoscil {open | Fl_Group modoscil {open | ||||
xywh {535 365 220 220} | |||||
xywh {535 390 220 195} | |||||
} { | } { | ||||
Fl_Group fmoscil {open | Fl_Group fmoscil {open | ||||
xywh {535 440 220 140} box THIN_DOWN_BOX color 32 selection_color 71 labelcolor 179 | |||||
xywh {535 445 220 140} box THIN_DOWN_BOX color 32 selection_color 71 labelcolor 179 | |||||
code0 {fmoscil->base = loc; fmoscil->ext="FMSmp/";fmoscil->osc = osc_i;fmoscil->begin();} | code0 {fmoscil->base = loc; fmoscil->ext="FMSmp/";fmoscil->osc = osc_i;fmoscil->begin();} | ||||
code1 {oscFM=new Fl_Oscilloscope(o->x(),o->y(),o->w(),o->h(),"");} | code1 {oscFM=new Fl_Oscilloscope(o->x(),o->y(),o->w(),o->h(),"");} | ||||
code2 {//int nv=nvoice; if (pars->VoicePar[nvoice].PextFMoscil>=0) nv=pars->VoicePar[nvoice].PextFMoscil;} | code2 {//int nv=nvoice; if (pars->VoicePar[nvoice].PextFMoscil>=0) nv=pars->VoicePar[nvoice].PextFMoscil;} | ||||
@@ -417,7 +428,7 @@ o->redraw();} | |||||
} {} | } {} | ||||
Fl_Box {} { | Fl_Box {} { | ||||
label {Mod.Oscillator} | label {Mod.Oscillator} | ||||
xywh {535 375 155 20} labelfont 1 align 20 | |||||
xywh {535 393 155 20} labelfont 1 align 20 | |||||
} | } | ||||
Fl_Button changeFMoscilbutton { | Fl_Button changeFMoscilbutton { | ||||
label Change | label Change | ||||
@@ -428,13 +439,13 @@ o->redraw();} | |||||
oscedit=new OscilEditor(true,loc+"FMSmp/", osc_i); | oscedit=new OscilEditor(true,loc+"FMSmp/", osc_i); | ||||
else | else | ||||
oscedit=new OscilEditor(true,loc+"../VoicePar"+to_s(extFMoscil->value()-1)+"/FMSmp/", osc_i);} | oscedit=new OscilEditor(true,loc+"../VoicePar"+to_s(extFMoscil->value()-1)+"/FMSmp/", osc_i);} | ||||
xywh {700 380 55 15} box THIN_UP_BOX labelfont 1 labelsize 11 | |||||
xywh {700 398 55 15} box THIN_UP_BOX labelfont 1 labelsize 11 | |||||
code0 {(void)o;/*if (extFMoscil->value()>=0) o->labelcolor(FL_BLUE);*/} | code0 {(void)o;/*if (extFMoscil->value()>=0) o->labelcolor(FL_BLUE);*/} | ||||
} | } | ||||
Fl_Slider {} { | Fl_Slider {} { | ||||
label Phase | label Phase | ||||
xywh {645 415 105 15} type {Horz Knob} box NO_BOX labelsize 10 align 5 minimum -63 maximum 64 step 1 | |||||
code0 { o->init("PFMoscilphase", 'i'); o->set_scope(oscFM); } | |||||
xywh {645 425 105 15} type {Horz Knob} box NO_BOX labelsize 10 align 5 minimum -63 maximum 64 step 1 | |||||
code0 {o->init("PFMoscilphase", 'i'); o->set_scope(oscFM);} | |||||
class PhaseSlider | class PhaseSlider | ||||
} | } | ||||
Fl_Choice extFMoscil { | Fl_Choice extFMoscil { | ||||
@@ -451,7 +462,7 @@ fmoscil->rebase(loc); | |||||
else | else | ||||
fmoscil->rebase(loc+"../VoicePar"+to_s(o->value()-1)+"/"); | fmoscil->rebase(loc+"../VoicePar"+to_s(o->value()-1)+"/"); | ||||
voiceFMparametersgroup->redraw();} open | voiceFMparametersgroup->redraw();} open | ||||
xywh {560 410 75 20} down_box BORDER_BOX labelsize 10 textfont 1 textsize 10 | |||||
xywh {560 420 75 20} down_box BORDER_BOX labelsize 10 textfont 1 textsize 10 | |||||
code0 {o->add("Internal");} | code0 {o->add("Internal");} | ||||
code1 {char tmp[50]; for (int i=0;i<nvoice;i++) {sprintf(tmp,"ExtM.%2d",i+1);o->add(tmp);};} | code1 {char tmp[50]; for (int i=0;i<nvoice;i++) {sprintf(tmp,"ExtM.%2d",i+1);o->add(tmp);};} | ||||
code3 {o->init("PextFMoscil",-1);} | code3 {o->init("PextFMoscil",-1);} | ||||
@@ -506,8 +517,8 @@ o->redraw();} | |||||
xywh {80 80 100 20} labelfont 1 | xywh {80 80 100 20} labelfont 1 | ||||
} | } | ||||
MenuItem {} { | MenuItem {} { | ||||
label PITCH | |||||
xywh {90 90 100 20} labelfont 1 deactivate | |||||
label PWM | |||||
xywh {80 80 100 20} labelfont 1 | |||||
} | } | ||||
} | } | ||||
Fl_Group {} { | Fl_Group {} { | ||||
@@ -558,6 +569,18 @@ o->redraw();} | |||||
code3 {o->lstep(10);} | code3 {o->lstep(10);} | ||||
class Fl_Osc_Counter | class Fl_Osc_Counter | ||||
} | } | ||||
Fl_Dial bendadjdial { | |||||
label Bend | |||||
tooltip {How the frequency varies according to the pitch wheel} xywh {60 270 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1 | |||||
code0 {o->init("PBendAdjust");o->reset_value=24;o->set_transform([](float x){return x/24.0f;});o->set_rounding(2);} | |||||
class Fl_Osc_Dial | |||||
} | |||||
Fl_Dial offsethzdial { | |||||
label Offset | |||||
tooltip {Offset of frequency in Hz} xywh {110 270 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1 | |||||
code0 {o->init("POffsetHz"); o->set_rounding(2); o->set_transform([](float x){x/=64; return 15*(x*sqrtf(fabsf(x)));});} | |||||
class Fl_Osc_Dial | |||||
} | |||||
Fl_Slider {} { | Fl_Slider {} { | ||||
callback {detunevalueoutput->update();} | callback {detunevalueoutput->update();} | ||||
tooltip {Fine Detune (cents)} xywh {58 287 392 13} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1 | tooltip {Fine Detune (cents)} xywh {58 287 392 13} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1 | ||||
@@ -580,7 +603,7 @@ o->redraw();} | |||||
} | } | ||||
Fl_Dial fixedfreqetdial { | Fl_Dial fixedfreqetdial { | ||||
label {Eq.T.} | label {Eq.T.} | ||||
tooltip {How the frequency varies acording to the keyboard (leftmost for fixed frequency)} xywh {405 270 15 15} box ROUND_UP_BOX labelsize 10 align 8 maximum 127 step 1 | |||||
tooltip {How the frequency varies according to the keyboard (leftmost for fixed frequency)} xywh {405 270 15 15} box ROUND_UP_BOX labelsize 10 align 8 maximum 127 step 1 | |||||
code0 {o->init("PfixedfreqET");} | code0 {o->init("PfixedfreqET");} | ||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
@@ -654,7 +677,7 @@ voiceonbutton->redraw();} open | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label Vibrato | label Vibrato | ||||
tooltip Vibrato xywh {364 555 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip Vibrato xywh {364 555 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Unison_vibratto");} | |||||
code0 {o->init("Unison_vibratto");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Choice {} { | Fl_Choice {} { | ||||
@@ -668,7 +691,7 @@ voiceonbutton->redraw();} open | |||||
label {Frequency Spread} | label {Frequency Spread} | ||||
callback {unisonspreadoutput->update();} | callback {unisonspreadoutput->update();} | ||||
tooltip {Frequency Spread of the Unison} xywh {95 562 125 13} type {Horz Knob} box NO_BOX labelsize 12 align 1 maximum 127 step 1 value 64 | tooltip {Frequency Spread of the Unison} xywh {95 562 125 13} type {Horz Knob} box NO_BOX labelsize 12 align 1 maximum 127 step 1 value 64 | ||||
code0 {o->init("Unison_frequency_spread", 'i');} | |||||
code0 {o->init("Unison_frequency_spread", 'i');o->reset_value=60;} | |||||
class Fl_Osc_Slider | class Fl_Osc_Slider | ||||
} | } | ||||
Fl_Value_Output unisonspreadoutput { | Fl_Value_Output unisonspreadoutput { | ||||
@@ -680,19 +703,19 @@ voiceonbutton->redraw();} open | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label {V.speed} | label {V.speed} | ||||
tooltip {Vibrato Average Speed} xywh {406 555 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Vibrato Average Speed} xywh {406 555 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Unison_vibratto_speed");} | |||||
code0 {o->init("Unison_vibratto_speed");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label {Ph.rand} | label {Ph.rand} | ||||
tooltip {Phase randomness} xywh {280 555 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Phase randomness} xywh {280 555 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Unison_phase_randomness");} | |||||
code0 {o->init("Unison_phase_randomness");o->reset_value=127;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label Stereo | label Stereo | ||||
tooltip {Stereo Spread} xywh {322 555 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Stereo Spread} xywh {322 555 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Unison_stereo_spread");} | |||||
code0 {o->init("Unison_stereo_spread");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -704,13 +727,13 @@ voiceonbutton->redraw();} open | |||||
Fl_Value_Slider {} { | Fl_Value_Slider {} { | ||||
label Vol | label Vol | ||||
tooltip Volume xywh {10 60 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip Volume xywh {10 60 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PVolume");} | |||||
code0 {o->init("PVolume");o->reset_value=100;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Value_Slider {} { | Fl_Value_Slider {} { | ||||
label {V.Sns} | label {V.Sns} | ||||
tooltip {Velocity Sensing Function (rightmost to disable)} xywh {10 80 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip {Velocity Sensing Function (rightmost to disable)} xywh {10 80 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PAmpVelocityScaleFunction");} | |||||
code0 {o->init("PAmpVelocityScaleFunction");o->reset_value=127;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Group voiceampenvgroup { | Fl_Group voiceampenvgroup { | ||||
@@ -723,7 +746,7 @@ voiceonbutton->redraw();} open | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label Pan | label Pan | ||||
tooltip {Panning (leftmost is Random)} xywh {212 65 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | tooltip {Panning (leftmost is Random)} xywh {212 65 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("PPanning");} | |||||
code0 {o->init("PPanning");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Check_Button {} { | Fl_Check_Button {} { | ||||
@@ -806,9 +829,9 @@ o->redraw();} | |||||
} {} | } {} | ||||
Fl_Choice {} { | Fl_Choice {} { | ||||
callback {switch (o->value()) { | callback {switch (o->value()) { | ||||
case 0: voicemodegroup->activate(); whitenoiselabel->hide(); pinknoiselabel->hide(); break; | |||||
case 1: voicemodegroup->deactivate(); whitenoiselabel->show(); pinknoiselabel->hide(); break; | |||||
default: voicemodegroup->deactivate(); whitenoiselabel->hide(); pinknoiselabel->show(); break; | |||||
case 0: voicemodegroup->activate(); whitenoiselabel->hide(); pinknoiselabel->hide(); osc->Overlay=NULL; break; | |||||
case 1: voicemodegroup->deactivate(); whitenoiselabel->show(); pinknoiselabel->hide(); osc->Overlay=whitenoiselabel; break; | |||||
default: voicemodegroup->deactivate(); whitenoiselabel->hide(); pinknoiselabel->show(); osc->Overlay=pinknoiselabel; break; | |||||
}} open | }} open | ||||
tooltip {Oscillator Type (sound/noise)} xywh {5 515 65 20} down_box BORDER_BOX labelsize 10 textfont 1 textsize 10 | tooltip {Oscillator Type (sound/noise)} xywh {5 515 65 20} down_box BORDER_BOX labelsize 10 textfont 1 textsize 10 | ||||
code0 {o->init("Type");} | code0 {o->init("Type");} | ||||
@@ -820,11 +843,11 @@ o->redraw();} | |||||
} | } | ||||
MenuItem {} { | MenuItem {} { | ||||
label White | label White | ||||
xywh {15 15 100 20} labelfont 1 labelsize 11 labelcolor 55 | |||||
xywh {15 15 100 20} labelfont 1 labelsize 11 | |||||
} | } | ||||
MenuItem {} { | MenuItem {} { | ||||
label Pink | label Pink | ||||
xywh {25 25 100 20} labelfont 1 labelsize 11 labelcolor 212 | |||||
xywh {25 25 100 20} labelfont 1 labelsize 11 | |||||
} | } | ||||
} | } | ||||
Fl_Check_Button bypassfiltercheckbutton { | Fl_Check_Button bypassfiltercheckbutton { | ||||
@@ -1019,7 +1042,7 @@ class ADnoteUI {open : {public PresetsUI_} | |||||
voicelistitem[i]->refreshlist(); | voicelistitem[i]->refreshlist(); | ||||
};} | };} | ||||
tooltip {Bandwidth - how the relative fine detune of the voice are changed} xywh {505 295 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Bandwidth - how the relative fine detune of the voice are changed} xywh {505 295 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("PBandwidth");} | |||||
code0 {o->init("PBandwidth");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -1030,25 +1053,25 @@ class ADnoteUI {open : {public PresetsUI_} | |||||
Fl_Value_Slider volume { | Fl_Value_Slider volume { | ||||
label Vol | label Vol | ||||
tooltip Volume xywh {10 30 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip Volume xywh {10 30 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PVolume");} | |||||
code0 {o->init("PVolume");o->reset_value=90;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Value_Slider vsns { | Fl_Value_Slider vsns { | ||||
label {V.Sns} | label {V.Sns} | ||||
tooltip {Velocity Sensing Function (rightmost to disable)} xywh {10 50 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip {Velocity Sensing Function (rightmost to disable)} xywh {10 50 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PAmpVelocityScaleFunction");} | |||||
code0 {o->init("PAmpVelocityScaleFunction");o->reset_value=64;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Dial pan { | Fl_Dial pan { | ||||
label Pan | label Pan | ||||
tooltip {Panning (leftmost is Random)} xywh {210 25 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | tooltip {Panning (leftmost is Random)} xywh {210 25 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("PPanning");} | |||||
code0 {o->init("PPanning");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label De-pop selected | label De-pop selected | ||||
tooltip {Pop suppression} xywh {208 228 20 20} type Float labelsize 10 maximum 127 step 1 textfont 1 textsize 11 | tooltip {Pop suppression} xywh {208 228 20 20} type Float labelsize 10 maximum 127 step 1 textfont 1 textsize 11 | ||||
code0 {o->init("Fadein_adjustment");} | |||||
code0 {o->init("Fadein_adjustment");o->reset_value=20;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
@@ -1061,19 +1084,19 @@ class ADnoteUI {open : {public PresetsUI_} | |||||
Fl_Dial pt { | Fl_Dial pt { | ||||
label {P.t.} | label {P.t.} | ||||
tooltip {Punch Time (duration)} xywh {108 237 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Punch Time (duration)} xywh {108 237 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("PPunchTime");} | |||||
code0 {o->init("PPunchTime");o->reset_value=60;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial pstc { | Fl_Dial pstc { | ||||
label {P.Stc.} | label {P.Stc.} | ||||
tooltip {Punch Stretch} xywh {138 237 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Punch Stretch} xywh {138 237 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("PPunchStretch");} | |||||
code0 {o->init("PPunchStretch");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial pvel { | Fl_Dial pvel { | ||||
label {P.Vel.} | label {P.Vel.} | ||||
tooltip {Punch Velocity Sensing} xywh {168 237 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Punch Velocity Sensing} xywh {168 237 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("PPunchVelocitySensing");} | |||||
code0 {o->init("PPunchVelocitySensing");o->reset_value=72;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Group ampenv { | Fl_Group ampenv { | ||||
@@ -103,6 +103,7 @@ int Fl_Osc_Slider::handle(int ev, int X, int Y, int W, int H) | |||||
just_pushed = true; | just_pushed = true; | ||||
mod_state = Fl::event_state() & MOD_MASK; | mod_state = Fl::event_state() & MOD_MASK; | ||||
slow_state = 0; | slow_state = 0; | ||||
start_pos = horizontal() ? Fl::event_x() : Fl::event_y(); | |||||
handled = mod_state ? 1 : Fl_Slider::handle(ev, X, Y, W, H); | handled = mod_state ? 1 : Fl_Slider::handle(ev, X, Y, W, H); | ||||
break; | break; | ||||
case FL_MOUSEWHEEL: | case FL_MOUSEWHEEL: | ||||
@@ -146,8 +147,13 @@ int Fl_Osc_Slider::handle(int ev, int X, int Y, int W, int H) | |||||
case FL_DRAG: { | case FL_DRAG: { | ||||
old_mod_state = mod_state; | old_mod_state = mod_state; | ||||
mod_state = Fl::event_state() & MOD_MASK; | mod_state = Fl::event_state() & MOD_MASK; | ||||
if (slow_state == 0 && mod_state == 0) | |||||
if (slow_state == 0 && mod_state == 0) { | |||||
int delta = (horizontal() ? Fl::event_x() : Fl::event_y()) | |||||
- start_pos; | |||||
if (delta < -1 || delta > 1) | |||||
Fl::event_clicks(0); | |||||
return Fl_Slider::handle(ev, X, Y, W, H); | return Fl_Slider::handle(ev, X, Y, W, H); | ||||
} | |||||
if (mod_state != 0) { | if (mod_state != 0) { | ||||
slow_state = 1; | slow_state = 1; | ||||
@@ -185,6 +191,8 @@ int Fl_Osc_Slider::handle(int ev, int X, int Y, int W, int H) | |||||
int delta = (horizontal() ? Fl::event_x() : Fl::event_y()) | int delta = (horizontal() ? Fl::event_x() : Fl::event_y()) | ||||
- start_pos; | - start_pos; | ||||
if (delta < -1 || delta > 1) | |||||
Fl::event_clicks(0); | |||||
float new_value; | float new_value; | ||||
if (slow_state == 1) { | if (slow_state == 1) { | ||||
new_value = old_value + delta / denominator; | new_value = old_value + delta / denominator; | ||||
@@ -10,12 +10,10 @@ class Fl_Osc_TSlider:public Fl_Osc_Slider | |||||
Fl_Osc_TSlider(int x, int y, int w, int h, const char *label = 0); | Fl_Osc_TSlider(int x, int y, int w, int h, const char *label = 0); | ||||
~Fl_Osc_TSlider(); | ~Fl_Osc_TSlider(); | ||||
int handle(int event); | int handle(int event); | ||||
void setTransform(float scale = 1.0, float offset = 0.0); | |||||
float transform(float x); | |||||
void setRounding(unsigned int digits = 0); | |||||
void set_transform(float (*transformer)(float)); | |||||
void set_rounding(unsigned int digits = 0); | |||||
private: | private: | ||||
class TipWin * tipwin; | class TipWin * tipwin; | ||||
float value_offset; | |||||
float value_scale; | |||||
float (*transform)(float); | |||||
}; | }; | ||||
#endif | #endif |
@@ -3,15 +3,19 @@ | |||||
//Copyright (c) 2015 Christopher Oliver | //Copyright (c) 2015 Christopher Oliver | ||||
//License: GNU GPL version 2 or later | //License: GNU GPL version 2 or later | ||||
static float identity(float value) | |||||
{ | |||||
return value; | |||||
} | |||||
Fl_Osc_TSlider::Fl_Osc_TSlider(int x, int y, int w, int h, const char *label) | Fl_Osc_TSlider::Fl_Osc_TSlider(int x, int y, int w, int h, const char *label) | ||||
:Fl_Osc_Slider(x, y, w, h, label), value_offset(0.0), value_scale(1.0) | |||||
:Fl_Osc_Slider(x, y, w, h, label), transform(identity) | |||||
{ | { | ||||
Fl_Group *save = Fl_Group::current(); | Fl_Group *save = Fl_Group::current(); | ||||
tipwin = new TipWin(); | tipwin = new TipWin(); | ||||
tipwin->hide(); | tipwin->hide(); | ||||
Fl_Group::current(save); | Fl_Group::current(save); | ||||
tipwin->setRounding(); | |||||
tipwin->set_rounding(); | |||||
} | } | ||||
Fl_Osc_TSlider::~Fl_Osc_TSlider() | Fl_Osc_TSlider::~Fl_Osc_TSlider() | ||||
@@ -20,9 +24,9 @@ Fl_Osc_TSlider::~Fl_Osc_TSlider() | |||||
delete tipwin; | delete tipwin; | ||||
} | } | ||||
void Fl_Osc_TSlider::setRounding(unsigned int digits) | |||||
void Fl_Osc_TSlider::set_rounding(unsigned int digits) | |||||
{ | { | ||||
tipwin->setRounding(digits); | |||||
tipwin->set_rounding(digits); | |||||
} | } | ||||
@@ -53,13 +57,7 @@ int Fl_Osc_TSlider::handle(int event) | |||||
return super; | return super; | ||||
} | } | ||||
void Fl_Osc_TSlider::setTransform(float scale, float offset) | |||||
{ | |||||
value_offset = offset; | |||||
value_scale = scale; | |||||
} | |||||
float Fl_Osc_TSlider::transform(float x) | |||||
void Fl_Osc_TSlider::set_transform(float (*transformer)(float)) | |||||
{ | { | ||||
return value_scale * x + value_offset; | |||||
transform = transformer; | |||||
} | } |
@@ -17,7 +17,8 @@ class Fl_Oscilloscope : public Fl_Box, public Fl_Osc_Widget | |||||
{ | { | ||||
public: | public: | ||||
Fl_Oscilloscope(int x,int y, int w, int h, const char *label=0) | Fl_Oscilloscope(int x,int y, int w, int h, const char *label=0) | ||||
:Fl_Box(x,y,w,h,label), Fl_Osc_Widget(this), smps(0), oscilsize(0) | |||||
:Fl_Box(x,y,w,h,label), Fl_Osc_Widget(this), smps(0), oscilsize(0), | |||||
Overlay(NULL) | |||||
{ | { | ||||
phase=64; | phase=64; | ||||
box(FL_FLAT_BOX); | box(FL_FLAT_BOX); | ||||
@@ -129,6 +130,8 @@ class Fl_Oscilloscope : public Fl_Box, public Fl_Osc_Widget | |||||
fl_rect(ox-1,oy-1,lx+2,ly+2); | fl_rect(ox-1,oy-1,lx+2,ly+2); | ||||
fl_line_style(FL_SOLID,0); | fl_line_style(FL_SOLID,0); | ||||
if (Overlay) | |||||
Overlay->redraw(); | |||||
} | } | ||||
//allows UI to manipuate phase of displayed waveform | //allows UI to manipuate phase of displayed waveform | ||||
@@ -149,4 +152,6 @@ class Fl_Oscilloscope : public Fl_Box, public Fl_Osc_Widget | |||||
float *smps; | float *smps; | ||||
int oscilsize; | int oscilsize; | ||||
Fl_Color bkgnd; | Fl_Color bkgnd; | ||||
public: | |||||
Fl_Box *Overlay; | |||||
}; | }; |
@@ -131,10 +131,14 @@ hide();} {} | |||||
label E2dn | label E2dn | ||||
xywh {70 70 100 20} labelfont 1 labelsize 10 | xywh {70 70 100 20} labelfont 1 labelsize 10 | ||||
} | } | ||||
MenuItem {} { | |||||
label RND | |||||
xywh {80 80 100 20} labelfont 1 labelsize 10 | |||||
} | |||||
} | } | ||||
Fl_Check_Button continous { | Fl_Check_Button continous { | ||||
label {C.} | label {C.} | ||||
tooltip {Continous LFO} xywh {165 35 15 15} down_box DOWN_BOX labelsize 10 align 2 | |||||
tooltip {Continuous LFO} xywh {165 35 15 15} down_box DOWN_BOX labelsize 10 align 2 | |||||
code0 {o->init("Pcontinous");} | code0 {o->init("Pcontinous");} | ||||
class Fl_Osc_Check | class Fl_Osc_Check | ||||
} | } | ||||
@@ -148,7 +148,7 @@ bankui->show();} | |||||
} | } | ||||
Fl_Slider partvolume { | Fl_Slider partvolume { | ||||
xywh {10 65 30 110} type {Vert Knob} box NO_BOX minimum 127 maximum 0 step 1 value 127 | xywh {10 65 30 110} type {Vert Knob} box NO_BOX minimum 127 maximum 0 step 1 value 127 | ||||
code0 {o->init("Pvolume", 'i');} | |||||
code0 {o->init("Pvolume", 'i');o->reset_value=96;} | |||||
class Fl_Osc_TSlider | class Fl_Osc_TSlider | ||||
} | } | ||||
Fl_Dial partpanning { | Fl_Dial partpanning { | ||||
@@ -508,7 +508,7 @@ if (fl_choice("The file *might* exist. \\nOverwrite it?","No","Yes",NULL)) { | |||||
Fl_Dial mastervolumedial { | Fl_Dial mastervolumedial { | ||||
label {Master Volume} | label {Master Volume} | ||||
tooltip {Master Volume} xywh {15 32 55 55} box ROUND_UP_BOX labelsize 9 align 130 maximum 127 step 1 | tooltip {Master Volume} xywh {15 32 55 55} box ROUND_UP_BOX labelsize 9 align 130 maximum 127 step 1 | ||||
code2 {o->init("volume"); o->selection_color(FL_RED);} | |||||
code2 {o->init("volume"); o->selection_color(FL_RED); o->reset_value=80;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Counter masterkeyshiftcounter { | Fl_Counter masterkeyshiftcounter { | ||||
@@ -856,7 +856,7 @@ globalfinedetuneslider->do_callback();} | |||||
Fl_Dial globalfinedetuneslider { | Fl_Dial globalfinedetuneslider { | ||||
label {Fine Detune} | label {Fine Detune} | ||||
tooltip {global fine detune} xywh {90 68 45 45} box ROUND_UP_BOX labelsize 9 align 130 maximum 127 step 1 value 64 | tooltip {global fine detune} xywh {90 68 45 45} box ROUND_UP_BOX labelsize 9 align 130 maximum 127 step 1 value 64 | ||||
code0 {o->init("microtonal/Pglobalfinedetune");} | |||||
code0 {o->init("microtonal/Pglobalfinedetune");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -1102,7 +1102,7 @@ virkeys->midich=(int) o->value();} open | |||||
} {} | } {} | ||||
Fl_Dial partvolume { | Fl_Dial partvolume { | ||||
xywh {135 95 45 40} labelsize 9 maximum 127 step 1 | xywh {135 95 45 40} labelsize 9 maximum 127 step 1 | ||||
code0 {o->init("Pvolume");} | |||||
code0 {o->init("Pvolume"); o->reset_value=96;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Box {} { | Fl_Box {} { | ||||
@@ -1422,7 +1422,7 @@ pthread_mutex_unlock(&master->mutex);*/} | |||||
Fl_Dial simplemastervolumedial { | Fl_Dial simplemastervolumedial { | ||||
label {Master Volume} | label {Master Volume} | ||||
tooltip {Master Volume} xywh {10 35 40 40} box ROUND_UP_BOX labelfont 1 labelsize 11 align 130 maximum 127 step 1 | tooltip {Master Volume} xywh {10 35 40 40} box ROUND_UP_BOX labelfont 1 labelsize 11 align 130 maximum 127 step 1 | ||||
code0 {o->init("Pvolume");} | |||||
code0 {o->init("Pvolume");o->reset_value=80;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Counter simplemasterkeyshiftcounter { | Fl_Counter simplemasterkeyshiftcounter { | ||||
@@ -1448,7 +1448,7 @@ simpleglobalfinedetuneslider->do_callback();} | |||||
Fl_Dial simpleglobalfinedetuneslider { | Fl_Dial simpleglobalfinedetuneslider { | ||||
label {Fine Detune} | label {Fine Detune} | ||||
tooltip {global fine detune} xywh {80 50 30 30} box ROUND_UP_BOX labelsize 11 align 130 maximum 127 step 1 value 64 | tooltip {global fine detune} xywh {80 50 30 30} box ROUND_UP_BOX labelsize 11 align 130 maximum 127 step 1 value 64 | ||||
code0 {o->init("microtonal/Pglobalfinedetune");} | |||||
code0 {o->init("microtonal/Pglobalfinedetune");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Counter simplenpartcounter { | Fl_Counter simplenpartcounter { | ||||
@@ -195,12 +195,12 @@ make_window(); | |||||
mag->osc = osc; | mag->osc = osc; | ||||
mag->loc = loc; | mag->loc = loc; | ||||
mag->reset_value = 63; | mag->reset_value = 63; | ||||
mag->setTransform(-1, 63); | |||||
mag->set_transform([](float x){return 63.0f - x;}); | |||||
phase->osc = osc; | phase->osc = osc; | ||||
phase->loc = loc; | phase->loc = loc; | ||||
phase->reset_value = 64; | phase->reset_value = 64; | ||||
phase->setRounding(1); | |||||
phase->setTransform(-180.0/64, 180.0); | |||||
phase->set_rounding(1); | |||||
phase->set_transform([](float x){return 180*(1 - x/64.0f);}); | |||||
osc->createLink(loc+"magnitude"+to_s(n), mag); | osc->createLink(loc+"magnitude"+to_s(n), mag); | ||||
osc->createLink(loc+"phase"+to_s(n), phase); | osc->createLink(loc+"phase"+to_s(n), phase); | ||||
@@ -303,7 +303,7 @@ class OscilEditor {open : {public PresetsUI_} | |||||
} | } | ||||
Fl_Dial hrnddial { | Fl_Dial hrnddial { | ||||
tooltip {Oscillator's spectrum adjust parameter} xywh {345 285 18 18} maximum 127 step 1 | tooltip {Oscillator's spectrum adjust parameter} xywh {345 285 18 18} maximum 127 step 1 | ||||
code0 {o->init("Pamprandpower");} | |||||
code0 {o->init("Pamprandpower");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -485,19 +485,19 @@ redrawoscil();} | |||||
Fl_Dial bfmodpar1 { | Fl_Dial bfmodpar1 { | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Oscillator's modulation parameter 1} xywh {664 286 15 15} maximum 127 step 1 | tooltip {Oscillator's modulation parameter 1} xywh {664 286 15 15} maximum 127 step 1 | ||||
code0 {o->init("Pbasefuncmodulationpar1");} | |||||
code0 {o->init("Pbasefuncmodulationpar1");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial bfmodpar2 { | Fl_Dial bfmodpar2 { | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Oscillator's modulation parameter 2} xywh {684 286 15 15} maximum 127 step 1 | tooltip {Oscillator's modulation parameter 2} xywh {684 286 15 15} maximum 127 step 1 | ||||
code0 {o->init("Pbasefuncmodulationpar2");} | |||||
code0 {o->init("Pbasefuncmodulationpar2");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial bfmodpar3 { | Fl_Dial bfmodpar3 { | ||||
callback {redrawoscil();} selected | callback {redrawoscil();} selected | ||||
tooltip {Oscillator's modulation parameter 3} xywh {704 286 15 15} maximum 127 step 1 | tooltip {Oscillator's modulation parameter 3} xywh {704 286 15 15} maximum 127 step 1 | ||||
code0 {o->init("Pbasefuncmodulationpar3");} | |||||
code0 {o->init("Pbasefuncmodulationpar3");o->reset_value=32;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -718,7 +718,7 @@ redrawoscil();} | |||||
Fl_Dial filtervalue1 { | Fl_Dial filtervalue1 { | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Oscillator's filter parameter1} xywh {372 318 20 20} maximum 127 step 1 | tooltip {Oscillator's filter parameter1} xywh {372 318 20 20} maximum 127 step 1 | ||||
code0 {o->init("Pfilterpar1");} | |||||
code0 {o->init("Pfilterpar1");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Check_Button filterpref { | Fl_Check_Button filterpref { | ||||
@@ -729,7 +729,7 @@ redrawoscil();} | |||||
Fl_Dial filtervalue2 { | Fl_Dial filtervalue2 { | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Oscillator's filter parameter2} xywh {395 318 20 20} maximum 127 step 1 | tooltip {Oscillator's filter parameter2} xywh {395 318 20 20} maximum 127 step 1 | ||||
code0 {o->init("Pfilterpar2");} | |||||
code0 {o->init("Pfilterpar2");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -763,7 +763,7 @@ redrawoscil();} | |||||
Fl_Dial sadjpar { | Fl_Dial sadjpar { | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Oscillator's spectrum adjust parameter} xywh {700 318 20 20} maximum 127 step 1 | tooltip {Oscillator's spectrum adjust parameter} xywh {700 318 20 20} maximum 127 step 1 | ||||
code0 {o->init("Psapar");} | |||||
code0 {o->init("Psapar");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -843,14 +843,14 @@ redrawoscil();} | |||||
label pow | label pow | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Adaptive harmonics power} xywh {705 465 25 25} labelsize 10 maximum 200 step 1 | tooltip {Adaptive harmonics power} xywh {705 465 25 25} labelsize 10 maximum 200 step 1 | ||||
code0 {o->init("Padaptiveharmonicspower");} | |||||
code0 {o->init("Padaptiveharmonicspower");o->reset_value=100;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial adhrbf { | Fl_Dial adhrbf { | ||||
label baseF | label baseF | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Adaptive harmonics base frequency} xywh {675 465 25 25} labelsize 10 maximum 255 step 1 | tooltip {Adaptive harmonics base frequency} xywh {675 465 25 25} labelsize 10 maximum 255 step 1 | ||||
code0 {o->init("Padaptiveharmonicsbasefreq");} | |||||
code0 {o->init("Padaptiveharmonicsbasefreq");o->reset_value=128;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Slider adhrpar { | Fl_Slider adhrpar { | ||||
@@ -890,19 +890,19 @@ redrawoscil();} | |||||
Fl_Dial modpar1 { | Fl_Dial modpar1 { | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Oscillator's modulation parameter 1} xywh {535 320 15 15} maximum 127 step 1 | tooltip {Oscillator's modulation parameter 1} xywh {535 320 15 15} maximum 127 step 1 | ||||
code0 {o->init("Pmodulationpar1");} | |||||
code0 {o->init("Pmodulationpar1");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial modpar2 { | Fl_Dial modpar2 { | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Oscillator's modulation parameter 2} xywh {555 320 15 15} maximum 127 step 1 | tooltip {Oscillator's modulation parameter 2} xywh {555 320 15 15} maximum 127 step 1 | ||||
code0 {o->init("Pmodulationpar2");} | |||||
code0 {o->init("Pmodulationpar2");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial modpar3 { | Fl_Dial modpar3 { | ||||
callback {redrawoscil();} | callback {redrawoscil();} | ||||
tooltip {Oscillator's modulation parameter 3} xywh {575 320 15 15} maximum 127 step 1 | tooltip {Oscillator's modulation parameter 3} xywh {575 320 15 15} maximum 127 step 1 | ||||
code0 {o->init("Pmodulationpar3");} | |||||
code0 {o->init("Pmodulationpar3");o->reset_value=32;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -136,7 +136,7 @@ initialized = true;} {} | |||||
callback {if(hpui) hpui->update(); | callback {if(hpui) hpui->update(); | ||||
cbwidget->do_callback();} | cbwidget->do_callback();} | ||||
xywh {20 75 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | xywh {20 75 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code2 {o->init("Php.base.par1");} | |||||
code2 {o->init("Php.base.par1");o->reset_value=80;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Choice hpbasetype { | Fl_Choice hpbasetype { | ||||
@@ -182,7 +182,7 @@ cbwidget->do_callback();} | |||||
callback {hpui->update(); | callback {hpui->update(); | ||||
cbwidget->do_callback();} | cbwidget->do_callback();} | ||||
xywh {40 115 20 20} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | xywh {40 115 20 20} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Php.modulator.freq");} | |||||
code0 {o->init("Php.modulator.freq");o->reset_value=30;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Group {} { | Fl_Group {} { | ||||
@@ -244,7 +244,7 @@ cbwidget->do_callback();}} | |||||
callback {hpui->update(); | callback {hpui->update(); | ||||
cbwidget->do_callback();} | cbwidget->do_callback();} | ||||
xywh {15 235 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | xywh {15 235 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Php.amp.par1");} | |||||
code0 {o->init("Php.amp.par1");o->reset_value=80;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial hpamppar2 { | Fl_Dial hpamppar2 { | ||||
@@ -252,7 +252,7 @@ cbwidget->do_callback();} | |||||
callback {hpui->update(); | callback {hpui->update(); | ||||
cbwidget->do_callback();} | cbwidget->do_callback();} | ||||
xywh {55 235 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | xywh {55 235 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Php.amp.par2");} | |||||
code0 {o->init("Php.amp.par2");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -293,7 +293,7 @@ cbwidget->do_callback();}} | |||||
callback {hpui->update(); | callback {hpui->update(); | ||||
cbwidget->do_callback();} | cbwidget->do_callback();} | ||||
xywh {65 115 20 20} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | xywh {65 115 20 20} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Php.width");} | |||||
code0 {o->init("Php.width");o->reset_value=127;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -328,7 +328,7 @@ resui->setcbwidget(cbwidget,applybutton);} | |||||
label BandWidth | label BandWidth | ||||
callback {o->oscWrite("bandwidthvalue");cbwidget->do_callback();} | callback {o->oscWrite("bandwidthvalue");cbwidget->do_callback();} | ||||
xywh {15 295 35 35} box ROUND_UP_BOX labelsize 10 maximum 1000 step 1 | xywh {15 295 35 35} box ROUND_UP_BOX labelsize 10 maximum 1000 step 1 | ||||
code0 {o->init("Pbandwidth");} | |||||
code0 {o->init("Pbandwidth");o->reset_value=500;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Value_Output bwcents { | Fl_Value_Output bwcents { | ||||
@@ -387,7 +387,7 @@ cbwidget->do_callback();}} | |||||
hpui->update(); | hpui->update(); | ||||
cbwidget->do_callback();} | cbwidget->do_callback();} | ||||
xywh {425 310 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | xywh {425 310 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Phrpos.par1");} | |||||
code0 {o->init("Phrpos.par1");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial hrpospar2 { | Fl_Dial hrpospar2 { | ||||
@@ -395,7 +395,7 @@ cbwidget->do_callback();} | |||||
callback {opui->update(); | callback {opui->update(); | ||||
cbwidget->do_callback();} | cbwidget->do_callback();} | ||||
xywh {460 310 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | xywh {460 310 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Phrpos.par2");} | |||||
code0 {o->init("Phrpos.par2");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial hrpospar3 { | Fl_Dial hrpospar3 { | ||||
@@ -651,7 +651,7 @@ cbwidget->do_callback();} | |||||
xywh {125 125 100 20} labelfont 1 labelsize 11 | xywh {125 125 100 20} labelfont 1 labelsize 11 | ||||
} | } | ||||
MenuItem {} { | MenuItem {} { | ||||
label Continous | |||||
label Continuous | |||||
xywh {115 115 100 20} labelfont 1 labelsize 11 | xywh {115 115 100 20} labelfont 1 labelsize 11 | ||||
} | } | ||||
} | } | ||||
@@ -691,13 +691,13 @@ cbwidget->do_callback();} | |||||
} {} | } {} | ||||
Fl_Slider detune { | Fl_Slider detune { | ||||
callback {o->oscWrite("detunevalue");} | callback {o->oscWrite("detunevalue");} | ||||
tooltip {Fine Detune (cents)} xywh {60 295 295 15} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1 | |||||
tooltip {Fine Detune (cents)} xywh {60 296 295 15} type {Horz Knob} box NO_BOX minimum -8192 maximum 8191 step 1 | |||||
code0 {o->init("PDetune", 'i');} | code0 {o->init("PDetune", 'i');} | ||||
class Fl_Osc_Slider | class Fl_Osc_Slider | ||||
} | } | ||||
Fl_Value_Output detunevalueoutput { | Fl_Value_Output detunevalueoutput { | ||||
label Detune | label Detune | ||||
xywh {12 295 45 15} labelsize 10 align 5 minimum -5000 maximum 5000 step 0.01 textfont 1 textsize 10 | |||||
xywh {12 296 45 15} labelsize 10 align 5 minimum -5000 maximum 5000 step 0.01 textfont 1 textsize 10 | |||||
code0 {o->init("detunevalue");} | code0 {o->init("detunevalue");} | ||||
class Fl_Osc_Output | class Fl_Osc_Output | ||||
} | } | ||||
@@ -709,6 +709,18 @@ cbwidget->do_callback();} | |||||
code1 {o->init("PDetuneType",1);} | code1 {o->init("PDetuneType",1);} | ||||
class Fl_Osc_Choice | class Fl_Osc_Choice | ||||
} {} | } {} | ||||
Fl_Dial bendadjustdial { | |||||
label Bend | |||||
tooltip {How the frequency varies according to the pitch wheel} xywh {60 278 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1 | |||||
code0 {o->init("PBendAdjust");o->reset_value=24;o->set_transform([](float x){return x/24.0f;});o->set_rounding(2);} | |||||
class Fl_Osc_Dial | |||||
} | |||||
Fl_Dial offsethzdial { | |||||
label Offset | |||||
tooltip {Offset of frequency in Hz} xywh {110 278 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1 | |||||
code0 {o->init("POffsetHz"); o->set_rounding(2); o->set_transform([](float x){x/=64; return 15*(x*sqrtf(fabsf(x)));});} | |||||
class Fl_Osc_Dial | |||||
} | |||||
Fl_Check_Button hz440 { | Fl_Check_Button hz440 { | ||||
label 440Hz | label 440Hz | ||||
callback {if (o->value()==0) fixedfreqetdial->deactivate(); | callback {if (o->value()==0) fixedfreqetdial->deactivate(); | ||||
@@ -719,7 +731,7 @@ cbwidget->do_callback();} | |||||
} | } | ||||
Fl_Dial fixedfreqetdial { | Fl_Dial fixedfreqetdial { | ||||
label {Eq.T.} | label {Eq.T.} | ||||
tooltip {How the frequency varies acording to the keyboard (leftmost for fixed frequency)} xywh {420 295 15 15} box ROUND_UP_BOX labelsize 10 align 8 maximum 127 step 1 | |||||
tooltip {How the frequency varies according to the keyboard (leftmost for fixed frequency)} xywh {420 295 15 15} box ROUND_UP_BOX labelsize 10 align 8 maximum 127 step 1 | |||||
code0 {o->init("PfixedfreqET");} | code0 {o->init("PfixedfreqET");} | ||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
@@ -731,25 +743,25 @@ cbwidget->do_callback();} | |||||
Fl_Value_Slider volume { | Fl_Value_Slider volume { | ||||
label Vol | label Vol | ||||
tooltip Volume xywh {10 50 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip Volume xywh {10 50 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PVolume", 'i');} | |||||
code0 {o->init("PVolume", 'i');o->reset_value=90;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Value_Slider vsns { | Fl_Value_Slider vsns { | ||||
label {V.Sns} | label {V.Sns} | ||||
tooltip {Velocity Sensing Function (rightmost to disable)} xywh {10 70 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip {Velocity Sensing Function (rightmost to disable)} xywh {10 70 160 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PAmpVelocityScaleFunction");} | |||||
code0 {o->init("PAmpVelocityScaleFunction");o->reset_value=64;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Dial pan { | Fl_Dial pan { | ||||
label Pan | label Pan | ||||
tooltip {Panning (leftmost is Random)} xywh {210 45 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | tooltip {Panning (leftmost is Random)} xywh {210 45 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("PPanning");} | |||||
code0 {o->init("PPanning");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label De-pop selected | label De-pop selected | ||||
tooltip {Pop suppression} xywh {208 238 20 20} type Float labelsize 10 maximum 127 step 1 textfont 1 textsize 11 | tooltip {Pop suppression} xywh {208 238 20 20} type Float labelsize 10 maximum 127 step 1 textfont 1 textsize 11 | ||||
code0 {o->init("Fadein_adjustment");} | |||||
code0 {o->init("Fadein_adjustment");o->reset_value=20;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial pstr { | Fl_Dial pstr { | ||||
@@ -761,19 +773,19 @@ cbwidget->do_callback();} | |||||
Fl_Dial pt { | Fl_Dial pt { | ||||
label {P.t.} | label {P.t.} | ||||
tooltip {Punch Time (duration)} xywh {108 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Punch Time (duration)} xywh {108 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("PPunchTime");} | |||||
code0 {o->init("PPunchTime");o->reset_value=60;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial pstc { | Fl_Dial pstc { | ||||
label {P.Stc.} | label {P.Stc.} | ||||
tooltip {Punch Stretch} xywh {138 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Punch Stretch} xywh {138 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("PPunchStretch");} | |||||
code0 {o->init("PPunchStretch");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial pvel { | Fl_Dial pvel { | ||||
label {P.Vel.} | label {P.Vel.} | ||||
tooltip {Punch Velocity Sensing} xywh {168 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | tooltip {Punch Velocity Sensing} xywh {168 247 25 25} box ROUND_UP_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("PPunchVelocitySensing");} | |||||
code0 {o->init("PPunchVelocitySensing");o->reset_value=72;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Group ampenv { | Fl_Group ampenv { | ||||
@@ -279,7 +279,7 @@ class PartUI {open : {public Fl_Osc_Group} | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label Pan | label Pan | ||||
xywh {50 40 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1 | xywh {50 40 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1 | ||||
code0 {o->init("Ppanning");} | |||||
code0 {o->init("Ppanning"); o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Counter {} { | Fl_Counter {} { | ||||
@@ -344,19 +344,19 @@ if (event==FL_RIGHT_MOUSE){ | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label Volume | label Volume | ||||
tooltip {Part Volume} xywh {10 35 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1 | tooltip {Part Volume} xywh {10 35 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1 | ||||
code0 {o->init("Pvolume");} | |||||
code0 {o->init("Pvolume"); o->reset_value=96;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label {Vel.Ofs.} | label {Vel.Ofs.} | ||||
tooltip {Velocity Offset} xywh {135 40 25 25} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | tooltip {Velocity Offset} xywh {135 40 25 25} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("Pveloffs");} | |||||
code0 {o->init("Pveloffs"); o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label {Vel.Sns.} | label {Vel.Sns.} | ||||
tooltip {Velocity Sensing Function} xywh {95 40 25 25} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | tooltip {Velocity Sensing Function} xywh {95 40 25 25} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("Pvelsns");} | |||||
code0 {o->init("Pvelsns"); o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Button {} { | Fl_Button {} { | ||||
@@ -453,31 +453,31 @@ if (event==FL_RIGHT_MOUSE){ | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label PanDpth | label PanDpth | ||||
tooltip {Panning Depth} xywh {10 55 30 30} labelsize 10 maximum 127 step 1 | tooltip {Panning Depth} xywh {10 55 30 30} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("panning.depth");} | |||||
code0 {o->init("panning.depth");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label FltCut | label FltCut | ||||
tooltip {Filter Cutoff depth} xywh {90 55 30 30} labelsize 10 maximum 127 step 1 | tooltip {Filter Cutoff depth} xywh {90 55 30 30} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("filtercutoff.depth");} | |||||
code0 {o->init("filtercutoff.depth");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label FltQ | label FltQ | ||||
tooltip {Filter Q depth} xywh {50 55 30 30} labelsize 10 maximum 127 step 1 | tooltip {Filter Q depth} xywh {50 55 30 30} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("filterq.depth");} | |||||
code0 {o->init("filterq.depth");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label BwDpth | label BwDpth | ||||
tooltip {BandWidth depth} xywh {125 10 30 30} labelsize 10 maximum 127 step 1 | tooltip {BandWidth depth} xywh {125 10 30 30} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("bandwidth.depth");} | |||||
code0 {o->init("bandwidth.depth");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label ModWh | label ModWh | ||||
tooltip {Modulation Wheel depth} xywh {50 10 30 30} labelsize 10 maximum 127 step 1 | tooltip {Modulation Wheel depth} xywh {50 10 30 30} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("modwheel.depth");} | |||||
code0 {o->init("modwheel.depth");o->reset_value=80;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Check_Button benddir { | Fl_Check_Button benddir { | ||||
@@ -551,7 +551,7 @@ else {bendrng->oscMove("pitchwheel.bendrange");}} | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label time | label time | ||||
tooltip {Portamento time} xywh {285 60 25 25} labelsize 10 maximum 127 step 1 | tooltip {Portamento time} xywh {285 60 25 25} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("portamento.time");} | |||||
code0 {o->init("portamento.time");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Counter {} { | Fl_Counter {} { | ||||
@@ -573,19 +573,19 @@ else {bendrng->oscMove("pitchwheel.bendrange");}} | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label {t.dn/up} | label {t.dn/up} | ||||
tooltip {Portamento time stretch (up/down)} xywh {315 60 25 25} labelsize 10 maximum 127 step 1 | tooltip {Portamento time stretch (up/down)} xywh {315 60 25 25} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("portamento.updowntimestretch");} | |||||
code0 {o->init("portamento.updowntimestretch");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial propta { | Fl_Dial propta { | ||||
label {Prp.Rate} | label {Prp.Rate} | ||||
tooltip {Distance required to double change from nonpropotinal portamento time} xywh {405 20 25 25} labelsize 9 maximum 127 step 1 | tooltip {Distance required to double change from nonpropotinal portamento time} xywh {405 20 25 25} labelsize 9 maximum 127 step 1 | ||||
code0 {o->init("portamento.propRate");} | |||||
code0 {o->init("portamento.propRate");o->reset_value=80;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial proptb { | Fl_Dial proptb { | ||||
label {Prp.Dpth} | label {Prp.Dpth} | ||||
tooltip {The difference from nonproportinal portamento} xywh {405 60 25 25} labelsize 9 maximum 127 step 1 | tooltip {The difference from nonproportinal portamento} xywh {405 60 25 25} labelsize 9 maximum 127 step 1 | ||||
code0 {o->init("portamento.propDepth");} | |||||
code0 {o->init("portamento.propDepth");o->reset_value=90;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Check_Button {} { | Fl_Check_Button {} { | ||||
@@ -605,13 +605,13 @@ else {propta->deactivate();proptb->deactivate();}} | |||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label BWdpth | label BWdpth | ||||
tooltip {BandWidth controller depth} xywh {455 60 25 25} labelsize 10 maximum 127 step 1 | tooltip {BandWidth controller depth} xywh {455 60 25 25} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("resonancebandwidth.depth");} | |||||
code0 {o->init("resonancebandwidth.depth");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Dial {} { | Fl_Dial {} { | ||||
label CFdpth | label CFdpth | ||||
tooltip {Center Frequency controller Depth} xywh {455 20 25 25} labelsize 10 maximum 127 step 1 | tooltip {Center Frequency controller Depth} xywh {455 20 25 25} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("resonancecenter.depth");} | |||||
code0 {o->init("resonancecenter.depth");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
} | } | ||||
@@ -169,14 +169,14 @@ redrawPADnoteApply();} | |||||
callback {centerfreqvo->do_callback(); | callback {centerfreqvo->do_callback(); | ||||
redrawPADnoteApply();} | redrawPADnoteApply();} | ||||
xywh {260 268 90 14} box FLAT_BOX type {Horz Knob} labelsize 10 maximum 127 step 1 | xywh {260 268 90 14} box FLAT_BOX type {Horz Knob} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("Pcenterfreq", 'i');} | |||||
code0 {o->init("Pcenterfreq", 'i');o->reset_value=64;} | |||||
class Fl_Osc_Slider | class Fl_Osc_Slider | ||||
} | } | ||||
Fl_Slider octavesfreq { | Fl_Slider octavesfreq { | ||||
callback {octavesfreqvo->do_callback(); | callback {octavesfreqvo->do_callback(); | ||||
redrawPADnoteApply();} | redrawPADnoteApply();} | ||||
xywh {260 286 90 14} box FLAT_BOX type {Horz Knob} labelsize 10 maximum 127 step 1 | xywh {260 286 90 14} box FLAT_BOX type {Horz Knob} labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("Poctavesfreq", 'i');} | |||||
code0 {o->init("Poctavesfreq", 'i');o->reset_value=64;} | |||||
class Fl_Osc_Slider | class Fl_Osc_Slider | ||||
} | } | ||||
Fl_Button {} { | Fl_Button {} { | ||||
@@ -107,11 +107,11 @@ harmonic->show(); | |||||
mag->reset_value=127; | mag->reset_value=127; | ||||
mag->ext = "Phmag" + to_s(n); | mag->ext = "Phmag" + to_s(n); | ||||
mag->oscRegister(mag->ext.c_str()); | mag->oscRegister(mag->ext.c_str()); | ||||
mag->setTransform(-1, 127); | |||||
mag->set_transform([](float x){return 127.0f - x;}); | |||||
bw->reset_value=63; | bw->reset_value=63; | ||||
bw->ext = "Phrelbw" + to_s(n); | bw->ext = "Phrelbw" + to_s(n); | ||||
bw->oscRegister(bw->ext.c_str()); | bw->oscRegister(bw->ext.c_str()); | ||||
bw->setTransform(-1, 63); | |||||
bw->set_transform([](float x){return 63.0f - x;}); | |||||
osc->requestValue(base+"Phrelbw"+to_s(n)); | osc->requestValue(base+"Phrelbw"+to_s(n)); | ||||
end();} {} | end();} {} | ||||
@@ -164,19 +164,19 @@ class SUBnoteUI {open : {public PresetsUI_} | |||||
Fl_Value_Slider vol { | Fl_Value_Slider vol { | ||||
label Vol | label Vol | ||||
tooltip Volume xywh {10 25 140 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip Volume xywh {10 25 140 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PVolume");} | |||||
code0 {o->init("PVolume");o->reset_value=96;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Value_Slider vsns { | Fl_Value_Slider vsns { | ||||
label {V.Sns} | label {V.Sns} | ||||
tooltip {Velocity Sensing Function (rightmost to disable)} xywh {10 45 140 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | tooltip {Velocity Sensing Function (rightmost to disable)} xywh {10 45 140 15} type {Horz Knob} box NO_BOX labelsize 11 align 8 maximum 127 step 1 | ||||
code0 {o->init("PAmpVelocityScaleFunction");} | |||||
code0 {o->init("PAmpVelocityScaleFunction");o->reset_value=90;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Dial pan { | Fl_Dial pan { | ||||
label Pan | label Pan | ||||
tooltip {Panning (leftmost is Random)} xywh {185 20 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | tooltip {Panning (leftmost is Random)} xywh {185 20 30 30} box ROUND_UP_BOX labelsize 10 maximum 127 step 1 | ||||
code0 {o->init("PPanning");} | |||||
code0 {o->init("PPanning");o->reset_value=64;} | |||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
Fl_Group ampenv { | Fl_Group ampenv { | ||||
@@ -287,6 +287,18 @@ freqsettingsui->redraw();} | |||||
code0 {o->init("detunevalue");} | code0 {o->init("detunevalue");} | ||||
class Fl_Osc_Output | class Fl_Osc_Output | ||||
} | } | ||||
Fl_Dial bendadjdial { | |||||
label Bend | |||||
tooltip {How the frequency varies according to the pitch wheel} xywh {448 53 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1 | |||||
code0 {o->init("PBendAdjust"); o->reset_value=24;o->set_transform([](float x){return x/24.0f;});o->set_rounding(2);} | |||||
class Fl_Osc_Dial | |||||
} | |||||
Fl_Dial offsethzdial { | |||||
label Offset | |||||
tooltip {Offset of frequency in Hz} xywh {500 53 15 15} box ROUND_UP_BOX labelsize 10 align 8 minimum -64 maximum 63 step 1 | |||||
code0 {o->init("POffsetHz"); o->set_rounding(2); o->set_transform([](float x){x/=64; return 15*(x*sqrtf(fabsf(x)));});} | |||||
class Fl_Osc_Dial | |||||
} | |||||
Fl_Check_Button hz440 { | Fl_Check_Button hz440 { | ||||
label 440Hz | label 440Hz | ||||
callback {if (o->value()==0) fixedfreqetdial->deactivate(); | callback {if (o->value()==0) fixedfreqetdial->deactivate(); | ||||
@@ -297,7 +309,7 @@ freqsettingsui->redraw();} | |||||
} | } | ||||
Fl_Dial fixedfreqetdial { | Fl_Dial fixedfreqetdial { | ||||
label {Eq.T.} | label {Eq.T.} | ||||
tooltip {How the frequency varies acording to the keyboard (leftmost for fixed frequency)} xywh {610 53 15 15} box ROUND_UP_BOX labelsize 10 align 8 maximum 127 step 1 | |||||
tooltip {How the frequency varies according to the keyboard (leftmost for fixed frequency)} xywh {610 53 15 15} box ROUND_UP_BOX labelsize 10 align 8 maximum 127 step 1 | |||||
code0 {o->init("PfixedfreqET");} | code0 {o->init("PfixedfreqET");} | ||||
class Fl_Osc_Dial | class Fl_Osc_Dial | ||||
} | } | ||||
@@ -352,7 +364,7 @@ bandwidthsettingsui->redraw();} | |||||
Fl_Value_Slider bandwidth { | Fl_Value_Slider bandwidth { | ||||
label {Band Width} | label {Band Width} | ||||
xywh {225 40 115 15} type {Horz Knob} box NO_BOX labelsize 10 align 1 maximum 127 step 1 | xywh {225 40 115 15} type {Horz Knob} box NO_BOX labelsize 10 align 1 maximum 127 step 1 | ||||
code0 {o->init("Pbandwidth");} | |||||
code0 {o->init("Pbandwidth");o->reset_value=40;} | |||||
class Fl_Osc_VSlider | class Fl_Osc_VSlider | ||||
} | } | ||||
Fl_Value_Slider bwidthscale { | Fl_Value_Slider bwidthscale { | ||||
@@ -11,7 +11,7 @@ TipWin::TipWin(void):Fl_Menu_Window(1, 1) | |||||
end(); | end(); | ||||
} | } | ||||
void TipWin::setRounding(unsigned int digits) | |||||
void TipWin::set_rounding(unsigned int digits) | |||||
{ | { | ||||
format[3] = "0123456789"[digits < 9 ? digits : 9]; | format[3] = "0123456789"[digits < 9 ? digits : 9]; | ||||
} | } | ||||
@@ -13,7 +13,7 @@ class TipWin:public Fl_Menu_Window | |||||
void showValue(float f); | void showValue(float f); | ||||
void setText(const char *c); | void setText(const char *c); | ||||
void showText(); | void showText(); | ||||
void setRounding(unsigned int digits = 0); | |||||
void set_rounding(unsigned int digits = 0); | |||||
private: | private: | ||||
void redraw(); | void redraw(); | ||||
const char *getStr() const; | const char *getStr() const; | ||||
@@ -10,10 +10,15 @@ | |||||
//static int numobj = 0; | //static int numobj = 0; | ||||
static float identity(float value) | |||||
{ | |||||
return value; | |||||
} | |||||
WidgetPDial::WidgetPDial(int x, int y, int w, int h, const char *label) | WidgetPDial::WidgetPDial(int x, int y, int w, int h, const char *label) | ||||
:Fl_Dial(x, y, w, h, label), reset_value(0), integer_step(true), | :Fl_Dial(x, y, w, h, label), reset_value(0), integer_step(true), | ||||
oldvalue(0.0f), pos(false), textset(false), value_offset(0.0), | |||||
value_scale(1.0) | |||||
use_rounding(false), oldvalue(0.0f), pos(false), textset(false), | |||||
transform(identity) | |||||
{ | { | ||||
//cout << "[" << label << "] There are now " << ++numobj << endl; | //cout << "[" << label << "] There are now " << ++numobj << endl; | ||||
Fl_Group *save = Fl_Group::current(); | Fl_Group *save = Fl_Group::current(); | ||||
@@ -28,9 +33,9 @@ WidgetPDial::~WidgetPDial() | |||||
delete tipwin; | delete tipwin; | ||||
} | } | ||||
void WidgetPDial::setRounding(unsigned int digits) | |||||
void WidgetPDial::set_rounding(unsigned int digits) | |||||
{ | { | ||||
tipwin->setRounding(digits); | |||||
tipwin->set_rounding(digits); | |||||
} | } | ||||
#define MOD_MASK (FL_CTRL | FL_SHIFT) | #define MOD_MASK (FL_CTRL | FL_SHIFT) | ||||
@@ -55,15 +60,17 @@ int WidgetPDial::handle(int event) | |||||
switch(event) { | switch(event) { | ||||
case FL_PUSH: | case FL_PUSH: | ||||
mod_state = Fl::event_state() & MOD_MASK; | mod_state = Fl::event_state() & MOD_MASK; | ||||
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); | |||||
if (!use_rounding) { | |||||
if (integer_step) | |||||
set_rounding(0); | |||||
else if (mod_state == MOD_MASK) | |||||
set_rounding(5); | |||||
else if (mod_state == FL_SHIFT) | |||||
set_rounding(4); | |||||
else | |||||
set_rounding((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: | ||||
@@ -73,18 +80,23 @@ int WidgetPDial::handle(int event) | |||||
if (old_mod_state != mod_state) { | if (old_mod_state != mod_state) { | ||||
oldvalue = value(); | oldvalue = value(); | ||||
old_y = Fl::event_y(); | 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); | |||||
if (!use_rounding) { | |||||
if (integer_step) | |||||
set_rounding(0); | |||||
else if (mod_state == MOD_MASK) | |||||
set_rounding(5); | |||||
else if (mod_state == FL_SHIFT) | |||||
set_rounding(4); | |||||
else | |||||
set_rounding((Fl::event_button3() || | |||||
mod_state & FL_CTRL) | |||||
? 3 : 2); | |||||
} | |||||
break; | break; | ||||
} | } | ||||
dy = old_y - Fl::event_y(); | dy = old_y - Fl::event_y(); | ||||
if (dy < -1 || dy > 1) | |||||
Fl::event_clicks(0); | |||||
if (!integer_step && mod_state == MOD_MASK) | if (!integer_step && mod_state == MOD_MASK) | ||||
dragsize = 200000.0f; | dragsize = 200000.0f; | ||||
@@ -107,7 +119,7 @@ int WidgetPDial::handle(int event) | |||||
dy = - Fl::event_dy(); | dy = - Fl::event_dy(); | ||||
if (integer_step) { | if (integer_step) { | ||||
setRounding(0); | |||||
if (!use_rounding) set_rounding(0); | |||||
result = (int)(value() + | result = (int)(value() + | ||||
dy * ((Fl::event_ctrl() || | dy * ((Fl::event_ctrl() || | ||||
Fl::event_shift()) ? 1 : 8)); | Fl::event_shift()) ? 1 : 8)); | ||||
@@ -115,16 +127,16 @@ int WidgetPDial::handle(int event) | |||||
float dragsize; | float dragsize; | ||||
if (mod_state == MOD_MASK) { | if (mod_state == MOD_MASK) { | ||||
dragsize = 100000.0; | dragsize = 100000.0; | ||||
setRounding(5); | |||||
if (!use_rounding) set_rounding(5); | |||||
} else if (mod_state == FL_SHIFT) { | } else if (mod_state == FL_SHIFT) { | ||||
dragsize = 10000.0; | dragsize = 10000.0; | ||||
setRounding(4); | |||||
if (!use_rounding) set_rounding(4); | |||||
} else if (mod_state == FL_CTRL) { | } else if (mod_state == FL_CTRL) { | ||||
dragsize = 1000.0; | dragsize = 1000.0; | ||||
setRounding(3); | |||||
if (!use_rounding) set_rounding(3); | |||||
} else { | } else { | ||||
dragsize = 100.0; | dragsize = 100.0; | ||||
setRounding(2); | |||||
if (!use_rounding) set_rounding(2); | |||||
} | } | ||||
result = value() + dy / dragsize * (max - min); | result = value() + dy / dragsize * (max - min); | ||||
} | } | ||||
@@ -248,13 +260,8 @@ void WidgetPDial::resetPos() | |||||
pos = false; | pos = false; | ||||
} | } | ||||
void WidgetPDial::set_transform(float scale, float offset) | |||||
{ | |||||
value_offset = offset; | |||||
value_scale = scale; | |||||
} | |||||
float WidgetPDial::transform(float x) | |||||
void WidgetPDial::set_transform(float (*transformer)(float)) | |||||
{ | { | ||||
return value_scale * x + value_offset; | |||||
transform = transformer; | |||||
use_rounding = true; | |||||
} | } |
@@ -15,12 +15,12 @@ class WidgetPDial:public Fl_Dial | |||||
void draw(); | void draw(); | ||||
void pdialcolor(int r, int g, int b); | void pdialcolor(int r, int g, int b); | ||||
void tooltip(const char *c); | void tooltip(const char *c); | ||||
void set_transform(float scale = 1.0, float offset = 0.0); | |||||
float transform(float x); | |||||
void setRounding(unsigned int digits = 0); | |||||
void set_transform(float (*transformer)(float)); | |||||
void set_rounding(unsigned int digits = 0); | |||||
float reset_value; | float reset_value; | ||||
protected: | protected: | ||||
bool integer_step; | bool integer_step; | ||||
bool use_rounding; | |||||
private: | private: | ||||
void getPos(); | void getPos(); | ||||
void resetPos(); | void resetPos(); | ||||
@@ -29,8 +29,7 @@ class WidgetPDial:public Fl_Dial | |||||
bool pos; | bool pos; | ||||
bool textset; | bool textset; | ||||
class TipWin * tipwin; | class TipWin * tipwin; | ||||
float value_offset; | |||||
float value_scale; | |||||
float (*transform)(float); | |||||
int mod_state; | int mod_state; | ||||
}; | }; | ||||
#endif | #endif |
@@ -578,7 +578,7 @@ int main(int argc, char *argv[]) | |||||
help = true; | help = true; | ||||
if(help) { | if(help) { | ||||
printf(help_message); | |||||
puts(help_message); | |||||
return 1; | return 1; | ||||
} | } | ||||
@@ -372,7 +372,7 @@ int main(int argc, char *argv[]) | |||||
<< " -a , --auto-connect\t\t\t AutoConnect when using JACK\n" | << " -a , --auto-connect\t\t\t AutoConnect when using JACK\n" | ||||
<< " -p , --pid-in-client-name\t\t Append PID to (JACK) " | << " -p , --pid-in-client-name\t\t Append PID to (JACK) " | ||||
"client name\n" | "client name\n" | ||||
<< " -P , --prefered-port\t\t\t Prefered OSC Port\n" | |||||
<< " -P , --preferred-port\t\t\t Preferred OSC Port\n" | |||||
<< " -O , --output\t\t\t\t Set Output Engine\n" | << " -O , --output\t\t\t\t Set Output Engine\n" | ||||
<< " -I , --input\t\t\t\t Set Input Engine\n" | << " -I , --input\t\t\t\t Set Input Engine\n" | ||||
<< " -e , --exec-after-init\t\t Run post-initialization script\n" | << " -e , --exec-after-init\t\t Run post-initialization script\n" | ||||