@@ -4,13 +4,6 @@ open System.Reflection
44open Midinette.Platform
55
66module Impl =
7- let getRawDataReceivedEventFromInput port =
8- let f = port.GetType() .GetEvent " Message" ;
9- let dataReceived = new Event< byte array>()
10- let handler = System.EventHandler< byte array>( fun _ -> dataReceived.Trigger)
11- f.AddEventHandler( port, handler)
12- dataReceived
13-
147 let toBytes ( message : Midi.MidiMessage ) = [| message.Status; message.Data1; message.Data2|]
158 let rtMidiOut ( bytes : byte array ) port =
169 let f = port.GetType() .GetField( " _outputDevice" , BindingFlags.NonPublic ||| BindingFlags.Instance)
@@ -22,6 +15,7 @@ module Impl =
2215
2316open Impl
2417open Midi
18+ open RtMidi.Core .Unmanaged .Devices
2519open System.Diagnostics
2620
2721type InPortEvents < 'timestamp > = {
@@ -76,7 +70,20 @@ type RtMidiMidinettePlatformImpl() =
7670 let rtmidi = RtMidi.Core.MidiDeviceManager.Default
7771 let watch = Stopwatch.StartNew()
7872 let platformEvents = MidiPlatformTrigger()
79-
73+ let platformEventsPublish = platformEvents :> IMidiPlatformEvents<_,_,_,_>
74+
75+ member x.Trigger = platformEvents
76+ member x.Platform = x :> IMidiPlatformEvents<_,_,_,_>
77+
78+ member x.Now = watch.ElapsedTicks
79+ interface IMidiPlatformEvents< IDeviceInfo, Midi.MidiEvent< int64>, int64, Midi.MidiMessage> with
80+ [<CLIEvent>] member x.Error = platformEventsPublish.Error |> Event.map ( fun ( d , e ) -> { info = d } :> IDeviceInfo, e)
81+ [<CLIEvent>] member x.ChannelMessageReceived = platformEventsPublish.ChannelMessageReceived |> Event.map ( fun ( d , e ) -> { info = d } :> IDeviceInfo, e)
82+ [<CLIEvent>] member x.SystemMessageReceived = platformEventsPublish.SystemMessageReceived |> Event.map ( fun ( d , e ) -> { info = d } :> IDeviceInfo, e)
83+ [<CLIEvent>] member x.SysexReceived = platformEventsPublish.SysexReceived |> Event.map ( fun ( d , e ) -> { info = d } :> IDeviceInfo, e)
84+ [<CLIEvent>] member x.RealtimeMessageReceived = platformEventsPublish.RealtimeMessageReceived |> Event.map ( fun ( d , e ) -> { info = d } :> IDeviceInfo, e)
85+
86+
8087 interface IMidiPlatform< IDeviceInfo, Midi.MidiEvent< int64>, int64, Midi.MidiMessage> with
8188 member x.InputDevices =
8289 RtMidi.Core.MidiDeviceManager.Default.InputDevices
@@ -94,29 +101,32 @@ type RtMidiMidinettePlatformImpl() =
94101 | :? RtMidi.Core.Devices.Infos.IMidiInputDeviceInfo as device ->
95102 // todo: keep that in store instead of creating / subscribing again
96103 let port = device.CreateDevice()
97- let dataReceived = getRawDataReceivedEventFromInput port
98104 let error = new Event<_>()
99105 let channelMessage = new Event<_>()
100106 let sysex = new Event<_>()
101107 let systemMessage = new Event<_>()
102108 let realtimeMessage = new Event<_>()
103- dataReceived.Publish .Add( fun bytes ->
109+ port.InputDevice.Message .Add( fun bytes ->
104110 let status : MidiMessageType = LanguagePrimitives.EnumOfValue ( bytes.[ 0 ])
105- let timestamp = watch.ElapsedTicks
106- let inline triggerMessageEvent ( event1 : Event < _ >) platformNoticer =
111+ let inline toMidiEvent ( bytes : byte array ) ( watch : Stopwatch ) =
112+ let timestamp = watch.ElapsedTicks
107113 let message = MidiMessage.Encode bytes.[ 0 ] bytes.[ 1 ] bytes.[ 2 ]
108- let event = Midi.MidiEvent( message, timestamp)
114+ Midi.MidiEvent( message, timestamp)
115+
116+ let inline triggerMessageEvent ( event1 : Event < _ >) platformNoticer =
117+ let event = toMidiEvent bytes watch
109118 event1.Trigger event
110- platformNoticer ( rtDevice , event)
119+ platformNoticer ( device , event)
111120 if MidiMessageTypeIdentifaction.isChannelMessage status then
112121 triggerMessageEvent channelMessage platformEvents.NoticeChannelMessage
113122 elif MidiMessageTypeIdentifaction.isRealtimeMessage status then
114123 triggerMessageEvent realtimeMessage platformEvents.NoticeRealtimeMessage
115124 elif MidiMessageTypeIdentifaction.isSystemMessage status then
116- triggerMessageEvent systemMessage platformEvents.NoticeSystemMessage
117- elif MidiMessageTypeIdentifaction.isSysexBeginOrEnd status then
118- sysex.Trigger bytes
119- platformEvents.NoticeSysex( rtDevice, bytes)
125+ if MidiMessageTypeIdentifaction.isSysexBeginOrEnd status then
126+ sysex.Trigger bytes
127+ platformEvents.NoticeSysex( device, bytes)
128+ else
129+ triggerMessageEvent systemMessage platformEvents.NoticeSystemMessage
120130 else
121131 #if DEBUG
122132 failwithf " unable to parse what I received received %A " bytes
0 commit comments