File tree Expand file tree Collapse file tree 2 files changed +54
-0
lines changed Expand file tree Collapse file tree 2 files changed +54
-0
lines changed Original file line number Diff line number Diff line change @@ -158,6 +158,14 @@ module ParserMonad =
158
158
work length state ( fun msg -> Error msg) ( fun st ac -> Ok ( ac, st))
159
159
|> Result.map ( fun ( ans , st ) -> ( List.toArray ans, st))
160
160
161
+ let boundRepeat n p =
162
+ parseMidi {
163
+ return [|
164
+ for i in 0 .. ( n - 1 ) do
165
+ yield ! p
166
+ |]
167
+ }
168
+
161
169
/// Drop a byte (word8).
162
170
let dropByte : ParserMonad < unit > =
163
171
checkedParseM " dropByte" <|
Original file line number Diff line number Diff line change @@ -57,6 +57,52 @@ module ReadFile =
57
57
timeDivision = timeDivision
58
58
format = format }
59
59
}
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
+ }
60
106
//let midiFile =
61
107
// parseMidi {
62
108
// let! header = P.header
You can’t perform that action at this time.
0 commit comments