diff --git a/src/Braids.cpp b/src/Braids.cpp
index 55e84b1..0f72d1c 100644
--- a/src/Braids.cpp
+++ b/src/Braids.cpp
@@ -39,6 +39,7 @@ struct Braids : Module {
SampleRateConverter<1> src;
DoubleRingBuffer, 256> outputBuffer;
bool lastTrig = false;
+ bool lowCpu = false;
Braids();
void step() override;
@@ -53,6 +54,10 @@ struct Braids : Module {
json_array_insert_new(settingsJ, i, settingJ);
}
json_object_set_new(rootJ, "settings", settingsJ);
+
+ json_t *lowCpuJ = json_boolean(lowCpu);
+ json_object_set_new(rootJ, "lowCpu", lowCpuJ);
+
return rootJ;
}
@@ -66,6 +71,11 @@ struct Braids : Module {
settingsArray[i] = json_integer_value(settingJ);
}
}
+
+ json_t *lowCpuJ = json_object_get(rootJ, "lowCpu");
+ if (lowCpuJ) {
+ lowCpu = json_boolean_value(lowCpuJ);
+ }
}
};
@@ -118,6 +128,8 @@ void Braids::step() {
float pitchV = inputs[PITCH_INPUT].value + params[COARSE_PARAM].value + params[FINE_PARAM].value / 12.0;
if (!settings.meta_modulation)
pitchV += fm;
+ if (lowCpu)
+ pitchV += log2f(96000.0 / engineGetSampleRate());
int32_t pitch = (pitchV * 12.0 + 60) * 128;
pitch += jitter_source.Render(settings.vco_drift);
pitch = clampi(pitch, 0, 16383);
@@ -138,17 +150,26 @@ void Braids::step() {
render_buffer[i] = stmlib::Mix(sample, warped, signature);
}
- // Sample rate convert
- Frame<1> in[24];
- for (int i = 0; i < 24; i++) {
- in[i].samples[0] = render_buffer[i] / 32768.0;
+ if (lowCpu) {
+ for (int i = 0; i < 24; i++) {
+ Frame<1> f;
+ f.samples[0] = render_buffer[i] / 32768.0;
+ outputBuffer.push(f);
+ }
}
- src.setRatio(engineGetSampleRate() / 96000.0);
+ else {
+ // Sample rate convert
+ Frame<1> in[24];
+ for (int i = 0; i < 24; i++) {
+ in[i].samples[0] = render_buffer[i] / 32768.0;
+ }
+ src.setRatio(engineGetSampleRate() / 96000.0);
- int inLen = 24;
- int outLen = outputBuffer.capacity();
- src.process(in, &inLen, outputBuffer.endData(), &outLen);
- outputBuffer.endIncr(outLen);
+ int inLen = 24;
+ int outLen = outputBuffer.capacity();
+ src.process(in, &inLen, outputBuffer.endData(), &outLen);
+ outputBuffer.endIncr(outLen);
+ }
}
// Output
@@ -302,6 +323,16 @@ struct BraidsSettingItem : MenuItem {
}
};
+struct BraidsLowCpuItem : MenuItem {
+ Braids *braids;
+ void onAction() override {
+ braids->lowCpu = !braids->lowCpu;
+ }
+ void step() override {
+ rightText = (braids->lowCpu) ? "✔" : "";
+ }
+};
+
Menu *BraidsWidget::createContextMenu() {
Menu *menu = ModuleWidget::createContextMenu();
@@ -313,6 +344,7 @@ Menu *BraidsWidget::createContextMenu() {
menu->pushChild(construct(&MenuEntry::text, "META", &BraidsSettingItem::setting, &braids->settings.meta_modulation));
menu->pushChild(construct(&MenuEntry::text, "DRFT", &BraidsSettingItem::setting, &braids->settings.vco_drift, &BraidsSettingItem::onValue, 4));
menu->pushChild(construct(&MenuEntry::text, "SIGN", &BraidsSettingItem::setting, &braids->settings.signature, &BraidsSettingItem::onValue, 4));
+ menu->pushChild(construct(&MenuEntry::text, "Low CPU", &BraidsLowCpuItem::braids, braids));
return menu;
}