diff --git a/api/src/persistence/target.rs b/api/src/persistence/target.rs index 23514a89..1a6950ce 100644 --- a/api/src/persistence/target.rs +++ b/api/src/persistence/target.rs @@ -1014,7 +1014,7 @@ pub struct SendMidiTarget { #[serde(skip_serializing_if = "Option::is_none")] pub message: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub destination: Option, + pub destination: Option, } #[derive(Eq, PartialEq, Default, Serialize, Deserialize)] @@ -2265,19 +2265,41 @@ impl Default for PlaytimeRowDescriptor { } } -#[derive(Eq, PartialEq, Serialize, Deserialize)] +#[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Default, + Serialize, + Deserialize, + EnumIter, + TryFromPrimitive, + IntoPrimitive, + Display, +)] +#[repr(usize)] #[serde(tag = "kind")] -pub enum MidiDestination { +pub enum SendMidiDestination { + #[serde(alias = "fx-output")] + #[display(fmt = "FX output")] + #[default] FxOutput, + #[serde(alias = "feedback-output")] + #[display(fmt = "Feedback output")] FeedbackOutput, - DeviceInput, + #[serde(alias = "device-input")] + #[display(fmt = "Same device input")] + SameDeviceInput, + // #[display(fmt = "Explicit device input")] + // ExplicitDeviceInput(ExplicitDeviceInputMidiDestination), } -impl Default for MidiDestination { - fn default() -> Self { - Self::FeedbackOutput - } -} +// #[derive(Copy, Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] +// pub struct ExplicitDeviceInputMidiDestination { +// pub input_device_id: u32, +// } #[derive(Eq, PartialEq, Serialize, Deserialize)] #[serde(tag = "kind")] diff --git a/main/src/application/target_model.rs b/main/src/application/target_model.rs index 39b0e280..5bef9fbe 100644 --- a/main/src/application/target_model.rs +++ b/main/src/application/target_model.rs @@ -23,26 +23,26 @@ use crate::domain::{ ExpressionEvaluator, ExtendedProcessorContext, FeedbackResolution, FxDescriptor, FxDisplayType, FxParameterDescriptor, GroupId, MappingId, MappingKey, MappingRef, MappingSnapshotId, MouseActionType, OscDeviceId, PotFilterItemsTargetSettings, ProcessorContext, - QualifiedMappingId, RealearnTarget, ReaperTarget, ReaperTargetType, SeekOptions, - SendMidiDestination, SoloBehavior, Tag, TagScope, TouchedRouteParameterType, - TouchedTrackParameterType, TrackDescriptor, TrackExclusivity, TrackGangBehavior, - TrackRouteDescriptor, TrackRouteSelector, TrackRouteType, TransportAction, - UnresolvedActionTarget, UnresolvedAllTrackFxEnableTarget, UnresolvedAnyOnTarget, - UnresolvedAutomationModeOverrideTarget, UnresolvedBrowseFxsTarget, UnresolvedBrowseGroupTarget, - UnresolvedBrowsePotFilterItemsTarget, UnresolvedBrowsePotPresetsTarget, - UnresolvedBrowseTracksTarget, UnresolvedCompartmentParameterValueTarget, - UnresolvedCompoundMappingTarget, UnresolvedDummyTarget, UnresolvedEnableInstancesTarget, - UnresolvedEnableMappingsTarget, UnresolvedFxEnableTarget, UnresolvedFxOnlineTarget, - UnresolvedFxOpenTarget, UnresolvedFxParameterTarget, UnresolvedFxParameterTouchStateTarget, - UnresolvedFxPresetTarget, UnresolvedFxToolTarget, UnresolvedGoToBookmarkTarget, - UnresolvedLastTouchedTarget, UnresolvedLoadFxSnapshotTarget, - UnresolvedLoadMappingSnapshotTarget, UnresolvedLoadPotPresetTarget, UnresolvedMidiSendTarget, - UnresolvedModifyMappingTarget, UnresolvedMouseTarget, UnresolvedOscSendTarget, - UnresolvedPlayrateTarget, UnresolvedPreviewPotPresetTarget, UnresolvedReaperTarget, - UnresolvedRouteAutomationModeTarget, UnresolvedRouteMonoTarget, UnresolvedRouteMuteTarget, - UnresolvedRoutePanTarget, UnresolvedRoutePhaseTarget, UnresolvedRouteTouchStateTarget, - UnresolvedRouteVolumeTarget, UnresolvedSeekTarget, UnresolvedTakeMappingSnapshotTarget, - UnresolvedTempoTarget, UnresolvedTrackArmTarget, UnresolvedTrackAutomationModeTarget, + QualifiedMappingId, RealearnTarget, ReaperTarget, ReaperTargetType, SeekOptions, SoloBehavior, + Tag, TagScope, TouchedRouteParameterType, TouchedTrackParameterType, TrackDescriptor, + TrackExclusivity, TrackGangBehavior, TrackRouteDescriptor, TrackRouteSelector, TrackRouteType, + TransportAction, UnresolvedActionTarget, UnresolvedAllTrackFxEnableTarget, + UnresolvedAnyOnTarget, UnresolvedAutomationModeOverrideTarget, UnresolvedBrowseFxsTarget, + UnresolvedBrowseGroupTarget, UnresolvedBrowsePotFilterItemsTarget, + UnresolvedBrowsePotPresetsTarget, UnresolvedBrowseTracksTarget, + UnresolvedCompartmentParameterValueTarget, UnresolvedCompoundMappingTarget, + UnresolvedDummyTarget, UnresolvedEnableInstancesTarget, UnresolvedEnableMappingsTarget, + UnresolvedFxEnableTarget, UnresolvedFxOnlineTarget, UnresolvedFxOpenTarget, + UnresolvedFxParameterTarget, UnresolvedFxParameterTouchStateTarget, UnresolvedFxPresetTarget, + UnresolvedFxToolTarget, UnresolvedGoToBookmarkTarget, UnresolvedLastTouchedTarget, + UnresolvedLoadFxSnapshotTarget, UnresolvedLoadMappingSnapshotTarget, + UnresolvedLoadPotPresetTarget, UnresolvedMidiSendTarget, UnresolvedModifyMappingTarget, + UnresolvedMouseTarget, UnresolvedOscSendTarget, UnresolvedPlayrateTarget, + UnresolvedPreviewPotPresetTarget, UnresolvedReaperTarget, UnresolvedRouteAutomationModeTarget, + UnresolvedRouteMonoTarget, UnresolvedRouteMuteTarget, UnresolvedRoutePanTarget, + UnresolvedRoutePhaseTarget, UnresolvedRouteTouchStateTarget, UnresolvedRouteVolumeTarget, + UnresolvedSeekTarget, UnresolvedTakeMappingSnapshotTarget, UnresolvedTempoTarget, + UnresolvedTrackArmTarget, UnresolvedTrackAutomationModeTarget, UnresolvedTrackMonitoringModeTarget, UnresolvedTrackMuteTarget, UnresolvedTrackPanTarget, UnresolvedTrackParentSendTarget, UnresolvedTrackPeakTarget, UnresolvedTrackPhaseTarget, UnresolvedTrackSelectionTarget, UnresolvedTrackShowTarget, UnresolvedTrackSoloTarget, @@ -65,7 +65,7 @@ use helgobox_api::persistence::{ MappingModification, MappingSnapshotDescForLoad, MappingSnapshotDescForTake, MonitoringMode, MouseAction, MouseButton, PlaytimeColumnAction, PlaytimeColumnDescriptor, PlaytimeMatrixAction, PlaytimeRowAction, PlaytimeRowDescriptor, PlaytimeSlotDescriptor, PlaytimeSlotManagementAction, - PlaytimeSlotTransportAction, PotFilterKind, SeekBehavior, + PlaytimeSlotTransportAction, PotFilterKind, SeekBehavior, SendMidiDestination, SetTargetToLastTouchedMappingModification, TargetTouchCause, TrackDescriptorCommons, TrackFxChain, TrackScope, TrackToolAction, VirtualControlElementCharacter, }; diff --git a/main/src/domain/reaper_target.rs b/main/src/domain/reaper_target.rs index 14abd4a2..1044ba6a 100644 --- a/main/src/domain/reaper_target.rs +++ b/main/src/domain/reaper_target.rs @@ -162,38 +162,6 @@ pub enum ReaperTarget { CompartmentParameterValue(CompartmentParameterValueTarget), } -#[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Serialize, - Deserialize, - EnumIter, - TryFromPrimitive, - IntoPrimitive, - Display, -)] -#[repr(usize)] -pub enum SendMidiDestination { - #[serde(rename = "fx-output")] - #[display(fmt = "FX output")] - FxOutput, - #[serde(rename = "feedback-output")] - #[display(fmt = "Feedback output")] - FeedbackOutput, - #[serde(rename = "device-input")] - #[display(fmt = "Device input")] - DeviceInput, -} - -impl Default for SendMidiDestination { - fn default() -> Self { - Self::FxOutput - } -} - #[derive(Clone, Copy, Debug, PartialEq, Eq, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SeekOptions { diff --git a/main/src/domain/targets/midi_send_target.rs b/main/src/domain/targets/midi_send_target.rs index 8a082822..51c6c500 100644 --- a/main/src/domain/targets/midi_send_target.rs +++ b/main/src/domain/targets/midi_send_target.rs @@ -3,8 +3,8 @@ use crate::domain::{ ExtendedProcessorContext, FeedbackAudioHookTask, FeedbackOutput, FeedbackRealTimeTask, HitResponse, LogOptions, MappingControlContext, MidiDestination, MidiEvent, MidiTransformationContainer, RealTimeReaperTarget, RealearnTarget, ReaperTarget, - ReaperTargetType, SendMidiDestination, TargetCharacter, TargetSection, TargetTypeDef, - UnresolvedReaperTargetDef, DEFAULT_TARGET, + ReaperTargetType, TargetCharacter, TargetSection, TargetTypeDef, UnresolvedReaperTargetDef, + DEFAULT_TARGET, }; use base::{NamedChannelSender, SenderToNormalThread, SenderToRealTimeThread}; use helgoboss_learn::{ @@ -12,6 +12,7 @@ use helgoboss_learn::{ MidiSourceValue, RawMidiPattern, Target, UnitValue, }; use helgobox_allocator::permit_alloc; +use helgobox_api::persistence::SendMidiDestination; use reaper_high::MidiOutputDevice; use reaper_medium::SendMidiTime; use std::convert::TryInto; @@ -132,7 +133,7 @@ impl MidiSendTarget { } }; } - SendMidiDestination::DeviceInput => { + SendMidiDestination::SameDeviceInput => { if let Some(container) = transformation_container { container.push(raw_midi_event); } @@ -247,7 +248,7 @@ impl RealearnTarget for MidiSendTarget { let resolved_destination = match self.destination { SendMidiDestination::FxOutput => MidiDestination::FxOutput, - SendMidiDestination::DeviceInput => return Err( + SendMidiDestination::SameDeviceInput => return Err( "sending to device input is only possible in response to a MIDI source event coming from a MIDI device", ), SendMidiDestination::FeedbackOutput => { diff --git a/main/src/infrastructure/api/convert/from_data/target.rs b/main/src/infrastructure/api/convert/from_data/target.rs index cf4e1a8f..d297b572 100644 --- a/main/src/infrastructure/api/convert/from_data/target.rs +++ b/main/src/infrastructure/api/convert/from_data/target.rs @@ -5,8 +5,8 @@ use crate::application::{ }; use crate::domain::{ ActionInvocationType, AnyOnParameter, Exclusivity, FeedbackResolution, FxDisplayType, - ReaperTargetType, SendMidiDestination, SoloBehavior, TouchedRouteParameterType, - TouchedTrackParameterType, TrackExclusivity, TrackRouteType, TransportAction, + ReaperTargetType, SoloBehavior, TouchedRouteParameterType, TouchedTrackParameterType, + TrackExclusivity, TrackRouteType, TransportAction, }; use crate::infrastructure::api::convert::from_data::{ convert_control_element_id, convert_osc_argument, convert_tags, ConversionStyle, @@ -358,16 +358,7 @@ fn convert_real_target( SendMidi => T::SendMidi(SendMidiTarget { commons, message: style.required_value(data.raw_midi_pattern), - destination: { - use persistence::MidiDestination as T; - use SendMidiDestination::*; - let dest = match data.send_midi_destination { - FxOutput => T::FxOutput, - FeedbackOutput => T::FeedbackOutput, - DeviceInput => T::DeviceInput, - }; - style.required_value(dest) - }, + destination: style.required_value(data.send_midi_destination), }), Dummy => T::Dummy(DummyTarget { commons }), BrowseTracks => T::BrowseTracks(BrowseTracksTarget { diff --git a/main/src/infrastructure/api/convert/to_data/target.rs b/main/src/infrastructure/api/convert/to_data/target.rs index e9edc05b..ced44328 100644 --- a/main/src/infrastructure/api/convert/to_data/target.rs +++ b/main/src/infrastructure/api/convert/to_data/target.rs @@ -6,7 +6,7 @@ use crate::application::{ }; use crate::domain::{ ActionInvocationType, Exclusivity, FxDisplayType, ReaperTargetType, SeekOptions, - SendMidiDestination, TouchedRouteParameterType, TrackRouteType, + TouchedRouteParameterType, TrackRouteType, }; use crate::infrastructure::api::convert::to_data::{ convert_control_element_id, convert_osc_arg_type, convert_osc_value_range, convert_tags, @@ -816,9 +816,9 @@ pub fn convert_target(t: Target) -> ConversionResult { r#type: ReaperTargetType::SendMidi, raw_midi_pattern: d.message.unwrap_or_default(), send_midi_destination: match d.destination.unwrap_or_default() { - MidiDestination::FxOutput => SendMidiDestination::FxOutput, - MidiDestination::FeedbackOutput => SendMidiDestination::FeedbackOutput, - MidiDestination::DeviceInput => SendMidiDestination::DeviceInput, + SendMidiDestination::FxOutput => SendMidiDestination::FxOutput, + SendMidiDestination::FeedbackOutput => SendMidiDestination::FeedbackOutput, + SendMidiDestination::SameDeviceInput => SendMidiDestination::SameDeviceInput, }, ..init(d.commons) }, diff --git a/main/src/infrastructure/data/target_model_data.rs b/main/src/infrastructure/data/target_model_data.rs index 7969b25e..6a2c7b3d 100644 --- a/main/src/infrastructure/data/target_model_data.rs +++ b/main/src/infrastructure/data/target_model_data.rs @@ -10,9 +10,8 @@ use crate::application::{ use crate::domain::{ get_fx_chains, ActionInvocationType, AnyOnParameter, CompartmentKind, Exclusivity, ExtendedProcessorContext, FxDisplayType, GroupKey, MappingKey, OscDeviceId, ReaperTargetType, - SeekOptions, SendMidiDestination, SoloBehavior, Tag, TouchedRouteParameterType, - TouchedTrackParameterType, TrackExclusivity, TrackGangBehavior, TrackRouteType, - TransportAction, VirtualTrack, + SeekOptions, SoloBehavior, Tag, TouchedRouteParameterType, TouchedTrackParameterType, + TrackExclusivity, TrackGangBehavior, TrackRouteType, TransportAction, VirtualTrack, }; use crate::infrastructure::data::common::OscValueRange; use crate::infrastructure::data::{ @@ -27,8 +26,8 @@ use helgoboss_learn::{AbsoluteValue, Fraction, OscTypeTag, UnitValue}; use helgobox_api::persistence::{ ActionScope, Axis, BrowseTracksMode, FxToolAction, LearnableTargetKind, MappingSnapshotDescForLoad, MappingSnapshotDescForTake, MonitoringMode, MouseAction, - PotFilterKind, SeekBehavior, TargetTouchCause, TargetValue, TrackScope, TrackToolAction, - VirtualControlElementCharacter, + PotFilterKind, SeekBehavior, SendMidiDestination, TargetTouchCause, TargetValue, TrackScope, + TrackToolAction, VirtualControlElementCharacter, }; use reaper_high::{BookmarkType, Fx, Guid}; use std::collections::HashSet; diff --git a/main/src/infrastructure/ui/mapping_panel.rs b/main/src/infrastructure/ui/mapping_panel.rs index b92fb612..4dacb031 100644 --- a/main/src/infrastructure/ui/mapping_panel.rs +++ b/main/src/infrastructure/ui/mapping_panel.rs @@ -33,7 +33,7 @@ use helgobox_api::persistence::{ PlaytimeColumnDescriptorKind, PlaytimeMatrixAction, PlaytimeRowAction, PlaytimeRowDescriptor, PlaytimeRowDescriptorKind, PlaytimeSlotDescriptor, PlaytimeSlotDescriptorKind, PlaytimeSlotManagementAction, PlaytimeSlotTransportAction, PotFilterKind, SeekBehavior, - TrackToolAction, VirtualControlElementCharacter, + SendMidiDestination, TrackToolAction, VirtualControlElementCharacter, }; use swell_ui::{ DeviceContext, DialogUnits, Point, SharedView, SwellStringArg, View, ViewContext, WeakView, @@ -60,8 +60,8 @@ use crate::domain::ui_util::{ use crate::domain::{ control_element_domains, AnyOnParameter, Backbone, ControlContext, Exclusivity, FeedbackSendBehavior, KeyStrokePortability, MouseActionType, PortabilityIssue, ReaperTarget, - ReaperTargetType, SendMidiDestination, SimpleExclusivity, SourceFeedbackEvent, - TargetControlEvent, TouchedRouteParameterType, TrackGangBehavior, WithControlContext, + ReaperTargetType, SimpleExclusivity, SourceFeedbackEvent, TargetControlEvent, + TouchedRouteParameterType, TrackGangBehavior, WithControlContext, }; use crate::domain::{ get_non_present_virtual_route_label, get_non_present_virtual_track_label,