|
|
@@ -107,9 +107,11 @@ struct Frames : Module { |
|
|
|
json_t *channelJ = json_array_get(channelsJ, i); |
|
|
|
if (channelJ) { |
|
|
|
json_t *curveJ = json_object_get(channelJ, "curve"); |
|
|
|
keyframer.mutable_settings(i)->easing_curve = (frames::EasingCurve) json_integer_value(curveJ); |
|
|
|
if (curveJ) |
|
|
|
keyframer.mutable_settings(i)->easing_curve = (frames::EasingCurve) json_integer_value(curveJ); |
|
|
|
json_t *responseJ = json_object_get(channelJ, "response"); |
|
|
|
keyframer.mutable_settings(i)->response = json_integer_value(responseJ); |
|
|
|
if (responseJ) |
|
|
|
keyframer.mutable_settings(i)->response = json_integer_value(responseJ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@@ -118,6 +120,10 @@ struct Frames : Module { |
|
|
|
void reset() override { |
|
|
|
poly_lfo_mode = false; |
|
|
|
keyframer.Clear(); |
|
|
|
for (int i = 0; i < 4; i++) { |
|
|
|
keyframer.mutable_settings(i)->easing_curve = frames::EASING_CURVE_LINEAR; |
|
|
|
keyframer.mutable_settings(i)->response = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
void randomize() override { |
|
|
|
// TODO |
|
|
@@ -132,9 +138,7 @@ Frames::Frames() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { |
|
|
|
memset(&poly_lfo, 0, sizeof(poly_lfo)); |
|
|
|
poly_lfo.Init(); |
|
|
|
|
|
|
|
for (int i = 0; i < 4; i++) { |
|
|
|
keyframer.mutable_settings(i)->easing_curve = frames::EASING_CURVE_LINEAR; |
|
|
|
} |
|
|
|
reset(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@@ -205,6 +209,12 @@ void Frames::step() { |
|
|
|
float lin = keyframer.level(i) / 65535.0; |
|
|
|
gains[i] = lin; |
|
|
|
} |
|
|
|
// Simulate SSM2164 |
|
|
|
if (keyframer.mutable_settings(i)->response > 0) { |
|
|
|
const float expBase = 200.0; |
|
|
|
float expGain = rescalef(powf(expBase, gains[i]), 1.0, expBase, 0.0, 1.0); |
|
|
|
gains[i] = crossf(gains[i], expGain, keyframer.mutable_settings(i)->response / 255.0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Update last controls |
|
|
@@ -353,7 +363,7 @@ struct FramesResponseItem : MenuItem { |
|
|
|
frames->keyframer.mutable_settings(channel)->response = response; |
|
|
|
} |
|
|
|
void step() override { |
|
|
|
rightText = (frames->keyframer.mutable_settings(channel)->response = response) ? "✔" : ""; |
|
|
|
rightText = (frames->keyframer.mutable_settings(channel)->response == response) ? "✔" : ""; |
|
|
|
MenuItem::step(); |
|
|
|
} |
|
|
|
}; |
|
|
@@ -376,7 +386,7 @@ struct FramesChannelSettingsItem : MenuItem { |
|
|
|
menu->pushChild(construct<MenuLabel>()); |
|
|
|
menu->pushChild(construct<MenuLabel>(&MenuEntry::text, "Response Curve")); |
|
|
|
menu->pushChild(construct<FramesResponseItem>(&MenuEntry::text, "Linear", &FramesResponseItem::frames, frames, &FramesResponseItem::channel, channel, &FramesResponseItem::response, 0)); |
|
|
|
menu->pushChild(construct<FramesResponseItem>(&MenuEntry::text, "Exponential", &FramesResponseItem::frames, frames, &FramesResponseItem::channel, channel, &FramesResponseItem::response, 1)); |
|
|
|
menu->pushChild(construct<FramesResponseItem>(&MenuEntry::text, "Exponential", &FramesResponseItem::frames, frames, &FramesResponseItem::channel, channel, &FramesResponseItem::response, 255)); |
|
|
|
|
|
|
|
return menu; |
|
|
|
} |
|
|
|