X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fmidi_mapper.cpp;h=9cfb3be6749e2f9234fe81c2fde5fb6bbd926da1;hb=refs%2Fheads%2Fmaster;hp=a76e36cb04f83c96ed5c49149078115c23a2cd13;hpb=a6f3a2275ad116e6ab338e583ab8ef1b1141b468;p=nageru diff --git a/futatabi/midi_mapper.cpp b/futatabi/midi_mapper.cpp index a76e36c..9cfb3be 100644 --- a/futatabi/midi_mapper.cpp +++ b/futatabi/midi_mapper.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -16,6 +17,7 @@ #include #include #include +#include #include #include "defs.h" @@ -78,11 +80,16 @@ ControllerReceiver *MIDIMapper::set_receiver(ControllerReceiver *new_receiver) void MIDIMapper::controller_received(int controller, int value_int) { int delta_value = value_int - 64; // For infinite controllers such as jog. + float value = map_controller_to_float(controller, value_int); receiver->controller_changed(controller); match_controller(controller, MIDIMappingProto::kJogFieldNumber, MIDIMappingProto::kJogBankFieldNumber, delta_value, bind(&ControllerReceiver::jog, receiver, _1)); + + // Speed goes from 0.0 to 2.0 (the receiver will clamp). + match_controller(controller, MIDIMappingProto::kMasterSpeedFieldNumber, MIDIMappingProto::kMasterSpeedBankFieldNumber, + value * 2.0, bind(&ControllerReceiver::set_master_speed, receiver, _1)); } void MIDIMapper::note_on_received(int note) @@ -136,6 +143,10 @@ void MIDIMapper::note_on_received(int note) bind(&ControllerReceiver::queue, receiver)); match_button(note, MIDIMappingProto::kPlayFieldNumber, MIDIMappingProto::kPlayBankFieldNumber, bind(&ControllerReceiver::play, receiver)); + match_button(note, MIDIMappingProto::kNextFieldNumber, MIDIMappingProto::kNextButtonBankFieldNumber, + bind(&ControllerReceiver::next, receiver)); + match_button(note, MIDIMappingProto::kToggleLockFieldNumber, MIDIMappingProto::kToggleLockBankFieldNumber, + bind(&ControllerReceiver::toggle_lock, receiver)); unsigned num_cameras = std::min(MAX_STREAMS, mapping_proto->camera_size()); for (unsigned camera_idx = 0; camera_idx < num_cameras; ++camera_idx) { @@ -198,7 +209,7 @@ void MIDIMapper::refresh_lights() void MIDIMapper::update_lights_lock_held() { - set active_lights; // Desired state. + map active_lights; // Desired state. if (current_controller_bank == 0) { activate_mapped_light(*mapping_proto, MIDIMappingProto::kBank1IsSelectedFieldNumber, &active_lights); } @@ -214,23 +225,44 @@ void MIDIMapper::update_lights_lock_held() if (current_controller_bank == 4) { activate_mapped_light(*mapping_proto, MIDIMappingProto::kBank5IsSelectedFieldNumber, &active_lights); } - if (preview_enabled_light) { - activate_mapped_light(*mapping_proto, MIDIMappingProto::kPreviewEnabledFieldNumber, &active_lights); + if (preview_enabled_light == On) { // Playing. + activate_mapped_light(*mapping_proto, MIDIMappingProto::kPreviewPlayingFieldNumber, &active_lights); + } else if (preview_enabled_light == Blinking) { // Preview ready. + activate_mapped_light(*mapping_proto, MIDIMappingProto::kPreviewReadyFieldNumber, &active_lights); } if (queue_enabled_light) { activate_mapped_light(*mapping_proto, MIDIMappingProto::kQueueEnabledFieldNumber, &active_lights); } - if (play_enabled_light) { - activate_mapped_light(*mapping_proto, MIDIMappingProto::kPlayEnabledFieldNumber, &active_lights); + if (play_enabled_light == On) { // Playing. + activate_mapped_light(*mapping_proto, MIDIMappingProto::kPlayingFieldNumber, &active_lights); + } else if (play_enabled_light == Blinking) { // Play ready. + activate_mapped_light(*mapping_proto, MIDIMappingProto::kPlayReadyFieldNumber, &active_lights); + } + if (next_ready_light == On) { + activate_mapped_light(*mapping_proto, MIDIMappingProto::kNextReadyFieldNumber, &active_lights); + } + if (locked_light == On) { + activate_mapped_light(*mapping_proto, MIDIMappingProto::kLockedFieldNumber, &active_lights); + } else if (locked_light == Blinking) { + activate_mapped_light(*mapping_proto, MIDIMappingProto::kLockedBlinkingFieldNumber, &active_lights); } if (current_highlighted_camera >= 0 && current_highlighted_camera < mapping_proto->camera_size()) { const CameraMIDIMappingProto &camera = mapping_proto->camera(current_highlighted_camera); activate_mapped_light(camera, CameraMIDIMappingProto::kIsCurrentFieldNumber, &active_lights); } + // Master speed light. + if (mapping_proto->has_master_speed_light()) { + unsigned controller = mapping_proto->master_speed_light().controller_number(); + unsigned min = mapping_proto->master_speed_light_min(); + unsigned max = mapping_proto->master_speed_light_max(); + int speed_light_value = lrintf((max - min) * current_speed / 2.0f) + min; + active_lights[MIDIDevice::LightKey{MIDIDevice::LightKey::CONTROLLER, controller}] = speed_light_value; + } + // These are always enabled right now. - activate_mapped_light(*mapping_proto, MIDIMappingProto::kCueInFieldNumber, &active_lights); - activate_mapped_light(*mapping_proto, MIDIMappingProto::kCueOutFieldNumber, &active_lights); + activate_mapped_light(*mapping_proto, MIDIMappingProto::kCueInEnabledFieldNumber, &active_lights); + activate_mapped_light(*mapping_proto, MIDIMappingProto::kCueOutEnabledFieldNumber, &active_lights); midi_device.update_lights(active_lights); }