|  |  | @@ -348,54 +348,43 @@ struct FramesWidget : ModuleWidget { | 
		
	
		
			
			|  |  |  | Frames* module = dynamic_cast<Frames*>(this->module); | 
		
	
		
			
			|  |  |  | assert(module); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | struct FramesChannelSettingsItem : MenuItem { | 
		
	
		
			
			|  |  |  | Frames* module; | 
		
	
		
			
			|  |  |  | uint8_t channel; | 
		
	
		
			
			|  |  |  | Menu* createChildMenu() override { | 
		
	
		
			
			|  |  |  | Menu* menu = new Menu(); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | menu->addChild(createMenuLabel("Interpolation curve")); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static const std::vector<std::string> curveLabels = { | 
		
	
		
			
			|  |  |  | "Step", | 
		
	
		
			
			|  |  |  | "Linear", | 
		
	
		
			
			|  |  |  | "Accelerating", | 
		
	
		
			
			|  |  |  | "Decelerating", | 
		
	
		
			
			|  |  |  | "Departure/arrival", | 
		
	
		
			
			|  |  |  | "Bouncing", | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | for (int i = 0; i < (int) curveLabels.size(); i++) { | 
		
	
		
			
			|  |  |  | menu->addChild(createCheckMenuItem(curveLabels[i], | 
		
	
		
			
			|  |  |  | [=]() {return module->keyframer.mutable_settings(channel)->easing_curve == i;}, | 
		
	
		
			
			|  |  |  | [=]() {module->keyframer.mutable_settings(channel)->easing_curve = (frames::EasingCurve) i;} | 
		
	
		
			
			|  |  |  | )); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | menu->addChild(new MenuSeparator); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | menu->addChild(createMenuLabel("Response curve")); | 
		
	
		
			
			|  |  |  | menu->addChild(new MenuSeparator); | 
		
	
		
			
			|  |  |  | menu->addChild(createMenuLabel("Channel settings")); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | menu->addChild(createCheckMenuItem("Linear", | 
		
	
		
			
			|  |  |  | [=]() {return module->keyframer.mutable_settings(channel)->response == 0;}, | 
		
	
		
			
			|  |  |  | [=]() {module->keyframer.mutable_settings(channel)->response = 0;} | 
		
	
		
			
			|  |  |  | )); | 
		
	
		
			
			|  |  |  | menu->addChild(createCheckMenuItem("Exponential", | 
		
	
		
			
			|  |  |  | [=]() {return module->keyframer.mutable_settings(channel)->response == 255;}, | 
		
	
		
			
			|  |  |  | [=]() {module->keyframer.mutable_settings(channel)->response = 255;} | 
		
	
		
			
			|  |  |  | )); | 
		
	
		
			
			|  |  |  | for (int c = 0; c < 4; c++) { | 
		
	
		
			
			|  |  |  | menu->addChild(createSubmenuItem(string::f("Channel %d", c + 1), | 
		
	
		
			
			|  |  |  | [=](Menu* menu) { | 
		
	
		
			
			|  |  |  | menu->addChild(createMenuLabel("Interpolation curve")); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static const std::vector<std::string> curveLabels = { | 
		
	
		
			
			|  |  |  | "Step", | 
		
	
		
			
			|  |  |  | "Linear", | 
		
	
		
			
			|  |  |  | "Accelerating", | 
		
	
		
			
			|  |  |  | "Decelerating", | 
		
	
		
			
			|  |  |  | "Departure/arrival", | 
		
	
		
			
			|  |  |  | "Bouncing", | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | for (int i = 0; i < (int) curveLabels.size(); i++) { | 
		
	
		
			
			|  |  |  | menu->addChild(createCheckMenuItem(curveLabels[i], | 
		
	
		
			
			|  |  |  | [=]() {return module->keyframer.mutable_settings(c)->easing_curve == i;}, | 
		
	
		
			
			|  |  |  | [=]() {module->keyframer.mutable_settings(c)->easing_curve = (frames::EasingCurve) i;} | 
		
	
		
			
			|  |  |  | )); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return menu; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | menu->addChild(new MenuSeparator); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | menu->addChild(new MenuSeparator); | 
		
	
		
			
			|  |  |  | menu->addChild(createMenuLabel("Channel settings")); | 
		
	
		
			
			|  |  |  | menu->addChild(createMenuLabel("Response curve")); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (int i = 0; i < 4; i++) { | 
		
	
		
			
			|  |  |  | FramesChannelSettingsItem* item = createMenuItem<FramesChannelSettingsItem>(string::f("Channel %d", i + 1)); | 
		
	
		
			
			|  |  |  | item->module = module; | 
		
	
		
			
			|  |  |  | item->channel = i; | 
		
	
		
			
			|  |  |  | menu->addChild(item); | 
		
	
		
			
			|  |  |  | menu->addChild(createCheckMenuItem("Linear", | 
		
	
		
			
			|  |  |  | [=]() {return module->keyframer.mutable_settings(c)->response == 0;}, | 
		
	
		
			
			|  |  |  | [=]() {module->keyframer.mutable_settings(c)->response = 0;} | 
		
	
		
			
			|  |  |  | )); | 
		
	
		
			
			|  |  |  | menu->addChild(createCheckMenuItem("Exponential", | 
		
	
		
			
			|  |  |  | [=]() {return module->keyframer.mutable_settings(c)->response == 255;}, | 
		
	
		
			
			|  |  |  | [=]() {module->keyframer.mutable_settings(c)->response = 255;} | 
		
	
		
			
			|  |  |  | )); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | )); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | menu->addChild(createMenuItem("Clear keyframes", "", | 
		
	
	
		
			
				|  |  | 
 |