|
|
@@ -39,6 +39,7 @@ struct Braids : Module { |
|
|
|
SampleRateConverter<1> src; |
|
|
|
DoubleRingBuffer<Frame<1>, 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<BraidsSettingItem>(&MenuEntry::text, "META", &BraidsSettingItem::setting, &braids->settings.meta_modulation)); |
|
|
|
menu->pushChild(construct<BraidsSettingItem>(&MenuEntry::text, "DRFT", &BraidsSettingItem::setting, &braids->settings.vco_drift, &BraidsSettingItem::onValue, 4)); |
|
|
|
menu->pushChild(construct<BraidsSettingItem>(&MenuEntry::text, "SIGN", &BraidsSettingItem::setting, &braids->settings.signature, &BraidsSettingItem::onValue, 4)); |
|
|
|
menu->pushChild(construct<BraidsLowCpuItem>(&MenuEntry::text, "Low CPU", &BraidsLowCpuItem::braids, braids)); |
|
|
|
|
|
|
|
return menu; |
|
|
|
} |