From 1de4c8898faf2a63b6ab768301e2e0ec2cd14c40 Mon Sep 17 00:00:00 2001 From: hemmer <915048+hemmer@users.noreply.github.com> Date: Fri, 22 Mar 2024 07:54:05 +0000 Subject: [PATCH] Prepare PR for library update --- CHANGELOG.md | 2 - docs/MIDIThingV2.md | 19 - docs/img/MidiThingV2.png | Bin 104621 -> 0 bytes plugin.json | 24 - res/panels/EvenVCObeta.svg | 1850 ---------- res/panels/MidiThing.svg | 6828 ------------------------------------ src/EvenVCO2.cpp | 331 -- src/MidiThing.cpp | 780 ---- src/plugin.cpp | 2 - src/plugin.hpp | 2 - 10 files changed, 9838 deletions(-) delete mode 100644 docs/MIDIThingV2.md delete mode 100644 docs/img/MidiThingV2.png delete mode 100644 res/panels/EvenVCObeta.svg delete mode 100644 res/panels/MidiThing.svg delete mode 100644 src/EvenVCO2.cpp delete mode 100644 src/MidiThing.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 1639fe2..a20bc04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,6 @@ ## v2.5.0 * Burst * Initial release - * Midi Thing 2 - * Initial release * Voltio * Initial release * PonyVCO diff --git a/docs/MIDIThingV2.md b/docs/MIDIThingV2.md deleted file mode 100644 index b3051eb..0000000 --- a/docs/MIDIThingV2.md +++ /dev/null @@ -1,19 +0,0 @@ -# MIDI Thing v2 - -The original MIDI Thing v2 hardware unit is described as follows: - -> Midi Thing v2 is a flexible MIDI to CV converter. Allowing polyphonic notes handling, envelope and LFO generation as well as all available MIDI messages to be converted into CV. This is a huge upgrade from our previous beloved MIDI Thing, which adds a screen for easy configuration,12 assignable ports, TRS, USB Host and Device, MIDI merge OUT, a web configuration tool, and a VCV rack Bridge counterpart. - -The VCV counterpart is designed to allow users to quickly get up and running with their hardware, i.e. sending CV from VCV to the hardware unit. - -## Setup - -To use, first ensure the MIDI Thing v2 is plugged into your computer, and visible as a MIDI device. Then select it, either from the top of the module, or the right click context menu. Then click "SYNC" - this puts the MIDI Thing into a preset designed to work with VCV Rack, and syncronises settings/voltage ranges etc. - -![MIDI Thing Config](img/MidiThingV2.png "MIDI Thing v2 Setup") - -## Usage - -To use, simply wire CV which you wish to send to the hardware to the matching input on the VCV module. Note that you will need to select the range, which can be done by right-clicking on the matching box (see below). Options are 0/10v, -5/5v, -10/0v, 0/8v, 0/5v. Note that the module is **not** designed to work with audio rate signals, just CV. - -![MIDI Thing Voltage Range](img/VoltageRange.png "MIDI Thing v2 Voltage Range") diff --git a/docs/img/MidiThingV2.png b/docs/img/MidiThingV2.png deleted file mode 100644 index 6d3dc95f1b18df9f4022b15ba3f569af207dfce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104621 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 QZ7%RKy=-}@@B%vQzsl{m0RR91 diff --git a/plugin.json b/plugin.json index 5138f5c..bcfe2df 100644 --- a/plugin.json +++ b/plugin.json @@ -23,18 +23,6 @@ "Polyphonic" ] }, - { - "slug": "EvenVCO2", - "name": "Even VCO (beta)", - "description": "Oscillator including even-harmonic waveform", - "manualUrl": "https://www.befaco.org/even-vco/", - "modularGridUrl": "https://www.modulargrid.net/e/befaco-even-vco-", - "tags": [ - "VCO", - "Hardware clone", - "Polyphonic" - ] - }, { "slug": "Rampage", "name": "Rampage", @@ -308,18 +296,6 @@ "Hardware clone" ] }, - { - "slug": "MidiThingV2", - "name": "MIDI Thing V2", - "description": "Hardware MIDI Thing v2 is a flexible MIDI to CV converter, this module acts as a bridge from VCV", - "manualUrl": "https://github.com/VCVRack/Befaco/blob/v2/docs/MIDIThingV2.md", - "modularGridUrl": "https://www.modulargrid.net/e/befaco-midi-thing-v2", - "tags": [ - "External", - "MIDI", - "Hardware clone" - ] - }, { "slug": "Voltio", "name": "Voltio", diff --git a/res/panels/EvenVCObeta.svg b/res/panels/EvenVCObeta.svg deleted file mode 100644 index 770d19f..0000000 --- a/res/panels/EvenVCObeta.svg +++ /dev/null @@ -1,1850 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/panels/MidiThing.svg b/res/panels/MidiThing.svg deleted file mode 100644 index c6d658d..0000000 --- a/res/panels/MidiThing.svg +++ /dev/null @@ -1,6828 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   - - - - - - -   - - - - - - -   -   - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - - - 0-10v - -10-0v - 0-10v - -10-0v - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MIDI THING V2 - - - - - - - - - - MIDI THINGV2 -   -   -   - - - - - - - - - - - - - -   -   - - - - - 1 - 2 - 3 - MIDI THING V2 - MIDI THINGV2 -   -   -   - - - - - - - - - - - - - -   -   - - - - - MIDI THINGV2 -   -   -   - - - - - - - - - - - - - -   -   - - - - - MIDI THINGV2 -   -   -   - - - - - - - - - - - - - -   -   - - - - - 0-10v - -5/5v - -10-0v - 0-10v - -5/5v - -10-0v - 0-10v - -10-0v - SYNC - - - - - - - - - - - - - - - diff --git a/src/EvenVCO2.cpp b/src/EvenVCO2.cpp deleted file mode 100644 index 7886ff6..0000000 --- a/src/EvenVCO2.cpp +++ /dev/null @@ -1,331 +0,0 @@ -#include "plugin.hpp" -#include "ChowDSP.hpp" - -using simd::float_4; - -struct EvenVCO2 : Module { - enum ParamIds { - OCTAVE_PARAM, - TUNE_PARAM, - PWM_PARAM, - NUM_PARAMS - }; - enum InputIds { - PITCH1_INPUT, - PITCH2_INPUT, - FM_INPUT, - SYNC_INPUT, - PWM_INPUT, - NUM_INPUTS - }; - enum OutputIds { - TRI_OUTPUT, - SINE_OUTPUT, - EVEN_OUTPUT, - SAW_OUTPUT, - SQUARE_OUTPUT, - NUM_OUTPUTS - }; - - - float_4 phase[4] = {}; - dsp::TSchmittTrigger syncTrigger[4]; - bool removePulseDC = true; - bool limitPW = true; - - EvenVCO2() { - config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); - configParam(OCTAVE_PARAM, -5.0, 4.0, 0.0, "Octave", "'", 0.5); - getParamQuantity(OCTAVE_PARAM)->snapEnabled = true; - configParam(TUNE_PARAM, -7.0, 7.0, 0.0, "Tune", " semitones"); - configParam(PWM_PARAM, -1.0, 1.0, 0.0, "Pulse width"); - - configInput(PITCH1_INPUT, "Pitch 1"); - configInput(PITCH2_INPUT, "Pitch 2"); - configInput(FM_INPUT, "FM"); - configInput(SYNC_INPUT, "Sync"); - configInput(PWM_INPUT, "Pulse Width Modulation"); - - configOutput(TRI_OUTPUT, "Triangle"); - configOutput(SINE_OUTPUT, "Sine"); - configOutput(EVEN_OUTPUT, "Even"); - configOutput(SAW_OUTPUT, "Sawtooth"); - configOutput(SQUARE_OUTPUT, "Square"); - - // calculate up/downsampling rates - onSampleRateChange(); - } - - void onSampleRateChange() override { - float sampleRate = APP->engine->getSampleRate(); - for (int i = 0; i < NUM_OUTPUTS; ++i) { - for (int c = 0; c < 4; c++) { - oversampler[i][c].setOversamplingIndex(oversamplingIndex); - oversampler[i][c].reset(sampleRate); - } - } - - const float lowFreqRegime = oversampler[0][0].getOversamplingRatio() * 1e-3 * sampleRate; - DEBUG("Low freq regime: %g", lowFreqRegime); - } - - float_4 aliasSuppressedTri(float_4* phases) { - float_4 triBuffer[3]; - for (int i = 0; i < 3; ++i) { - float_4 p = 2 * phases[i] - 1.0; // range -1.0 to +1.0 - float_4 s = 0.5 - simd::abs(p); // eq 30 - triBuffer[i] = (s * s * s - 0.75 * s) / 3.0; // eq 29 - } - return (triBuffer[0] - 2.0 * triBuffer[1] + triBuffer[2]); - } - - float_4 aliasSuppressedSaw(float_4* phases) { - float_4 sawBuffer[3]; - for (int i = 0; i < 3; ++i) { - float_4 p = 2 * phases[i] - 1.0; // range -1 to +1 - sawBuffer[i] = (p * p * p - p) / 6.0; // eq 11 - } - - return (sawBuffer[0] - 2.0 * sawBuffer[1] + sawBuffer[2]); - } - - float_4 aliasSuppressedDoubleSaw(float_4* phases) { - float_4 sawBuffer[3]; - for (int i = 0; i < 3; ++i) { - float_4 p = 4.0 * simd::ifelse(phases[i] < 0.5, phases[i], phases[i] - 0.5) - 1.0; - sawBuffer[i] = (p * p * p - p) / 24.0; // eq 11 (modified for doubled freq) - } - - return (sawBuffer[0] - 2.0 * sawBuffer[1] + sawBuffer[2]); - } - - float_4 aliasSuppressedOffsetSaw(float_4* phases, float_4 pw) { - float_4 sawOffsetBuff[3]; - - for (int i = 0; i < 3; ++i) { - float_4 p = 2 * phases[i] - 1.0; // range -1 to +1 - float_4 pwp = p + 2 * pw; // phase after pw (pw in [0, 1]) - pwp += simd::ifelse(pwp > 1, -2, 0); // modulo on [-1, +1] - sawOffsetBuff[i] = (pwp * pwp * pwp - pwp) / 6.0; // eq 11 - } - return (sawOffsetBuff[0] - 2.0 * sawOffsetBuff[1] + sawOffsetBuff[2]); - } - - chowdsp::VariableOversampling<6, float_4> oversampler[NUM_OUTPUTS][4]; // uses a 2*6=12th order Butterworth filter - int oversamplingIndex = 1; // default is 2^oversamplingIndex == x2 oversampling - - void process(const ProcessArgs& args) override { - - // pitch inputs determine number of polyphony engines - const int channels = std::max({1, inputs[PITCH1_INPUT].getChannels(), inputs[PITCH2_INPUT].getChannels()}); - - const float pitchKnobs = 1.f + std::round(params[OCTAVE_PARAM].getValue()) + params[TUNE_PARAM].getValue() / 12.f; - const int oversamplingRatio = oversampler[0][0].getOversamplingRatio(); - - for (int c = 0; c < channels; c += 4) { - float_4 pw = simd::clamp(params[PWM_PARAM].getValue() + inputs[PWM_INPUT].getPolyVoltageSimd(c) / 5.f, -1.f, 1.f); - if (limitPW) { - pw = simd::rescale(pw, -1, +1, 0.05f, 0.95f); - } - else { - pw = simd::rescale(pw, -1.f, +1.f, 0.f, 1.f); - } - - const float_4 fmVoltage = inputs[FM_INPUT].getPolyVoltageSimd(c) * 0.25f; - const float_4 pitch = inputs[PITCH1_INPUT].getPolyVoltageSimd(c) + inputs[PITCH2_INPUT].getPolyVoltageSimd(c); - const float_4 freq = dsp::FREQ_C4 * simd::pow(2.f, pitchKnobs + pitch + fmVoltage); - const float_4 deltaBasePhase = simd::clamp(freq * args.sampleTime / oversamplingRatio, 1e-6, 0.5f); - // floating point arithmetic doesn't work well at low frequencies, specifically because the finite difference denominator - // becomes tiny - we check for that scenario and use naive / 1st order waveforms in that frequency regime (as aliasing isn't - // a problem there). With no oversampling, at 44100Hz, the threshold frequency is 44.1Hz. - const float_4 lowFreqRegime = simd::abs(deltaBasePhase) < 1e-3; - // 1 / denominator for the second-order FD - const float_4 denominatorInv = 0.25 / (deltaBasePhase * deltaBasePhase); - - // pulsewave waveform doesn't have DC even for non 50% duty cycles, but Befaco team would like the option - // for it to be added back in for hardware compatibility reasons - const float_4 pulseDCOffset = (!removePulseDC) * 2.f * (0.5f - pw); - - // hard sync - const float_4 syncMask = syncTrigger[c / 4].process(inputs[SYNC_INPUT].getPolyVoltageSimd(c)); - phase[c / 4] = simd::ifelse(syncMask, 0.5f, phase[c / 4]); - - float_4* osBufferTri = oversampler[TRI_OUTPUT][c / 4].getOSBuffer(); - float_4* osBufferSaw = oversampler[SAW_OUTPUT][c / 4].getOSBuffer(); - float_4* osBufferSin = oversampler[SINE_OUTPUT][c / 4].getOSBuffer(); - float_4* osBufferSquare = oversampler[SQUARE_OUTPUT][c / 4].getOSBuffer(); - float_4* osBufferEven = oversampler[EVEN_OUTPUT][c / 4].getOSBuffer(); - for (int i = 0; i < oversamplingRatio; ++i) { - - phase[c / 4] += deltaBasePhase; - // ensure within [0, 1] - phase[c / 4] -= simd::floor(phase[c / 4]); - - float_4 phases[3]; // phase as extrapolated to the current and two previous samples - - phases[0] = phase[c / 4] - 2 * deltaBasePhase + simd::ifelse(phase[c / 4] < 2 * deltaBasePhase, 1.f, 0.f); - phases[1] = phase[c / 4] - deltaBasePhase + simd::ifelse(phase[c / 4] < deltaBasePhase, 1.f, 0.f); - phases[2] = phase[c / 4]; - - if (outputs[SINE_OUTPUT].isConnected() || outputs[EVEN_OUTPUT].isConnected()) { - // sin doesn't need PDW - osBufferSin[i] = -simd::cos(2.0 * M_PI * phase[c / 4]); - } - - if (outputs[TRI_OUTPUT].isConnected()) { - const float_4 dpwOrder1 = 1.0 - 2.0 * simd::abs(2 * phase[c / 4] - 1.0); - const float_4 dpwOrder3 = aliasSuppressedTri(phases) * denominatorInv; - - osBufferTri[i] = simd::ifelse(lowFreqRegime, dpwOrder1, dpwOrder3); - } - - if (outputs[SAW_OUTPUT].isConnected()) { - const float_4 dpwOrder1 = 2 * phase[c / 4] - 1.0; - const float_4 dpwOrder3 = aliasSuppressedSaw(phases) * denominatorInv; - - osBufferSaw[i] = simd::ifelse(lowFreqRegime, dpwOrder1, dpwOrder3); - } - - if (outputs[SQUARE_OUTPUT].isConnected()) { - - float_4 dpwOrder1 = simd::ifelse(phase[c / 4] < pw, -1.0, +1.0); - dpwOrder1 -= removePulseDC ? 2.f * (0.5f - pw) : 0.f; - - float_4 saw = aliasSuppressedSaw(phases); - float_4 sawOffset = aliasSuppressedOffsetSaw(phases, pw); - float_4 dpwOrder3 = (saw - sawOffset) * denominatorInv + pulseDCOffset; - - osBufferSquare[i] = simd::ifelse(lowFreqRegime, dpwOrder1, dpwOrder3); - } - - if (outputs[EVEN_OUTPUT].isConnected()) { - - float_4 dpwOrder1 = 4.0 * simd::ifelse(phase[c / 4] < 0.5, phase[c / 4], phase[c / 4] - 0.5) - 1.0; - float_4 dpwOrder3 = aliasSuppressedDoubleSaw(phases) * denominatorInv; - float_4 doubleSaw = simd::ifelse(lowFreqRegime, dpwOrder1, dpwOrder3); - osBufferEven[i] = 0.55 * (doubleSaw + 1.27 * osBufferSin[i]); - } - - - } // end of oversampling loop - - // downsample (if required) - if (outputs[SINE_OUTPUT].isConnected()) { - const float_4 outSin = (oversamplingRatio > 1) ? oversampler[SINE_OUTPUT][c / 4].downsample() : osBufferSin[0]; - outputs[SINE_OUTPUT].setVoltageSimd(5.f * outSin, c); - } - - if (outputs[TRI_OUTPUT].isConnected()) { - const float_4 outTri = (oversamplingRatio > 1) ? oversampler[TRI_OUTPUT][c / 4].downsample() : osBufferTri[0]; - outputs[TRI_OUTPUT].setVoltageSimd(5.f * outTri, c); - } - - if (outputs[SAW_OUTPUT].isConnected()) { - const float_4 outSaw = (oversamplingRatio > 1) ? oversampler[SAW_OUTPUT][c / 4].downsample() : osBufferSaw[0]; - outputs[SAW_OUTPUT].setVoltageSimd(5.f * outSaw, c); - } - - if (outputs[SQUARE_OUTPUT].isConnected()) { - const float_4 outSquare = (oversamplingRatio > 1) ? oversampler[SQUARE_OUTPUT][c / 4].downsample() : osBufferSquare[0]; - outputs[SQUARE_OUTPUT].setVoltageSimd(5.f * outSquare, c); - } - - if (outputs[EVEN_OUTPUT].isConnected()) { - const float_4 outEven = (oversamplingRatio > 1) ? oversampler[EVEN_OUTPUT][c / 4].downsample() : osBufferEven[0]; - outputs[EVEN_OUTPUT].setVoltageSimd(5.f * outEven, c); - } - - } // end of channels loop - - // Outputs - outputs[TRI_OUTPUT].setChannels(channels); - outputs[SINE_OUTPUT].setChannels(channels); - outputs[EVEN_OUTPUT].setChannels(channels); - outputs[SAW_OUTPUT].setChannels(channels); - outputs[SQUARE_OUTPUT].setChannels(channels); - } - - - json_t* dataToJson() override { - json_t* rootJ = json_object(); - json_object_set_new(rootJ, "removePulseDC", json_boolean(removePulseDC)); - json_object_set_new(rootJ, "limitPW", json_boolean(limitPW)); - json_object_set_new(rootJ, "oversamplingIndex", json_integer(oversampler[0][0].getOversamplingIndex())); - return rootJ; - } - - void dataFromJson(json_t* rootJ) override { - json_t* pulseDCJ = json_object_get(rootJ, "removePulseDC"); - if (pulseDCJ) { - removePulseDC = json_boolean_value(pulseDCJ); - } - - json_t* limitPWJ = json_object_get(rootJ, "limitPW"); - if (limitPWJ) { - limitPW = json_boolean_value(limitPWJ); - } - - json_t* oversamplingIndexJ = json_object_get(rootJ, "oversamplingIndex"); - if (oversamplingIndexJ) { - oversamplingIndex = json_integer_value(oversamplingIndexJ); - onSampleRateChange(); - } - } -}; - - -struct EvenVCO2Widget : ModuleWidget { - EvenVCO2Widget(EvenVCO2* module) { - setModule(module); - setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/panels/EvenVCObeta.svg"))); - - addChild(createWidget(Vec(15, 0))); - addChild(createWidget(Vec(15, 365))); - addChild(createWidget(Vec(15 * 6, 0))); - addChild(createWidget(Vec(15 * 6, 365))); - - addParam(createParam(Vec(22, 32), module, EvenVCO2::OCTAVE_PARAM)); - addParam(createParam(Vec(73, 131), module, EvenVCO2::TUNE_PARAM)); - addParam(createParam(Vec(16, 230), module, EvenVCO2::PWM_PARAM)); - - addInput(createInput(Vec(8, 120), module, EvenVCO2::PITCH1_INPUT)); - addInput(createInput(Vec(19, 157), module, EvenVCO2::PITCH2_INPUT)); - addInput(createInput(Vec(48, 183), module, EvenVCO2::FM_INPUT)); - addInput(createInput(Vec(86, 189), module, EvenVCO2::SYNC_INPUT)); - - addInput(createInput(Vec(72, 236), module, EvenVCO2::PWM_INPUT)); - - addOutput(createOutput(Vec(10, 283), module, EvenVCO2::TRI_OUTPUT)); - addOutput(createOutput(Vec(87, 283), module, EvenVCO2::SINE_OUTPUT)); - addOutput(createOutput(Vec(48, 306), module, EvenVCO2::EVEN_OUTPUT)); - addOutput(createOutput(Vec(10, 327), module, EvenVCO2::SAW_OUTPUT)); - addOutput(createOutput(Vec(87, 327), module, EvenVCO2::SQUARE_OUTPUT)); - } - - void appendContextMenu(Menu* menu) override { - EvenVCO2* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); - menu->addChild(createSubmenuItem("Hardware compatibility", "", - [ = ](Menu * menu) { - menu->addChild(createBoolPtrMenuItem("Remove DC from pulse", "", &module->removePulseDC)); - menu->addChild(createBoolPtrMenuItem("Limit pulsewidth (5\%-95\%)", "", &module->limitPW)); - } - )); - - menu->addChild(createIndexSubmenuItem("Oversampling", - {"Off", "x2", "x4", "x8"}, - [ = ]() { - return module->oversamplingIndex; - }, - [ = ](int mode) { - module->oversamplingIndex = mode; - module->onSampleRateChange(); - } - )); - } -}; - - -Model* modelEvenVCO2 = createModel("EvenVCO2"); diff --git a/src/MidiThing.cpp b/src/MidiThing.cpp deleted file mode 100644 index 1ca30ff..0000000 --- a/src/MidiThing.cpp +++ /dev/null @@ -1,780 +0,0 @@ -#include "plugin.hpp" - - -/*! \brief Decode System Exclusive messages. - SysEx messages are encoded to guarantee transmission of data bytes higher than - 127 without breaking the MIDI protocol. Use this static method to reassemble - your received message. - \param inSysEx The SysEx data received from MIDI in. - \param outData The output buffer where to store the decrypted message. - \param inLength The length of the input buffer. - \param inFlipHeaderBits True for Korg and other who store MSB in reverse order - \return The length of the output buffer. - @see encodeSysEx @see getSysExArrayLength - Code inspired from Ruin & Wesen's SysEx encoder/decoder - http://ruinwesen.com - */ -unsigned decodeSysEx(const uint8_t* inSysEx, - uint8_t* outData, - unsigned inLength, - bool inFlipHeaderBits) { - unsigned count = 0; - uint8_t msbStorage = 0; - uint8_t byteIndex = 0; - - for (unsigned i = 0; i < inLength; ++i) { - if ((i % 8) == 0) { - msbStorage = inSysEx[i]; - byteIndex = 6; - } - else { - const uint8_t body = inSysEx[i]; - const uint8_t shift = inFlipHeaderBits ? 6 - byteIndex : byteIndex; - const uint8_t msb = uint8_t(((msbStorage >> shift) & 1) << 7); - byteIndex--; - outData[count++] = msb | body; - } - } - return count; -} - -struct RoundRobinProcessor { - // if a channel (0 - 11) should be updated, return it's index, otherwise return -1 - int process(float sampleTime, float period, int numActiveChannels) { - - if (numActiveChannels == 0 || period <= 0) { - return -1; - } - - time += sampleTime; - - if (time > period) { - time -= period; - - // special case: when there's only one channel, the below logic (which looks for when active channel changes) - // wont fire. as we've completed a period, return an "update channel 0" value - if (numActiveChannels == 1) { - return 0; - } - } - - int currentActiveChannel = numActiveChannels * time / period; - - if (currentActiveChannel != previousActiveChannel) { - previousActiveChannel = currentActiveChannel; - return currentActiveChannel; - } - - // if we've got this far, no updates needed (-1) - return -1; - } -private: - float time = 0.f; - int previousActiveChannel = -1; -}; - - -struct MidiThing : Module { - enum ParamId { - REFRESH_PARAM, - PARAMS_LEN - }; - enum InputId { - A1_INPUT, - B1_INPUT, - C1_INPUT, - A2_INPUT, - B2_INPUT, - C2_INPUT, - A3_INPUT, - B3_INPUT, - C3_INPUT, - A4_INPUT, - B4_INPUT, - C4_INPUT, - INPUTS_LEN - }; - enum OutputId { - OUTPUTS_LEN - }; - enum LightId { - LIGHTS_LEN - }; - /// Port mode - enum PORTMODE_t : uint8_t { - NOPORTMODE = 0, - MODE10V, - MODEPN5V, - MODENEG10V, - MODE8V, - MODE5V, - - LASTPORTMODE - }; - - const char* cfgPortModeNames[7] = { - "No Mode", - "0/10v", - "-5/5v", - "-10/0v", - "0/8v", - "0/5v", - "" - }; - - const std::vector updateRates = {200., 1000., 4000., 16000.}; - const std::vector updateRateNames = {"200 Hz (fewest active channels, slowest, lowest-cpu)", "1 kHz", "4 kHz", - "16 kHz (most active channels, fast, highest-cpu)"}; - int updateRateIdx = 1; - - // use Pre-def 4 for bridge mode - const static int VCV_BRIDGE_PREDEF = 4; - - midi::Output midiOut; - RoundRobinProcessor roundRobinProcessor; - - MidiThing() { - config(PARAMS_LEN, INPUTS_LEN, OUTPUTS_LEN, LIGHTS_LEN); - configButton(REFRESH_PARAM, ""); - - for (int i = 0; i < NUM_INPUTS; ++i) { - portModes[i] = MODE10V; - configInput(A1_INPUT + i, string::f("Port %d", i + 1)); - } - } - - void onReset() override { - midiOut.reset(); - - } - - void refreshConfig() { - for (int row = 0; row < 4; ++row) { - for (int col = 0; col < 3; ++col) { - requestParamOverSysex(row, col, 2); - } - } - } - - // request that MidiThing loads a pre-defined template, 1-4 - void setPredef(uint8_t predef) { - predef = clamp(predef, 1, 4); - midi::Message msg; - msg.bytes.resize(8); - // Midi spec is zeroo indexed - uint8_t predefToSend = predef - 1; - msg.bytes = {0xF0, 0x7D, 0x17, 0x00, 0x00, 0x02, 0x00, predefToSend, 0xF7}; - midiOut.setChannel(0); - midiOut.sendMessage(msg); - // DEBUG("Predef %d msg request sent: %s", predef, msg.toString().c_str()); - } - - uint8_t port = 0; - void setVoltageMode(uint8_t row, uint8_t col, uint8_t outputMode_) { - port = 3 * row + col; - // +1 because enum starts at 1 - portModes[port] = (PORTMODE_t)(outputMode_ + 1); - - midi::Message msg; - msg.bytes.resize(8); - // F0 7D 17 2n 02 02 00 0m F7 - // Where n = 0 based port number - // and m is the volt output mode to select from: - msg.bytes = {0xF0, 0x7D, 0x17, static_cast(32 + port), 0x02, 0x02, 0x00, portModes[port], 0xF7}; - midiOut.sendMessage(msg); - // DEBUG("Voltage mode msg sent: port %d (%d), mode %d", port, static_cast(32 + port), portModes[port]); - } - - - midi::InputQueue inputQueue; - void requestParamOverSysex(uint8_t row, uint8_t col, uint8_t mode) { - - midi::Message msg; - msg.bytes.resize(8); - // F0 7D 17 00 01 03 00 nm pp F7 - uint8_t port = 3 * row + col; - //Where n is: - // 0 = Full configuration request. The module will send only pre def, port functions and modified parameters - // 2 = Send Port configuration - // 4 = Send MIDI Channel configuration - // 6 = Send Voice Configuration - - uint8_t n = mode * 16; - uint8_t m = port; // element number: 0-11 port number, 1-16 channel or voice number - uint8_t pp = 2; - msg.bytes = {0xF0, 0x7D, 0x17, 0x00, 0x01, 0x03, 0x00, static_cast(n + m), pp, 0xF7}; - midiOut.sendMessage(msg); - // DEBUG("API request mode msg sent: port %d, pp %s", port, msg.toString().c_str()); - } - - int getVoltageMode(uint8_t row, uint8_t col) { - // -1 because menu is zero indexed but enum is not - int channel = clamp(3 * row + col, 0, NUM_INPUTS - 1); - return portModes[channel] - 1; - } - - const static int NUM_INPUTS = 12; - bool isClipping[NUM_INPUTS] = {}; - - bool checkIsVoltageWithinRange(uint8_t channel, float voltage) { - const float tol = 0.001; - switch (portModes[channel]) { - case MODE10V: return 0 - tol < voltage && voltage < 10 + tol; - case MODEPN5V: return -5 - tol < voltage && voltage < 5 + tol; - case MODENEG10V: return -10 - tol < voltage && voltage < 0 + tol; - case MODE8V: return 0 - tol < voltage && voltage < 8 + tol; - case MODE5V: return 0 - tol < voltage && voltage < 5 + tol; - default: return false; - } - } - - uint16_t rescaleVoltageForChannel(uint8_t channel, float voltage) { - switch (portModes[channel]) { - case MODE10V: return rescale(clamp(voltage, 0.f, 10.f), 0.f, +10.f, 0, 16383); - case MODEPN5V: return rescale(clamp(voltage, -5.f, 5.f), -5.f, +5.f, 0, 16383); - case MODENEG10V: return rescale(clamp(voltage, -10.f, 0.f), -10.f, +0.f, 0, 16383); - case MODE8V: return rescale(clamp(voltage, 0.f, 8.f), 0.f, +8.f, 0, 16383); - case MODE5V: return rescale(clamp(voltage, 0.f, 5.f), 0.f, +5.f, 0, 16383); - default: return 0; - } - } - - // debug only - bool setFrame = true; - int numActiveChannels = 0; - dsp::BooleanTrigger buttonTrigger; - dsp::Timer rateLimiterTimer; - PORTMODE_t portModes[NUM_INPUTS] = {}; - void process(const ProcessArgs& args) override { - - if (buttonTrigger.process(params[REFRESH_PARAM].getValue())) { - - // currently this sets the predef to 4, which will reset ranges etc - // TODO: figure this out! - setPredef(4); - refreshConfig(); - } - - //DEBUG("inputDriver id: %d, outMidi id: %d", inputQueue.getDriverId(), midiOut.getDriverId()); - //DEBUG("inputDevice id: %d, outMidi id: %d", inputQueue.getDeviceId(), midiOut.getDeviceId()); - //DEBUG("inputChannel: %d, outChannel: %d", inputQueue.getChannel(), midiOut.getChannel()); - - midi::Message msg; - uint8_t outData[32] = {}; - while (inputQueue.tryPop(&msg, args.frame)) { - DEBUG("msg (size: %d): %s", msg.getSize(), msg.toString().c_str()); - - uint8_t outLen = decodeSysEx(&msg.bytes[0], outData, msg.bytes.size(), false); - if (outLen > 3) { - - int channel = (outData[2] & 0x0f) >> 0; - - if (channel >= 0 && channel < NUM_INPUTS) { - if (outData[outLen - 1] < LASTPORTMODE) { - portModes[channel] = (PORTMODE_t) outData[outLen - 1]; - DEBUG("Channel %d, %d: mode %d (%s)", outData[2], channel, portModes[channel], cfgPortModeNames[portModes[channel]]); - } - - } - } - } - - std::vector activeChannels; - for (int c = 0; c < NUM_INPUTS; ++c) { - if (inputs[A1_INPUT + c].isConnected()) { - activeChannels.push_back(c); - } - } - numActiveChannels = activeChannels.size(); - // we're done if no channels are active - if (numActiveChannels == 0) { - return; - } - - //DEBUG("updateRateIdx: %d", updateRateIdx); - const float updateRateHz = updateRates[updateRateIdx]; - //DEBUG("updateRateHz: %f", updateRateHz); - const int maxCCMessagesPerSecondPerChannel = updateRateHz / numActiveChannels; - - // MIDI baud rate is 31250 b/s, or 3125 B/s. - // CC messages are 3 bytes, so we can send a maximum of 1041 CC messages per second. - // The refresh rate period (i.e. how often we can send X channels of data is: - const float rateLimiterPeriod = 1.f / maxCCMessagesPerSecondPerChannel; - - // this returns -1 if no channel should be updated, or the index of the channel that should be updated - // it distributes update times in a round robin fashion - int channelIdxToUpdate = roundRobinProcessor.process(args.sampleTime, rateLimiterPeriod, numActiveChannels); - - if (channelIdxToUpdate >= 0 && channelIdxToUpdate < numActiveChannels) { - int c = activeChannels[channelIdxToUpdate]; - - const float channelVoltage = inputs[A1_INPUT + c].getVoltage(); - uint16_t pw = rescaleVoltageForChannel(c, channelVoltage); - isClipping[c] = !checkIsVoltageWithinRange(c, channelVoltage); - midi::Message m; - m.setStatus(0xe); - m.setNote(pw & 0x7f); - m.setValue((pw >> 7) & 0x7f); - - if (setFrame) { - m.setFrame(args.frame); - } - - midiOut.setChannel(c); - midiOut.sendMessage(m); - } - } - - - json_t* dataToJson() override { - json_t* rootJ = json_object(); - json_object_set_new(rootJ, "midiOutput", midiOut.toJson()); - json_object_set_new(rootJ, "inputQueue", inputQueue.toJson()); - - json_object_set_new(rootJ, "setFrame", json_boolean(setFrame)); - json_object_set_new(rootJ, "updateRateIdx", json_integer(updateRateIdx)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override { - json_t* midiOutputJ = json_object_get(rootJ, "midiOutput"); - if (midiOutputJ) { - midiOut.fromJson(midiOutputJ); - } - - json_t* midiInputQueueJ = json_object_get(rootJ, "inputQueue"); - if (midiInputQueueJ) { - inputQueue.fromJson(midiInputQueueJ); - } - - json_t* setFrameJ = json_object_get(rootJ, "setFrame"); - if (setFrameJ) { - setFrame = json_boolean_value(setFrameJ); - } - - json_t* updateRateIdxJ = json_object_get(rootJ, "updateRateIdx"); - if (updateRateIdxJ) { - updateRateIdx = json_integer_value(updateRateIdxJ); - } - - refreshConfig(); - } -}; - -struct MidiThingPort : PJ301MPort { - int row = 0, col = 0; - MidiThing* module; - - void appendContextMenu(Menu* menu) override { - - menu->addChild(new MenuSeparator()); - std::string label = string::f("Voltage Mode Port %d", 3 * row + col + 1); - - menu->addChild(createIndexSubmenuItem(label, - {"0 to 10v", "-5 to 5v", "-10 to 0v", "0 to 8v", "0 to 5v"}, - [ = ]() { - return module->getVoltageMode(row, col); - }, - [ = ](int mode) { - module->setVoltageMode(row, col, mode); - } - )); - - menu->addChild(createIndexSubmenuItem("Get Port Info", - {"Full", "Port", "MIDI", "Voice"}, - [ = ]() { - return -1; - }, - [ = ](int mode) { - module->requestParamOverSysex(row, col, 2 * mode); - } - )); - } -}; - -// dervied from https://github.com/countmodula/VCVRackPlugins/blob/v2.0.0/src/components/CountModulaLEDDisplay.hpp -struct LEDDisplay : LightWidget { - float fontSize = 9; - Vec textPos = Vec(1, 13); - int numChars = 7; - int row = 0, col = 0; - MidiThing* module; - - LEDDisplay() { - box.size = mm2px(Vec(9.298, 5.116)); - } - - void setCentredPos(Vec pos) { - box.pos.x = pos.x - box.size.x / 2; - box.pos.y = pos.y - box.size.y / 2; - } - - void drawBackground(const DrawArgs& args) override { - // Background - NVGcolor backgroundColor = nvgRGB(0x20, 0x20, 0x20); - NVGcolor borderColor = nvgRGB(0x10, 0x10, 0x10); - nvgBeginPath(args.vg); - nvgRoundedRect(args.vg, 0.0, 0.0, box.size.x, box.size.y, 2.0); - nvgFillColor(args.vg, backgroundColor); - nvgFill(args.vg); - nvgStrokeWidth(args.vg, 1.0); - nvgStrokeColor(args.vg, borderColor); - nvgStroke(args.vg); - } - - void drawLight(const DrawArgs& args) override { - // Background - NVGcolor backgroundColor = nvgRGB(0x20, 0x20, 0x20); - NVGcolor borderColor = nvgRGB(0x10, 0x10, 0x10); - NVGcolor textColor = nvgRGB(0xff, 0x10, 0x10); - - nvgBeginPath(args.vg); - nvgRoundedRect(args.vg, 0.0, 0.0, box.size.x, box.size.y, 2.0); - nvgFillColor(args.vg, backgroundColor); - nvgFill(args.vg); - nvgStrokeWidth(args.vg, 1.0); - - if (module) { - const bool isClipping = module->isClipping[col + row * 3]; - if (isClipping) { - borderColor = nvgRGB(0xff, 0x20, 0x20); - } - } - - nvgStrokeColor(args.vg, borderColor); - nvgStroke(args.vg); - - std::shared_ptr font = APP->window->loadFont(asset::plugin(pluginInstance, "res/fonts/miso.otf")); - - if (font && font->handle >= 0) { - - std::string text = "?-?v"; // fallback if module not yet defined - if (module) { - text = module->cfgPortModeNames[module->getVoltageMode(row, col) + 1]; - } - char buffer[numChars + 1]; - int l = text.size(); - if (l > numChars) - l = numChars; - - nvgGlobalTint(args.vg, color::WHITE); - - text.copy(buffer, l); - buffer[l] = '\0'; - - nvgFontSize(args.vg, fontSize); - nvgFontFaceId(args.vg, font->handle); - nvgFillColor(args.vg, textColor); - nvgTextAlign(args.vg, NVG_ALIGN_CENTER | NVG_ALIGN_BOTTOM); - NVGtextRow textRow; - nvgTextBreakLines(args.vg, text.c_str(), NULL, box.size.x, &textRow, 1); - nvgTextBox(args.vg, textPos.x, textPos.y, box.size.x, textRow.start, textRow.end); - } - } - - void onButton(const ButtonEvent& e) override { - if (e.button == GLFW_MOUSE_BUTTON_RIGHT && e.action == GLFW_PRESS) { - ui::Menu* menu = createMenu(); - - menu->addChild(createMenuLabel(string::f("Voltage mode port %d:", col + 3 * row + 1))); - - const std::string labels[5] = {"0 to 10v", "-5 to 5v", "-10 to 0v", "0 to 8v", "0 to 5v"}; - - for (int i = 0; i < 5; ++i) { - menu->addChild(createCheckMenuItem(labels[i], "", - [ = ]() { - return module->getVoltageMode(row, col) == i; - }, - [ = ]() { - module->setVoltageMode(row, col, i);; - } - )); - } - - e.consume(this); - return; - } - - LightWidget::onButton(e); - } - -}; - - -struct MidiThingWidget : ModuleWidget { - - struct LedDisplayCenterChoiceEx : LedDisplayChoice { - LedDisplayCenterChoiceEx() { - box.size = mm2px(math::Vec(0, 8.0)); - color = nvgRGB(0xf0, 0xf0, 0xf0); - bgColor = nvgRGBAf(0, 0, 0, 0); - textOffset = math::Vec(0, 16); - } - - void drawLayer(const DrawArgs& args, int layer) override { - nvgScissor(args.vg, RECT_ARGS(args.clipBox)); - if (layer == 1) { - if (bgColor.a > 0.0) { - nvgBeginPath(args.vg); - nvgRect(args.vg, 0, 0, box.size.x, box.size.y); - nvgFillColor(args.vg, bgColor); - nvgFill(args.vg); - } - - std::shared_ptr font = APP->window->loadFont(asset::plugin(pluginInstance, "res/fonts/miso.otf")); - - if (font && font->handle >= 0 && !text.empty()) { - nvgFillColor(args.vg, color); - nvgFontFaceId(args.vg, font->handle); - nvgTextLetterSpacing(args.vg, -0.6f); - nvgFontSize(args.vg, 10); - nvgTextAlign(args.vg, NVG_ALIGN_CENTER | NVG_ALIGN_BOTTOM); - NVGtextRow textRow; - nvgTextBreakLines(args.vg, text.c_str(), NULL, box.size.x, &textRow, 1); - nvgTextBox(args.vg, textOffset.x, textOffset.y, box.size.x, textRow.start, textRow.end); - } - } - nvgResetScissor(args.vg); - } - }; - - - struct MidiDriverItem : ui::MenuItem { - midi::Port* port; - int driverId; - void onAction(const event::Action& e) override { - port->setDriverId(driverId); - } - }; - - struct MidiDriverChoice : LedDisplayCenterChoiceEx { - midi::Port* port; - void onAction(const event::Action& e) override { - if (!port) - return; - createContextMenu(); - } - - virtual ui::Menu* createContextMenu() { - ui::Menu* menu = createMenu(); - menu->addChild(createMenuLabel("MIDI driver")); - for (int driverId : midi::getDriverIds()) { - MidiDriverItem* item = new MidiDriverItem; - item->port = port; - item->driverId = driverId; - item->text = midi::getDriver(driverId)->getName(); - item->rightText = CHECKMARK(item->driverId == port->driverId); - menu->addChild(item); - } - return menu; - } - - void step() override { - text = port ? port->getDriver()->getName() : ""; - if (text.empty()) { - text = "(No driver)"; - color.a = 0.5f; - } - else { - color.a = 1.f; - } - } - }; - - struct MidiDeviceItem : ui::MenuItem { - midi::Port* outPort, *inPort; - int deviceId; - void onAction(const event::Action& e) override { - outPort->setDeviceId(deviceId); - inPort->setDeviceId(deviceId); - } - }; - - struct MidiDeviceChoice : LedDisplayCenterChoiceEx { - midi::Port* outPort, *inPort; - void onAction(const event::Action& e) override { - if (!outPort || !inPort) - return; - createContextMenu(); - } - - virtual ui::Menu* createContextMenu() { - ui::Menu* menu = createMenu(); - menu->addChild(createMenuLabel("MIDI device")); - { - MidiDeviceItem* item = new MidiDeviceItem; - item->outPort = outPort; - item->inPort = inPort; - item->deviceId = -1; - item->text = "(No device)"; - item->rightText = CHECKMARK(item->deviceId == outPort->deviceId); - menu->addChild(item); - } - for (int deviceId : outPort->getDeviceIds()) { - MidiDeviceItem* item = new MidiDeviceItem; - item->outPort = outPort; - item->inPort = inPort; - item->deviceId = deviceId; - item->text = outPort->getDeviceName(deviceId); - item->rightText = CHECKMARK(item->deviceId == outPort->deviceId); - menu->addChild(item); - } - return menu; - } - - void step() override { - text = outPort ? outPort->getDeviceName(outPort->deviceId) : ""; - if (text.empty()) { - text = "(No device)"; - color.a = 0.5f; - } - else { - color.a = 1.f; - } - } - }; - - struct MidiWidget : LedDisplay { - MidiDriverChoice* driverChoice; - LedDisplaySeparator* driverSeparator; - MidiDeviceChoice* deviceChoice; - LedDisplaySeparator* deviceSeparator; - - void setMidiPorts(midi::Port* outPort, midi::Port* inPort) { - - clearChildren(); - math::Vec pos; - - MidiDriverChoice* driverChoice = createWidget(pos); - driverChoice->box.size = Vec(box.size.x, 20.f); - //driverChoice->textOffset = Vec(6.f, 14.7f); - driverChoice->color = nvgRGB(0xf0, 0xf0, 0xf0); - driverChoice->port = outPort; - - addChild(driverChoice); - pos = driverChoice->box.getBottomLeft(); - this->driverChoice = driverChoice; - - this->driverSeparator = createWidget(pos); - this->driverSeparator->box.size.x = box.size.x; - addChild(this->driverSeparator); - - MidiDeviceChoice* deviceChoice = createWidget(pos); - deviceChoice->box.size = Vec(box.size.x, 21.f); - //deviceChoice->textOffset = Vec(6.f, 14.7f); - deviceChoice->color = nvgRGB(0xf0, 0xf0, 0xf0); - deviceChoice->outPort = outPort; - deviceChoice->inPort = inPort; - addChild(deviceChoice); - pos = deviceChoice->box.getBottomLeft(); - this->deviceChoice = deviceChoice; - } - }; - - - MidiThingWidget(MidiThing* module) { - setModule(module); - setPanel(createPanel(asset::plugin(pluginInstance, "res/panels/MidiThing.svg"))); - - addChild(createWidget(Vec(RACK_GRID_WIDTH, 0))); - addChild(createWidget(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); - - MidiWidget* midiInputWidget = createWidget(Vec(1.5f, 36.4f)); //mm2px(Vec(0.5f, 10.f))); - midiInputWidget->box.size = mm2px(Vec(5.08 * 6 - 1, 13.5f)); - if (module) { - midiInputWidget->setMidiPorts(&module->midiOut, &module->inputQueue); - } - else { - midiInputWidget->setMidiPorts(nullptr, nullptr); - } - addChild(midiInputWidget); - - addParam(createParamCentered(mm2px(Vec(21.12, 57.32)), module, MidiThing::REFRESH_PARAM)); - - const float xStartLed = 0.2 + 0.628; - const float yStartLed = 28.019; - - for (int row = 0; row < 4; row++) { - for (int col = 0; col < 3; col++) { - - LEDDisplay* display = createWidget(mm2px(Vec(xStartLed + 9.751 * col, yStartLed + 5.796 * row))); - display->module = module; - display->row = row; - display->col = col; - addChild(display); - - auto input = createInputCentered(mm2px(Vec(5.08 + 10 * col, 69.77 + 14.225 * row)), module, MidiThing::A1_INPUT + 3 * row + col); - input->row = row; - input->col = col; - input->module = module; - addInput(input); - - - } - } - } - - void appendContextMenu(Menu* menu) override { - MidiThing* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); - - menu->addChild(createSubmenuItem("Select Device", "", - [ = ](Menu * menu) { - - for (auto driverId : rack::midi::getDriverIds()) { - midi::Driver* driver = midi::getDriver(driverId); - const bool activeDriver = module->midiOut.getDriverId() == driverId; - - menu->addChild(createSubmenuItem(driver->getName(), CHECKMARK(activeDriver), - [ = ](Menu * menu) { - - for (auto deviceId : driver->getOutputDeviceIds()) { - const bool activeDevice = activeDriver && module->midiOut.getDeviceId() == deviceId; - - menu->addChild(createMenuItem(driver->getOutputDeviceName(deviceId), - CHECKMARK(activeDevice), - [ = ]() { - module->midiOut.setDriverId(driverId); - module->midiOut.setDeviceId(deviceId); - - module->inputQueue.setDriverId(driverId); - module->inputQueue.setDeviceId(deviceId); - module->inputQueue.setChannel(0); // TODO update - - module->refreshConfig(); - - // DEBUG("Updating Output MIDI settings - driver: %s, device: %s", - // driver->getName().c_str(), driver->getOutputDeviceName(deviceId).c_str()); - })); - } - })); - } - })); - - - menu->addChild(createIndexSubmenuItem("Select Hardware Preset", - {"Predef 1", "Predef 2", "Predef 3", "Predef 4 (VCV Mode)"}, - [ = ]() { - return -1; - }, - [ = ](int mode) { - module->setPredef(mode + 1); - module->refreshConfig(); - })); - - - menu->addChild(createIndexPtrSubmenuItem("MIDI Rate Limiting", - module->updateRateNames, - &module->updateRateIdx)); - - menu->addChild(createBoolPtrMenuItem("Set frame", "", &module->setFrame)); - - float updateRate = module->updateRates[module->updateRateIdx] / module->numActiveChannels; - menu->addChild(createMenuLabel(string::f("Per-channel MIDI rate: %.3g Hz", updateRate))); - } -}; - - -Model* modelMidiThing = createModel("MidiThingV2"); \ No newline at end of file diff --git a/src/plugin.cpp b/src/plugin.cpp index 378cbf8..475f31e 100644 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -7,7 +7,6 @@ void init(rack::Plugin *p) { pluginInstance = p; p->addModel(modelEvenVCO); - p->addModel(modelEvenVCO2); p->addModel(modelRampage); p->addModel(modelABC); p->addModel(modelSpringReverb); @@ -29,6 +28,5 @@ void init(rack::Plugin *p) { p->addModel(modelPonyVCO); p->addModel(modelMotionMTR); p->addModel(modelBurst); - p->addModel(modelMidiThing); p->addModel(modelVoltio); } diff --git a/src/plugin.hpp b/src/plugin.hpp index 8e71739..f9d86e8 100644 --- a/src/plugin.hpp +++ b/src/plugin.hpp @@ -8,7 +8,6 @@ using namespace rack; extern Plugin* pluginInstance; extern Model* modelEvenVCO; -extern Model* modelEvenVCO2; extern Model* modelRampage; extern Model* modelABC; extern Model* modelSpringReverb; @@ -30,7 +29,6 @@ extern Model* modelChannelStrip; extern Model* modelPonyVCO; extern Model* modelMotionMTR; extern Model* modelBurst; -extern Model* modelMidiThing; extern Model* modelVoltio; struct Knurlie : SvgScrew {