@@ -16,7 +16,7 @@ struct QuestionableModule : Module {
1616 bool toggleableDescriptors = true ;
1717
1818 float sampleRateOverride = 0 ;
19- bool runHalfRate = false ;
19+ int rateDivision = 0 ;
2020 int64_t frame = 0 ;
2121
2222 std::vector<int > interpolatedOutputs;
@@ -34,18 +34,18 @@ struct QuestionableModule : Module {
3434 json_t * rootJ = json_object ();
3535 if (supportsThemes) json_object_set_new (rootJ, " theme" , json_string (theme.c_str ()));
3636 if (toggleableDescriptors) json_object_set_new (rootJ, " showDescriptors" , json_boolean (showDescriptors));
37- if (supportsSampleRateOverride) json_object_set_new (rootJ, " runHalfRate " , json_boolean (runHalfRate ));
38- return rootJ;
39- }
37+ if (supportsSampleRateOverride) json_object_set_new (rootJ, " rateDivision " , json_integer (rateDivision ));
38+ return rootJ;
39+ }
4040
4141 void dataFromJson (json_t * rootJ) override {
4242 if (supportsThemes) if (json_t * s = json_object_get (rootJ, " theme" )) theme = json_string_value (s);
4343 if (toggleableDescriptors) if (json_t * d = json_object_get (rootJ, " showDescriptors" )) showDescriptors = json_boolean_value (d);
44- if (supportsSampleRateOverride) if (json_t * hr = json_object_get (rootJ, " runHalfRate " )) runHalfRate = json_boolean_value (hr);
45- }
44+ if (supportsSampleRateOverride) if (json_t * hr = json_object_get (rootJ, " rateDivision " )) rateDivision = json_integer_value (hr);
45+ }
4646
4747 void onSampleRateChange (const SampleRateChangeEvent& e) override {
48- if (supportsSampleRateOverride && runHalfRate ) sampleRateOverride = e.sampleRate / 2 ;
48+ if (supportsSampleRateOverride && rateDivision ) sampleRateOverride = e.sampleRate / rateDivision ;
4949 }
5050
5151 void process (const ProcessArgs& args) override {
@@ -62,15 +62,14 @@ struct QuestionableModule : Module {
6262 processUndersampled (newArgs);
6363
6464 for (size_t i = 0 ; i < interpolatedOutputs.size (); i++) {
65- engine::Output out = outputs[interpolatedOutputs[i]];
66- float curVal = out.getVoltage ();
67- out.setVoltage (outputCache[i]);
65+ float curVal = outputs[interpolatedOutputs[i]].getVoltage ();
66+ outputs[interpolatedOutputs[i]].setVoltage (outputCache[i]);
6867 outputCache[i] = curVal;
6968 }
7069 } else {
71- int ticksBetweenProcess = ( int ) (args.sampleRate /sampleRateOverride);
70+ float ticksBetweenProcess = (args.sampleRate /sampleRateOverride);
7271 for (size_t i = 0 ; i < interpolatedOutputs.size (); i++) {
73- outputs[interpolatedOutputs[i]].setVoltage (lerp<float >(outputs[interpolatedOutputs[i]].getVoltage (), outputCache[i], (args. frame % ticksBetweenProcess) / ticksBetweenProcess ));
72+ outputs[interpolatedOutputs[i]].setVoltage (lerp<float >(outputs[interpolatedOutputs[i]].getVoltage (), outputCache[i], 1 / sampleRateOverride ));
7473 }
7574 }
7675
@@ -140,13 +139,17 @@ struct QuestionableWidget : ModuleWidget {
140139 QuestionableModule* mod = (QuestionableModule*)module ;
141140
142141 if (mod->supportsSampleRateOverride ) menu->addChild (rack::createSubmenuItem (" Sample Rate" , " " , [=](ui::Menu* menu) {
143- menu->addChild (createMenuItem (" Full" , mod->runHalfRate ? " " : " •" ,[=]() {
142+ menu->addChild (createMenuItem (" Full" , mod->rateDivision ? " " : " •" ,[=]() {
144143 mod->sampleRateOverride = 0 ;
145- mod->runHalfRate = false ;
144+ mod->rateDivision = 0 ;
146145 }));
147- menu->addChild (createMenuItem (" Half" , mod->runHalfRate ? " •" : " " , [=]() {
146+ menu->addChild (createMenuItem (" Half" , mod->rateDivision == 2 ? " •" : " " , [=]() {
148147 mod->sampleRateOverride = APP->engine ->getSampleRate () / 2 ;
149- mod->runHalfRate = true ;
148+ mod->rateDivision = 2 ;
149+ }));
150+ menu->addChild (createMenuItem (" Quarter" , mod->rateDivision == 4 ? " •" : " " , [=]() {
151+ mod->sampleRateOverride = APP->engine ->getSampleRate () / 4 ;
152+ mod->rateDivision = 4 ;
150153 }));
151154 }));
152155
0 commit comments