1
- module rec DataTypes
1
+ module DataTypes
2
2
type midiportnumber = byte
3
3
type word8 = byte
4
4
type word16 = uint16
@@ -55,7 +55,7 @@ type MidiEvent =
55
55
| SysRealtimeEvent of MidiSysRealtimeEvent
56
56
| MetaEvent of MidiMetaEvent
57
57
58
- type MidiVoiceEvent =
58
+ and MidiVoiceEvent =
59
59
/// Note off.
60
60
///
61
61
/// > 80 to 8F (0 to F is channel number) * note * velocity
@@ -112,7 +112,7 @@ type MidiVoiceEvent =
112
112
| PitchBend of status : bits7 * bend : word14
113
113
114
114
115
- type MidiTextType =
115
+ and MidiTextType =
116
116
| GenericText
117
117
| CopyrightNotice
118
118
| SequenceName
@@ -123,48 +123,48 @@ type MidiTextType =
123
123
124
124
125
125
/// Sequential messages with delta time 0 are played simultaneously.
126
- type MidiMessage = {
126
+ and MidiMessage = {
127
127
timestamp: DeltaTime
128
128
event: MidiEvent
129
129
}
130
130
131
- type MidiTrack = MidiMessage array
131
+ and MidiTrack = MidiMessage array
132
132
133
- type MidiFile = {
133
+ and MidiFile = {
134
134
header : MidiHeader
135
135
tracks : MidiTrack array
136
136
}
137
137
138
- type MidiSysExEvent =
139
- /// Single SysEx event.
140
- ///
141
- /// > F0 * length * data
142
- ///
143
- /// An uninterpreted sys-ex event.
144
- | SysExSingle of byte array
145
-
146
- /// SysEx sent as (non-standard) multiple continuation
147
- /// packets.
148
- ///
149
- /// > F0 * length * packet1 ... [SysExContPacket]
150
- ///
151
- | SysExCont of byte array * MidiSysExContPacket array
152
-
153
- /// Escape sequence of one-or-more SysEx events.
154
- ///
155
- /// > F7 * length * data
156
- ///
157
- | SysExEscape of byte array
138
+ and MidiSysExEvent =
139
+ /// Single SysEx event.
140
+ ///
141
+ /// > F0 * length * data
142
+ ///
143
+ /// An uninterpreted sys-ex event.
144
+ | SysExSingle of byte array
145
+
146
+ /// SysEx sent as (non-standard) multiple continuation
147
+ /// packets.
148
+ ///
149
+ /// > F0 * length * packet1 ... [SysExContPacket]
150
+ ///
151
+ | SysExCont of byte array * MidiSysExContPacket array
152
+
153
+ /// Escape sequence of one-or-more SysEx events.
154
+ ///
155
+ /// > F7 * length * data
156
+ ///
157
+ | SysExEscape of byte array
158
158
159
159
/// Continuation packet for a (non-standard) multi-part SysEx
160
160
/// event.
161
161
///
162
162
/// Apprently this format is use by Casio.
163
- type MidiSysExContPacket = MidiSysExContPacket of DeltaTime * byte array
163
+ and MidiSysExContPacket = MidiSysExContPacket of DeltaTime * byte array
164
164
165
165
166
166
167
- type MidiMetaEvent =
167
+ and MidiMetaEvent =
168
168
169
169
/// Text / copywright etc.
170
170
///
@@ -267,7 +267,7 @@ type MidiMetaEvent =
267
267
/// computer (as opposed to MIDI generated by a synthesizer or
268
268
/// sequencer).
269
269
///
270
- type MidiSysCommonEvent =
270
+ and MidiSysCommonEvent =
271
271
/// Time code quarter frame.
272
272
///
273
273
/// > F1 * payload
@@ -322,7 +322,7 @@ type MidiSysCommonEvent =
322
322
/// These events may not be pertinent to MIDI files generated on a
323
323
/// computer (as opposed to MIDI generated by a synthesizer or
324
324
/// sequencer).
325
- type MidiSysRealtimeEvent =
325
+ and MidiSysRealtimeEvent =
326
326
/// Timing signal.
327
327
///
328
328
/// > F8
@@ -380,8 +380,9 @@ type MidiSysRealtimeEvent =
380
380
///
381
381
| SystemReset
382
382
383
- [<RequireQualifiedAccess>]
384
- type MidiScaleType = Major | Minor | OtherScale of word8
383
+
384
+
385
+ and [<RequireQualifiedAccess>] MidiScaleType = Major | Minor | OtherScale of word8
385
386
386
387
module Internal =
387
388
module ParserMonad =
@@ -412,6 +413,7 @@ module Internal =
412
413
member state.posPastEnd = state.pos >= state.input.Length
413
414
member state.moved direction = { state with pos = state.pos + direction }
414
415
member state.get () = state.input.[ state.pos]
416
+
415
417
type ErrorMessage = string
416
418
type ParseError = ParseError of Pos * ErrorMessage
417
419
@@ -423,28 +425,38 @@ module Internal =
423
425
424
426
let getPos = parserM ( fun state -> ( Ok ( state.pos), state))
425
427
426
- let peek = parserM ( fun ({ pos = pos ; input = input } as state ) ->
428
+ let inline failPastEndOrResult ( state : ParserState ) funcName getResultAndState =
427
429
if state.posPastEnd then
428
- err pos " peek - no more data" , state
429
- else
430
- Ok input.[ pos], state
431
- )
432
-
433
- let cond pred = parserM ( fun ({ pos = pos ; input = input } as state ) ->
434
- if state.posPastEnd then
435
- err pos " cond - no more data" , state
430
+ ( err state.pos ( funcName + " - no more data" )), state
436
431
else
437
- let a = state.get()
438
- ( if pred a then Ok ( Some a) else ( Ok None)), state.moved( 1 )
439
- )
440
-
441
- let dropW8 = parserM ( fun ( state ) ->
442
- if state.posPastEnd then
443
- err state.pos " dropW8 - no more data" , state
444
- else
445
- Ok (), state.moved( 1 )
446
- )
432
+ let res , state = getResultAndState state
433
+ Ok res, state
447
434
435
+ let inline checkedPastEndOrResult fName getResultAndNextState = parserM <| fun state -> failPastEndOrResult state fName getResultAndNextState
436
+
437
+ let peek = checkedPastEndOrResult " peek" ( fun state -> state.get(), state)
438
+
439
+ let cond pred =
440
+ checkedPastEndOrResult " cond" (
441
+ fun state ->
442
+ let a = state.get()
443
+ ( if pred a then Some a else None), state.moved( 1 )
444
+ )
445
+
446
+ let dropW8 =
447
+ checkedPastEndOrResult " dropW8" (
448
+ fun state -> (), state.moved( 1 )
449
+ )
450
+
451
+ let word8 =
452
+ checkedPastEndOrResult " word8" (
453
+ fun state -> state.get(), state.moved( 1 )
454
+ )
455
+
456
+ let word16be : ParserM < word16 > =
457
+ checkedPastEndOrResult " word16be" (
458
+ fun state -> failwith " uncons2!!!"
459
+ )
448
460
449
461
450
462
0 commit comments