| @@ -203,6 +203,7 @@ struct ChannelChoice : ChoiceButton { | |||
| */ | |||
| struct MIDIToCVInterface : MidiIO, Module { | |||
| enum ParamIds { | |||
| RESET_PARAM, | |||
| NUM_PARAMS | |||
| }; | |||
| enum InputIds { | |||
| @@ -229,6 +230,9 @@ struct MIDIToCVInterface : MidiIO, Module { | |||
| bool retriggered = false; | |||
| float lights[NUM_OUTPUTS]; | |||
| SchmittTrigger resetTrigger; | |||
| float resetLight = 0.0; | |||
| MIDIToCVInterface() : MidiIO(), Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { | |||
| } | |||
| @@ -260,6 +264,8 @@ struct MIDIToCVInterface : MidiIO, Module { | |||
| } | |||
| virtual void resetMidi(); | |||
| void updateLights(); | |||
| }; | |||
| void MIDIToCVInterface::resetMidi(){ | |||
| @@ -273,6 +279,15 @@ void MIDIToCVInterface::resetMidi(){ | |||
| updateLights(); | |||
| } | |||
| void MIDIToCVInterface::updateLights() { | |||
| lights[GATE_OUTPUT] = outputs[GATE_OUTPUT].value/10; | |||
| lights[MOD_OUTPUT] = mod / 127.0; | |||
| lights[PITCHWHEEL_OUTPUT] = pitchWheel / 127.0; | |||
| lights[CHANNEL_AFTERTOUCH_OUTPUT] = afterTouch / 127.0; | |||
| lights[VELOCITY_OUTPUT] = vel / 127.0; | |||
| } | |||
| void MIDIToCVInterface::step() { | |||
| if (rtMidi->isPortOpen()) { | |||
| std::vector<unsigned char> message; | |||
| @@ -293,22 +308,24 @@ void MIDIToCVInterface::step() { | |||
| gate = false; | |||
| retriggered = false; | |||
| } | |||
| outputs[GATE_OUTPUT].value = gate ? 10.0 : 0.0; | |||
| lights[GATE_OUTPUT] = gate ? 1.0 : 0.0; | |||
| if (resetTrigger.process(params[RESET_PARAM].value)) { | |||
| resetMidi(); | |||
| return; | |||
| } | |||
| outputs[MOD_OUTPUT].value = mod / 127.0 * 10.0; | |||
| lights[MOD_OUTPUT] = mod / 127.0; | |||
| if (resetLight > 0) { | |||
| resetLight -= resetLight/0.55/gSampleRate; // fade out light | |||
| } | |||
| outputs[PITCHWHEEL_OUTPUT].value = (pitchWheel - 64) / 64.0 * 10.0; | |||
| lights[MOD_OUTPUT] = pitchWheel / 127.0; | |||
| outputs[GATE_OUTPUT].value = gate ? 10.0 : 0.0; | |||
| outputs[MOD_OUTPUT].value = mod / 127.0 * 10.0; | |||
| outputs[PITCHWHEEL_OUTPUT].value = (pitchWheel - 64) / 64.0 * 10.0; | |||
| outputs[CHANNEL_AFTERTOUCH_OUTPUT].value = afterTouch / 127.0 * 10.0; | |||
| lights[CHANNEL_AFTERTOUCH_OUTPUT] = afterTouch / 127.0; | |||
| outputs[VELOCITY_OUTPUT].value = vel / 127.0 * 10.0; | |||
| lights[VELOCITY_OUTPUT] = vel / 127.0; | |||
| } | |||
| updateLights(); | |||
| } | |||
| void MIDIToCVInterface::pressNote(int note) { | |||
| // Remove existing similar note | |||
| @@ -416,6 +433,8 @@ MidiToCVWidget::MidiToCVWidget() { | |||
| } | |||
| addParam(createParam<LEDButton>(Vec(7 * 15, labelHeight), module, MIDIToCVInterface::RESET_PARAM, 0.0, 1.0, 0.0)); | |||
| addChild(createValueLight<SmallLight<RedValueLight>>(Vec(7*15+5, labelHeight+5), &module->resetLight)); | |||
| { | |||
| Label *label = new Label(); | |||
| label->box.pos = Vec(margin, yPos); | |||