| @@ -32,12 +32,12 @@ struct QuadMIDIToCVInterface : MidiIO, Module { | |||||
| enum Modes { | enum Modes { | ||||
| ROTATE, | ROTATE, | ||||
| RESET, | RESET, | ||||
| REASIGN | |||||
| REASSIGN | |||||
| }; | }; | ||||
| bool pedal = false; | bool pedal = false; | ||||
| int mode = REASIGN; | |||||
| int mode = REASSIGN; | |||||
| int getMode() const; | int getMode() const; | ||||
| @@ -185,69 +185,50 @@ void QuadMIDIToCVInterface::processMidi(std::vector<unsigned char> msg) { | |||||
| if (activeKeys[i].pitch == data1) { | if (activeKeys[i].pitch == data1) { | ||||
| activeKeys[i].gate = false; | activeKeys[i].gate = false; | ||||
| activeKeys[i].vel = data2; | activeKeys[i].vel = data2; | ||||
| if (std::find(open.begin(), open.end(), i) != open.end()) { | |||||
| open.remove(i); | |||||
| } | |||||
| open.push_front(i); | open.push_front(i); | ||||
| } | } | ||||
| } | } | ||||
| return; | return; | ||||
| } | } | ||||
| if (open.empty()) { | |||||
| open.clear(); | |||||
| for (int i = 0; i < 4; i++) { | |||||
| open.push_back(i); | |||||
| } | |||||
| } | |||||
| if (!activeKeys[0].gate && !activeKeys[1].gate && | |||||
| !activeKeys[2].gate && !activeKeys[3].gate) { | |||||
| open.sort(); | |||||
| } | |||||
| switch (mode) { | switch (mode) { | ||||
| case RESET: | case RESET: | ||||
| case REASIGN: | |||||
| for (int i = 0; i < 4; i++) { | |||||
| if (activeKeys[i].gate == false && std::find(open.begin(), open.end(), i) == open.end()) { | |||||
| if (open.size() == 4 ) { | |||||
| for (int i = 0; i < 4; i++) { | |||||
| activeKeys[i].gate = false; | |||||
| open.push_back(i); | open.push_back(i); | ||||
| } | } | ||||
| } | } | ||||
| if (open.size() == 4) { | |||||
| open.sort(); | |||||
| } | |||||
| break; | |||||
| case REASSIGN: | |||||
| open.push_back(open.front()); | open.push_back(open.front()); | ||||
| break; | break; | ||||
| case ROTATE: | case ROTATE: | ||||
| if (open.empty()) { | |||||
| for (int i = 0; i < 4; i++) { | |||||
| open.push_back(i); | |||||
| } | |||||
| } else { | |||||
| open.sort(); | |||||
| } | |||||
| break; | break; | ||||
| default: | default: | ||||
| fprintf(stderr, "No mode selected?!\n"); | fprintf(stderr, "No mode selected?!\n"); | ||||
| } | } | ||||
| activeKeys[open. | |||||
| front() | |||||
| ]. | |||||
| gate = true; | |||||
| activeKeys[open. | |||||
| front() | |||||
| ]. | |||||
| pitch = data1; | |||||
| activeKeys[open. | |||||
| front() | |||||
| ]. | |||||
| vel = data2; | |||||
| fprintf(stderr, | |||||
| "Using No: %d\n", open. | |||||
| front() | |||||
| ); | |||||
| open. | |||||
| pop_front(); | |||||
| activeKeys[open.front()].gate = true; | |||||
| activeKeys[open.front()].pitch = data1; | |||||
| activeKeys[open.front()].vel = data2; | |||||
| open.pop_front(); | |||||
| return; | return; | ||||
| @@ -273,7 +254,7 @@ struct ModeItem : MenuItem { | |||||
| struct ModeChoice : ChoiceButton { | struct ModeChoice : ChoiceButton { | ||||
| QuadMIDIToCVInterface *module; | QuadMIDIToCVInterface *module; | ||||
| const std::vector<std::string> modeNames = {"ROTATE", "RESET", "REASSIGN"}; | |||||
| const std::vector<std::string> modeNames = {"ROTATE", "RESET", "REASSIGN"}; | |||||
| void onAction() { | void onAction() { | ||||
| @@ -374,35 +355,40 @@ QuadMidiToCVWidget::QuadMidiToCVWidget() { | |||||
| { | { | ||||
| Label *label = new Label(); | Label *label = new Label(); | ||||
| label->box.pos = Vec(margin, yPos); | |||||
| label->text = "1V/Oct"; | |||||
| label->box.pos = Vec(84, yPos); | |||||
| label->text = "1"; | |||||
| addChild(label); | addChild(label); | ||||
| } | } | ||||
| { | { | ||||
| Label *label = new Label(); | Label *label = new Label(); | ||||
| label->box.pos = Vec(67, yPos); | |||||
| label->text = "Gate"; | |||||
| label->box.pos = Vec(125, yPos); | |||||
| label->text = "2"; | |||||
| addChild(label); | addChild(label); | ||||
| } | } | ||||
| { | { | ||||
| Label *label = new Label(); | Label *label = new Label(); | ||||
| label->box.pos = Vec(133, yPos); | |||||
| label->text = "Vel"; | |||||
| label->box.pos = Vec(164, yPos); | |||||
| label->text = "3"; | |||||
| addChild(label); | addChild(label); | ||||
| } | } | ||||
| { | { | ||||
| Label *label = new Label(); | Label *label = new Label(); | ||||
| label->box.pos = Vec(195, yPos); | |||||
| label->text = "At"; | |||||
| label->box.pos = Vec(203, yPos); | |||||
| label->text = "4"; | |||||
| addChild(label); | addChild(label); | ||||
| } | } | ||||
| std::string labels[4] = {"1V/Oct", "Gate", "Vel", "At"}; | |||||
| yPos += labelHeight + margin; | |||||
| yPos += labelHeight + margin * 2; | |||||
| for (int i = 0; i < 4; i++) { | for (int i = 0; i < 4; i++) { | ||||
| addOutput(createOutput<PJ3410Port>(Vec(0 * (63) + 15, yPos + 5), module, i)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(1 * (63) + 10, yPos + 5), module, i + 4)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(2 * (63) + 10, yPos + 5), module, i + 8)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(3 * (63) + 5, yPos + 5), module, i + 12)); | |||||
| Label *label = new Label(); | |||||
| label->box.pos = Vec(margin, yPos); | |||||
| label->text = labels[i]; | |||||
| addChild(label); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(2 * (40), yPos - 5), module, i * 4)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(3 * (40), yPos - 5), module, i * 4 + 1)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(4 * (40), yPos - 5), module, i * 4 + 2)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(5 * (40), yPos - 5), module, i * 4 + 3)); | |||||
| yPos += 40; | yPos += 40; | ||||
| } | } | ||||