Skip to content

Commit dd753e3

Browse files
fix boundRepeat off by one
1 parent 1aec97f commit dd753e3

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

src/ZMidi/DataTypes.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ and MidiMessage = {
130130
timestamp: DeltaTime
131131
event: MidiEvent
132132
}
133+
with override x.ToString() = sprintf "{%A %A}" x.timestamp x.event
133134

134135
and MidiTrack = MidiMessage array
135136

src/ZMidi/Internal/ParserMonad.fs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,14 @@ module ParserMonad =
7979
type ParserMonad<'a> =
8080
ParserMonad of (MidiData -> State -> Result<'a * State, ParseError> )
8181

82-
let inline logf format =
82+
let nullOut = new StreamWriter(Stream.Null) :> TextWriter
83+
let mutable debug = false
84+
let logf format = //format: Printf.TextWriterFormat<'a>) =
85+
if debug then
86+
printfn format
87+
else
88+
fprintfn nullOut format
8389

84-
printfn format
8590
let inline private apply1 (parser : ParserMonad<'a>)
8691
(midiData : byte[])
8792
(state : State) : Result<'a * State, ParseError> =
@@ -90,7 +95,7 @@ module ParserMonad =
9095
let result = fn midiData state
9196
match result with
9297
| Ok (r, state) ->
93-
logf "parse ok: %50s %O" (sprintf "%A" r) state
98+
logf "parse ok: %50s %O" (sprintf "%O" r) state
9499
#if DEBUG_LASTPARSE
95100
let state = { state with LastParse = r }
96101
#endif
@@ -293,15 +298,18 @@ module ParserMonad =
293298
let mutable error = Ok (Unchecked.defaultof<_>,lastState)
294299
let mutable i = LanguagePrimitives.GenericZero
295300
let mutable errorOccured = false
301+
logf "bound repeat %i" n
296302
while i < n && not errorOccured do
297-
i <- i + LanguagePrimitives.GenericOne
303+
logf "bound repeat %i/%i" i n
304+
298305
match apply1 p data lastState with
299306
| Ok (item,state) ->
300307
lastState <- state
301308
result.[int i] <- item
302309
| (Error e) ->
303310
error <- Error e
304311
errorOccured <- true
312+
i <- i + LanguagePrimitives.GenericOne
305313
if errorOccured then
306314
error
307315
else

src/ZMidi/Read.fs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,7 @@ module ReadFile =
5353
return (uint32 result) }
5454

5555
let getVarlenText = gencount getVarlen readChar (fun _ b -> System.String b)
56-
let getVarlenBytes =
57-
parseMidi {
58-
let! l = getVarlen
59-
return! ParserMonad (
60-
fun data state ->
61-
Ok (data.[state.Position .. state.Position + (int l) - 1], { state with Position = state.Position + int l})
62-
)
63-
}
56+
let getVarlenBytes = gencount getVarlen readByte (fun _ b -> b)
6457

6558
let deltaTime =
6659
parseMidi {

0 commit comments

Comments
 (0)