gen-rack

Create VCV Rack modules from gen~ exports
Log | Files | Refs | README | LICENSE

commit 72e72d86378a5b376e19952ef3987ec41fb80131
parent cf5c929c1ace665f06b82c24faa853c859b69c94
Author: Isabel Kaspriskie <ikaspriskie@gmail.com>
Date:   Sun,  9 May 2021 11:12:30 -0500

Set sample rate dynamically #9... also allow smaller buffer sizes

Diffstat:
Msrc/gigaverb.cpp | 13+++++++++----
Msrc/module.in | 59+++++++++++++++++++++++++++++++++++++++++++++++++----------
2 files changed, 58 insertions(+), 14 deletions(-)

diff --git a/src/gigaverb.cpp b/src/gigaverb.cpp @@ -12,8 +12,9 @@ struct Gigaverb : Module { t_sample **inputBuffers; t_sample **outputBuffers; - std::array<int, 6> validBufferSizes = { 64, 128, 256, 512, 1024, 2048 }; + std::array<int, 10> validBufferSizes = { 1, 4, 16, 32, 64, 128, 256, 512, 1024, 2048 }; int currentBufferSize = 256; + int currentSampleRate = 44100; int numParams; int numInputs; @@ -22,9 +23,7 @@ struct Gigaverb : Module { int count = 0; Gigaverb() { - // Set default sample rate of 44100 Hz and vector size 1 (VCV uses single sample processing) - // and update it later if needed - moduleState = (CommonState *)create(44100, currentBufferSize); + moduleState = (CommonState *)create(currentSampleRate, currentBufferSize); reset(moduleState); numParams = num_params(); @@ -95,11 +94,17 @@ struct Gigaverb : Module { } } currentBufferSize = bufferSize; + moduleState->vs = currentBufferSize; count = 0; } void process(const ProcessArgs& args) override { + if (args.sampleRate != currentSampleRate) { + moduleState->sr = args.sampleRate; + currentSampleRate = args.sampleRate; + } + if (count >= currentBufferSize) { count = 0; } diff --git a/src/module.in b/src/module.in @@ -1,15 +1,20 @@ #include "plugin.hpp" #include "GEN_RACK_DISPLAY_NAME.h" +#include <array> using namespace GEN_RACK_DISPLAY_NAME; + /// Processing struct GEN_RACK_NAME : Module { CommonState *moduleState; - t_sample **inputBuffers; // access like: buffer[input #][sample #] + t_sample **inputBuffers; t_sample **outputBuffers; + + std::array<int, 10> validBufferSizes = { 1, 4, 16, 32, 64, 128, 256, 512, 1024, 2048 }; int currentBufferSize = 256; + int currentSampleRate = 44100; int numParams; int numInputs; @@ -18,9 +23,7 @@ struct GEN_RACK_NAME : Module { int count = 0; GEN_RACK_NAME() { - // Set default sample rate of 44100 Hz and vector size 1 (VCV uses single sample processing) - // and update it later if needed - moduleState = (CommonState *)create(44100, currentBufferSize); + moduleState = (CommonState *)create(currentSampleRate, currentBufferSize); reset(moduleState); numParams = num_params(); @@ -74,8 +77,7 @@ struct GEN_RACK_NAME : Module { } } - - void assureBufferSize(long bufferSize) { + void setBufferSize(long bufferSize) { if (bufferSize > currentBufferSize) { for (int i = 0; i < numInputs; i++) { if (inputBuffers[i]) { @@ -90,12 +92,19 @@ struct GEN_RACK_NAME : Module { } outputBuffers[i] = new t_sample[bufferSize]; } - currentBufferSize = bufferSize; } + currentBufferSize = bufferSize; + moduleState->vs = currentBufferSize; + count = 0; } void process(const ProcessArgs& args) override { + if (args.sampleRate != currentSampleRate) { + moduleState->sr = args.sampleRate; + currentSampleRate = args.sampleRate; + } + if (count >= currentBufferSize) { count = 0; } @@ -144,6 +153,15 @@ struct GEN_RACK_NAME : Module { /// Main module UI +struct BufferSizeMenuItem : MenuItem { + GEN_RACK_NAME* module; + int bufferSize; + void onAction(const event::Action& e) override { + if (!module) return; + module->setBufferSize(bufferSize); + } +}; + struct GEN_RACK_NAMEWidget : ModuleWidget { int numParams; int numInputs; @@ -193,7 +211,7 @@ struct GEN_RACK_NAMEWidget : ModuleWidget { panel = new genrack::Panel(40, 40, 40); addChild(panel); panel->box.size = box.size; - genrack::Title *title = new genrack::Title(box.size.x / 2, top_margin, box.size.x, GEN_RACK_DISPLAY_NAME); + genrack::Title *title = new genrack::Title(box.size.x / 2, top_margin, box.size.x, "GEN_RACK_DISPLAY_NAME"); addChild(title); if (module) { @@ -243,7 +261,7 @@ struct GEN_RACK_NAMEWidget : ModuleWidget { panel->box.size = box.size; // Title text - genrack::Title *title = new genrack::Title(box.size.x / 2, top_margin, box.size.x, GEN_RACK_DISPLAY_NAME); + genrack::Title *title = new genrack::Title(box.size.x / 2, top_margin, box.size.x, "GEN_RACK_DISPLAY_NAME"); addChild(title); // Screws @@ -310,8 +328,29 @@ struct GEN_RACK_NAMEWidget : ModuleWidget { ModuleWidget::step(); } + + + void appendContextMenu(Menu* menu) override { + GEN_RACK_NAME* module = dynamic_cast<GEN_RACK_NAME*>(this->module); + + // Buffer sizes selection + menu->addChild(new MenuSeparator()); + MenuItem* bufferSizeLabel = new MenuItem; + bufferSizeLabel->disabled = true; + bufferSizeLabel->text = "Buffer size"; + menu->addChild(bufferSizeLabel); + + for (int i = 0; i < (int) module->validBufferSizes.size(); i++) { + BufferSizeMenuItem* item = new BufferSizeMenuItem; + item->module = module; + item->text = std::to_string(module->validBufferSizes[i]).c_str(); + item->rightText = CHECKMARK(module->currentBufferSize == module->validBufferSizes[i]); + item->bufferSize = module->validBufferSizes[i]; + menu->addChild(item); + } + } }; /// Register the model -Model* modelGEN_RACK_NAME = createModel<GEN_RACK_NAME, GEN_RACK_NAMEWidget>(GEN_RACK_DISPLAY_NAME); +Model* modelGEN_RACK_NAME = createModel<GEN_RACK_NAME, GEN_RACK_NAMEWidget>("GEN_RACK_DISPLAY_NAME");