| @@ -117,7 +117,7 @@ void MIDICCToCVInterface::resetMidi() { | |||
| for (int i = 0; i < NUM_OUTPUTS; i++) { | |||
| cc[i].val = 0; | |||
| cc[i].resetSync(); | |||
| cc[i].tSmooth.set(0,0); | |||
| cc[i].tSmooth.set(0, 0); | |||
| } | |||
| }; | |||
| @@ -147,7 +147,8 @@ void MIDICCToCVInterface::processMidi(std::vector<unsigned char> msg) { | |||
| cc[i].syncFirst = false; | |||
| if (data2 < cc[i].val + 2 && data2 > cc[i].val - 2) { | |||
| cc[i].sync = 0; | |||
| }else { | |||
| } | |||
| else { | |||
| cc[i].sync = absi(data2 - cc[i].val); | |||
| } | |||
| return; | |||
| @@ -156,7 +157,8 @@ void MIDICCToCVInterface::processMidi(std::vector<unsigned char> msg) { | |||
| if (cc[i].sync == 0) { | |||
| cc[i].val = data2; | |||
| cc[i].changed = true; | |||
| } else { | |||
| } | |||
| else { | |||
| cc[i].sync = absi(data2 - cc[i].val); | |||
| } | |||
| } | |||
| @@ -225,12 +227,14 @@ void CCTextField::onTextChange() { | |||
| text = ""; | |||
| begin = end = 0; | |||
| module->cc[outNum].num = -1; | |||
| } else { | |||
| } | |||
| else { | |||
| module->cc[outNum].num = num; | |||
| module->cc[outNum].resetSync(); | |||
| } | |||
| } catch (...) { | |||
| } | |||
| catch (...) { | |||
| text = ""; | |||
| begin = end = 0; | |||
| module->cc[outNum].num = -1; | |||
| @@ -309,7 +313,8 @@ MIDICCToCVWidget::MIDICCToCVWidget() { | |||
| if ((i + 1) % 4 == 0) { | |||
| yPos += 47 + margin; | |||
| } else { | |||
| } | |||
| else { | |||
| yPos -= labelHeight + margin; | |||
| } | |||
| } | |||
| @@ -71,7 +71,7 @@ struct MIDIClockToCVInterface : MidiIO, Module { | |||
| void resetMidi() override; | |||
| json_t *toJson() override{ | |||
| json_t *toJson() override { | |||
| json_t *rootJ = json_object(); | |||
| addBaseJson(rootJ); | |||
| json_object_set_new(rootJ, "clock1ratio", json_integer(clock1ratio)); | |||
| @@ -79,7 +79,7 @@ struct MIDIClockToCVInterface : MidiIO, Module { | |||
| return rootJ; | |||
| } | |||
| void fromJson(json_t *rootJ) override{ | |||
| void fromJson(json_t *rootJ) override { | |||
| baseFromJson(rootJ); | |||
| json_t *c1rJ = json_object_get(rootJ, "clock1ratio"); | |||
| if (c1rJ) { | |||
| @@ -185,18 +185,18 @@ void MIDIClockToCVInterface::resetMidi() { | |||
| void MIDIClockToCVInterface::processMidi(std::vector<unsigned char> msg) { | |||
| switch (msg[0]) { | |||
| case 0xfa: | |||
| start = true; | |||
| break; | |||
| case 0xfb: | |||
| cont = true; | |||
| break; | |||
| case 0xfc: | |||
| stop = true; | |||
| break; | |||
| case 0xf8: | |||
| tick = true; | |||
| break; | |||
| case 0xfa: | |||
| start = true; | |||
| break; | |||
| case 0xfb: | |||
| cont = true; | |||
| break; | |||
| case 0xfc: | |||
| stop = true; | |||
| break; | |||
| case 0xf8: | |||
| tick = true; | |||
| break; | |||
| } | |||
| @@ -218,13 +218,15 @@ struct ClockRatioItem : MenuItem { | |||
| struct ClockRatioChoice : ChoiceButton { | |||
| int *clockRatio; | |||
| const std::vector<std::string> ratioNames = {"Sixteenth note (1:4 ratio)", "Eighth note triplet (1:3 ratio)", | |||
| "Eighth note (1:2 ratio)", "Quarter note triplet (2:3 ratio)", | |||
| "Quarter note (tap speed)", "Half note triplet (4:3 ratio)", | |||
| "Half note (2:1 ratio)", "Whole note (4:1 ratio)", | |||
| "Two whole notes (8:1 ratio)"}; | |||
| "Eighth note (1:2 ratio)", "Quarter note triplet (2:3 ratio)", | |||
| "Quarter note (tap speed)", "Half note triplet (4:3 ratio)", | |||
| "Half note (2:1 ratio)", "Whole note (4:1 ratio)", | |||
| "Two whole notes (8:1 ratio)" | |||
| }; | |||
| const std::vector<std::string> ratioNames_short = {"1:4 ratio", "1:3 ratio", "1:2 ratio", "2:3 ratio", "1:1 ratio", | |||
| "4:3", "2:1 ratio", "4:1 ratio", "8:1 ratio"}; | |||
| "4:3", "2:1 ratio", "4:1 ratio", "8:1 ratio" | |||
| }; | |||
| void onAction(EventAction &e) override { | |||
| Menu *menu = gScene->createMenu(); | |||
| @@ -270,7 +272,7 @@ MIDIClockToCVWidget::MIDIClockToCVWidget() { | |||
| label->box.pos = Vec(box.size.x - margin - 7 * 15, margin); | |||
| label->text = "MIDI Clk-CV"; | |||
| addChild(label); | |||
| yPos = labelHeight*2; | |||
| yPos = labelHeight * 2; | |||
| } | |||
| { | |||
| @@ -320,8 +322,8 @@ MIDIClockToCVWidget::MIDIClockToCVWidget() { | |||
| addInput(createInput<PJ3410Port>(Vec(margin, yPos - 5), module, MIDIClockToCVInterface::CLOCK1_RATIO)); | |||
| ClockRatioChoice *ratioChoice = new ClockRatioChoice(); | |||
| ratioChoice->clockRatio = &module->clock1ratio; | |||
| ratioChoice->box.pos = Vec(int(box.size.x/3), yPos); | |||
| ratioChoice->box.size.x = int(box.size.x/1.5 - margin); | |||
| ratioChoice->box.pos = Vec(int(box.size.x / 3), yPos); | |||
| ratioChoice->box.size.x = int(box.size.x / 1.5 - margin); | |||
| addChild(ratioChoice); | |||
| yPos += ratioChoice->box.size.y + margin * 3; | |||
| @@ -344,8 +346,8 @@ MIDIClockToCVWidget::MIDIClockToCVWidget() { | |||
| addInput(createInput<PJ3410Port>(Vec(margin, yPos - 5), module, MIDIClockToCVInterface::CLOCK2_RATIO)); | |||
| ClockRatioChoice *ratioChoice = new ClockRatioChoice(); | |||
| ratioChoice->clockRatio = &module->clock2ratio; | |||
| ratioChoice->box.pos = Vec(int(box.size.x/3), yPos); | |||
| ratioChoice->box.size.x = int(box.size.x/1.5 - margin); | |||
| ratioChoice->box.pos = Vec(int(box.size.x / 3), yPos); | |||
| ratioChoice->box.size.x = int(box.size.x / 1.5 - margin); | |||
| addChild(ratioChoice); | |||
| yPos += ratioChoice->box.size.y + margin * 3; | |||
| @@ -59,7 +59,8 @@ std::vector<std::string> MidiIO::getDevices() { | |||
| RtMidiIn *m; | |||
| try { | |||
| m = new RtMidiIn(); | |||
| } catch (RtMidiError &error) { | |||
| } | |||
| catch (RtMidiError &error) { | |||
| warn("Failed to create RtMidiIn: %s", error.getMessage().c_str()); | |||
| return names; | |||
| } | |||
| @@ -9,6 +9,7 @@ | |||
| using namespace rack; | |||
| struct IgnoreFlags { | |||
| bool midiSysex = true; | |||
| bool midiTime = true; | |||
| @@ -20,7 +21,6 @@ struct MidiMessage { | |||
| double timeStamp; | |||
| MidiMessage() : bytes(0), timeStamp(0.0) {}; | |||
| }; | |||
| /** | |||
| @@ -135,10 +135,10 @@ struct TransitionSmoother { | |||
| switch (m) { | |||
| case DELTA: | |||
| /* If the change is smaller, the transition phase is longer */ | |||
| this->step = delta > 0 ? delta/l : -delta/l; | |||
| this->step = delta > 0 ? delta / l : -delta / l; | |||
| break; | |||
| case CONST: | |||
| this->step = 1.0/l; | |||
| this->step = 1.0 / l; | |||
| break; | |||
| } | |||
| @@ -153,13 +153,13 @@ struct TransitionSmoother { | |||
| switch (t) { | |||
| case SMOOTHSTEP: | |||
| next += delta*x*x*(3-2*x); | |||
| next += delta * x * x * (3 - 2 * x); | |||
| break; | |||
| case EXP: | |||
| next += delta*x*x; | |||
| next += delta * x * x; | |||
| break; | |||
| case LIN: | |||
| next += delta*x; | |||
| next += delta * x; | |||
| break; | |||
| } | |||
| @@ -169,10 +169,12 @@ void TriggerTextField::onTextChange() { | |||
| text = ""; | |||
| begin = end = 0; | |||
| module->trigger[outNum].num = -1; | |||
| }else { | |||
| } | |||
| else { | |||
| module->trigger[outNum].num = num; | |||
| } | |||
| } catch (...) { | |||
| } | |||
| catch (...) { | |||
| text = ""; | |||
| begin = end = 0; | |||
| module->trigger[outNum].num = -1; | |||
| @@ -271,7 +273,8 @@ MIDITriggerToCVWidget::MIDITriggerToCVWidget() { | |||
| if ((i + 1) % 4 == 0) { | |||
| yPos += 47 + margin; | |||
| } else { | |||
| } | |||
| else { | |||
| yPos -= labelHeight + margin; | |||
| } | |||
| } | |||
| @@ -140,40 +140,41 @@ void QuadMIDIToCVInterface::processMidi(std::vector<unsigned char> msg) { | |||
| return; | |||
| switch (status) { | |||
| // note off | |||
| case 0x8: { | |||
| // note off | |||
| case 0x8: { | |||
| gate = false; | |||
| } | |||
| break; | |||
| case 0x9: // note on | |||
| if (data2 > 0) { | |||
| gate = true; | |||
| } | |||
| else { | |||
| // For some reason, some keyboards send a "note on" event with a velocity of 0 to signal that the key has been released. | |||
| gate = false; | |||
| } | |||
| break; | |||
| case 0x9: // note on | |||
| if (data2 > 0) { | |||
| gate = true; | |||
| } else { | |||
| // For some reason, some keyboards send a "note on" event with a velocity of 0 to signal that the key has been released. | |||
| gate = false; | |||
| } | |||
| break; | |||
| case 0xa: // channel aftertouch | |||
| for (int i = 0; i < 4; i++) { | |||
| if (activeKeys[i].pitch == data1) { | |||
| activeKeys[i].at = data2; | |||
| } | |||
| break; | |||
| case 0xa: // channel aftertouch | |||
| for (int i = 0; i < 4; i++) { | |||
| if (activeKeys[i].pitch == data1) { | |||
| activeKeys[i].at = data2; | |||
| } | |||
| return; | |||
| case 0xb: // cc | |||
| if (data1 == 0x40) { // pedal | |||
| pedal = (data2 >= 64); | |||
| if (!pedal) { | |||
| open.clear(); | |||
| for (int i = 0; i < 4; i++) { | |||
| activeKeys[i].gate = false; | |||
| open.push_back(i); | |||
| } | |||
| } | |||
| return; | |||
| case 0xb: // cc | |||
| if (data1 == 0x40) { // pedal | |||
| pedal = (data2 >= 64); | |||
| if (!pedal) { | |||
| open.clear(); | |||
| for (int i = 0; i < 4; i++) { | |||
| activeKeys[i].gate = false; | |||
| open.push_back(i); | |||
| } | |||
| } | |||
| return; | |||
| default: | |||
| return; | |||
| } | |||
| return; | |||
| default: | |||
| return; | |||
| } | |||
| if (pedal && !gate) { | |||
| @@ -201,25 +202,25 @@ void QuadMIDIToCVInterface::processMidi(std::vector<unsigned char> msg) { | |||
| } | |||
| if (!activeKeys[0].gate && !activeKeys[1].gate && | |||
| !activeKeys[2].gate && !activeKeys[3].gate) { | |||
| !activeKeys[2].gate && !activeKeys[3].gate) { | |||
| open.sort(); | |||
| } | |||
| switch (mode) { | |||
| case RESET: | |||
| if (open.size() >= 4) { | |||
| for (int i = 0; i < 4; i++) { | |||
| activeKeys[i].gate = false; | |||
| open.push_back(i); | |||
| } | |||
| case RESET: | |||
| if (open.size() >= 4) { | |||
| for (int i = 0; i < 4; i++) { | |||
| activeKeys[i].gate = false; | |||
| open.push_back(i); | |||
| } | |||
| break; | |||
| case REASSIGN: | |||
| open.push_back(open.front()); | |||
| break; | |||
| case ROTATE: | |||
| break; | |||
| } | |||
| break; | |||
| case REASSIGN: | |||
| open.push_back(open.front()); | |||
| break; | |||
| case ROTATE: | |||
| break; | |||
| } | |||
| int next = open.front(); | |||
| @@ -313,7 +314,7 @@ QuadMidiToCVWidget::QuadMidiToCVWidget() { | |||
| } | |||
| addParam(createParam<LEDButton>(Vec(12 * 15, labelHeight), module, QuadMIDIToCVInterface::RESET_PARAM, 0.0, 1.0, | |||
| 0.0)); | |||
| 0.0)); | |||
| addChild(createLight<SmallLight<RedLight>>(Vec(12 * 15 + 5, labelHeight + 5), module, QuadMIDIToCVInterface::RESET_LIGHT)); | |||
| { | |||
| Label *label = new Label(); | |||