| @@ -21,7 +21,9 @@ struct _8vert : Module { | |||
| _8vert() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| for (int i = 0; i < 8; i++) { | |||
| configParam(GAIN_PARAMS + i, -1.f, 1.f, 0.f, string::f("Ch %d gain", i + 1), "%", 0, 100); | |||
| configParam(GAIN_PARAMS + i, -1.f, 1.f, 0.f, string::f("Row %d gain", i + 1), "%", 0, 100); | |||
| configInput(IN_INPUTS + i, string::f("Row %d", i + 1)); | |||
| configOutput(OUT_OUTPUTS + i, string::f("Row %d", i + 1)); | |||
| } | |||
| } | |||
| @@ -38,6 +38,12 @@ struct Delay : Module { | |||
| configParam(FEEDBACK_PARAM, 0.f, 1.f, 0.5f, "Feedback", "%", 0, 100); | |||
| configParam(COLOR_PARAM, 0.f, 1.f, 0.5f, "Color", "%", 0, 100); | |||
| configParam(MIX_PARAM, 0.f, 1.f, 0.5f, "Mix", "%", 0, 100); | |||
| configInput(TIME_INPUT, "Time"); | |||
| configInput(FEEDBACK_INPUT, "Feedback"); | |||
| configInput(COLOR_INPUT, "Color"); | |||
| configInput(MIX_INPUT, "Mix"); | |||
| configInput(IN_INPUT, "Audio"); | |||
| configOutput(OUT_OUTPUT, "Audio"); | |||
| src = src_new(SRC_SINC_FASTEST, 1, NULL); | |||
| assert(src); | |||
| @@ -124,6 +124,15 @@ struct LFO : Module { | |||
| configParam(PW_PARAM, 0.01f, 0.99f, 0.5f, "Pulse width", "%", 0.f, 100.f); | |||
| configParam(FM2_PARAM, 0.f, 1.f, 0.f, "Frequency modulation 2", "%", 0.f, 100.f); | |||
| configParam(PWM_PARAM, 0.f, 1.f, 0.f, "Pulse width modulation", "%", 0.f, 100.f); | |||
| configInput(FM1_INPUT, "Frequency modulation 1"); | |||
| configInput(FM2_INPUT, "Frequency modulation 2"); | |||
| configInput(RESET_INPUT, "Reset"); | |||
| configInput(PW_INPUT, "Pulse width modulation"); | |||
| configOutput(SIN_OUTPUT, "Sine"); | |||
| configOutput(TRI_OUTPUT, "Triangle"); | |||
| configOutput(SAW_OUTPUT, "Sawtooth"); | |||
| configOutput(SQR_OUTPUT, "Square"); | |||
| lightDivider.setDivision(16); | |||
| } | |||
| @@ -261,6 +270,11 @@ struct LFO2 : Module { | |||
| configParam(FREQ_PARAM, -8.f, 10.f, 1.f, "Frequency", " Hz", 2, 1); | |||
| configParam(WAVE_PARAM, 0.f, 3.f, 1.5f, "Wave"); | |||
| configParam(FM_PARAM, 0.f, 1.f, 0.5f, "Frequency modulation", "%", 0.f, 100.f); | |||
| configInput(FM_INPUT, "Frequency modulation"); | |||
| configInput(RESET_INPUT, "Reset"); | |||
| configInput(WAVE_INPUT, "Wave"); | |||
| configOutput(INTERP_OUTPUT, "Out"); | |||
| lightDivider.setDivision(16); | |||
| } | |||
| @@ -23,6 +23,10 @@ struct Merge : Module { | |||
| Merge() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| for (int i = 0; i < 16; i++) | |||
| configInput(MONO_INPUTS + i, string::f("Channel %d", i + 1)); | |||
| configOutput(POLY_OUTPUT, "Polyphonic"); | |||
| lightDivider.setDivision(512); | |||
| onReset(); | |||
| } | |||
| @@ -31,6 +31,16 @@ struct MidSide : Module { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| configParam(ENC_WIDTH_PARAM, 0.f, 2.f, 1.f, "Encoder width", "%", 0, 100); | |||
| configParam(DEC_WIDTH_PARAM, 0.f, 2.f, 1.f, "Decoder width", "%", 0, 100); | |||
| configInput(ENC_WIDTH_INPUT, "Encoder width"); | |||
| configInput(ENC_LEFT_INPUT, "Encoder left"); | |||
| configInput(ENC_RIGHT_INPUT, "Encoder right"); | |||
| configInput(DEC_WIDTH_INPUT, "Decoder width"); | |||
| configInput(DEC_MID_INPUT, "Decoder mid"); | |||
| configInput(DEC_SIDES_INPUT, "Decoder sides"); | |||
| configOutput(ENC_MID_OUTPUT, "Encoder mid"); | |||
| configOutput(ENC_SIDES_OUTPUT, "Encoder sides"); | |||
| configOutput(DEC_LEFT_OUTPUT, "Decoder left"); | |||
| configOutput(DEC_RIGHT_OUTPUT, "Decoder right"); | |||
| } | |||
| void process(const ProcessArgs& args) override { | |||
| @@ -3,19 +3,19 @@ | |||
| struct Mutes : Module { | |||
| enum ParamIds { | |||
| ENUMS(MUTE_PARAM, 10), | |||
| ENUMS(MUTE_PARAMS, 10), | |||
| NUM_PARAMS | |||
| }; | |||
| enum InputIds { | |||
| ENUMS(IN_INPUT, 10), | |||
| ENUMS(IN_INPUTS, 10), | |||
| NUM_INPUTS | |||
| }; | |||
| enum OutputIds { | |||
| ENUMS(OUT_OUTPUT, 10), | |||
| ENUMS(OUT_OUTPUTS, 10), | |||
| NUM_OUTPUTS | |||
| }; | |||
| enum LightIds { | |||
| ENUMS(MUTE_LIGHT, 10), | |||
| ENUMS(MUTE_LIGHTS, 10), | |||
| NUM_LIGHTS | |||
| }; | |||
| @@ -25,7 +25,9 @@ struct Mutes : Module { | |||
| Mutes() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| for (int i = 0; i < 10; i++) { | |||
| configParam(MUTE_PARAM + i, 0.0, 1.0, 0.0, string::f("Ch %d mute", i + 1)); | |||
| configParam(MUTE_PARAMS + i, 0.0, 1.0, 0.0, string::f("Row %d mute", i + 1)); | |||
| configInput(IN_INPUTS + i, string::f("Row %d", i + 1)); | |||
| configOutput(OUT_OUTPUTS + i, string::f("Row %d", i + 1)); | |||
| } | |||
| onReset(); | |||
| @@ -39,24 +41,24 @@ struct Mutes : Module { | |||
| // Iterate rows | |||
| for (int i = 0; i < 10; i++) { | |||
| // Process trigger | |||
| if (muteTrigger[i].process(params[MUTE_PARAM + i].getValue() > 0.f)) | |||
| if (muteTrigger[i].process(params[MUTE_PARAMS + i].getValue() > 0.f)) | |||
| state[i] ^= true; | |||
| // Get input | |||
| // Inputs are normalized to the input above it, so only set if connected | |||
| if (inputs[IN_INPUT + i].isConnected()) { | |||
| channels = inputs[IN_INPUT + i].getChannels(); | |||
| inputs[IN_INPUT + i].readVoltages(out); | |||
| if (inputs[IN_INPUTS + i].isConnected()) { | |||
| channels = inputs[IN_INPUTS + i].getChannels(); | |||
| inputs[IN_INPUTS + i].readVoltages(out); | |||
| } | |||
| // Set output | |||
| if (outputs[OUT_OUTPUT + i].isConnected()) { | |||
| outputs[OUT_OUTPUT + i].setChannels(channels); | |||
| outputs[OUT_OUTPUT + i].writeVoltages(state[i] ? out : zero); | |||
| if (outputs[OUT_OUTPUTS + i].isConnected()) { | |||
| outputs[OUT_OUTPUTS + i].setChannels(channels); | |||
| outputs[OUT_OUTPUTS + i].writeVoltages(state[i] ? out : zero); | |||
| } | |||
| // Set light | |||
| lights[MUTE_LIGHT + i].setBrightness(state[i] ? 0.9f : 0.f); | |||
| lights[MUTE_LIGHTS + i].setBrightness(state[i] ? 0.9f : 0.f); | |||
| } | |||
| } | |||
| @@ -109,49 +111,49 @@ struct MutesWidget : ModuleWidget { | |||
| addChild(createWidget<ScrewSilver>(Vec(15, 365))); | |||
| addChild(createWidget<ScrewSilver>(Vec(box.size.x - 30, 365))); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 18.165)), module, Mutes::MUTE_PARAM + 0)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 28.164)), module, Mutes::MUTE_PARAM + 1)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 38.164)), module, Mutes::MUTE_PARAM + 2)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 48.165)), module, Mutes::MUTE_PARAM + 3)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 58.164)), module, Mutes::MUTE_PARAM + 4)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 68.165)), module, Mutes::MUTE_PARAM + 5)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 78.164)), module, Mutes::MUTE_PARAM + 6)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 88.164)), module, Mutes::MUTE_PARAM + 7)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 98.165)), module, Mutes::MUTE_PARAM + 8)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 108.166)), module, Mutes::MUTE_PARAM + 9)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 17.81)), module, Mutes::IN_INPUT + 0)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 27.809)), module, Mutes::IN_INPUT + 1)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 37.809)), module, Mutes::IN_INPUT + 2)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 47.81)), module, Mutes::IN_INPUT + 3)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 57.81)), module, Mutes::IN_INPUT + 4)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 67.809)), module, Mutes::IN_INPUT + 5)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 77.81)), module, Mutes::IN_INPUT + 6)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 87.81)), module, Mutes::IN_INPUT + 7)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 97.809)), module, Mutes::IN_INPUT + 8)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 107.809)), module, Mutes::IN_INPUT + 9)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 17.81)), module, Mutes::OUT_OUTPUT + 0)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 27.809)), module, Mutes::OUT_OUTPUT + 1)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 37.809)), module, Mutes::OUT_OUTPUT + 2)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 47.81)), module, Mutes::OUT_OUTPUT + 3)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 57.809)), module, Mutes::OUT_OUTPUT + 4)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 67.809)), module, Mutes::OUT_OUTPUT + 5)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 77.81)), module, Mutes::OUT_OUTPUT + 6)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 87.81)), module, Mutes::OUT_OUTPUT + 7)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 97.809)), module, Mutes::OUT_OUTPUT + 8)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 107.809)), module, Mutes::OUT_OUTPUT + 9)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 18.915)), module, Mutes::MUTE_LIGHT + 0)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 28.916)), module, Mutes::MUTE_LIGHT + 1)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 38.915)), module, Mutes::MUTE_LIGHT + 2)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 48.915)), module, Mutes::MUTE_LIGHT + 3)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 58.916)), module, Mutes::MUTE_LIGHT + 4)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 68.916)), module, Mutes::MUTE_LIGHT + 5)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 78.915)), module, Mutes::MUTE_LIGHT + 6)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 88.916)), module, Mutes::MUTE_LIGHT + 7)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 98.915)), module, Mutes::MUTE_LIGHT + 8)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 108.915)), module, Mutes::MUTE_LIGHT + 9)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 18.165)), module, Mutes::MUTE_PARAMS + 0)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 28.164)), module, Mutes::MUTE_PARAMS + 1)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 38.164)), module, Mutes::MUTE_PARAMS + 2)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 48.165)), module, Mutes::MUTE_PARAMS + 3)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 58.164)), module, Mutes::MUTE_PARAMS + 4)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 68.165)), module, Mutes::MUTE_PARAMS + 5)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 78.164)), module, Mutes::MUTE_PARAMS + 6)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 88.164)), module, Mutes::MUTE_PARAMS + 7)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 98.165)), module, Mutes::MUTE_PARAMS + 8)); | |||
| addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 108.166)), module, Mutes::MUTE_PARAMS + 9)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 17.81)), module, Mutes::IN_INPUTS + 0)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 27.809)), module, Mutes::IN_INPUTS + 1)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 37.809)), module, Mutes::IN_INPUTS + 2)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 47.81)), module, Mutes::IN_INPUTS + 3)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 57.81)), module, Mutes::IN_INPUTS + 4)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 67.809)), module, Mutes::IN_INPUTS + 5)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 77.81)), module, Mutes::IN_INPUTS + 6)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 87.81)), module, Mutes::IN_INPUTS + 7)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 97.809)), module, Mutes::IN_INPUTS + 8)); | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 107.809)), module, Mutes::IN_INPUTS + 9)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 17.81)), module, Mutes::OUT_OUTPUTS + 0)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 27.809)), module, Mutes::OUT_OUTPUTS + 1)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 37.809)), module, Mutes::OUT_OUTPUTS + 2)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 47.81)), module, Mutes::OUT_OUTPUTS + 3)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 57.809)), module, Mutes::OUT_OUTPUTS + 4)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 67.809)), module, Mutes::OUT_OUTPUTS + 5)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 77.81)), module, Mutes::OUT_OUTPUTS + 6)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 87.81)), module, Mutes::OUT_OUTPUTS + 7)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 97.809)), module, Mutes::OUT_OUTPUTS + 8)); | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 107.809)), module, Mutes::OUT_OUTPUTS + 9)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 18.915)), module, Mutes::MUTE_LIGHTS + 0)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 28.916)), module, Mutes::MUTE_LIGHTS + 1)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 38.915)), module, Mutes::MUTE_LIGHTS + 2)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 48.915)), module, Mutes::MUTE_LIGHTS + 3)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 58.916)), module, Mutes::MUTE_LIGHTS + 4)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 68.916)), module, Mutes::MUTE_LIGHTS + 5)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 78.915)), module, Mutes::MUTE_LIGHTS + 6)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 88.916)), module, Mutes::MUTE_LIGHTS + 7)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 98.915)), module, Mutes::MUTE_LIGHTS + 8)); | |||
| addChild(createLight<LEDBezelLight<GreenLight>>(mm2px(Vec(17.32, 108.915)), module, Mutes::MUTE_LIGHTS + 9)); | |||
| } | |||
| }; | |||
| @@ -99,6 +99,20 @@ struct Noise : Module { | |||
| Noise() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| configOutput(WHITE_OUTPUT, "White noise"); | |||
| outputInfos[WHITE_OUTPUT]->description = "0 dB/octave power density"; | |||
| configOutput(PINK_OUTPUT, "Pink noise"); | |||
| outputInfos[PINK_OUTPUT]->description = "-3 dB/octave power density"; | |||
| configOutput(RED_OUTPUT, "Red noise"); | |||
| outputInfos[RED_OUTPUT]->description = "-6 dB/octave power density"; | |||
| configOutput(VIOLET_OUTPUT, "Violet noise"); | |||
| outputInfos[VIOLET_OUTPUT]->description = "+6 dB/octave power density"; | |||
| configOutput(BLUE_OUTPUT, "Blue noise"); | |||
| outputInfos[BLUE_OUTPUT]->description = "+3 dB/octave power density"; | |||
| configOutput(GRAY_OUTPUT, "Gray noise"); | |||
| outputInfos[GRAY_OUTPUT]->description = "Psychoacoustic equal loudness"; | |||
| configOutput(BLACK_OUTPUT, "Black noise"); | |||
| outputInfos[BLACK_OUTPUT]->description = "Uniform random numbers"; | |||
| // Hard-code coefficients for Butterworth lowpass with cutoff 20 Hz @ 44.1kHz. | |||
| const float b[] = {0.00425611, 0.00425611}; | |||
| @@ -22,6 +22,9 @@ struct Octave : Module { | |||
| Octave() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| configParam(OCTAVE_PARAM, -4.f, 4.f, 0.f, "Octave shift"); | |||
| configInput(PITCH_INPUT, "Pitch"); | |||
| configInput(OCTAVE_INPUT, "Octave shift"); | |||
| configOutput(PITCH_OUTPUT, "Octave-shifted pitch"); | |||
| } | |||
| void process(const ProcessArgs& args) override { | |||
| @@ -24,8 +24,11 @@ struct Pulses : Module { | |||
| Pulses() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| for (int i = 0; i < 10; i++) | |||
| configParam(TAP_PARAMS + i, 0.f, 1.f, 0.f, string::f("Tap %d", i + 1)); | |||
| for (int i = 0; i < 10; i++) { | |||
| configParam(TAP_PARAMS + i, 0.f, 1.f, 0.f, string::f("Row %d tap", i + 1)); | |||
| configOutput(TRIG_OUTPUTS + i, string::f("Row %d trigger", i + 1)); | |||
| configOutput(GATE_OUTPUTS + i, string::f("Row %d gate", i + 1)); | |||
| } | |||
| } | |||
| void process(const ProcessArgs& args) override { | |||
| @@ -24,6 +24,9 @@ struct Quantizer : Module { | |||
| Quantizer() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| configInput(PITCH_INPUT, "Pitch"); | |||
| configOutput(PITCH_OUTPUT, "Pitch"); | |||
| onReset(); | |||
| } | |||
| @@ -42,6 +42,14 @@ struct Random : Module { | |||
| configParam(SHAPE_PARAM, 0.f, 1.f, 0.5f, "Shape", "%", 0, 100); | |||
| configParam(OFFSET_PARAM, 0.f, 1.f, 1.f, "Bipolar/unipolar"); | |||
| configParam(MODE_PARAM, 0.f, 1.f, 1.f, "Relative/absolute randomness"); | |||
| configInput(RATE_INPUT, "Rate"); | |||
| configInput(SHAPE_INPUT, "Shape"); | |||
| configInput(TRIGGER_INPUT, "Trigger"); | |||
| configInput(EXTERNAL_INPUT, "External"); | |||
| configOutput(STEPPED_OUTPUT, "Stepped"); | |||
| configOutput(LINEAR_OUTPUT, "Linear"); | |||
| configOutput(SMOOTH_OUTPUT, "Smooth"); | |||
| configOutput(EXPONENTIAL_OUTPUT, "Exponential"); | |||
| } | |||
| void trigger() { | |||
| @@ -7,10 +7,10 @@ struct SEQ3 : Module { | |||
| RUN_PARAM, | |||
| RESET_PARAM, | |||
| STEPS_PARAM, | |||
| ENUMS(ROW1_PARAM, 8), | |||
| ENUMS(ROW2_PARAM, 8), | |||
| ENUMS(ROW3_PARAM, 8), | |||
| ENUMS(GATE_PARAM, 8), | |||
| ENUMS(ROW1_PARAMS, 8), | |||
| ENUMS(ROW2_PARAMS, 8), | |||
| ENUMS(ROW3_PARAMS, 8), | |||
| ENUMS(GATE_PARAMS, 8), | |||
| NUM_PARAMS | |||
| }; | |||
| enum InputIds { | |||
| @@ -25,7 +25,7 @@ struct SEQ3 : Module { | |||
| ROW1_OUTPUT, | |||
| ROW2_OUTPUT, | |||
| ROW3_OUTPUT, | |||
| ENUMS(GATE_OUTPUT, 8), | |||
| ENUMS(GATE_OUTPUTS, 8), | |||
| NUM_OUTPUTS | |||
| }; | |||
| enum LightIds { | |||
| @@ -54,12 +54,21 @@ struct SEQ3 : Module { | |||
| configParam(RESET_PARAM, 0.f, 1.f, 0.f); | |||
| configParam(STEPS_PARAM, 1.f, 8.f, 8.f); | |||
| for (int i = 0; i < 8; i++) { | |||
| configParam(ROW1_PARAM + i, 0.f, 10.f, 0.f); | |||
| configParam(ROW2_PARAM + i, 0.f, 10.f, 0.f); | |||
| configParam(ROW3_PARAM + i, 0.f, 10.f, 0.f); | |||
| configParam(GATE_PARAM + i, 0.f, 1.f, 0.f); | |||
| configParam(ROW1_PARAMS + i, 0.f, 10.f, 0.f); | |||
| configParam(ROW2_PARAMS + i, 0.f, 10.f, 0.f); | |||
| configParam(ROW3_PARAMS + i, 0.f, 10.f, 0.f); | |||
| configParam(GATE_PARAMS + i, 0.f, 1.f, 0.f); | |||
| } | |||
| configInput(CLOCK_INPUT, "Clock rate"); | |||
| configInput(EXT_CLOCK_INPUT, "External clock"); | |||
| configInput(RESET_INPUT, "Reset"); | |||
| configInput(STEPS_INPUT, "Steps"); | |||
| configOutput(GATES_OUTPUT, "Gate"); | |||
| configOutput(ROW1_OUTPUT, "Row 1"); | |||
| configOutput(ROW2_OUTPUT, "Row 2"); | |||
| configOutput(ROW3_OUTPUT, "Row 3"); | |||
| for (int i = 0; i < 8; i++) | |||
| configOutput(GATE_OUTPUTS + i, string::f("Gate %d", i + 1)); | |||
| onReset(); | |||
| } | |||
| @@ -150,17 +159,17 @@ struct SEQ3 : Module { | |||
| // Gate buttons | |||
| for (int i = 0; i < 8; i++) { | |||
| if (gateTriggers[i].process(params[GATE_PARAM + i].getValue())) { | |||
| if (gateTriggers[i].process(params[GATE_PARAMS + i].getValue())) { | |||
| gates[i] = !gates[i]; | |||
| } | |||
| outputs[GATE_OUTPUT + i].setVoltage((running && gateIn && i == index && gates[i]) ? 10.f : 0.f); | |||
| outputs[GATE_OUTPUTS + i].setVoltage((running && gateIn && i == index && gates[i]) ? 10.f : 0.f); | |||
| lights[GATE_LIGHTS + i].setSmoothBrightness((gateIn && i == index) ? (gates[i] ? 1.f : 0.33) : (gates[i] ? 0.66 : 0.0), args.sampleTime); | |||
| } | |||
| // Outputs | |||
| outputs[ROW1_OUTPUT].setVoltage(params[ROW1_PARAM + index].getValue()); | |||
| outputs[ROW2_OUTPUT].setVoltage(params[ROW2_PARAM + index].getValue()); | |||
| outputs[ROW3_OUTPUT].setVoltage(params[ROW3_PARAM + index].getValue()); | |||
| outputs[ROW1_OUTPUT].setVoltage(params[ROW1_PARAMS + index].getValue()); | |||
| outputs[ROW2_OUTPUT].setVoltage(params[ROW2_PARAMS + index].getValue()); | |||
| outputs[ROW3_OUTPUT].setVoltage(params[ROW3_PARAMS + index].getValue()); | |||
| outputs[GATES_OUTPUT].setVoltage((gateIn && gates[index]) ? 10.f : 0.f); | |||
| lights[RUNNING_LIGHT].value = (running); | |||
| lights[RESET_LIGHT].setSmoothBrightness(resetTrigger.isHigh(), args.sampleTime); | |||
| @@ -204,12 +213,12 @@ struct SEQ3Widget : ModuleWidget { | |||
| addOutput(createOutput<PJ301MPort>(Vec(portX[7] - 1, 98), module, SEQ3::ROW3_OUTPUT)); | |||
| for (int i = 0; i < 8; i++) { | |||
| addParam(createParam<RoundBlackKnob>(Vec(portX[i] - 2, 157), module, SEQ3::ROW1_PARAM + i)); | |||
| addParam(createParam<RoundBlackKnob>(Vec(portX[i] - 2, 198), module, SEQ3::ROW2_PARAM + i)); | |||
| addParam(createParam<RoundBlackKnob>(Vec(portX[i] - 2, 240), module, SEQ3::ROW3_PARAM + i)); | |||
| addParam(createParam<LEDButton>(Vec(portX[i] + 2, 278 - 1), module, SEQ3::GATE_PARAM + i)); | |||
| addParam(createParam<RoundBlackKnob>(Vec(portX[i] - 2, 157), module, SEQ3::ROW1_PARAMS + i)); | |||
| addParam(createParam<RoundBlackKnob>(Vec(portX[i] - 2, 198), module, SEQ3::ROW2_PARAMS + i)); | |||
| addParam(createParam<RoundBlackKnob>(Vec(portX[i] - 2, 240), module, SEQ3::ROW3_PARAMS + i)); | |||
| addParam(createParam<LEDButton>(Vec(portX[i] + 2, 278 - 1), module, SEQ3::GATE_PARAMS + i)); | |||
| addChild(createLight<MediumLight<GreenLight>>(Vec(portX[i] + 6.4f, 281.4f), module, SEQ3::GATE_LIGHTS + i)); | |||
| addOutput(createOutput<PJ301MPort>(Vec(portX[i] - 1, 307), module, SEQ3::GATE_OUTPUT + i)); | |||
| addOutput(createOutput<PJ301MPort>(Vec(portX[i] - 1, 307), module, SEQ3::GATE_OUTPUTS + i)); | |||
| } | |||
| } | |||
| }; | |||
| @@ -58,6 +58,9 @@ struct Scope : Module { | |||
| configParam(LISSAJOUS_PARAM, 0.f, 1.f, 0.f); | |||
| configParam(TRIG_PARAM, -10.f, 10.f, 0.f, "Trigger position", " V"); | |||
| configParam(EXTERNAL_PARAM, 0.f, 1.f, 0.f); | |||
| configInput(X_INPUT, "X"); | |||
| configInput(Y_INPUT, "Y"); | |||
| configInput(TRIG_INPUT, "External trigger"); | |||
| } | |||
| void onReset() override { | |||
| @@ -32,6 +32,22 @@ struct SequentialSwitch : Module { | |||
| SequentialSwitch() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| configParam(STEPS_PARAM, 0.0, 2.0, 0.0, "Steps", "", 0, -1, 4); | |||
| configInput(CLOCK_INPUT, "Clock"); | |||
| configInput(RESET_INPUT, "Reset"); | |||
| if (INPUTS == 1) { | |||
| configInput(IN_INPUTS + 0, "In"); | |||
| } | |||
| else { | |||
| for (int i = 0; i < INPUTS; i++) | |||
| configInput(IN_INPUTS + i, string::f("Ch %d", i + 1)); | |||
| } | |||
| if (OUTPUTS == 1) { | |||
| configOutput(OUT_OUTPUTS + 0, "Out"); | |||
| } | |||
| else { | |||
| for (int i = 0; i < OUTPUTS; i++) | |||
| configOutput(OUT_OUTPUTS + i, string::f("Ch %d", i + 1)); | |||
| } | |||
| for (int i = 0; i < 4; i++) { | |||
| clickFilters[i].rise = 400.f; // Hz | |||
| @@ -22,6 +22,10 @@ struct Split : Module { | |||
| Split() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| configInput(POLY_INPUT, "Polyphonic"); | |||
| for (int i = 0; i < 8; i++) | |||
| configOutput(MONO_OUTPUTS + i, string::f("Channel %d", i + 1)); | |||
| lightDivider.setDivision(512); | |||
| } | |||
| @@ -27,6 +27,8 @@ struct Sum : Module { | |||
| Sum() { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| configParam(LEVEL_PARAM, 0.f, 1.f, 1.f, "Level", "%", 0.f, 100.f); | |||
| configInput(POLY_INPUT, "Polyphonic"); | |||
| configOutput(MONO_OUTPUT, "Monophonic"); | |||
| vuMeter.lambda = 1 / 0.1f; | |||
| vuDivider.setDivision(16); | |||
| @@ -31,6 +31,15 @@ struct Unity : Module { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | |||
| configParam(AVG1_PARAM, 0.0, 1.0, 0.0, "Ch 1 average mode"); | |||
| configParam(AVG2_PARAM, 0.0, 1.0, 0.0, "Ch 2 average mode"); | |||
| for (int i = 0; i < 2; i++) { | |||
| for (int j = 0; j < 6; j++) { | |||
| configInput(IN_INPUTS + i * 6 + j, string::f("In %d ch %d", i + 1, j + 1)); | |||
| } | |||
| } | |||
| configOutput(MIX1_OUTPUT, "Mix 1"); | |||
| configOutput(INV1_OUTPUT, "Inverse mix 1"); | |||
| configOutput(MIX2_OUTPUT, "Mix 2"); | |||
| configOutput(INV2_OUTPUT, "Inverse mix 2"); | |||
| lightDivider.setDivision(256); | |||
| } | |||
| @@ -26,6 +26,14 @@ struct VCA : Module { | |||
| config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); | |||
| configParam(LEVEL1_PARAM, 0.0, 1.0, 1.0, "Ch 1 level", "%", 0, 100); | |||
| configParam(LEVEL2_PARAM, 0.0, 1.0, 1.0, "Ch 2 level", "%", 0, 100); | |||
| configInput(EXP1_INPUT, "Exponential CV 1"); | |||
| configInput(LIN1_INPUT, "Linear CV 1"); | |||
| configInput(IN1_INPUT, "In 1"); | |||
| configInput(EXP2_INPUT, "Exponential CV 2"); | |||
| configInput(LIN2_INPUT, "Linear CV 2"); | |||
| configInput(IN2_INPUT, "In 2"); | |||
| configOutput(OUT1_OUTPUT, "Out 1"); | |||
| configOutput(OUT2_OUTPUT, "Out 2"); | |||
| } | |||
| void processChannel(Input& in, Param& level, Input& lin, Input& exp, Output& out) { | |||
| @@ -99,6 +99,12 @@ struct VCF : Module { | |||
| configParam(RES_PARAM, 0.f, 1.f, 0.f, "Resonance", "%", 0.f, 100.f); | |||
| configParam(FREQ_CV_PARAM, -1.f, 1.f, 0.f, "Frequency modulation", "%", 0.f, 100.f); | |||
| configParam(DRIVE_PARAM, 0.f, 1.f, 0.f, "Drive", "", 0, 11); | |||
| configInput(FREQ_INPUT, "Frequency"); | |||
| configInput(RES_INPUT, "Resonance"); | |||
| configInput(DRIVE_INPUT, "Drive"); | |||
| configInput(IN_INPUT, "In"); | |||
| configOutput(LPF_OUTPUT, "Lowpass filter"); | |||
| configOutput(HPF_OUTPUT, "Highpass filter"); | |||
| } | |||
| void onReset() override { | |||
| @@ -287,6 +287,15 @@ struct VCO : Module { | |||
| configParam(FM_PARAM, 0.f, 1.f, 0.f, "Frequency modulation", "%", 0.f, 100.f); | |||
| configParam(PW_PARAM, 0.01f, 0.99f, 0.5f, "Pulse width", "%", 0.f, 100.f); | |||
| configParam(PWM_PARAM, 0.f, 1.f, 0.f, "Pulse width modulation", "%", 0.f, 100.f); | |||
| configInput(PITCH_INPUT, "1V/oct pitch"); | |||
| configInput(FM_INPUT, "Frequency modulation"); | |||
| configInput(SYNC_INPUT, "Sync"); | |||
| configInput(PW_INPUT, "Pulse width modulation"); | |||
| configOutput(SIN_OUTPUT, "Sine"); | |||
| configOutput(TRI_OUTPUT, "Triangle"); | |||
| configOutput(SAW_OUTPUT, "Sawtooth"); | |||
| configOutput(SQR_OUTPUT, "Square"); | |||
| lightDivider.setDivision(16); | |||
| } | |||
| @@ -419,6 +428,11 @@ struct VCO2 : Module { | |||
| configParam(FREQ_PARAM, -54.f, 54.f, 0.f, "Frequency", " Hz", dsp::FREQ_SEMITONE, dsp::FREQ_C4); | |||
| configParam(WAVE_PARAM, 0.f, 3.f, 1.5f, "Wave"); | |||
| configParam(FM_PARAM, 0.f, 1.f, 0.f, "Frequency modulation", "%", 0.f, 100.f); | |||
| configInput(FM_INPUT, "Frequency modulation"); | |||
| configInput(SYNC_INPUT, "Sync"); | |||
| configInput(WAVE_INPUT, "Wave"); | |||
| configOutput(OUT_OUTPUT, "Out"); | |||
| lightDivider.setDivision(16); | |||
| } | |||