|
|
@@ -60,7 +60,7 @@ struct VoltageControlledOscillator { |
|
|
|
// Adjust pitch slew |
|
|
|
if (++pitchSlewIndex > 32) { |
|
|
|
const float pitchSlewTau = 100.0f; // Time constant for leaky integrator in seconds |
|
|
|
pitchSlew += (randomNormal() - pitchSlew / pitchSlewTau) * engineGetSampleTime(); |
|
|
|
pitchSlew += (random::normal() - pitchSlew / pitchSlewTau) * context()->engine->getSampleTime(); |
|
|
|
pitchSlewIndex = 0; |
|
|
|
} |
|
|
|
} |
|
|
@@ -140,7 +140,7 @@ struct VoltageControlledOscillator { |
|
|
|
|
|
|
|
// Advance phase |
|
|
|
phase += deltaPhase / OVERSAMPLE; |
|
|
|
phase = eucmod(phase, 1.0f); |
|
|
|
phase = eucMod(phase, 1.0f); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -195,7 +195,16 @@ struct VCO : Module { |
|
|
|
|
|
|
|
VoltageControlledOscillator<16, 16> oscillator; |
|
|
|
|
|
|
|
VCO() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} |
|
|
|
VCO() { |
|
|
|
setup(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); |
|
|
|
params[MODE_PARAM].setup(0.f, 1.f, 1.f); |
|
|
|
params[SYNC_PARAM].setup(0.f, 1.f, 1.f); |
|
|
|
params[FREQ_PARAM].setup(-54.0f, 54.0f, 0.0f, "Frequency", " Hz", std::pow(2, 1/12.f), 261.626f); |
|
|
|
params[FINE_PARAM].setup(-1.0f, 1.0f, 0.0f, "Fine frequency"); |
|
|
|
params[FM_PARAM].setup(0.0f, 1.0f, 0.0f, "Frequency modulation"); |
|
|
|
params[PW_PARAM].setup(0.0f, 1.0f, 0.5f, "Pulse width", "%", 0.f, 100.f); |
|
|
|
params[PWM_PARAM].setup(0.0f, 1.0f, 0.0f, "Pulse width modulation", "%", 0.f, 100.f); |
|
|
|
} |
|
|
|
void step() override; |
|
|
|
}; |
|
|
|
|
|
|
@@ -213,7 +222,7 @@ void VCO::step() { |
|
|
|
oscillator.setPulseWidth(params[PW_PARAM].value + params[PWM_PARAM].value * inputs[PW_INPUT].value / 10.0f); |
|
|
|
oscillator.syncEnabled = inputs[SYNC_INPUT].active; |
|
|
|
|
|
|
|
oscillator.process(engineGetSampleTime(), inputs[SYNC_INPUT].value); |
|
|
|
oscillator.process(context()->engine->getSampleTime(), inputs[SYNC_INPUT].value); |
|
|
|
|
|
|
|
// Set output |
|
|
|
if (outputs[SIN_OUTPUT].active) |
|
|
@@ -235,31 +244,31 @@ struct VCOWidget : ModuleWidget { |
|
|
|
}; |
|
|
|
|
|
|
|
VCOWidget::VCOWidget(VCO *module) : ModuleWidget(module) { |
|
|
|
setPanel(SVG::load(assetPlugin(plugin, "res/VCO-1.svg"))); |
|
|
|
setPanel(SVG::load(asset::plugin(plugin, "res/VCO-1.svg"))); |
|
|
|
|
|
|
|
addChild(createWidget<ScrewSilver>(Vec(15, 0))); |
|
|
|
addChild(createWidget<ScrewSilver>(Vec(box.size.x-30, 0))); |
|
|
|
addChild(createWidget<ScrewSilver>(Vec(15, 365))); |
|
|
|
addChild(createWidget<ScrewSilver>(Vec(box.size.x-30, 365))); |
|
|
|
|
|
|
|
addParam(createParam<CKSS>(Vec(15, 77), module, VCO::MODE_PARAM, 0.0f, 1.0f, 1.0f)); |
|
|
|
addParam(createParam<CKSS>(Vec(119, 77), module, VCO::SYNC_PARAM, 0.0f, 1.0f, 1.0f)); |
|
|
|
addParam(createParam<CKSS>(Vec(15, 77), module, VCO::MODE_PARAM)); |
|
|
|
addParam(createParam<CKSS>(Vec(119, 77), module, VCO::SYNC_PARAM)); |
|
|
|
|
|
|
|
addParam(createParam<RoundHugeBlackKnob>(Vec(47, 61), module, VCO::FREQ_PARAM, -54.0f, 54.0f, 0.0f)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(23, 143), module, VCO::FINE_PARAM, -1.0f, 1.0f, 0.0f)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(91, 143), module, VCO::PW_PARAM, 0.0f, 1.0f, 0.5f)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(23, 208), module, VCO::FM_PARAM, 0.0f, 1.0f, 0.0f)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(91, 208), module, VCO::PWM_PARAM, 0.0f, 1.0f, 0.0f)); |
|
|
|
addParam(createParam<RoundHugeBlackKnob>(Vec(47, 61), module, VCO::FREQ_PARAM)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(23, 143), module, VCO::FINE_PARAM)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(91, 143), module, VCO::PW_PARAM)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(23, 208), module, VCO::FM_PARAM)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(91, 208), module, VCO::PWM_PARAM)); |
|
|
|
|
|
|
|
addInput(createPort<PJ301MPort>(Vec(11, 276), PortWidget::INPUT, module, VCO::PITCH_INPUT)); |
|
|
|
addInput(createPort<PJ301MPort>(Vec(45, 276), PortWidget::INPUT, module, VCO::FM_INPUT)); |
|
|
|
addInput(createPort<PJ301MPort>(Vec(80, 276), PortWidget::INPUT, module, VCO::SYNC_INPUT)); |
|
|
|
addInput(createPort<PJ301MPort>(Vec(114, 276), PortWidget::INPUT, module, VCO::PW_INPUT)); |
|
|
|
addInput(createInput<PJ301MPort>(Vec(11, 276), module, VCO::PITCH_INPUT)); |
|
|
|
addInput(createInput<PJ301MPort>(Vec(45, 276), module, VCO::FM_INPUT)); |
|
|
|
addInput(createInput<PJ301MPort>(Vec(80, 276), module, VCO::SYNC_INPUT)); |
|
|
|
addInput(createInput<PJ301MPort>(Vec(114, 276), module, VCO::PW_INPUT)); |
|
|
|
|
|
|
|
addOutput(createPort<PJ301MPort>(Vec(11, 320), PortWidget::OUTPUT, module, VCO::SIN_OUTPUT)); |
|
|
|
addOutput(createPort<PJ301MPort>(Vec(45, 320), PortWidget::OUTPUT, module, VCO::TRI_OUTPUT)); |
|
|
|
addOutput(createPort<PJ301MPort>(Vec(80, 320), PortWidget::OUTPUT, module, VCO::SAW_OUTPUT)); |
|
|
|
addOutput(createPort<PJ301MPort>(Vec(114, 320), PortWidget::OUTPUT, module, VCO::SQR_OUTPUT)); |
|
|
|
addOutput(createOutput<PJ301MPort>(Vec(11, 320), module, VCO::SIN_OUTPUT)); |
|
|
|
addOutput(createOutput<PJ301MPort>(Vec(45, 320), module, VCO::TRI_OUTPUT)); |
|
|
|
addOutput(createOutput<PJ301MPort>(Vec(80, 320), module, VCO::SAW_OUTPUT)); |
|
|
|
addOutput(createOutput<PJ301MPort>(Vec(114, 320), module, VCO::SQR_OUTPUT)); |
|
|
|
|
|
|
|
addChild(createLight<SmallLight<GreenRedLight>>(Vec(99, 42.5f), module, VCO::PHASE_POS_LIGHT)); |
|
|
|
} |
|
|
@@ -295,7 +304,14 @@ struct VCO2 : Module { |
|
|
|
|
|
|
|
VoltageControlledOscillator<8, 8> oscillator; |
|
|
|
|
|
|
|
VCO2() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} |
|
|
|
VCO2() { |
|
|
|
setup(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); |
|
|
|
params[MODE_PARAM].setup(0.f, 1.f, 1.f); |
|
|
|
params[SYNC_PARAM].setup(0.f, 1.f, 1.f); |
|
|
|
params[FREQ_PARAM].setup(-54.0f, 54.0f, 0.0f, "Frequency", " Hz", std::pow(2, 1/12.f), 261.626f); |
|
|
|
params[WAVE_PARAM].setup(0.0f, 3.0f, 1.5f, "Wave"); |
|
|
|
params[FM_PARAM].setup(0.0f, 1.0f, 0.0f, "Frequency modulation"); |
|
|
|
} |
|
|
|
void step() override; |
|
|
|
}; |
|
|
|
|
|
|
@@ -308,7 +324,7 @@ void VCO2::step() { |
|
|
|
oscillator.setPitch(0.0f, pitchCv); |
|
|
|
oscillator.syncEnabled = inputs[SYNC_INPUT].active; |
|
|
|
|
|
|
|
oscillator.process(engineGetSampleTime(), inputs[SYNC_INPUT].value); |
|
|
|
oscillator.process(context()->engine->getSampleTime(), inputs[SYNC_INPUT].value); |
|
|
|
|
|
|
|
// Set output |
|
|
|
float wave = clamp(params[WAVE_PARAM].value + inputs[WAVE_INPUT].value, 0.0f, 3.0f); |
|
|
@@ -331,25 +347,25 @@ struct VCO2Widget : ModuleWidget { |
|
|
|
}; |
|
|
|
|
|
|
|
VCO2Widget::VCO2Widget(VCO2 *module) : ModuleWidget(module) { |
|
|
|
setPanel(SVG::load(assetPlugin(plugin, "res/VCO-2.svg"))); |
|
|
|
setPanel(SVG::load(asset::plugin(plugin, "res/VCO-2.svg"))); |
|
|
|
|
|
|
|
addChild(createWidget<ScrewSilver>(Vec(15, 0))); |
|
|
|
addChild(createWidget<ScrewSilver>(Vec(box.size.x-30, 0))); |
|
|
|
addChild(createWidget<ScrewSilver>(Vec(15, 365))); |
|
|
|
addChild(createWidget<ScrewSilver>(Vec(box.size.x-30, 365))); |
|
|
|
|
|
|
|
addParam(createParam<CKSS>(Vec(62, 150), module, VCO2::MODE_PARAM, 0.0f, 1.0f, 1.0f)); |
|
|
|
addParam(createParam<CKSS>(Vec(62, 215), module, VCO2::SYNC_PARAM, 0.0f, 1.0f, 1.0f)); |
|
|
|
addParam(createParam<CKSS>(Vec(62, 150), module, VCO2::MODE_PARAM)); |
|
|
|
addParam(createParam<CKSS>(Vec(62, 215), module, VCO2::SYNC_PARAM)); |
|
|
|
|
|
|
|
addParam(createParam<RoundHugeBlackKnob>(Vec(17, 60), module, VCO2::FREQ_PARAM, -54.0f, 54.0f, 0.0f)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(12, 143), module, VCO2::WAVE_PARAM, 0.0f, 3.0f, 1.5f)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(12, 208), module, VCO2::FM_PARAM, 0.0f, 1.0f, 0.0f)); |
|
|
|
addParam(createParam<RoundHugeBlackKnob>(Vec(17, 60), module, VCO2::FREQ_PARAM)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(12, 143), module, VCO2::WAVE_PARAM)); |
|
|
|
addParam(createParam<RoundLargeBlackKnob>(Vec(12, 208), module, VCO2::FM_PARAM)); |
|
|
|
|
|
|
|
addInput(createPort<PJ301MPort>(Vec(11, 276), PortWidget::INPUT, module, VCO2::FM_INPUT)); |
|
|
|
addInput(createPort<PJ301MPort>(Vec(54, 276), PortWidget::INPUT, module, VCO2::SYNC_INPUT)); |
|
|
|
addInput(createPort<PJ301MPort>(Vec(11, 320), PortWidget::INPUT, module, VCO2::WAVE_INPUT)); |
|
|
|
addInput(createInput<PJ301MPort>(Vec(11, 276), module, VCO2::FM_INPUT)); |
|
|
|
addInput(createInput<PJ301MPort>(Vec(54, 276), module, VCO2::SYNC_INPUT)); |
|
|
|
addInput(createInput<PJ301MPort>(Vec(11, 320), module, VCO2::WAVE_INPUT)); |
|
|
|
|
|
|
|
addOutput(createPort<PJ301MPort>(Vec(54, 320), PortWidget::OUTPUT, module, VCO2::OUT_OUTPUT)); |
|
|
|
addOutput(createOutput<PJ301MPort>(Vec(54, 320), module, VCO2::OUT_OUTPUT)); |
|
|
|
|
|
|
|
addChild(createLight<SmallLight<GreenRedLight>>(Vec(68, 42.5f), module, VCO2::PHASE_POS_LIGHT)); |
|
|
|
} |
|
|
|