|
|
@@ -46,10 +46,13 @@ struct Frames : Module { |
|
|
|
frames::Keyframer keyframer; |
|
|
|
frames::PolyLfo poly_lfo; |
|
|
|
bool poly_lfo_mode = false; |
|
|
|
bool sequencer_mode = false; |
|
|
|
uint16_t lastControls[4] = {}; |
|
|
|
uint8_t sequencer_step = 0; |
|
|
|
|
|
|
|
SchmittTrigger addTrigger; |
|
|
|
SchmittTrigger delTrigger; |
|
|
|
SchmittTrigger stepTrigger; |
|
|
|
|
|
|
|
Frames(); |
|
|
|
void step() override; |
|
|
@@ -57,6 +60,7 @@ struct Frames : Module { |
|
|
|
json_t *toJson() override { |
|
|
|
json_t *rootJ = json_object(); |
|
|
|
json_object_set_new(rootJ, "polyLfo", json_boolean(poly_lfo_mode)); |
|
|
|
json_object_set_new(rootJ, "seqMode", json_boolean(sequencer_mode)); |
|
|
|
|
|
|
|
json_t *keyframesJ = json_array(); |
|
|
|
for (int i = 0; i < keyframer.num_keyframes(); i++) { |
|
|
@@ -87,6 +91,10 @@ struct Frames : Module { |
|
|
|
if (polyLfoJ) |
|
|
|
poly_lfo_mode = json_boolean_value(polyLfoJ); |
|
|
|
|
|
|
|
json_t *seqModeJ = json_object_get(rootJ, "seqMode"); |
|
|
|
if (seqModeJ) |
|
|
|
sequencer_mode = json_boolean_value(seqModeJ); |
|
|
|
|
|
|
|
json_t *keyframesJ = json_object_get(rootJ, "keyframes"); |
|
|
|
if (keyframesJ) { |
|
|
|
json_t *keyframeJ; |
|
|
@@ -195,6 +203,16 @@ void Frames::step() { |
|
|
|
keyframer.RemoveKeyframe(nearestTimestamp); |
|
|
|
} |
|
|
|
} |
|
|
|
if (sequencer_mode) { |
|
|
|
if (stepTrigger.process(rescale(inputs[FRAME_INPUT].value * params[MODULATION_PARAM].value, 0.1f, 2.f, 0.f, 1.f))) { |
|
|
|
++sequencer_step; |
|
|
|
} |
|
|
|
if (sequencer_step >= keyframer.num_keyframes()) |
|
|
|
sequencer_step = 0; |
|
|
|
|
|
|
|
timestampMod = keyframer.keyframe(sequencer_step).timestamp; |
|
|
|
} |
|
|
|
|
|
|
|
keyframer.Evaluate(timestampMod); |
|
|
|
} |
|
|
|
|
|
|
@@ -402,6 +420,8 @@ struct FramesWidget : ModuleWidget { |
|
|
|
bool poly_lfo_mode; |
|
|
|
void onAction(EventAction &e) override { |
|
|
|
frames->poly_lfo_mode = poly_lfo_mode; |
|
|
|
if (frames->poly_lfo_mode) |
|
|
|
frames->sequencer_mode = false; |
|
|
|
} |
|
|
|
void step() override { |
|
|
|
rightText = (frames->poly_lfo_mode == poly_lfo_mode) ? "✔" : ""; |
|
|
@@ -409,6 +429,20 @@ struct FramesWidget : ModuleWidget { |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
struct FramesSeqModeItem : MenuItem { |
|
|
|
Frames *frames; |
|
|
|
bool sequencer_mode; |
|
|
|
void onAction(EventAction &e) override { |
|
|
|
frames->sequencer_mode = !frames->sequencer_mode; |
|
|
|
if (frames->sequencer_mode) |
|
|
|
frames->poly_lfo_mode = false; |
|
|
|
} |
|
|
|
void step() override { |
|
|
|
rightText = frames->sequencer_mode ? "✔" : ""; |
|
|
|
MenuItem::step(); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
menu->addChild(construct<MenuLabel>()); |
|
|
|
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Channel Settings")); |
|
|
|
for (int i = 0; i < 4; i++) { |
|
|
@@ -420,6 +454,7 @@ struct FramesWidget : ModuleWidget { |
|
|
|
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Mode")); |
|
|
|
menu->addChild(construct<FramesModeItem>(&MenuItem::text, "Keyframer", &FramesModeItem::frames, frames, &FramesModeItem::poly_lfo_mode, false)); |
|
|
|
menu->addChild(construct<FramesModeItem>(&MenuItem::text, "Poly LFO", &FramesModeItem::frames, frames, &FramesModeItem::poly_lfo_mode, true)); |
|
|
|
menu->addChild(construct<FramesSeqModeItem>(&MenuItem::text, "Sequencer", &FramesSeqModeItem::frames, frames)); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|