@@ -34,6 +34,16 @@ module ReadFile =
34
34
let assertWord32 i =
35
35
postCheck readUInt32be ((=) i) ( Other ( sprintf " assertWord32: expected '%i '" i))
36
36
37
+ let assertWord8 i =
38
+ postCheck readByte ((=) i) ( Other ( sprintf " assertWord8: expected '%i '" i))
39
+
40
+ let getVarlen : ParserMonad < word32 > =
41
+ parseMidi {
42
+ failwith " getVarlen: not imple"
43
+ }
44
+
45
+ let getVarlenText = gencount getVarlen readChar ( fun _ b -> System.String b)
46
+
37
47
let fileFormat =
38
48
parseMidi {
39
49
match ! readUInt16be with
@@ -64,46 +74,54 @@ module ReadFile =
64
74
let! _ = assertString " MTrk"
65
75
return ! readUInt32be
66
76
}
67
- let event : ParserMonad < MidiMessage > =
77
+ let textEvent textType =
68
78
parseMidi {
69
- return ! fatalError ( Other " not implemented" ) }
70
- let getVarLen : ParserMonad < uint32 > =
79
+ let! text = getVarlenText
80
+ return TextEvent( textType, text)
81
+ }
82
+ let metaEventSequenceNumber =
71
83
parseMidi {
72
- return ! fatalError ( Other " not implemented" )
73
- //getVarlen :: ParserM Word32
74
- //getVarlen = liftM fromVarlen step1
75
- // where
76
- // step1 = word8 >>= \a -> if msbHigh a then step2 a else return (V1 a)
77
- // step2 a = word8 >>= \b -> if msbHigh b then step3 a b else return (V2 a b)
78
- // step3 a b = word8 >>= \c -> if msbHigh c then do { d <- word8
79
- // ; return (V4 a b c d) }
80
- // else return (V3 a b c)
81
-
82
-
84
+ let! a = assertWord8 2 uy
85
+ let! b = peek
86
+ return SequenceNumber( word16be a b)
83
87
}
88
+
89
+ let metaEventGenericText =
90
+ parseMidi {
91
+ let! a = assertWord8 2 uy
92
+ let! b = peek
93
+ return ! textEvent GenericText
94
+ }
95
+ let metaEvent i =
96
+ parseMidi {
97
+ match i with
98
+ | 0x00 -> return metaEventSequenceNumber
99
+ | 0x01 -> return metaEventGenericText
100
+ }
101
+ let event : ParserMonad < MidiEvent > =
102
+ parseMidi {
103
+ return ! fatalError ( Other " event: not implemented" ) }
84
104
85
105
86
106
let deltaTime =
87
107
parseMidi {
88
- return ! getVarLen
108
+ return ! getVarlen
89
109
} <??> ( fun p -> " delta time" )
90
110
91
111
let message =
92
112
parseMidi {
93
113
let! deltaTime = deltaTime
94
114
let! event = event
95
- return deltaTime, event
115
+ return { timestamp = DeltaTime ( deltaTime); event = event }
96
116
}
97
117
let messages i =
98
118
parseMidi {
99
- return ! boundRepeat i message
119
+ return ! boundRepeat ( int i ) message
100
120
}
101
121
let track : ParserMonad < MidiTrack > =
102
122
parseMidi {
103
123
let! length = trackHeader
104
- let! messages = messages length
105
- return ! fatalError ( Other " not implemented" )
106
-
124
+ return ! messages length
107
125
}
108
126
//let midiFile =
109
127
// parseMidi {
0 commit comments