@@ -4,13 +4,6 @@ open System.Reflection
4
4
open Midinette.Platform
5
5
6
6
module 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
-
14
7
let toBytes ( message : Midi.MidiMessage ) = [| message.Status; message.Data1; message.Data2|]
15
8
let rtMidiOut ( bytes : byte array ) port =
16
9
let f = port.GetType() .GetField( " _outputDevice" , BindingFlags.NonPublic ||| BindingFlags.Instance)
@@ -22,6 +15,7 @@ module Impl =
22
15
23
16
open Impl
24
17
open Midi
18
+ open RtMidi.Core .Unmanaged .Devices
25
19
open System.Diagnostics
26
20
27
21
type InPortEvents < 'timestamp > = {
@@ -76,7 +70,20 @@ type RtMidiMidinettePlatformImpl() =
76
70
let rtmidi = RtMidi.Core.MidiDeviceManager.Default
77
71
let watch = Stopwatch.StartNew()
78
72
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
+
80
87
interface IMidiPlatform< IDeviceInfo, Midi.MidiEvent< int64>, int64, Midi.MidiMessage> with
81
88
member x.InputDevices =
82
89
RtMidi.Core.MidiDeviceManager.Default.InputDevices
@@ -94,29 +101,32 @@ type RtMidiMidinettePlatformImpl() =
94
101
| :? RtMidi.Core.Devices.Infos.IMidiInputDeviceInfo as device ->
95
102
// todo: keep that in store instead of creating / subscribing again
96
103
let port = device.CreateDevice()
97
- let dataReceived = getRawDataReceivedEventFromInput port
98
104
let error = new Event<_>()
99
105
let channelMessage = new Event<_>()
100
106
let sysex = new Event<_>()
101
107
let systemMessage = new Event<_>()
102
108
let realtimeMessage = new Event<_>()
103
- dataReceived.Publish .Add( fun bytes ->
109
+ port.InputDevice.Message .Add( fun bytes ->
104
110
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
107
113
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
109
118
event1.Trigger event
110
- platformNoticer ( rtDevice , event)
119
+ platformNoticer ( device , event)
111
120
if MidiMessageTypeIdentifaction.isChannelMessage status then
112
121
triggerMessageEvent channelMessage platformEvents.NoticeChannelMessage
113
122
elif MidiMessageTypeIdentifaction.isRealtimeMessage status then
114
123
triggerMessageEvent realtimeMessage platformEvents.NoticeRealtimeMessage
115
124
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
120
130
else
121
131
#if DEBUG
122
132
failwithf " unable to parse what I received received %A " bytes
0 commit comments