Skip to content

Commit 273aab8

Browse files
committed
Min diff by bringing back parseMidi
1 parent 542135d commit 273aab8

File tree

2 files changed

+47
-45
lines changed

2 files changed

+47
-45
lines changed

src/ZMidi/Internal/ParserMonad.fs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ module ParserMonad =
158158
let (>>=) (m: ParserMonad<'a>) (k: 'a -> ParserMonad<'b>) : ParserMonad<'b> =
159159
bindM m k
160160

161+
let parseMidi = monad
162+
161163
let runParser (ma:ParserMonad<'a>) input initialState =
162164
apply1 ma { initialState with Input = input}
163165
|> Result.map fst
@@ -182,13 +184,13 @@ module ParserMonad =
182184

183185
///
184186
let fmap (f: 'a -> 'b) (p: ParserMonad<'a>) : ParserMonad<'b> =
185-
monad {
187+
parseMidi {
186188
let! a = p
187189
return (f a)
188190
}
189191
let inline ( <~> (* <$> *) ) (a) b = fmap a b
190192
let ( *> ) (a: ParserMonad<'a>) (b: 'a -> ParserMonad<'b>) : ParserMonad<'b> =
191-
monad {
193+
parseMidi {
192194
let! a = a
193195
return! (b a)
194196
}
@@ -332,7 +334,7 @@ module ParserMonad =
332334
/// Apply the parser for /count/ times, derive the final answer
333335
/// from the intermediate list with the supplied function.
334336
let inline gencount (plen: ParserMonad<'T>) (p: ParserMonad<'a>) (constr: ^T -> 'a array -> 'answer) : ParserMonad<'answer> =
335-
monad {
337+
parseMidi {
336338
let! l = plen
337339
logf "gen count: l: %i" l
338340
let! items = boundRepeat l p
@@ -353,22 +355,22 @@ module ParserMonad =
353355

354356
/// Parse a single byte char.
355357
let readChar : ParserMonad<char> =
356-
monad {
358+
parseMidi {
357359
let! a = readByte
358360
return (char a)
359361
}
360362

361363
/// Parse a string of the given length.
362364
let readString (length : int) : ParserMonad<string> =
363-
monad {
365+
parseMidi {
364366
let! arr = count length readChar
365367
return (System.String arr)
366368
}
367369
<??> sprintf "readString failed at %i"
368370
open ZMidi.Internal.DataTypes.FromBytes
369371
/// Parse a uint16 (big endian).
370372
let readUInt16be : ParserMonad<uint16>=
371-
monad {
373+
parseMidi {
372374
let! a = readByte
373375
let! b = readByte
374376
return word16be a b
@@ -377,7 +379,7 @@ module ParserMonad =
377379

378380
/// Parse a word14 (big endian) from 2 consecutive bytes.
379381
let readWord14be =
380-
monad {
382+
parseMidi {
381383
let! a = readByte
382384
let! b = readByte
383385
return (word14be a b)
@@ -386,7 +388,7 @@ module ParserMonad =
386388

387389
/// Parse a word32 (big endian).
388390
let readUInt32be =
389-
monad {
391+
parseMidi {
390392
let! a = readByte
391393
let! b = readByte
392394
let! c = readByte
@@ -396,7 +398,7 @@ module ParserMonad =
396398

397399
/// Parse a word24 (big endian).
398400
let readWord24be =
399-
monad {
401+
parseMidi {
400402
let! a = readByte
401403
let! b = readByte
402404
let! c = readByte

src/ZMidi/Read.fs

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ module ReadFile =
1111
/// Apply parse then apply the check, if the check fails report
1212
/// the error message.
1313
let postCheck parser isOutputValid errorMessage =
14-
monad {
14+
parseMidi {
1515
let! answer = parser
1616
if isOutputValid answer then
1717
return answer
@@ -29,43 +29,43 @@ module ReadFile =
2929

3030
let getVarlen : ParserMonad<word32> =
3131
let rec loop acc =
32-
monad {
32+
parseMidi {
3333
let! b = readByte
3434
let acc = acc <<< 7
3535
if msbHigh b then
3636
let result = uint64 (b &&& 0b01111111uy)
3737
return! loop (acc + result)
3838
else
3939
return (acc + (uint64 b)) }
40-
monad {
40+
parseMidi {
4141
let! result = loop 0UL
4242
return (uint32 result) }
4343

4444
let getVarlenText = gencount getVarlen readChar (fun _ b -> System.String b)
4545
let getVarlenBytes = gencount getVarlen readByte (fun _ b -> b)
4646

4747
let deltaTime =
48-
monad {
48+
parseMidi {
4949
let! v = getVarlen
5050
return DeltaTime(v)
5151
} <??> (fun p -> "delta time")
5252

5353
let fileFormat =
54-
monad {
54+
parseMidi {
5555
match! readUInt16be with
5656
| 0us -> return MidiFormat0
5757
| 1us -> return MidiFormat1
5858
| 2us -> return MidiFormat2
5959
| x -> return! (fatalError (Other (sprintf "fileFormat: Unrecognized file format %i" x)))
6060
}
6161
let timeDivision =
62-
monad {
62+
parseMidi {
6363
match! readUInt16be with
6464
| TestBit 15 as x -> return FramePerSecond (clearBit 15 x)
6565
| x -> return TicksPerBeat x
6666
}
6767
let header =
68-
monad {
68+
parseMidi {
6969
let! _ = assertString "MThd"
7070
let! _ = assertWord32 6u
7171
let! format = fileFormat
@@ -76,59 +76,59 @@ module ReadFile =
7676
format = format }
7777
}
7878
let trackHeader =
79-
monad {
79+
parseMidi {
8080
let! _ = assertString "MTrk"
8181
return! readUInt32be
8282
}
8383

8484
let textEvent textType =
85-
monad {
85+
parseMidi {
8686
let! text = getVarlenText
8787
return TextEvent(textType, text)
8888
}
8989

9090
let scale =
91-
monad {
91+
parseMidi {
9292
match! readByte with
9393
| 0uy -> return MidiScaleType.Major
9494
| 1uy -> return MidiScaleType.Minor
9595
| other -> return MidiScaleType.OtherScale other
9696
}
9797

9898
let metaEventSequenceNumber =
99-
monad {
99+
parseMidi {
100100
let! a = assertWord8 2uy
101101
let! b = peek
102102
return SequenceNumber(word16be a b)
103103
}
104104

105105
let metaEventChannelPrefix =
106-
monad {
106+
parseMidi {
107107
let! _ = assertWord8 0x01uy
108108
let! b = readByte
109109
return ChannelPrefix b
110110
}
111111

112112
let metaEventMidiPort =
113-
monad {
113+
parseMidi {
114114
let! _ = assertWord8 0x01uy
115115
let! b = readByte
116116
return MidiPort b
117117
}
118118
let metaEventEndOfTrack =
119-
monad {
119+
parseMidi {
120120
let! _ = assertWord8 0uy
121121
return EndOfTrack
122122
}
123123
let metaEventSetTempo =
124-
monad {
124+
parseMidi {
125125
let! _ = assertWord8 3uy
126126
let! a = readWord24be
127127
return SetTempo a
128128
}
129129

130130
let metaEventSmpteOffset =
131-
monad {
131+
parseMidi {
132132
let! _ = assertWord8 5uy
133133
let! a = readByte
134134
let! b = readByte
@@ -138,7 +138,7 @@ module ReadFile =
138138
return SMPTEOffset(a,b,c,d,e)
139139
}
140140
let metaEventTimeSignature =
141-
monad {
141+
parseMidi {
142142
let! _ = assertWord8 4uy
143143
let! a = readByte
144144
let! b = readByte
@@ -148,7 +148,7 @@ module ReadFile =
148148
}
149149

150150
let metaEventKeySignature =
151-
monad {
151+
parseMidi {
152152
let! _ = assertWord8 2uy
153153
let! a = readByte
154154
let a = int8 a
@@ -158,7 +158,7 @@ module ReadFile =
158158

159159
let metaEvent i =
160160
let konst k _ = k
161-
monad {
161+
parseMidi {
162162
match i with
163163
| 0x00uy -> return! metaEventSequenceNumber <??> (konst "sequence number")
164164
| 0x01uy -> return! textEvent GenericText <??> (konst "generic text")
@@ -188,7 +188,7 @@ module ReadFile =
188188
| None -> false
189189

190190
let rec sysExContPackets =
191-
monad {
191+
parseMidi {
192192
let! d = deltaTime
193193
let! b = getVarlenBytes
194194
let answer = MidiSysExContPacket (d, b)
@@ -198,7 +198,7 @@ module ReadFile =
198198
return (answer :: answer2)
199199
}
200200
let sysExEvent =
201-
monad {
201+
parseMidi {
202202
let! b = getVarlenBytes
203203
if isTerminated b then
204204
return SysExSingle b
@@ -207,7 +207,7 @@ module ReadFile =
207207
return SysExCont(b, cont)
208208
} <??> (fun _ -> "sysExEvent")
209209
let sysExEscape =
210-
monad {
210+
parseMidi {
211211
let! bytes = getVarlenBytes
212212
return SysExEscape bytes
213213
} <??> (fun _ -> "sysExEscape")
@@ -218,7 +218,7 @@ module ReadFile =
218218
match n with
219219
| 0xf1uy -> readByte >>= (QuarterFrame >> mreturn) <??> (fun p -> "quarter frame")
220220
| 0xf2uy ->
221-
monad {
221+
parseMidi {
222222
let! a = readByte
223223
let! b = readByte
224224
return SongPosPointer(a,b)
@@ -246,53 +246,53 @@ module ReadFile =
246246
b &&& 0xf0uy, b &&& 0x0fuy
247247

248248
let noteOff ch =
249-
monad {
249+
parseMidi {
250250
let! a = readByte
251251
let! b = readByte
252252
return MidiVoiceEvent.NoteOff(ch, a, b)
253253
} <??> (fun p -> "note-off")
254254

255255
let noteOn ch =
256-
monad {
256+
parseMidi {
257257
let! a = readByte
258258
let! b = readByte
259259
return MidiVoiceEvent.NoteOn(ch, a, b)
260260
} <??> (fun p -> "note-on")
261261

262262
let noteAftertouch ch =
263-
monad {
263+
parseMidi {
264264
let! a = readByte
265265
let! b = readByte
266266
return MidiVoiceEvent.NoteAfterTouch(ch, a, b)
267267
} <??> (fun p -> "noteAftertouch")
268268

269269
let controller ch =
270-
monad {
270+
parseMidi {
271271
let! a = readByte
272272
let! b = readByte
273273
return MidiVoiceEvent.Controller(ch, a, b)
274274
} <??> (fun p -> "controller")
275275

276276
let programChange ch =
277-
monad {
277+
parseMidi {
278278
let! a = readByte
279279
return MidiVoiceEvent.ProgramChange(ch, a)
280280
} <??> (fun p -> "controller")
281281

282282
let channelAftertouch ch =
283-
monad {
283+
parseMidi {
284284
let! a = readByte
285285
return MidiVoiceEvent.ChannelAftertouch(ch, a)
286286
} <??> (fun p -> "channelAftertouch")
287287
let pitchBend ch =
288-
monad {
288+
parseMidi {
289289
let! a = readWord14be
290290
return MidiVoiceEvent.PitchBend(ch, a)
291291
} <??> (fun p -> "pitchBend")
292292

293293

294294
let voiceEvent n =
295-
monad {
295+
parseMidi {
296296
match n with
297297
| SB(0x80uy, ch) -> do! setRunningEvent (NoteOff ch);
298298
return! noteOff ch
@@ -331,7 +331,7 @@ module ReadFile =
331331
/// can cause fatal parse errors.
332332
333333
let event : ParserMonad<MidiEvent> =
334-
monad {
334+
parseMidi {
335335
match! peek with
336336
| 0xffuy ->
337337
do! dropByte
@@ -362,26 +362,26 @@ module ReadFile =
362362
}
363363

364364
let message =
365-
monad {
365+
parseMidi {
366366
let! deltaTime = deltaTime
367367
let! event = event
368368
return { timestamp = deltaTime; event = event }
369369
}
370370
let messages i =
371-
monad {
371+
parseMidi {
372372

373373
let! lastPos = getPos
374374
let maxPos = lastPos + int i
375375
return! repeatTillPosition maxPos message
376376
}
377377
let track : ParserMonad<MidiTrack> =
378-
monad {
378+
parseMidi {
379379
let! length = trackHeader
380380
return! messages length
381381
}
382382

383383
let midiFile =
384-
monad {
384+
parseMidi {
385385
let! header = header
386386
let! tracks = count (header.trackCount) track
387387
return { header = header; tracks = tracks }

0 commit comments

Comments
 (0)