Skip to content

Commit cee51ec

Browse files
committed
midi: reworked to include delta in event
1 parent 1bdeeb6 commit cee51ec

File tree

3 files changed

+38
-12
lines changed

3 files changed

+38
-12
lines changed

format/midi/TODO.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# TODO
22

33
- [ ] add to probe group
4-
- [ ] move delta into events
4+
- [x] move delta into events
55

66
- formats
77
- [ ] format 0
88
- [ ] format 1
9-
- [ ] format 1
9+
- [ ] format 2
1010

1111
- meta events
1212
- [ ] sequence number

format/midi/metaevents.go

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const (
2828
)
2929

3030
func decodeTrackName(d *decode.D) {
31+
d.FieldUintFn("delta", vlq)
3132
d.FieldU8("status")
3233
d.FieldU8("event")
3334
d.FieldStrFn("Name", func(d *decode.D) string {
@@ -36,6 +37,7 @@ func decodeTrackName(d *decode.D) {
3637
}
3738

3839
func decodeTempo(d *decode.D) {
40+
d.FieldUintFn("delta", vlq)
3941
d.FieldU8("status")
4042
d.FieldU8("event")
4143
d.FieldUintFn("Tempo", func(d *decode.D) uint64 {

format/midi/midi.go

+34-10
Original file line numberDiff line numberDiff line change
@@ -90,20 +90,19 @@ func decodeMTrk(d *decode.D) {
9090

9191
d.FieldArray("events", func(d *decode.D) {
9292
d.FramedFn(int64(length)*8, func(d *decode.D) {
93-
d.FieldStruct("event", decodeEvent)
94-
d.FieldStruct("event", decodeEvent)
93+
for d.BitsLeft() > 0 {
94+
d.FieldStruct("event", decodeEvent)
95+
}
9596
})
9697
})
9798
}
9899

99100
func decodeEvent(d *decode.D) {
100-
d.FieldUintFn("delta", vlq)
101-
102-
event := d.PeekBytes(2)
101+
_, status, event := peekEvent(d)
103102

104103
// ... meta event?
105-
if event[0] == 0xff {
106-
switch MetaEventType(event[1]) {
104+
if status == 0xff {
105+
switch MetaEventType(event) {
107106
case TypeTrackName:
108107
d.FieldStruct("TrackName", decodeTrackName)
109108
return
@@ -114,9 +113,34 @@ func decodeEvent(d *decode.D) {
114113
}
115114
}
116115

117-
// ... unknown event - swallow remaining bytes
118-
// for N := d.BitsLeft(); N > 0; {
119-
// }
116+
// ... unknown event - flush remaining data
117+
var N int = int(d.BitsLeft())
118+
119+
d.Bits(N)
120+
}
121+
122+
func peekEvent(d *decode.D) (uint64, uint8, uint8) {
123+
N := 3
124+
125+
for {
126+
bytes := d.PeekBytes(N)
127+
128+
// ... peek at delta value
129+
delta := uint64(0)
130+
131+
for i, b := range bytes[:N-2] {
132+
delta <<= 7
133+
delta += uint64(b & 0x7f)
134+
135+
if b&0x80 == 0 {
136+
status := bytes[i+1]
137+
event := bytes[i+2]
138+
return delta, status, event
139+
}
140+
}
141+
142+
N++
143+
}
120144
}
121145

122146
func vlq(d *decode.D) uint64 {

0 commit comments

Comments
 (0)