|
@@ -250,6 +250,157 @@ struct Peaks : Module { |
|
|
setFunction(1, function_[1]); |
|
|
setFunction(1, function_[1]); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void updateKnobDescriptions() { |
|
|
|
|
|
|
|
|
|
|
|
if (processors[0].function() == peaks::PROCESSOR_FUNCTION_NUMBER_STATION) { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "????"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "????"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "????"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "????"; |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (edit_mode_ == EDIT_MODE_SPLIT) { |
|
|
|
|
|
switch (function_[0]) { |
|
|
|
|
|
case FUNCTION_ENVELOPE: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "Ch. 1 Attack"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "Ch. 1 Decay"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "Ch. 2 Attack"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "Ch. 2 Decay"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_LFO: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "Ch. 1 Frequency"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "Ch. 1 Waveform"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "Ch. 2 Frequency"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "Ch. 2 Waveform"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_TAP_LFO: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "Ch. 1 Waveform"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "Ch. 1 Waveform variation"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "Ch. 2 Waveform"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "Ch. 2 Waveform variation"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_DRUM_GENERATOR: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "Ch. 1 BD Tone"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "Ch. 1 BD Decay"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "Ch. 2 SD Tone"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "Ch. 2 SD Snappy"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_MINI_SEQUENCER: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "Ch. 1 Step 1"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "Ch. 1 Step 2"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "Ch. 2 Step 1"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "Ch. 2 Step 2"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_PULSE_SHAPER: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "Ch. 1 Delay"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "Ch. 1 Number of repeats"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "Ch. 2 Delay"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "Ch. 2 Number of repeats"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_PULSE_RANDOMIZER: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "Ch. 1 Acceptance/regeneration probability"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "Ch. 1 Delay"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "Ch. 2 Acceptance/regeneration probability"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "Ch. 2 Delay"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_FM_DRUM_GENERATOR: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = "Ch. 1 BD presets morphing"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = "Ch. 1 BD presets variations"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = "Ch. 2 SD presets morphing"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = "Ch. 2 SD presets variations"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
default: break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
|
|
|
|
|
|
int currentFunction = -1; |
|
|
|
|
|
// same for both |
|
|
|
|
|
if (edit_mode_ == EDIT_MODE_TWIN) { |
|
|
|
|
|
currentFunction = function_[0]; // == function_[1] |
|
|
|
|
|
} |
|
|
|
|
|
// if expert, pick the active set of labels |
|
|
|
|
|
else if (edit_mode_ == EDIT_MODE_FIRST || edit_mode_ == EDIT_MODE_SECOND) { |
|
|
|
|
|
currentFunction = function_[edit_mode_ - EDIT_MODE_FIRST]; |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::string channelText = (edit_mode_ == EDIT_MODE_TWIN) ? "Ch. 1&2 " : string::f("Ch. %d ", edit_mode_ - EDIT_MODE_FIRST + 1); |
|
|
|
|
|
|
|
|
|
|
|
switch (currentFunction) { |
|
|
|
|
|
case FUNCTION_ENVELOPE: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = channelText + "Attack"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = channelText + "Decay"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = channelText + "Sustain"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = channelText + "Release"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_LFO: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = channelText + "Frequency"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = channelText + "Waveform (sine, linear slope, square, steps, random)"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = channelText + "Waveform variation (wavefolder for sine; ascending/triangle/descending balance for slope, pulse-width for square, number of steps, and interpolation method)"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = channelText + "Phase on restart"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_TAP_LFO: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = channelText + "Amplitude"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = channelText + "Waveform"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = channelText + "Waveform variation"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = channelText + "Phase on restart"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_DRUM_GENERATOR: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = channelText + "Base frequency"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = channelText + "Frequency modulation (“Punch” for BD, “Tone” for SD)"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = channelText + "High-frequency content (“Tone” for BD, “Snappy” for SD)"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = channelText + "Decay"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_MINI_SEQUENCER: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = channelText + "Step 1"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = channelText + "Step 2"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = channelText + "Step 3"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = channelText + "Step 4"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_PULSE_SHAPER: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = channelText + "Pre-delay"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = channelText + "Gate duration"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = channelText + "Delay"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = channelText + "Number of repeats"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_PULSE_RANDOMIZER: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = channelText + "Probability that an incoming trigger is processed"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = channelText + "Probability that the trigger is regenerated after the delay"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = channelText + "Delay time"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = channelText + "Jitter"; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case FUNCTION_FM_DRUM_GENERATOR: { |
|
|
|
|
|
getParamQuantity(KNOB_1_PARAM)->description = channelText + "Frequency"; |
|
|
|
|
|
getParamQuantity(KNOB_2_PARAM)->description = channelText + "FM intensity"; |
|
|
|
|
|
getParamQuantity(KNOB_3_PARAM)->description = channelText + "FM and AM envelope decay time (the FM envelope has a shorter decay than the AM envelope, but the two values are tied to this parameter)"; |
|
|
|
|
|
getParamQuantity(KNOB_4_PARAM)->description = channelText + "Color. At 12 o'clock, no modification is brought to the oscillator signal. Turn right to increase the amount of noise (for snares). Turn left to increase the amount of distortion (for 909 style kicks)."; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
default: break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
json_t* dataToJson() override { |
|
|
json_t* dataToJson() override { |
|
|
|
|
|
|
|
|
saveState(); |
|
|
saveState(); |
|
@@ -309,6 +460,7 @@ struct Peaks : Module { |
|
|
void process(const ProcessArgs& args) override { |
|
|
void process(const ProcessArgs& args) override { |
|
|
poll(); |
|
|
poll(); |
|
|
pollPots(); |
|
|
pollPots(); |
|
|
|
|
|
updateKnobDescriptions(); |
|
|
|
|
|
|
|
|
// Initialize "secret" number station mode. |
|
|
// Initialize "secret" number station mode. |
|
|
if (initNumberStation) { |
|
|
if (initNumberStation) { |
|
|