@@ -11,7 +11,7 @@ module ReadFile =
11
11
/// Apply parse then apply the check, if the check fails report
12
12
/// the error message.
13
13
let postCheck parser isOutputValid errorMessage =
14
- monad {
14
+ parseMidi {
15
15
let! answer = parser
16
16
if isOutputValid answer then
17
17
return answer
@@ -29,43 +29,43 @@ module ReadFile =
29
29
30
30
let getVarlen : ParserMonad < word32 > =
31
31
let rec loop acc =
32
- monad {
32
+ parseMidi {
33
33
let! b = readByte
34
34
let acc = acc <<< 7
35
35
if msbHigh b then
36
36
let result = uint64 ( b &&& 0b01111111 uy)
37
37
return ! loop ( acc + result)
38
38
else
39
39
return ( acc + ( uint64 b)) }
40
- monad {
40
+ parseMidi {
41
41
let! result = loop 0 UL
42
42
return ( uint32 result) }
43
43
44
44
let getVarlenText = gencount getVarlen readChar ( fun _ b -> System.String b)
45
45
let getVarlenBytes = gencount getVarlen readByte ( fun _ b -> b)
46
46
47
47
let deltaTime =
48
- monad {
48
+ parseMidi {
49
49
let! v = getVarlen
50
50
return DeltaTime( v)
51
51
} <??> ( fun p -> " delta time" )
52
52
53
53
let fileFormat =
54
- monad {
54
+ parseMidi {
55
55
match ! readUInt16be with
56
56
| 0 us -> return MidiFormat0
57
57
| 1 us -> return MidiFormat1
58
58
| 2 us -> return MidiFormat2
59
59
| x -> return ! ( fatalError ( Other ( sprintf " fileFormat: Unrecognized file format %i " x)))
60
60
}
61
61
let timeDivision =
62
- monad {
62
+ parseMidi {
63
63
match ! readUInt16be with
64
64
| TestBit 15 as x -> return FramePerSecond ( clearBit 15 x)
65
65
| x -> return TicksPerBeat x
66
66
}
67
67
let header =
68
- monad {
68
+ parseMidi {
69
69
let! _ = assertString " MThd"
70
70
let! _ = assertWord32 6 u
71
71
let! format = fileFormat
@@ -76,59 +76,59 @@ module ReadFile =
76
76
format = format }
77
77
}
78
78
let trackHeader =
79
- monad {
79
+ parseMidi {
80
80
let! _ = assertString " MTrk"
81
81
return ! readUInt32be
82
82
}
83
83
84
84
let textEvent textType =
85
- monad {
85
+ parseMidi {
86
86
let! text = getVarlenText
87
87
return TextEvent( textType, text)
88
88
}
89
89
90
90
let scale =
91
- monad {
91
+ parseMidi {
92
92
match ! readByte with
93
93
| 0 uy -> return MidiScaleType.Major
94
94
| 1 uy -> return MidiScaleType.Minor
95
95
| other -> return MidiScaleType.OtherScale other
96
96
}
97
97
98
98
let metaEventSequenceNumber =
99
- monad {
99
+ parseMidi {
100
100
let! a = assertWord8 2 uy
101
101
let! b = peek
102
102
return SequenceNumber( word16be a b)
103
103
}
104
104
105
105
let metaEventChannelPrefix =
106
- monad {
106
+ parseMidi {
107
107
let! _ = assertWord8 0x01 uy
108
108
let! b = readByte
109
109
return ChannelPrefix b
110
110
}
111
111
112
112
let metaEventMidiPort =
113
- monad {
113
+ parseMidi {
114
114
let! _ = assertWord8 0x01 uy
115
115
let! b = readByte
116
116
return MidiPort b
117
117
}
118
118
let metaEventEndOfTrack =
119
- monad {
119
+ parseMidi {
120
120
let! _ = assertWord8 0 uy
121
121
return EndOfTrack
122
122
}
123
123
let metaEventSetTempo =
124
- monad {
124
+ parseMidi {
125
125
let! _ = assertWord8 3 uy
126
126
let! a = readWord24be
127
127
return SetTempo a
128
128
}
129
129
130
130
let metaEventSmpteOffset =
131
- monad {
131
+ parseMidi {
132
132
let! _ = assertWord8 5 uy
133
133
let! a = readByte
134
134
let! b = readByte
@@ -138,7 +138,7 @@ module ReadFile =
138
138
return SMPTEOffset( a, b, c, d, e)
139
139
}
140
140
let metaEventTimeSignature =
141
- monad {
141
+ parseMidi {
142
142
let! _ = assertWord8 4 uy
143
143
let! a = readByte
144
144
let! b = readByte
@@ -148,7 +148,7 @@ module ReadFile =
148
148
}
149
149
150
150
let metaEventKeySignature =
151
- monad {
151
+ parseMidi {
152
152
let! _ = assertWord8 2 uy
153
153
let! a = readByte
154
154
let a = int8 a
@@ -158,7 +158,7 @@ module ReadFile =
158
158
159
159
let metaEvent i =
160
160
let konst k _ = k
161
- monad {
161
+ parseMidi {
162
162
match i with
163
163
| 0x00 uy -> return ! metaEventSequenceNumber <??> ( konst " sequence number" )
164
164
| 0x01 uy -> return ! textEvent GenericText <??> ( konst " generic text" )
@@ -188,7 +188,7 @@ module ReadFile =
188
188
| None -> false
189
189
190
190
let rec sysExContPackets =
191
- monad {
191
+ parseMidi {
192
192
let! d = deltaTime
193
193
let! b = getVarlenBytes
194
194
let answer = MidiSysExContPacket ( d, b)
@@ -198,7 +198,7 @@ module ReadFile =
198
198
return ( answer :: answer2)
199
199
}
200
200
let sysExEvent =
201
- monad {
201
+ parseMidi {
202
202
let! b = getVarlenBytes
203
203
if isTerminated b then
204
204
return SysExSingle b
@@ -207,7 +207,7 @@ module ReadFile =
207
207
return SysExCont( b, cont)
208
208
} <??> ( fun _ -> " sysExEvent" )
209
209
let sysExEscape =
210
- monad {
210
+ parseMidi {
211
211
let! bytes = getVarlenBytes
212
212
return SysExEscape bytes
213
213
} <??> ( fun _ -> " sysExEscape" )
@@ -218,7 +218,7 @@ module ReadFile =
218
218
match n with
219
219
| 0xf1 uy -> readByte >>= ( QuarterFrame >> mreturn) <??> ( fun p -> " quarter frame" )
220
220
| 0xf2 uy ->
221
- monad {
221
+ parseMidi {
222
222
let! a = readByte
223
223
let! b = readByte
224
224
return SongPosPointer( a, b)
@@ -246,53 +246,53 @@ module ReadFile =
246
246
b &&& 0xf0 uy, b &&& 0x0f uy
247
247
248
248
let noteOff ch =
249
- monad {
249
+ parseMidi {
250
250
let! a = readByte
251
251
let! b = readByte
252
252
return MidiVoiceEvent.NoteOff( ch, a, b)
253
253
} <??> ( fun p -> " note-off" )
254
254
255
255
let noteOn ch =
256
- monad {
256
+ parseMidi {
257
257
let! a = readByte
258
258
let! b = readByte
259
259
return MidiVoiceEvent.NoteOn( ch, a, b)
260
260
} <??> ( fun p -> " note-on" )
261
261
262
262
let noteAftertouch ch =
263
- monad {
263
+ parseMidi {
264
264
let! a = readByte
265
265
let! b = readByte
266
266
return MidiVoiceEvent.NoteAfterTouch( ch, a, b)
267
267
} <??> ( fun p -> " noteAftertouch" )
268
268
269
269
let controller ch =
270
- monad {
270
+ parseMidi {
271
271
let! a = readByte
272
272
let! b = readByte
273
273
return MidiVoiceEvent.Controller( ch, a, b)
274
274
} <??> ( fun p -> " controller" )
275
275
276
276
let programChange ch =
277
- monad {
277
+ parseMidi {
278
278
let! a = readByte
279
279
return MidiVoiceEvent.ProgramChange( ch, a)
280
280
} <??> ( fun p -> " controller" )
281
281
282
282
let channelAftertouch ch =
283
- monad {
283
+ parseMidi {
284
284
let! a = readByte
285
285
return MidiVoiceEvent.ChannelAftertouch( ch, a)
286
286
} <??> ( fun p -> " channelAftertouch" )
287
287
let pitchBend ch =
288
- monad {
288
+ parseMidi {
289
289
let! a = readWord14be
290
290
return MidiVoiceEvent.PitchBend( ch, a)
291
291
} <??> ( fun p -> " pitchBend" )
292
292
293
293
294
294
let voiceEvent n =
295
- monad {
295
+ parseMidi {
296
296
match n with
297
297
| SB( 0x80 uy, ch) -> do ! setRunningEvent ( NoteOff ch);
298
298
return ! noteOff ch
@@ -331,7 +331,7 @@ module ReadFile =
331
331
/// can cause fatal parse errors.
332
332
333
333
let event : ParserMonad < MidiEvent > =
334
- monad {
334
+ parseMidi {
335
335
match ! peek with
336
336
| 0xff uy ->
337
337
do ! dropByte
@@ -362,26 +362,26 @@ module ReadFile =
362
362
}
363
363
364
364
let message =
365
- monad {
365
+ parseMidi {
366
366
let! deltaTime = deltaTime
367
367
let! event = event
368
368
return { timestamp = deltaTime; event = event }
369
369
}
370
370
let messages i =
371
- monad {
371
+ parseMidi {
372
372
373
373
let! lastPos = getPos
374
374
let maxPos = lastPos + int i
375
375
return ! repeatTillPosition maxPos message
376
376
}
377
377
let track : ParserMonad < MidiTrack > =
378
- monad {
378
+ parseMidi {
379
379
let! length = trackHeader
380
380
return ! messages length
381
381
}
382
382
383
383
let midiFile =
384
- monad {
384
+ parseMidi {
385
385
let! header = header
386
386
let! tracks = count ( header.trackCount) track
387
387
return { header = header; tracks = tracks }
0 commit comments