| @@ -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) { | ||||