Skip to content

Commit ef46b0c

Browse files
ParserMonad: tentative implementation for boundRepeat
Read: few functions, some incomplete (track, messages, message, deltaTime, etc.) hitting a bump with getVarLen for now, but I assume the implementation will look easier (to the procedural programmer) implemented in the CE
1 parent 0686c4c commit ef46b0c

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

src/ZMidi/Internal/ParserMonad.fs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,14 @@ module ParserMonad =
158158
work length state (fun msg -> Error msg) (fun st ac -> Ok (ac, st))
159159
|> Result.map (fun (ans, st) -> (List.toArray ans, st))
160160

161+
let boundRepeat n p =
162+
parseMidi {
163+
return [|
164+
for i in 0 .. (n - 1) do
165+
yield! p
166+
|]
167+
}
168+
161169
/// Drop a byte (word8).
162170
let dropByte : ParserMonad<unit> =
163171
checkedParseM "dropByte" <|

src/ZMidi/Read.fs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,52 @@ module ReadFile =
5757
timeDivision = timeDivision
5858
format = format }
5959
}
60+
let trackHeader =
61+
parseMidi {
62+
let! _ = assertString "MTrk"
63+
return! readUInt32be
64+
}
65+
let event : ParserMonad<MidiMessage> =
66+
parseMidi {
67+
return! fatalError (Other "not implemented") }
68+
let getVarLen : ParserMonad<uint32> =
69+
parseMidi {
70+
return! fatalError (Other "not implemented")
71+
//getVarlen :: ParserM Word32
72+
//getVarlen = liftM fromVarlen step1
73+
// where
74+
// step1 = word8 >>= \a -> if msbHigh a then step2 a else return (V1 a)
75+
// step2 a = word8 >>= \b -> if msbHigh b then step3 a b else return (V2 a b)
76+
// step3 a b = word8 >>= \c -> if msbHigh c then do { d <- word8
77+
// ; return (V4 a b c d) }
78+
// else return (V3 a b c)
79+
80+
81+
}
82+
83+
84+
let deltaTime =
85+
parseMidi {
86+
return! getVarLen
87+
} <??> (fun p -> "delta time")
88+
89+
let message =
90+
parseMidi {
91+
let! deltaTime = deltaTime
92+
let! event = event
93+
return deltaTime, event
94+
}
95+
let messages i =
96+
parseMidi {
97+
return! fatalError (Other "not implemented")
98+
//let! messages = boundRepeat i message
99+
}
100+
let track : ParserMonad<MidiTrack> =
101+
parseMidi {
102+
let header = trackHeader
103+
return! fatalError (Other "not implemented")
104+
// let! messages = messages
105+
}
60106
//let midiFile =
61107
// parseMidi {
62108
// let! header = P.header

0 commit comments

Comments
 (0)