From 1ab4b2cb85ea0dacb58e58c8b48f88882b49dbb4 Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Fri, 23 Feb 2018 05:13:10 -0500 Subject: [PATCH] AudioInterface rework, Notes rework, partial MIDIToCVInterface rework --- include/app.hpp | 48 +- include/audio.hpp | 1 + include/componentlibrary.hpp | 16 - include/ui.hpp | 29 +- res/Core/AudioInterface.svg | 463 ++++++++++++++++ res/Core/LICENSE.txt | 3 + res/Core/MIDIToCVInterface.svg | 505 ++++++++++++++++++ res/Core/Notes.svg | 132 +++++ .../DejaVuSans-LICENSE.txt} | 92 +++- res/{ => fonts}/DejaVuSans.ttf | Bin 741536 -> 757076 bytes res/fonts/ShareTechMono-Regular-LICENSE.txt | 93 ++++ res/fonts/ShareTechMono-Regular.ttf | Bin 0 -> 43272 bytes src/app/AddModuleWindow.cpp | 14 +- src/app/AudioWidget.cpp | 217 +++++--- src/app/LedDisplay.cpp | 102 ++++ src/app/MidiWidget.cpp | 123 ++++- src/app/ModuleWidget.cpp | 2 + src/audio.cpp | 52 +- src/core/AudioInterface.cpp | 198 +++---- src/core/MidiToCV.cpp | 114 ++-- src/core/Notes.cpp | 25 +- src/engine.cpp | 8 +- src/ui/TextField.cpp | 18 +- src/window.cpp | 2 +- 24 files changed, 1938 insertions(+), 319 deletions(-) create mode 100644 res/Core/AudioInterface.svg create mode 100644 res/Core/LICENSE.txt create mode 100644 res/Core/MIDIToCVInterface.svg create mode 100644 res/Core/Notes.svg rename res/{LICENSE-DejaVuSans.txt => fonts/DejaVuSans-LICENSE.txt} (54%) rename res/{ => fonts}/DejaVuSans.ttf (73%) create mode 100644 res/fonts/ShareTechMono-Regular-LICENSE.txt create mode 100644 res/fonts/ShareTechMono-Regular.ttf create mode 100644 src/app/LedDisplay.cpp diff --git a/include/app.hpp b/include/app.hpp index 4aa57478..b7d0b4be 100644 --- a/include/app.hpp +++ b/include/app.hpp @@ -87,7 +87,12 @@ struct ModuleWidget : OpaqueWidget { Called when the user clicks Randomize in the context menu. */ virtual void randomize(); + /** Do not subclass this to add context menu entries. Use appendContextMenu() instead */ virtual Menu *createContextMenu(); + /** Override to add context menu entries to your subclass. + It is recommended to add a blank MenuEntry first for spacing. + */ + virtual void appendContextMenu(Menu *menu) {} void draw(NVGcontext *vg) override; void drawShadow(NVGcontext *vg); @@ -320,19 +325,54 @@ struct MomentarySwitch : virtual Switch { // IO widgets //////////////////// +struct LedDisplay : Widget { + void draw(NVGcontext *vg) override; +}; + +struct LedDisplaySeparator : TransparentWidget { + LedDisplaySeparator(); + void draw(NVGcontext *vg) override; +}; + +struct LedDisplayChoice : TransparentWidget { + std::string text; + std::shared_ptr font; + NVGcolor color; + LedDisplayChoice(); + void draw(NVGcontext *vg) override; + void onMouseDown(EventMouseDown &e) override; +}; + +struct LedDisplayTextField : TextField { + std::shared_ptr font; + NVGcolor color; + LedDisplayTextField(); + void draw(NVGcontext *vg) override; + int getTextPosition(Vec mousePos) override; +}; + + struct AudioIO; struct MidiIO; -struct AudioWidget : OpaqueWidget { +struct AudioWidget : LedDisplay { /** Not owned */ AudioIO *audioIO = NULL; - void onMouseDown(EventMouseDown &e) override; + struct Internal; + Internal *internal; + AudioWidget(); + ~AudioWidget(); + void step() override; }; -struct MidiWidget : OpaqueWidget { +struct MidiWidget : LedDisplay { /** Not owned */ MidiIO *midiIO = NULL; - void onMouseDown(EventMouseDown &e) override; + struct Internal; + Internal *internal; + MidiWidget(); + ~MidiWidget(); + void step() override; }; //////////////////// diff --git a/include/audio.hpp b/include/audio.hpp index daf8f833..7c677d0b 100644 --- a/include/audio.hpp +++ b/include/audio.hpp @@ -23,6 +23,7 @@ struct AudioIO { int numOutputs = 0; int numInputs = 0; RtAudio *rtAudio = NULL; + RtAudio::DeviceInfo deviceInfo; AudioIO(); virtual ~AudioIO(); diff --git a/include/componentlibrary.hpp b/include/componentlibrary.hpp index c5de23e7..7f6a8fca 100644 --- a/include/componentlibrary.hpp +++ b/include/componentlibrary.hpp @@ -338,22 +338,6 @@ struct BefacoSlidePot : SVGFader { } }; -//////////////////// -// IO widgets -//////////////////// - -struct USB_B_AudioWidget : AudioWidget, SVGWidget { - USB_B_AudioWidget() { - setSVG(SVG::load(assetGlobal("res/ComponentLibrary/USB-B.svg"))); - } -}; - -struct MIDI_DIN_MidiWidget : MidiWidget, SVGWidget { - MIDI_DIN_MidiWidget() { - setSVG(SVG::load(assetGlobal("res/ComponentLibrary/MIDI_DIN.svg"))); - } -}; - //////////////////// // Jacks //////////////////// diff --git a/include/ui.hpp b/include/ui.hpp index 4d74b7d8..c62818af 100644 --- a/include/ui.hpp +++ b/include/ui.hpp @@ -44,24 +44,46 @@ struct Menu : OpaqueWidget { }; struct MenuEntry : OpaqueWidget { - std::string text; MenuEntry() { box.size = Vec(0, BND_WIDGET_HEIGHT); } + + template + static T *create() { + T *o = Widget::create(Vec()); + return o; + } }; struct MenuLabel : MenuEntry { + std::string text; void draw(NVGcontext *vg) override; void step() override; + + template + static T *create(std::string text) { + T *o = MenuEntry::create(); + o->text = text; + return o; + } }; struct MenuItem : MenuEntry { + std::string text; std::string rightText; void draw(NVGcontext *vg) override; void step() override; virtual Menu *createChildMenu() {return NULL;} void onMouseEnter(EventMouseEnter &e) override; void onDragDrop(EventDragDrop &e) override; + + template + static T *create(std::string text, std::string rightText = "") { + T *o = MenuEntry::create(); + o->text = text; + o->rightText = rightText; + return o; + } }; struct WindowOverlay : OpaqueWidget { @@ -153,16 +175,19 @@ struct TextField : OpaqueWidget { bool multiline = false; int begin = 0; int end = 0; + int dragPos = 0; TextField() { box.size.y = BND_WIDGET_HEIGHT; } void draw(NVGcontext *vg) override; void onMouseDown(EventMouseDown &e) override; + void onMouseMove(EventMouseMove &e) override; void onFocus(EventFocus &e) override; void onText(EventText &e) override; void onKey(EventKey &e) override; void insertText(std::string newText); + virtual int getTextPosition(Vec mousePos); virtual void onTextChange() {} }; @@ -170,7 +195,7 @@ struct PasswordField : TextField { void draw(NVGcontext *vg) override; }; -struct ProgressBar : TransparentWidget, QuantityWidget { +struct ProgressBar : QuantityWidget { ProgressBar() { box.size.y = BND_WIDGET_HEIGHT; } diff --git a/res/Core/AudioInterface.svg b/res/Core/AudioInterface.svg new file mode 100644 index 00000000..175ba6ac --- /dev/null +++ b/res/Core/AudioInterface.svg @@ -0,0 +1,463 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/Core/LICENSE.txt b/res/Core/LICENSE.txt new file mode 100644 index 00000000..10b99ce4 --- /dev/null +++ b/res/Core/LICENSE.txt @@ -0,0 +1,3 @@ +Core panel and VCV logo design © 2018 by Grayscale + +Derivative works may not use Core panel and VCV logo design. diff --git a/res/Core/MIDIToCVInterface.svg b/res/Core/MIDIToCVInterface.svg new file mode 100644 index 00000000..12c206ca --- /dev/null +++ b/res/Core/MIDIToCVInterface.svg @@ -0,0 +1,505 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/Core/Notes.svg b/res/Core/Notes.svg new file mode 100644 index 00000000..e1676db5 --- /dev/null +++ b/res/Core/Notes.svg @@ -0,0 +1,132 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/res/LICENSE-DejaVuSans.txt b/res/fonts/DejaVuSans-LICENSE.txt similarity index 54% rename from res/LICENSE-DejaVuSans.txt rename to res/fonts/DejaVuSans-LICENSE.txt index 254e2cc4..df52c170 100644 --- a/res/LICENSE-DejaVuSans.txt +++ b/res/fonts/DejaVuSans-LICENSE.txt @@ -1,6 +1,7 @@ Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + Bitstream Vera Fonts Copyright ------------------------------ @@ -46,7 +47,7 @@ Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot -org. +org. Arev Fonts Copyright ------------------------------ @@ -96,4 +97,91 @@ dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. -$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ +TeX Gyre DJV Math +----------------- +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. + +Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski +(on behalf of TeX users groups) are in public domain. + +Letters imported from Euler Fraktur from AMSfonts are (c) American +Mathematical Society (see below). +Bitstream Vera Fonts Copyright +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera +is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license (“Fonts”) and associated +documentation +files (the “Font Software”), to reproduce and distribute the Font Software, +including without limitation the rights to use, copy, merge, publish, +distribute, +and/or sell copies of the Font Software, and to permit persons to whom +the Font Software is furnished to do so, subject to the following +conditions: + +The above copyright and trademark notices and this permission notice +shall be +included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional +glyphs or characters may be added to the Fonts, only if the fonts are +renamed +to names not containing either the words “Bitstream” or the word “Vera”. + +This License becomes null and void to the extent applicable to Fonts or +Font Software +that has been modified and is distributed under the “Bitstream Vera” +names. + +The Font Software may be sold as part of a larger software package but +no copy +of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN +ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR +INABILITY TO USE +THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. +Except as contained in this notice, the names of GNOME, the GNOME +Foundation, +and Bitstream Inc., shall not be used in advertising or otherwise to promote +the sale, use or other dealings in this Font Software without prior written +authorization from the GNOME Foundation or Bitstream Inc., respectively. +For further information, contact: fonts at gnome dot org. + +AMSFonts (v. 2.2) copyright + +The PostScript Type 1 implementation of the AMSFonts produced by and +previously distributed by Blue Sky Research and Y&Y, Inc. are now freely +available for general use. This has been accomplished through the +cooperation +of a consortium of scientific publishers with Blue Sky Research and Y&Y. +Members of this consortium include: + +Elsevier Science IBM Corporation Society for Industrial and Applied +Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS) + +In order to assure the authenticity of these fonts, copyright will be +held by +the American Mathematical Society. This is not meant to restrict in any way +the legitimate use of the fonts, such as (but not limited to) electronic +distribution of documents containing these fonts, inclusion of these fonts +into other public domain or commercial font collections or computer +applications, use of the outline data to create derivative fonts and/or +faces, etc. However, the AMS does require that the AMS copyright notice be +removed from any derivative versions of the fonts which have been altered in +any way. In addition, to ensure the fidelity of TeX documents using Computer +Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces, +has requested that any alterations which yield different font metrics be +given a different name. + +$Id$ diff --git a/res/DejaVuSans.ttf b/res/fonts/DejaVuSans.ttf similarity index 73% rename from res/DejaVuSans.ttf rename to res/fonts/DejaVuSans.ttf index 9d40c325694b3bfb8cdd4c0146ad44379d5c4ade..e5f7eecce43be41ff0703ed99e1553029b849f14 100644 GIT binary patch delta 109100 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�<74;UZbt<$S3!avh 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 delta 95713 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
    h-yF5UG71b?Fw^3m4gqh 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 literal 0 HcmV?d00001 diff --git a/src/app/AddModuleWindow.cpp b/src/app/AddModuleWindow.cpp index 8e6fd377..f80a4c73 100644 --- a/src/app/AddModuleWindow.cpp +++ b/src/app/AddModuleWindow.cpp @@ -55,7 +55,7 @@ struct MetadataMenu : ListMenu { // Tag list if (!model->tags.empty()) { for (ModelTag tag : model->tags) { - addChild(construct(&MenuEntry::text, gTagNames[tag])); + addChild(construct(&MenuLabel::text, gTagNames[tag])); } addChild(construct()); } @@ -66,17 +66,17 @@ struct MetadataMenu : ListMenu { pluginName += " v"; pluginName += model->plugin->version; } - addChild(construct(&MenuEntry::text, pluginName)); + addChild(construct(&MenuLabel::text, pluginName)); // Plugin metadata if (!model->plugin->website.empty()) { - addChild(construct(&MenuEntry::text, "Website", &UrlItem::url, model->plugin->website)); + addChild(construct(&MenuItem::text, "Website", &UrlItem::url, model->plugin->website)); } if (!model->plugin->manual.empty()) { - addChild(construct(&MenuEntry::text, "Manual", &UrlItem::url, model->plugin->manual)); + addChild(construct(&MenuItem::text, "Manual", &UrlItem::url, model->plugin->manual)); } if (!model->plugin->path.empty()) { - addChild(construct(&MenuEntry::text, "Browse directory", &UrlItem::url, model->plugin->path)); + addChild(construct(&MenuItem::text, "Browse directory", &UrlItem::url, model->plugin->path)); } } } @@ -137,7 +137,7 @@ struct ModelMenu : ListMenu { for (Plugin *plugin : gPlugins) { for (Model *model : plugin->models) { if (model->manufacturer == manufacturer) { - addChild(construct(&MenuEntry::text, model->name, &ModelItem::model, model)); + addChild(construct(&MenuItem::text, model->name, &ModelItem::model, model)); } } } @@ -190,7 +190,7 @@ struct ManufacturerMenu : ListMenu { } // Add menu item for each manufacturer name for (std::string manufacturer : manufacturers) { - addChild(construct(&MenuEntry::text, manufacturer)); + addChild(construct(&MenuItem::text, manufacturer)); } } diff --git a/src/app/AudioWidget.cpp b/src/app/AudioWidget.cpp index bd73f662..0b0aedf3 100644 --- a/src/app/AudioWidget.cpp +++ b/src/app/AudioWidget.cpp @@ -13,6 +13,25 @@ struct AudioDriverItem : MenuItem { } }; +struct AudioDriverChoice : LedDisplayChoice { + AudioWidget *audioWidget; + void onAction(EventAction &e) override { + Menu *menu = gScene->createMenu(); + menu->addChild(construct(&MenuLabel::text, "Audio driver")); + for (int driver : audioWidget->audioIO->listDrivers()) { + AudioDriverItem *item = new AudioDriverItem(); + item->audioIO = audioWidget->audioIO; + item->driver = driver; + item->text = audioWidget->audioIO->getDriverName(driver); + item->rightText = CHECKMARK(item->driver == audioWidget->audioIO->driver); + menu->addChild(item); + } + } + void step() override { + text = audioWidget->audioIO->getDriverName(audioWidget->audioIO->driver); + } +}; + struct AudioDeviceItem : MenuItem { AudioIO *audioIO; @@ -23,6 +42,42 @@ struct AudioDeviceItem : MenuItem { } }; +struct AudioDeviceChoice : LedDisplayChoice { + AudioWidget *audioWidget; + void onAction(EventAction &e) override { + Menu *menu = gScene->createMenu(); + menu->addChild(construct(&MenuLabel::text, "Audio device")); + int deviceCount = audioWidget->audioIO->getDeviceCount(); + { + AudioDeviceItem *item = new AudioDeviceItem(); + item->audioIO = audioWidget->audioIO; + item->device = -1; + item->text = "(No device)"; + item->rightText = CHECKMARK(item->device == audioWidget->audioIO->device); + menu->addChild(item); + } + for (int device = 0; device < deviceCount; device++) { + AudioDeviceItem *item = new AudioDeviceItem(); + item->audioIO = audioWidget->audioIO; + item->device = device; + item->text = audioWidget->audioIO->getDeviceDetail(device); + item->rightText = CHECKMARK(item->device == audioWidget->audioIO->device); + menu->addChild(item); + } + } + void step() override { + text = audioWidget->audioIO->getDeviceDetail(audioWidget->audioIO->device); + if (text.empty()) { + text = "(No device)"; + color.a = 0.5f; + } + else { + color.a = 1.f; + } + text = ellipsize(text, 18); + } +}; + struct AudioSampleRateItem : MenuItem { AudioIO *audioIO; @@ -33,6 +88,25 @@ struct AudioSampleRateItem : MenuItem { } }; +struct AudioSampleRateChoice : LedDisplayChoice { + AudioWidget *audioWidget; + void onAction(EventAction &e) override { + Menu *menu = gScene->createMenu(); + menu->addChild(construct(&MenuLabel::text, "Sample rate")); + for (int sampleRate : audioWidget->audioIO->listSampleRates()) { + AudioSampleRateItem *item = new AudioSampleRateItem(); + item->audioIO = audioWidget->audioIO; + item->sampleRate = sampleRate; + item->text = stringf("%d Hz", sampleRate); + item->rightText = CHECKMARK(item->sampleRate == audioWidget->audioIO->sampleRate); + menu->addChild(item); + } + } + void step() override { + text = stringf("%g kHz", audioWidget->audioIO->sampleRate / 1000.f); + } +}; + struct AudioBlockSizeItem : MenuItem { AudioIO *audioIO; @@ -43,72 +117,91 @@ struct AudioBlockSizeItem : MenuItem { } }; +struct AudioBlockSizeChoice : LedDisplayChoice { + AudioWidget *audioWidget; + void onAction(EventAction &e) override { + Menu *menu = gScene->createMenu(); + menu->addChild(construct(&MenuLabel::text, "Block size")); + std::vector blockSizes = {64, 128, 256, 512, 1024, 2048, 4096}; + for (int blockSize : blockSizes) { + AudioBlockSizeItem *item = new AudioBlockSizeItem(); + item->audioIO = audioWidget->audioIO; + item->blockSize = blockSize; + float latency = (float) blockSize / audioWidget->audioIO->sampleRate * 1000.0; + item->text = stringf("%d (%.1f ms)", blockSize, latency); + item->rightText = CHECKMARK(item->blockSize == audioWidget->audioIO->blockSize); + menu->addChild(item); + } + } + void step() override { + text = stringf("%d", audioWidget->audioIO->blockSize); + } +}; + -void AudioWidget::onMouseDown(EventMouseDown &e) { - OpaqueWidget::onMouseDown(e); +struct AudioWidget::Internal { + LedDisplayChoice *driverChoice; + LedDisplaySeparator *driverSeparator; + LedDisplayChoice *deviceChoice; + LedDisplaySeparator *deviceSeparator; + LedDisplayChoice *sampleRateChoice; + LedDisplaySeparator *sampleRateSeparator; + LedDisplayChoice *bufferSizeChoice; +}; - if (!audioIO) - return; +AudioWidget::AudioWidget() { + internal = new Internal(); + box.size = mm2px(Vec(44, 28)); - Menu *menu = gScene->createMenu(); + Vec pos = Vec(); - // Audio driver - menu->addChild(construct(&MenuLabel::text, "Audio driver")); - for (int driver : audioIO->listDrivers()) { - AudioDriverItem *item = new AudioDriverItem(); - item->audioIO = audioIO; - item->driver = driver; - item->text = audioIO->getDriverName(driver); - item->rightText = CHECKMARK(item->driver == audioIO->driver); - menu->addChild(item); - } - menu->addChild(construct()); - - // Audio device - menu->addChild(construct(&MenuLabel::text, "Audio device")); - int deviceCount = audioIO->getDeviceCount(); - { - AudioDeviceItem *item = new AudioDeviceItem(); - item->audioIO = audioIO; - item->device = -1; - item->text = "No device"; - item->rightText = CHECKMARK(item->device == audioIO->device); - menu->addChild(item); - } - for (int device = 0; device < deviceCount; device++) { - AudioDeviceItem *item = new AudioDeviceItem(); - item->audioIO = audioIO; - item->device = device; - item->text = audioIO->getDeviceDetail(device); - item->rightText = CHECKMARK(item->device == audioIO->device); - menu->addChild(item); - } - menu->addChild(construct()); - - // Sample rate - menu->addChild(construct(&MenuLabel::text, "Sample rate")); - for (int sampleRate : audioIO->listSampleRates()) { - AudioSampleRateItem *item = new AudioSampleRateItem(); - item->audioIO = audioIO; - item->sampleRate = sampleRate; - item->text = stringf("%d Hz", sampleRate); - item->rightText = CHECKMARK(item->sampleRate == audioIO->sampleRate); - menu->addChild(item); - } - menu->addChild(construct()); - - // Block size - menu->addChild(construct(&MenuLabel::text, "Block size")); - std::vector blockSizes = {64, 128, 256, 512, 1024, 2048, 4096}; - for (int blockSize : blockSizes) { - AudioBlockSizeItem *item = new AudioBlockSizeItem(); - item->audioIO = audioIO; - item->blockSize = blockSize; - float latency = (float) blockSize / audioIO->sampleRate * 1000.0; - item->text = stringf("%d (%.1f ms)", blockSize, latency); - item->rightText = CHECKMARK(item->blockSize == audioIO->blockSize); - menu->addChild(item); - } + AudioDriverChoice *driverChoice = Widget::create(pos); + driverChoice->audioWidget = this; + addChild(driverChoice); + pos = driverChoice->box.getBottomLeft(); + internal->driverChoice = driverChoice; + + internal->driverSeparator = Widget::create(pos); + addChild(internal->driverSeparator); + + AudioDeviceChoice *deviceChoice = Widget::create(pos); + deviceChoice->audioWidget = this; + addChild(deviceChoice); + pos = deviceChoice->box.getBottomLeft(); + internal->deviceChoice = deviceChoice; + + internal->deviceSeparator = Widget::create(pos); + addChild(internal->deviceSeparator); + + AudioSampleRateChoice *sampleRateChoice = Widget::create(pos); + sampleRateChoice->audioWidget = this; + addChild(sampleRateChoice); + internal->sampleRateChoice = sampleRateChoice; + + internal->sampleRateSeparator = Widget::create(pos); + internal->sampleRateSeparator->box.size.y = internal->sampleRateChoice->box.size.y; + addChild(internal->sampleRateSeparator); + + AudioBlockSizeChoice *bufferSizeChoice = Widget::create(pos); + bufferSizeChoice->audioWidget = this; + addChild(bufferSizeChoice); + internal->bufferSizeChoice = bufferSizeChoice; +} + +AudioWidget::~AudioWidget() { + delete internal; +} + +void AudioWidget::step() { + internal->driverChoice->box.size.x = box.size.x; + internal->driverSeparator->box.size.x = box.size.x; + internal->deviceChoice->box.size.x = box.size.x; + internal->deviceSeparator->box.size.x = box.size.x; + internal->sampleRateChoice->box.size.x = box.size.x / 2; + internal->sampleRateSeparator->box.pos.x = box.size.x / 2; + internal->bufferSizeChoice->box.pos.x = box.size.x / 2; + internal->bufferSizeChoice->box.size.x = box.size.x / 2; + LedDisplay::step(); } diff --git a/src/app/LedDisplay.cpp b/src/app/LedDisplay.cpp new file mode 100644 index 00000000..0305b3da --- /dev/null +++ b/src/app/LedDisplay.cpp @@ -0,0 +1,102 @@ +#include "app.hpp" +#include "asset.hpp" +#include "window.hpp" + + +namespace rack { + + +void LedDisplay::draw(NVGcontext *vg) { + nvgBeginPath(vg); + nvgRoundedRect(vg, 0, 0, box.size.x, box.size.y, 5.0); + nvgFillColor(vg, nvgRGB(0x00, 0x00, 0x00)); + nvgFill(vg); + + Widget::draw(vg); +} + + +LedDisplaySeparator::LedDisplaySeparator() { + box.size = Vec(); +} + +void LedDisplaySeparator::draw(NVGcontext *vg) { + nvgBeginPath(vg); + nvgMoveTo(vg, 0, 0); + nvgLineTo(vg, box.size.x, box.size.y); + nvgStrokeWidth(vg, 1.0); + nvgStrokeColor(vg, nvgRGB(0x33, 0x33, 0x33)); + nvgStroke(vg); +} + + +LedDisplayChoice::LedDisplayChoice() { + box.size = mm2px(Vec(0, 28.0 / 3)); + font = Font::load(assetGlobal("res/fonts/ShareTechMono-Regular.ttf")); + color = nvgRGB(0xff, 0xd7, 0x14); +} + +void LedDisplayChoice::draw(NVGcontext *vg) { + if (font->handle < 0) + return; + + nvgFillColor(vg, color); + nvgFontFaceId(vg, font->handle); + nvgTextLetterSpacing(vg, 0.0); + + Vec textPos = Vec(10, 18); + nvgFontSize(vg, 12); + nvgText(vg, textPos.x, textPos.y, text.c_str(), NULL); +} + +void LedDisplayChoice::onMouseDown(EventMouseDown &e) { + if (e.button == 1) { + EventAction eAction; + onAction(eAction); + e.consumed = true; + e.target = this; + } +} + + +LedDisplayTextField::LedDisplayTextField() { + font = Font::load(assetGlobal("res/fonts/ShareTechMono-Regular.ttf")); + color = nvgRGB(0xff, 0xd7, 0x14); +} + +static const Vec textFieldPos = Vec(5, 5); + +void LedDisplayTextField::draw(NVGcontext *vg) { + // Background + nvgBeginPath(vg); + nvgRoundedRect(vg, 0, 0, box.size.x, box.size.y, 5.0); + nvgFillColor(vg, nvgRGB(0x00, 0x00, 0x00)); + nvgFill(vg); + + // Text + if (font->handle < 0) + return; + + bndSetFont(font->handle); + + NVGcolor highlightColor = color; + highlightColor.a = 0.5; + int cend = (this == gFocusedWidget) ? end : -1; + bndIconLabelCaret(vg, textFieldPos.x, textFieldPos.y, + box.size.x - 2*textFieldPos.x, box.size.y - 2*textFieldPos.y, + -1, color, 12, text.c_str(), highlightColor, begin, cend); + + bndSetFont(gGuiFont->handle); +} + +int LedDisplayTextField::getTextPosition(Vec mousePos) { + bndSetFont(font->handle); + int textPos = bndIconLabelTextPosition(gVg, textFieldPos.x, textFieldPos.y, + box.size.x - 2*textFieldPos.x, box.size.y - 2*textFieldPos.y, + -1, 12, text.c_str(), mousePos.x, mousePos.y); + bndSetFont(gGuiFont->handle); + return textPos; +} + + +} // namespace rack diff --git a/src/app/MidiWidget.cpp b/src/app/MidiWidget.cpp index b3826c3c..2de8c063 100644 --- a/src/app/MidiWidget.cpp +++ b/src/app/MidiWidget.cpp @@ -5,27 +5,141 @@ namespace rack { +struct MidiDriverItem : MenuItem { + MidiIO *midiIO; + int driver; + void onAction(EventAction &e) override { + // midiIO->openDriver(device); + } +}; + +struct MidiDriverChoice : LedDisplayChoice { + MidiWidget *midiWidget; + void onAction(EventAction &e) override { + // Menu *menu = gScene->createMenu(); + // menu->addChild(construct(&MenuLabel::text, "Audio driver")); + // for (int driver : audioWidget->audioIO->listDrivers()) { + // AudioDriverItem *item = new AudioDriverItem(); + // item->audioIO = audioWidget->audioIO; + // item->driver = driver; + // item->text = audioWidget->audioIO->getDriverName(driver); + // item->rightText = CHECKMARK(item->driver == audioWidget->audioIO->driver); + // menu->addChild(item); + // } + } + void step() override { + // text = audioWidget->audioIO->getDriverName(audioWidget->audioIO->driver); + } +}; + struct MidiDeviceItem : MenuItem { MidiIO *midiIO; int device; void onAction(EventAction &e) override { - midiIO->openDevice(device); + // midiIO->openDevice(device); } }; +struct MidiDeviceChoice : LedDisplayChoice { + MidiWidget *midiWidget; + void onAction(EventAction &e) override { + // Menu *menu = gScene->createMenu(); + // menu->addChild(construct(&MenuLabel::text, "Audio driver")); + // for (int driver : audioWidget->audioIO->listDrivers()) { + // AudioDriverItem *item = new AudioDriverItem(); + // item->audioIO = audioWidget->audioIO; + // item->driver = driver; + // item->text = audioWidget->audioIO->getDriverName(driver); + // item->rightText = CHECKMARK(item->driver == audioWidget->audioIO->driver); + // menu->addChild(item); + // } + } + void step() override { + // text = audioWidget->audioIO->getDriverName(audioWidget->audioIO->driver); + } +}; struct MidiChannelItem : MenuItem { MidiIO *midiIO; int channel; void onAction(EventAction &e) override { - midiIO->channel = channel; + // midiIO->channel = channel; + } +}; + +struct MidiChannelChoice : LedDisplayChoice { + MidiWidget *midiWidget; + void onAction(EventAction &e) override { + // Menu *menu = gScene->createMenu(); + // menu->addChild(construct(&MenuLabel::text, "Audio driver")); + // for (int driver : audioWidget->audioIO->listDrivers()) { + // AudioDriverItem *item = new AudioDriverItem(); + // item->audioIO = audioWidget->audioIO; + // item->driver = driver; + // item->text = audioWidget->audioIO->getDriverName(driver); + // item->rightText = CHECKMARK(item->driver == audioWidget->audioIO->driver); + // menu->addChild(item); + // } } + void step() override { + // text = audioWidget->audioIO->getDriverName(audioWidget->audioIO->driver); + } +}; + + +struct MidiWidget::Internal { + LedDisplayChoice *driverChoice; + LedDisplaySeparator *driverSeparator; + LedDisplayChoice *deviceChoice; + LedDisplaySeparator *deviceSeparator; + LedDisplayChoice *channelChoice; }; +MidiWidget::MidiWidget() { + internal = new Internal(); + box.size = mm2px(Vec(44, 28)); + + Vec pos = Vec(); + + MidiDriverChoice *driverChoice = Widget::create(pos); + driverChoice->midiWidget = this; + addChild(driverChoice); + pos = driverChoice->box.getBottomLeft(); + internal->driverChoice = driverChoice; -void MidiWidget::onMouseDown(EventMouseDown &e) { - OpaqueWidget::onMouseDown(e); + internal->driverSeparator = Widget::create(pos); + addChild(internal->driverSeparator); + + MidiDeviceChoice *deviceChoice = Widget::create(pos); + deviceChoice->midiWidget = this; + addChild(deviceChoice); + pos = deviceChoice->box.getBottomLeft(); + internal->deviceChoice = deviceChoice; + + internal->deviceSeparator = Widget::create(pos); + addChild(internal->deviceSeparator); + + MidiChannelChoice *channelChoice = Widget::create(pos); + channelChoice->midiWidget = this; + addChild(channelChoice); + internal->channelChoice = channelChoice; +} + +MidiWidget::~MidiWidget() { + delete internal; +} + +void MidiWidget::step() { + internal->driverChoice->box.size.x = box.size.x; + internal->driverSeparator->box.size.x = box.size.x; + internal->deviceChoice->box.size.x = box.size.x; + internal->deviceSeparator->box.size.x = box.size.x; + internal->channelChoice->box.size.x = box.size.x; + LedDisplay::step(); +} +/* +void MidiWidget::onAction(EventAction &e) { if (!midiIO) return; @@ -69,6 +183,7 @@ void MidiWidget::onMouseDown(EventMouseDown &e) { menu->addChild(item); } } +*/ } // namespace rack diff --git a/src/app/ModuleWidget.cpp b/src/app/ModuleWidget.cpp index da9a080d..3af3a989 100644 --- a/src/app/ModuleWidget.cpp +++ b/src/app/ModuleWidget.cpp @@ -346,6 +346,8 @@ Menu *ModuleWidget::createContextMenu() { deleteItem->moduleWidget = this; menu->addChild(deleteItem); + appendContextMenu(menu); + return menu; } diff --git a/src/audio.cpp b/src/audio.cpp index 06e5741c..2d1477c3 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -2,7 +2,8 @@ #include "audio.hpp" -#define DRIVER_BRIDGE -1 +#define BRIDGE_DRIVER -1 +#define BRIDGE_CHANNELS 16 namespace rack { @@ -23,7 +24,7 @@ std::vector AudioIO::listDrivers() { for (RtAudio::Api api : apis) drivers.push_back((int) api); // Add Bridge fake driver - // drivers.push_back(DRIVER_BRIDGE); + drivers.push_back(BRIDGE_DRIVER); return drivers; } @@ -39,7 +40,7 @@ std::string AudioIO::getDriverName(int driver) { case RtAudio::WINDOWS_ASIO: return "ASIO"; case RtAudio::WINDOWS_DS: return "DirectSound"; case RtAudio::RTAUDIO_DUMMY: return "Dummy"; - case DRIVER_BRIDGE: return "VCV Bridge"; + case BRIDGE_DRIVER: return "Bridge"; default: return "Unknown"; } } @@ -58,9 +59,9 @@ void AudioIO::setDriver(int driver) { rtAudio = new RtAudio((RtAudio::Api) driver); this->driver = (int) rtAudio->getCurrentApi(); } - else if (driver == DRIVER_BRIDGE) { + else if (driver == BRIDGE_DRIVER) { // TODO Connect to Bridge - this->driver = DRIVER_BRIDGE; + this->driver = BRIDGE_DRIVER; } } @@ -68,40 +69,56 @@ int AudioIO::getDeviceCount() { if (rtAudio) { return rtAudio->getDeviceCount(); } - if (driver == DRIVER_BRIDGE) { - return 16; + if (driver == BRIDGE_DRIVER) { + return BRIDGE_CHANNELS; } return 0; } std::string AudioIO::getDeviceName(int device) { + if (device < 0) + return ""; + if (rtAudio) { try { - RtAudio::DeviceInfo deviceInfo = rtAudio->getDeviceInfo(device); + RtAudio::DeviceInfo deviceInfo; + if (device == this->device) + deviceInfo = this->deviceInfo; + else + deviceInfo = rtAudio->getDeviceInfo(device); return deviceInfo.name; } catch (RtAudioError &e) { warn("Failed to query RtAudio device: %s", e.what()); } } - if (driver == DRIVER_BRIDGE) { - return stringf("%d", device + 1); + if (driver == BRIDGE_DRIVER) { + if (device >= 0) + return stringf("%d", device + 1); } return ""; } std::string AudioIO::getDeviceDetail(int device) { + if (device < 0) + return ""; + if (rtAudio) { try { - RtAudio::DeviceInfo deviceInfo = rtAudio->getDeviceInfo(device); + RtAudio::DeviceInfo deviceInfo; + if (device == this->device) + deviceInfo = this->deviceInfo; + else + deviceInfo = rtAudio->getDeviceInfo(device); return stringf("%s (%d in, %d out)", deviceInfo.name.c_str(), deviceInfo.inputChannels, deviceInfo.outputChannels); } catch (RtAudioError &e) { warn("Failed to query RtAudio device: %s", e.what()); } } - if (driver == DRIVER_BRIDGE) { - return stringf("Channel %d", device + 1); + if (driver == BRIDGE_DRIVER) { + if (device >= 0) + return stringf("Channel %d", device + 1); } return ""; } @@ -123,7 +140,6 @@ void AudioIO::openStream() { if (rtAudio) { // Open new device - RtAudio::DeviceInfo deviceInfo; try { deviceInfo = rtAudio->getDeviceInfo(device); } @@ -184,6 +200,11 @@ void AudioIO::openStream() { this->device = device; onOpenStream(); } + if (driver == BRIDGE_DRIVER) { + if (device < BRIDGE_CHANNELS) { + this->device = device; + } + } } void AudioIO::closeStream() { @@ -206,6 +227,7 @@ void AudioIO::closeStream() { warn("Failed to close RtAudio stream %s", e.what()); } } + deviceInfo = RtAudio::DeviceInfo(); } // Reset rtAudio settings @@ -234,7 +256,7 @@ std::vector AudioIO::listSampleRates() { warn("Failed to query RtAudio device: %s", e.what()); } } - if (driver == DRIVER_BRIDGE) { + if (driver == BRIDGE_DRIVER) { return {44100, 48000, 88200, 96000, 176400, 192000}; } diff --git a/src/core/AudioInterface.cpp b/src/core/AudioInterface.cpp index c9c66ac8..861b3f8c 100644 --- a/src/core/AudioInterface.cpp +++ b/src/core/AudioInterface.cpp @@ -15,8 +15,8 @@ #pragma GCC diagnostic pop -#define MAX_OUTPUTS 8 -#define MAX_INPUTS 8 +#define OUTPUTS 8 +#define INPUTS 8 static const auto audioTimeout = std::chrono::milliseconds(100); @@ -30,13 +30,13 @@ struct AudioInterfaceIO : AudioIO { std::mutex audioMutex; std::condition_variable audioCv; // Audio thread produces, engine thread consumes - DoubleRingBuffer, (1<<15)> inputBuffer; + DoubleRingBuffer, (1<<15)> inputBuffer; // Audio thread consumes, engine thread produces - DoubleRingBuffer, (1<<15)> outputBuffer; + DoubleRingBuffer, (1<<15)> outputBuffer; AudioInterfaceIO() { - maxOutputs = MAX_OUTPUTS; - maxInputs = MAX_INPUTS; + maxOutputs = OUTPUTS; + maxInputs = INPUTS; } ~AudioInterfaceIO() { @@ -49,7 +49,7 @@ struct AudioInterfaceIO : AudioIO { for (int i = 0; i < length; i++) { if (inputBuffer.full()) break; - Frame f; + Frame f; memset(&f, 0, sizeof(f)); memcpy(&f, &input[numInputs * i], numInputs * sizeof(float)); inputBuffer.push(f); @@ -64,7 +64,7 @@ struct AudioInterfaceIO : AudioIO { if (audioCv.wait_for(lock, audioTimeout, cond)) { // Consume audio block for (int i = 0; i < length; i++) { - Frame f = outputBuffer.shift(); + Frame f = outputBuffer.shift(); memcpy(&output[numOutputs * i], &f, numOutputs * sizeof(float)); } } @@ -90,27 +90,28 @@ struct AudioInterface : Module { NUM_PARAMS }; enum InputIds { - ENUMS(AUDIO_INPUT, MAX_INPUTS), + ENUMS(AUDIO_INPUT, INPUTS), NUM_INPUTS }; enum OutputIds { - ENUMS(AUDIO_OUTPUT, MAX_OUTPUTS), + ENUMS(AUDIO_OUTPUT, OUTPUTS), NUM_OUTPUTS }; enum LightIds { - ACTIVE_LIGHT, + ENUMS(INPUT_LIGHT, INPUTS), + ENUMS(OUTPUT_LIGHT, OUTPUTS), NUM_LIGHTS }; AudioInterfaceIO audioIO; int lastSampleRate = 0; - SampleRateConverter inputSrc; - SampleRateConverter outputSrc; + SampleRateConverter inputSrc; + SampleRateConverter outputSrc; // in rack's sample rate - DoubleRingBuffer, 16> inputBuffer; - DoubleRingBuffer, 16> outputBuffer; + DoubleRingBuffer, 16> inputBuffer; + DoubleRingBuffer, 16> outputBuffer; AudioInterface() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { onSampleRateChange(); @@ -130,10 +131,10 @@ struct AudioInterface : Module { } void onSampleRateChange() override { - // for (int i = 0; i < MAX_INPUTS; i++) { + // for (int i = 0; i < INPUTS; i++) { // inputSrc[i].setRates(audioIO.sampleRate, engineGetSampleRate()); // } - // for (int i = 0; i < MAX_OUTPUTS; i++) { + // for (int i = 0; i < OUTPUTS; i++) { // outputSrc[i].setRates(engineGetSampleRate(), audioIO.sampleRate); // } inputSrc.setRates(audioIO.sampleRate, engineGetSampleRate()); @@ -147,7 +148,7 @@ struct AudioInterface : Module { void AudioInterface::step() { - Frame inputFrame; + Frame inputFrame; memset(&inputFrame, 0, sizeof(inputFrame)); // Update sample rate if changed by audio driver @@ -169,14 +170,14 @@ void AudioInterface::step() { if (!inputBuffer.empty()) { inputFrame = inputBuffer.shift(); } - for (int i = 0; i < MAX_INPUTS; i++) { + for (int i = 0; i < INPUTS; i++) { outputs[AUDIO_OUTPUT + i].value = 10.0 * inputFrame.samples[i]; } if (audioIO.numOutputs > 0) { // Get and push output SRC frame if (!outputBuffer.full()) { - Frame f; + Frame f; for (int i = 0; i < audioIO.numOutputs; i++) { f.samples[i] = inputs[AUDIO_INPUT + i].value / 10.0; } @@ -203,109 +204,72 @@ void AudioInterface::step() { } } - audioIO.audioCv.notify_all(); + for (int i = 0; i < INPUTS; i++) + lights[INPUT_LIGHT + i].value = (audioIO.numInputs > i); + for (int i = 0; i < OUTPUTS; i++) + lights[OUTPUT_LIGHT + i].value = (audioIO.numOutputs > i); - // Lights - lights[ACTIVE_LIGHT].value = audioIO.isActive() ? 1.0 : 0.0; + audioIO.audioCv.notify_all(); } struct AudioInterfaceWidget : ModuleWidget { - AudioInterfaceWidget(AudioInterface *module) : ModuleWidget(module) { - box.size = Vec(15*12, 380); - { - Panel *panel = new LightPanel(); - panel->box.size = box.size; - addChild(panel); - } - - addChild(Widget::create(Vec(15, 0))); - addChild(Widget::create(Vec(box.size.x-30, 0))); - addChild(Widget::create(Vec(15, 365))); - addChild(Widget::create(Vec(box.size.x-30, 365))); - - Vec margin = Vec(5, 2); - float labelHeight = 15; - float yPos = margin.y + 100; - float xPos; - - { - Label *label = new Label(); - label->box.pos = Vec(margin.x, yPos); - label->text = "Outputs (DACs)"; - addChild(label); - yPos += labelHeight + margin.y; - } - - yPos += 5; - xPos = 10; - for (int i = 0; i < 4; i++) { - addInput(Port::create(Vec(xPos, yPos), Port::INPUT, module, AudioInterface::AUDIO_INPUT + i)); - Label *label = new Label(); - label->box.pos = Vec(xPos + 4, yPos + 28); - label->text = stringf("%d", i + 1); - addChild(label); - - xPos += 37 + margin.x; - } - yPos += 35 + margin.y; - - yPos += 5; - xPos = 10; - for (int i = 4; i < 8; i++) { - addInput(Port::create(Vec(xPos, yPos), Port::INPUT, module, AudioInterface::AUDIO_INPUT + i)); - Label *label = new Label(); - label->box.pos = Vec(xPos + 4, yPos + 28); - label->text = stringf("%d", i + 1); - addChild(label); - - xPos += 37 + margin.x; - } - yPos += 35 + margin.y; - - { - Label *label = new Label(); - label->box.pos = Vec(margin.x, yPos); - label->text = "Inputs (ADCs)"; - addChild(label); - yPos += labelHeight + margin.y; - } - - yPos += 5; - xPos = 10; - for (int i = 0; i < 4; i++) { - Port *port = Port::create(Vec(xPos, yPos), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + i); - addOutput(port); - Label *label = new Label(); - label->box.pos = Vec(xPos + 4, yPos + 28); - label->text = stringf("%d", i + 1); - addChild(label); - - xPos += 37 + margin.x; - } - yPos += 35 + margin.y; - - yPos += 5; - xPos = 10; - for (int i = 4; i < 8; i++) { - addOutput(Port::create(Vec(xPos, yPos), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + i)); - Label *label = new Label(); - label->box.pos = Vec(xPos + 4, yPos + 28); - label->text = stringf("%d", i + 1); - addChild(label); - - xPos += 37 + margin.x; - } - yPos += 35 + margin.y; + AudioInterfaceWidget(AudioInterface *module); +}; - AudioWidget *audioWidget = construct(); - audioWidget->audioIO = &module->audioIO; - addChild(audioWidget); - // Lights - addChild(ModuleLightWidget::create>(Vec(40, 20), module, AudioInterface::ACTIVE_LIGHT)); - } -}; +AudioInterfaceWidget::AudioInterfaceWidget(AudioInterface *module) : ModuleWidget(module) { + setPanel(SVG::load(assetGlobal("res/Core/AudioInterface.svg"))); + + addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0))); + addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); + addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + + addInput(Port::create(mm2px(Vec(3.89433, 55.5308)), Port::INPUT, module, AudioInterface::AUDIO_INPUT + 0)); + addInput(Port::create(mm2px(Vec(15.4947, 55.5308)), Port::INPUT, module, AudioInterface::AUDIO_INPUT + 1)); + addInput(Port::create(mm2px(Vec(27.095, 55.5308)), Port::INPUT, module, AudioInterface::AUDIO_INPUT + 2)); + addInput(Port::create(mm2px(Vec(38.6953, 55.5308)), Port::INPUT, module, AudioInterface::AUDIO_INPUT + 3)); + addInput(Port::create(mm2px(Vec(3.89433, 70.1449)), Port::INPUT, module, AudioInterface::AUDIO_INPUT + 4)); + addInput(Port::create(mm2px(Vec(15.4947, 70.1449)), Port::INPUT, module, AudioInterface::AUDIO_INPUT + 5)); + addInput(Port::create(mm2px(Vec(27.095, 70.1449)), Port::INPUT, module, AudioInterface::AUDIO_INPUT + 6)); + addInput(Port::create(mm2px(Vec(38.6953, 70.1449)), Port::INPUT, module, AudioInterface::AUDIO_INPUT + 7)); + + addOutput(Port::create(mm2px(Vec(3.89295, 92.1439)), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + 0)); + addOutput(Port::create(mm2px(Vec(15.4933, 92.1439)), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + 1)); + addOutput(Port::create(mm2px(Vec(27.0936, 92.1439)), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + 2)); + addOutput(Port::create(mm2px(Vec(38.6939, 92.1439)), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + 3)); + addOutput(Port::create(mm2px(Vec(3.89433, 108.144)), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + 4)); + addOutput(Port::create(mm2px(Vec(15.4947, 108.144)), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + 5)); + addOutput(Port::create(mm2px(Vec(27.095, 108.144)), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + 6)); + addOutput(Port::create(mm2px(Vec(38.6953, 108.144)), Port::OUTPUT, module, AudioInterface::AUDIO_OUTPUT + 7)); + + Vec lightOffset = mm2px(Vec(7.21812, -0.1833)); + + addChild(ModuleLightWidget::create>(mm2px(Vec(3.89433, 55.5308)).plus(lightOffset), module, AudioInterface::INPUT_LIGHT + 0)); + addChild(ModuleLightWidget::create>(mm2px(Vec(15.4947, 55.5308)).plus(lightOffset), module, AudioInterface::INPUT_LIGHT + 1)); + addChild(ModuleLightWidget::create>(mm2px(Vec(27.095, 55.5308)).plus(lightOffset), module, AudioInterface::INPUT_LIGHT + 2)); + addChild(ModuleLightWidget::create>(mm2px(Vec(38.6953, 55.5308)).plus(lightOffset), module, AudioInterface::INPUT_LIGHT + 3)); + addChild(ModuleLightWidget::create>(mm2px(Vec(3.89433, 70.1449)).plus(lightOffset), module, AudioInterface::INPUT_LIGHT + 4)); + addChild(ModuleLightWidget::create>(mm2px(Vec(15.4947, 70.1449)).plus(lightOffset), module, AudioInterface::INPUT_LIGHT + 5)); + addChild(ModuleLightWidget::create>(mm2px(Vec(27.095, 70.1449)).plus(lightOffset), module, AudioInterface::INPUT_LIGHT + 6)); + addChild(ModuleLightWidget::create>(mm2px(Vec(38.6953, 70.1449)).plus(lightOffset), module, AudioInterface::INPUT_LIGHT + 7)); + + addChild(ModuleLightWidget::create>(mm2px(Vec(3.89295, 92.1439)).plus(lightOffset), module, AudioInterface::OUTPUT_LIGHT + 0)); + addChild(ModuleLightWidget::create>(mm2px(Vec(15.4933, 92.1439)).plus(lightOffset), module, AudioInterface::OUTPUT_LIGHT + 1)); + addChild(ModuleLightWidget::create>(mm2px(Vec(27.0936, 92.1439)).plus(lightOffset), module, AudioInterface::OUTPUT_LIGHT + 2)); + addChild(ModuleLightWidget::create>(mm2px(Vec(38.6939, 92.1439)).plus(lightOffset), module, AudioInterface::OUTPUT_LIGHT + 3)); + addChild(ModuleLightWidget::create>(mm2px(Vec(3.89433, 108.144)).plus(lightOffset), module, AudioInterface::OUTPUT_LIGHT + 4)); + addChild(ModuleLightWidget::create>(mm2px(Vec(15.4947, 108.144)).plus(lightOffset), module, AudioInterface::OUTPUT_LIGHT + 5)); + addChild(ModuleLightWidget::create>(mm2px(Vec(27.095, 108.144)).plus(lightOffset), module, AudioInterface::OUTPUT_LIGHT + 6)); + addChild(ModuleLightWidget::create>(mm2px(Vec(38.6953, 108.144)).plus(lightOffset), module, AudioInterface::OUTPUT_LIGHT + 7)); + + + AudioWidget *audioWidget = Widget::create(mm2px(Vec(3.401, 14.8373))); + audioWidget->box.size = mm2px(Vec(44, 28)); + audioWidget->audioIO = &module->audioIO; + addChild(audioWidget); +} -Model *modelAudioInterface = Model::create("Core", "AudioInterface", "Audio Interface", EXTERNAL_TAG); \ No newline at end of file +Model *modelAudioInterface = Model::create("Core", "AudioInterface", "Audio", EXTERNAL_TAG); \ No newline at end of file diff --git a/src/core/MidiToCV.cpp b/src/core/MidiToCV.cpp index 598fdb18..bdfed3fe 100644 --- a/src/core/MidiToCV.cpp +++ b/src/core/MidiToCV.cpp @@ -6,7 +6,7 @@ /* - * MidiToCvInterface converts midi note on/off events, velocity , channel aftertouch, pitch wheel and mod wheel to + * MIDIToCVInterface converts midi note on/off events, velocity , channel aftertouch, pitch wheel and mod wheel to * CV */ struct MidiValue { @@ -16,29 +16,34 @@ struct MidiValue { }; -struct MidiToCvInterface : Module { +struct MIDIToCVInterface : Module { enum ParamIds { - RESET_PARAM, NUM_PARAMS }; enum InputIds { NUM_INPUTS }; enum OutputIds { - PITCH_OUTPUT = 0, + CV_OUTPUT, GATE_OUTPUT, VELOCITY_OUTPUT, MOD_OUTPUT, - PITCHWHEEL_OUTPUT, - CHANNEL_AFTERTOUCH_OUTPUT, + PITCH_OUTPUT, + AFTERTOUCH_OUTPUT, + START_OUTPUT, + STOP_OUTPUT, + CONTINUE_OUTPUT, + CLOCK_OUTPUT, + CLOCK_2_OUTPUT, + CLOCK_HALF_OUTPUT, NUM_OUTPUTS }; enum LightIds { - ACTIVE_LIGHT, - RESET_LIGHT, NUM_LIGHTS }; + MidiInput midiIO; + MidiInputQueue midiInput; std::list notes; bool pedal = false; @@ -51,12 +56,12 @@ struct MidiToCvInterface : Module { SchmittTrigger resetTrigger; - MidiToCvInterface() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { + MIDIToCVInterface() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { pitchWheel.val = 64; // pitchWheel.tSmooth.set(0, 0); } - ~MidiToCvInterface() { + ~MIDIToCVInterface() { }; void step() override; @@ -85,7 +90,7 @@ struct MidiToCvInterface : Module { }; /* -void MidiToCvInterface::resetMidi() { +void MIDIToCVInterface::resetMidi() { mod.val = 0; mod.tSmooth.set(0, 0); pitchWheel.val = 64; @@ -98,7 +103,7 @@ void MidiToCvInterface::resetMidi() { } */ -void MidiToCvInterface::step() { +void MIDIToCVInterface::step() { /* if (isPortOpen()) { std::vector message; @@ -138,12 +143,9 @@ void MidiToCvInterface::step() { outputs[CHANNEL_AFTERTOUCH_OUTPUT].value = afterTouch.val / 127.0 * 10.0; */ - - // Lights - lights[ACTIVE_LIGHT].value = midiInput.isActive() ? 1.0 : 0.0; } -void MidiToCvInterface::pressNote(int note) { +void MIDIToCVInterface::pressNote(int note) { // Remove existing similar note auto it = std::find(notes.begin(), notes.end(), note); if (it != notes.end()) @@ -154,7 +156,7 @@ void MidiToCvInterface::pressNote(int note) { gate = true; } -void MidiToCvInterface::releaseNote(int note) { +void MIDIToCVInterface::releaseNote(int note) { // Remove the note auto it = std::find(notes.begin(), notes.end(), note); if (it != notes.end()) @@ -174,7 +176,7 @@ void MidiToCvInterface::releaseNote(int note) { } } -void MidiToCvInterface::processMidi(std::vector msg) { +void MIDIToCVInterface::processMidi(std::vector msg) { /* int channel = msg[0] & 0xf; int status = (msg[0] >> 4) & 0xf; @@ -229,58 +231,34 @@ void MidiToCvInterface::processMidi(std::vector msg) { } -struct MidiToCvInterfaceWidget : ModuleWidget { - MidiToCvInterfaceWidget(MidiToCvInterface *module) : ModuleWidget(module) { - box.size = Vec(15 * 9, 380); - - { - Panel *panel = new LightPanel(); - panel->box.size = box.size; - addChild(panel); - } - - float margin = 5; - float labelHeight = 15; - float yPos = margin; - float yGap = 35; - - addChild(Widget::create(Vec(15, 0))); - addChild(Widget::create(Vec(box.size.x - 30, 0))); - addChild(Widget::create(Vec(15, 365))); - addChild(Widget::create(Vec(box.size.x - 30, 365))); - - { - Label *label = new Label(); - label->box.pos = Vec(box.size.x - margin - 7 * 15, margin); - label->text = "MIDI to CV"; - addChild(label); - yPos = labelHeight * 2; - } - - addParam(ParamWidget::create(Vec(7 * 15, labelHeight), module, MidiToCvInterface::RESET_PARAM, 0.0, 1.0, 0.0)); - addChild(ModuleLightWidget::create>(Vec(7 * 15 + 5, labelHeight + 5), module, MidiToCvInterface::RESET_LIGHT)); - - std::string labels[MidiToCvInterface::NUM_OUTPUTS] = {"1V/oct", "Gate", "Velocity", "Mod Wheel", "Pitch Wheel", "Aftertouch"}; - - for (int i = 0; i < MidiToCvInterface::NUM_OUTPUTS; i++) { - Label *label = new Label(); - label->box.pos = Vec(margin, yPos); - label->text = labels[i]; - addChild(label); - - addOutput(Port::create(Vec(15 * 6, yPos - 5), Port::OUTPUT, module, i)); - - yPos += yGap + margin; - } - - MidiWidget *midiWidget = construct(); - midiWidget->midiIO = &module->midiInput; +struct MIDIToCVInterfaceWidget : ModuleWidget { + MIDIToCVInterfaceWidget(MIDIToCVInterface *module) : ModuleWidget(module) { + setPanel(SVG::load(assetGlobal("res/Core/MIDIToCVInterface.svg"))); + + addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0))); + addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); + addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + + addOutput(Port::create(mm2px(Vec(4.61505, 60.1445)), Port::OUTPUT, module, MIDIToCVInterface::CV_OUTPUT)); + addOutput(Port::create(mm2px(Vec(16.214, 60.1445)), Port::OUTPUT, module, MIDIToCVInterface::GATE_OUTPUT)); + addOutput(Port::create(mm2px(Vec(27.8143, 60.1445)), Port::OUTPUT, module, MIDIToCVInterface::VELOCITY_OUTPUT)); + addOutput(Port::create(mm2px(Vec(4.61505, 76.1449)), Port::OUTPUT, module, MIDIToCVInterface::MOD_OUTPUT)); + addOutput(Port::create(mm2px(Vec(16.214, 76.1449)), Port::OUTPUT, module, MIDIToCVInterface::PITCH_OUTPUT)); + addOutput(Port::create(mm2px(Vec(27.8143, 76.1449)), Port::OUTPUT, module, MIDIToCVInterface::AFTERTOUCH_OUTPUT)); + addOutput(Port::create(mm2px(Vec(4.61505, 92.1439)), Port::OUTPUT, module, MIDIToCVInterface::START_OUTPUT)); + addOutput(Port::create(mm2px(Vec(16.214, 92.1439)), Port::OUTPUT, module, MIDIToCVInterface::STOP_OUTPUT)); + addOutput(Port::create(mm2px(Vec(27.8143, 92.1439)), Port::OUTPUT, module, MIDIToCVInterface::CONTINUE_OUTPUT)); + addOutput(Port::create(mm2px(Vec(4.61505, 108.144)), Port::OUTPUT, module, MIDIToCVInterface::CLOCK_OUTPUT)); + addOutput(Port::create(mm2px(Vec(16.214, 108.144)), Port::OUTPUT, module, MIDIToCVInterface::CLOCK_2_OUTPUT)); + addOutput(Port::create(mm2px(Vec(27.8143, 108.144)), Port::OUTPUT, module, MIDIToCVInterface::CLOCK_HALF_OUTPUT)); + + MidiWidget *midiWidget = Widget::create(mm2px(Vec(3.41891, 14.8373))); + midiWidget->box.size = mm2px(Vec(33.840, 28)); + midiWidget->midiIO = &module->midiIO; addChild(midiWidget); - - // Lights - addChild(ModuleLightWidget::create>(Vec(40, 20), module, MidiToCvInterface::ACTIVE_LIGHT)); } }; -Model *modelMidiToCvInterface = Model::create("Core", "MIDIToCVInterface", "MIDI-to-CV Interface", MIDI_TAG, EXTERNAL_TAG); +Model *modelMidiToCvInterface = Model::create("Core", "MIDIToCVInterface", "MIDI-1", MIDI_TAG, EXTERNAL_TAG); diff --git a/src/core/Notes.cpp b/src/core/Notes.cpp index dfe5c611..a113f265 100644 --- a/src/core/Notes.cpp +++ b/src/core/Notes.cpp @@ -8,22 +8,15 @@ struct NotesWidget : ModuleWidget { TextField *textField; NotesWidget(Module *module) : ModuleWidget(module) { - box.size = Vec(RACK_GRID_WIDTH * 18, RACK_GRID_HEIGHT); - - { - Panel *panel = new LightPanel(); - panel->box.size = box.size; - addChild(panel); - } - - addChild(Widget::create(Vec(15, 0))); - addChild(Widget::create(Vec(15, 365))); - addChild(Widget::create(Vec(box.size.x - 30, 0))); - addChild(Widget::create(Vec(box.size.x - 30, 365))); - - textField = new TextField(); - textField->box.pos = Vec(15, 15); - textField->box.size = box.size.minus(Vec(30, 30)); + setPanel(SVG::load(assetGlobal("res/Core/Notes.svg"))); + + addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0))); + addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); + addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + + textField = Widget::create(mm2px(Vec(3.39962, 14.8373))); + textField->box.size = mm2px(Vec(74.480, 102.753)); textField->multiline = true; addChild(textField); } diff --git a/src/engine.cpp b/src/engine.cpp index 151ad926..9976373d 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -72,15 +72,15 @@ static void engineStep() { if (smoothModule) { float value = smoothModule->params[smoothParamId].value; const float lambda = 60.0; // decay rate is 1 graphics frame - const float snap = 0.0001; float delta = smoothValue - value; - if (fabsf(delta) < snap) { + float newValue = value + delta * lambda * sampleTime; + if (value == newValue) { + // Snap to actual smooth value if the value doesn't change enough (due to the granularity of floats) smoothModule->params[smoothParamId].value = smoothValue; smoothModule = NULL; } else { - value += delta * lambda * sampleTime; - smoothModule->params[smoothParamId].value = value; + smoothModule->params[smoothParamId].value = newValue; } } diff --git a/src/ui/TextField.cpp b/src/ui/TextField.cpp index f093ac1e..cf17fcea 100644 --- a/src/ui/TextField.cpp +++ b/src/ui/TextField.cpp @@ -25,10 +25,22 @@ void TextField::draw(NVGcontext *vg) { } void TextField::onMouseDown(EventMouseDown &e) { - end = begin = bndTextFieldTextPosition(gVg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str(), e.pos.x, e.pos.y); + dragPos = getTextPosition(e.pos); + begin = end = dragPos; OpaqueWidget::onMouseDown(e); } +void TextField::onMouseMove(EventMouseMove &e) { + if (this == gDraggedWidget) { + int pos = getTextPosition(e.pos); + if (pos != dragPos) { + begin = min(dragPos, pos); + end = max(dragPos, pos); + } + } + OpaqueWidget::onMouseMove(e); +} + void TextField::onFocus(EventFocus &e) { begin = 0; end = text.size(); @@ -131,5 +143,9 @@ void TextField::insertText(std::string newText) { onTextChange(); } +int TextField::getTextPosition(Vec mousePos) { + return bndTextFieldTextPosition(gVg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str(), mousePos.x, mousePos.y); +} + } // namespace rack diff --git a/src/window.cpp b/src/window.cpp index f65c00a0..f600a29d 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -382,7 +382,7 @@ void windowInit() { assert(gFramebufferVg); // Set up Blendish - gGuiFont = Font::load(assetGlobal("res/DejaVuSans.ttf")); + gGuiFont = Font::load(assetGlobal("res/fonts/DejaVuSans.ttf")); bndSetFont(gGuiFont->handle); // bndSetIconImage(loadImage(assetGlobal("res/icons.png")));