| @@ -107,9 +107,11 @@ struct Frames : Module { | |||||
| json_t *channelJ = json_array_get(channelsJ, i); | json_t *channelJ = json_array_get(channelsJ, i); | ||||
| if (channelJ) { | if (channelJ) { | ||||
| json_t *curveJ = json_object_get(channelJ, "curve"); | 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"); | 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 { | void reset() override { | ||||
| poly_lfo_mode = false; | poly_lfo_mode = false; | ||||
| keyframer.Clear(); | 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 { | void randomize() override { | ||||
| // TODO | // TODO | ||||
| @@ -132,9 +138,7 @@ Frames::Frames() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { | |||||
| memset(&poly_lfo, 0, sizeof(poly_lfo)); | memset(&poly_lfo, 0, sizeof(poly_lfo)); | ||||
| poly_lfo.Init(); | 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; | float lin = keyframer.level(i) / 65535.0; | ||||
| gains[i] = lin; | 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 | // Update last controls | ||||
| @@ -353,7 +363,7 @@ struct FramesResponseItem : MenuItem { | |||||
| frames->keyframer.mutable_settings(channel)->response = response; | frames->keyframer.mutable_settings(channel)->response = response; | ||||
| } | } | ||||
| void step() override { | void step() override { | ||||
| rightText = (frames->keyframer.mutable_settings(channel)->response = response) ? "✔" : ""; | |||||
| rightText = (frames->keyframer.mutable_settings(channel)->response == response) ? "✔" : ""; | |||||
| MenuItem::step(); | MenuItem::step(); | ||||
| } | } | ||||
| }; | }; | ||||
| @@ -376,7 +386,7 @@ struct FramesChannelSettingsItem : MenuItem { | |||||
| menu->pushChild(construct<MenuLabel>()); | menu->pushChild(construct<MenuLabel>()); | ||||
| menu->pushChild(construct<MenuLabel>(&MenuEntry::text, "Response Curve")); | 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, "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; | return menu; | ||||
| } | } | ||||