mirror of
https://github.com/wader/fq.git
synced 2024-10-03 23:17:50 +03:00
midi: decorated 'delta' field with running tick
This commit is contained in:
parent
54a0cf1284
commit
59b1faa4b9
@ -15,7 +15,7 @@
|
||||
- notes
|
||||
- (?) add to probe group
|
||||
|
||||
- [ ] tick field
|
||||
- [x] tick field
|
||||
- [ ] assert available bytes
|
||||
|
||||
- [x] fix gaps
|
||||
|
@ -1,6 +0,0 @@
|
||||
package midi
|
||||
|
||||
type context struct {
|
||||
running uint8
|
||||
casio bool
|
||||
}
|
@ -62,60 +62,139 @@ func decodeMetaEvent(d *decode.D, event uint8, ctx *context) {
|
||||
ctx.running = 0x00
|
||||
ctx.casio = false
|
||||
|
||||
delta := func(d *decode.D) {
|
||||
dt := d.FieldUintFn("delta", vlq)
|
||||
d.FieldValueUint("tick", ctx.tick)
|
||||
|
||||
ctx.tick += dt
|
||||
}
|
||||
|
||||
switch MetaEventType(event) {
|
||||
case TypeSequenceNumber:
|
||||
d.FieldStruct("SequenceNumber", decodeSequenceNumber)
|
||||
d.FieldStruct("SequenceNumber", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeSequenceNumber(d)
|
||||
})
|
||||
|
||||
case TypeText:
|
||||
d.FieldStruct("Text", decodeText)
|
||||
d.FieldStruct("Text", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeText(d)
|
||||
})
|
||||
|
||||
case TypeCopyright:
|
||||
d.FieldStruct("Copyright", decodeCopyright)
|
||||
d.FieldStruct("Copyright", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeCopyright(d)
|
||||
})
|
||||
|
||||
case TypeTrackName:
|
||||
d.FieldStruct("TrackName", decodeTrackName)
|
||||
d.FieldStruct("TrackName", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeTrackName(d)
|
||||
})
|
||||
|
||||
case TypeInstrumentName:
|
||||
d.FieldStruct("InstrumentName", decodeInstrumentName)
|
||||
d.FieldStruct("InstrumentName", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeInstrumentName(d)
|
||||
})
|
||||
|
||||
case TypeLyric:
|
||||
d.FieldStruct("Lyric", decodeLyric)
|
||||
d.FieldStruct("Lyric", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeLyric(d)
|
||||
})
|
||||
|
||||
case TypeMarker:
|
||||
d.FieldStruct("Marker", decodeMarker)
|
||||
d.FieldStruct("Marker", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeMarker(d)
|
||||
})
|
||||
|
||||
case TypeCuePoint:
|
||||
d.FieldStruct("CuePoint", decodeCuePoint)
|
||||
d.FieldStruct("CuePoint", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeCuePoint(d)
|
||||
})
|
||||
|
||||
case TypeProgramName:
|
||||
d.FieldStruct("ProgramName", decodeProgramName)
|
||||
d.FieldStruct("ProgramName", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeProgramName(d)
|
||||
})
|
||||
|
||||
case TypeDeviceName:
|
||||
d.FieldStruct("DeviceName", decodeDeviceName)
|
||||
d.FieldStruct("DeviceName", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeDeviceName(d)
|
||||
})
|
||||
|
||||
case TypeMIDIChannelPrefix:
|
||||
d.FieldStruct("TypeMIDIChannelPrefix", decodeMIDIChannelPrefix)
|
||||
d.FieldStruct("TypeMIDIChannelPrefix", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeMIDIChannelPrefix(d)
|
||||
})
|
||||
|
||||
case TypeMIDIPort:
|
||||
d.FieldStruct("TypeMIDIPort", decodeMIDIPort)
|
||||
d.FieldStruct("TypeMIDIPort", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeMIDIPort(d)
|
||||
})
|
||||
|
||||
case TypeTempo:
|
||||
d.FieldStruct("Tempo", decodeTempo)
|
||||
d.FieldStruct("Tempo", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeTempo(d)
|
||||
})
|
||||
|
||||
case TypeSMPTEOffset:
|
||||
d.FieldStruct("SMPTEOffset", decodeSMPTEOffset)
|
||||
d.FieldStruct("SMPTEOffset", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeSMPTEOffset(d)
|
||||
})
|
||||
|
||||
case TypeTimeSignature:
|
||||
d.FieldStruct("TimeSignature", decodeTimeSignature)
|
||||
d.FieldStruct("TimeSignature", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeTimeSignature(d)
|
||||
})
|
||||
|
||||
case TypeKeySignature:
|
||||
d.FieldStruct("KeySignature", decodeKeySignature)
|
||||
d.FieldStruct("KeySignature", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeKeySignature(d)
|
||||
})
|
||||
|
||||
case TypeEndOfTrack:
|
||||
d.FieldStruct("EndOfTrack", decodeEndOfTrack)
|
||||
d.FieldStruct("EndOfTrack", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeEndOfTrack(d)
|
||||
})
|
||||
|
||||
case TypeSequencerSpecificEvent:
|
||||
d.FieldStruct("SequencerSpecific", decodeSequencerSpecificEvent)
|
||||
d.FieldStruct("SequencerSpecific", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
decodeSequencerSpecificEvent(d)
|
||||
})
|
||||
|
||||
default:
|
||||
flush(d, "unknown meta event (%02x)", event)
|
||||
@ -123,8 +202,6 @@ func decodeMetaEvent(d *decode.D, event uint8, ctx *context) {
|
||||
}
|
||||
|
||||
func decodeSequenceNumber(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldUintFn("sequenceNumber", func(d *decode.D) uint64 {
|
||||
data := vlf(d)
|
||||
seqno := uint64(0)
|
||||
@ -143,80 +220,60 @@ func decodeSequenceNumber(d *decode.D) {
|
||||
}
|
||||
|
||||
func decodeText(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("text", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeCopyright(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("copyright", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeTrackName(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("name", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeInstrumentName(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("instrument", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeLyric(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("lyric", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeMarker(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("marker", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeCuePoint(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("cue", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeProgramName(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("program", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeDeviceName(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStrFn("device", func(d *decode.D) string {
|
||||
return string(vlf(d))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeMIDIChannelPrefix(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldUintFn("channel", func(d *decode.D) uint64 {
|
||||
channel := uint64(0)
|
||||
data := vlf(d)
|
||||
@ -231,8 +288,6 @@ func decodeMIDIChannelPrefix(d *decode.D) {
|
||||
}
|
||||
|
||||
func decodeMIDIPort(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldUintFn("port", func(d *decode.D) uint64 {
|
||||
channel := uint64(0)
|
||||
data := vlf(d)
|
||||
@ -247,8 +302,6 @@ func decodeMIDIPort(d *decode.D) {
|
||||
}
|
||||
|
||||
func decodeTempo(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldUintFn("tempo", func(d *decode.D) uint64 {
|
||||
tempo := uint64(0)
|
||||
data := vlf(d)
|
||||
@ -263,8 +316,6 @@ func decodeTempo(d *decode.D) {
|
||||
}
|
||||
|
||||
func decodeSMPTEOffset(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStruct("offset", func(d *decode.D) {
|
||||
var data []uint8
|
||||
d.FieldStrFn("bytes", func(d *decode.D) string {
|
||||
@ -300,8 +351,6 @@ func decodeSMPTEOffset(d *decode.D) {
|
||||
}
|
||||
|
||||
func decodeTimeSignature(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStruct("signature", func(d *decode.D) {
|
||||
var data []uint8
|
||||
d.FieldStrFn("bytes", func(d *decode.D) string {
|
||||
@ -334,8 +383,6 @@ func decodeTimeSignature(d *decode.D) {
|
||||
}
|
||||
|
||||
func decodeKeySignature(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldUintFn("key", func(d *decode.D) uint64 {
|
||||
data := vlf(d)
|
||||
key := uint64(data[0]) & 0x00ff
|
||||
@ -348,16 +395,12 @@ func decodeKeySignature(d *decode.D) {
|
||||
}
|
||||
|
||||
func decodeEndOfTrack(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldUintFn("length", func(d *decode.D) uint64 {
|
||||
return uint64(len(vlf(d)))
|
||||
})
|
||||
}
|
||||
|
||||
func decodeSequencerSpecificEvent(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU16("metaevent", metaevents)
|
||||
d.FieldStruct("info", func(d *decode.D) {
|
||||
var data []uint8
|
||||
d.FieldStrFn("bytes", func(d *decode.D) string {
|
||||
|
@ -11,6 +11,12 @@ import (
|
||||
"github.com/wader/fq/pkg/interp"
|
||||
)
|
||||
|
||||
type context struct {
|
||||
tick uint64
|
||||
running uint8
|
||||
casio bool
|
||||
}
|
||||
|
||||
//go:embed midi.md
|
||||
var midiFS embed.FS
|
||||
|
||||
@ -91,6 +97,7 @@ func decodeMTrk(d *decode.D) {
|
||||
d.FieldArray("events", func(d *decode.D) {
|
||||
d.FramedFn(int64(length)*8, func(d *decode.D) {
|
||||
ctx := context{
|
||||
tick: 0,
|
||||
running: 0x000,
|
||||
casio: false,
|
||||
}
|
||||
|
@ -24,6 +24,13 @@ func decodeMIDIEvent(d *decode.D, status uint8, ctx *context) {
|
||||
ctx.running = status
|
||||
ctx.casio = false
|
||||
|
||||
delta := func(d *decode.D) {
|
||||
dt := d.FieldUintFn("delta", vlq)
|
||||
d.FieldValueUint("tick", ctx.tick)
|
||||
|
||||
ctx.tick += dt
|
||||
}
|
||||
|
||||
channel := func(d *decode.D) uint64 {
|
||||
b := d.PeekBytes(1)
|
||||
if b[0] >= 0x80 {
|
||||
@ -36,7 +43,7 @@ func decodeMIDIEvent(d *decode.D, status uint8, ctx *context) {
|
||||
switch MidiEventType(status & 0xf0) {
|
||||
case TypeNoteOff:
|
||||
d.FieldStruct("NoteOff", func(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldUintFn("channel", channel)
|
||||
|
||||
decodeNoteOff(d)
|
||||
@ -44,7 +51,7 @@ func decodeMIDIEvent(d *decode.D, status uint8, ctx *context) {
|
||||
|
||||
case TypeNoteOn:
|
||||
d.FieldStruct("NoteOn", func(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldUintFn("channel", channel)
|
||||
|
||||
decodeNoteOn(d)
|
||||
@ -52,7 +59,7 @@ func decodeMIDIEvent(d *decode.D, status uint8, ctx *context) {
|
||||
|
||||
case TypePolyphonicPressure:
|
||||
d.FieldStruct("PolyphonicPressure", func(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldUintFn("channel", channel)
|
||||
|
||||
decodePolyphonicPressure(d)
|
||||
@ -60,7 +67,7 @@ func decodeMIDIEvent(d *decode.D, status uint8, ctx *context) {
|
||||
|
||||
case TypeController:
|
||||
d.FieldStruct("Controller", func(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldUintFn("channel", channel)
|
||||
|
||||
decodeController(d)
|
||||
@ -68,7 +75,7 @@ func decodeMIDIEvent(d *decode.D, status uint8, ctx *context) {
|
||||
|
||||
case TypeProgramChange:
|
||||
d.FieldStruct("ProgramChange", func(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldUintFn("channel", channel)
|
||||
|
||||
decodeProgramChange(d)
|
||||
@ -76,7 +83,7 @@ func decodeMIDIEvent(d *decode.D, status uint8, ctx *context) {
|
||||
|
||||
case TypeChannelPressure:
|
||||
d.FieldStruct("ChannelPressure", func(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldUintFn("channel", channel)
|
||||
|
||||
decodeChannelPressure(d)
|
||||
@ -84,7 +91,7 @@ func decodeMIDIEvent(d *decode.D, status uint8, ctx *context) {
|
||||
|
||||
case TypePitchBend:
|
||||
d.FieldStruct("PitchBend", func(d *decode.D) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldUintFn("channel", channel)
|
||||
|
||||
decodePitchBend(d)
|
||||
|
@ -15,22 +15,35 @@ var sysex = scalar.UintMapSymStr{
|
||||
func decodeSysExEvent(d *decode.D, status uint8, ctx *context) {
|
||||
ctx.running = 0x00
|
||||
|
||||
delta := func(d *decode.D) {
|
||||
dt := d.FieldUintFn("delta", vlq)
|
||||
d.FieldValueUint("tick", ctx.tick)
|
||||
|
||||
ctx.tick += dt
|
||||
}
|
||||
|
||||
switch {
|
||||
case status == 0xf0 && ctx.casio:
|
||||
d.Errorf("SysExMessage F0 start byte without terminating F7")
|
||||
|
||||
case status == 0xf0:
|
||||
d.FieldStruct("SysExMessage", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU8("sysex", sysex)
|
||||
decodeSysExMessage(d, ctx)
|
||||
})
|
||||
|
||||
case status == 0xf7 && ctx.casio:
|
||||
d.FieldStruct("SysExContinuation", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU8("sysex", sysex)
|
||||
decodeSysExContinuation(d, ctx)
|
||||
})
|
||||
|
||||
case status == 0xf7:
|
||||
d.FieldStruct("SysExEscape", func(d *decode.D) {
|
||||
d.FieldStruct("time", delta)
|
||||
d.FieldU8("sysex", sysex)
|
||||
decodeSysExEscape(d, ctx)
|
||||
})
|
||||
|
||||
@ -40,10 +53,8 @@ func decodeSysExEvent(d *decode.D, status uint8, ctx *context) {
|
||||
}
|
||||
|
||||
func decodeSysExMessage(d *decode.D, ctx *context) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU8("sysex", sysex)
|
||||
|
||||
var bytes []uint8
|
||||
|
||||
d.FieldStrFn("bytes", func(d *decode.D) string {
|
||||
bytes = vlf(d)
|
||||
return fmt.Sprintf("%v", bytes)
|
||||
@ -77,8 +88,6 @@ func decodeSysExMessage(d *decode.D, ctx *context) {
|
||||
}
|
||||
|
||||
func decodeSysExContinuation(d *decode.D, ctx *context) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU8("sysex", sysex)
|
||||
d.FieldStrFn("data", func(d *decode.D) string {
|
||||
data := vlf(d)
|
||||
|
||||
@ -97,8 +106,6 @@ func decodeSysExContinuation(d *decode.D, ctx *context) {
|
||||
}
|
||||
|
||||
func decodeSysExEscape(d *decode.D, ctx *context) {
|
||||
d.FieldUintFn("delta", vlq)
|
||||
d.FieldU8("sysex", sysex)
|
||||
d.FieldStrFn("data", func(d *decode.D) string {
|
||||
data := vlf(d)
|
||||
|
||||
|
136
format/midi/testdata/keys.fqtest
vendored
136
format/midi/testdata/keys.fqtest
vendored
@ -14,147 +14,215 @@ $ ./fq -d midi d key-signatures.mid
|
||||
0x010| 00 00 00 f5 | .... | length: 245
|
||||
| | | events[0:34]:
|
||||
| | | [0]{}: TrackName
|
||||
0x010| 00 | . | delta: 0
|
||||
| | | time{}:
|
||||
0x010| 00 | . | delta: 0
|
||||
| | | tick: 0
|
||||
0x010| ff 03 | .. | metaevent: 3 (65283)
|
||||
0x010| 0e 4b 65 79 20 53 69| .Key Si| name: "Key Signatures"
|
||||
0x020|67 6e 61 74 75 72 65 73 |gnatures |
|
||||
| | | [1]{}: KeySignature
|
||||
0x020| 00 | . | delta: 0
|
||||
| | | time{}:
|
||||
0x020| 00 | . | delta: 0
|
||||
| | | tick: 0
|
||||
0x020| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x020| 02 00 00 | ... | key: "C major" (0)
|
||||
| | | [2]{}: KeySignature
|
||||
0x020| 8f 00| ..| delta: 1920
|
||||
| | | time{}:
|
||||
0x020| 8f 00| ..| delta: 1920
|
||||
| | | tick: 0
|
||||
0x030|ff 59 |.Y | metaevent: 89 (65369)
|
||||
0x030| 02 01 00 | ... | key: "G major" (256)
|
||||
| | | [3]{}: KeySignature
|
||||
0x030| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x030| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 1920
|
||||
0x030| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x030| 02 02 00 | ... | key: "D major" (512)
|
||||
| | | [4]{}: KeySignature
|
||||
0x030| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x030| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 3840
|
||||
0x030| ff 59| .Y| metaevent: 89 (65369)
|
||||
0x040|02 03 00 |... | key: "A major" (768)
|
||||
| | | [5]{}: KeySignature
|
||||
0x040| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x040| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 5760
|
||||
0x040| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x040| 02 04 00 | ... | key: "E major" (1024)
|
||||
| | | [6]{}: KeySignature
|
||||
0x040| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x040| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 7680
|
||||
0x040| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x040| 02 05| ..| key: "B major" (1280)
|
||||
0x050|00 |. |
|
||||
| | | [7]{}: KeySignature
|
||||
0x050| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x050| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 9600
|
||||
0x050| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x050| 02 06 00 | ... | key: "F♯ major" (1536)
|
||||
| | | [8]{}: KeySignature
|
||||
0x050| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x050| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 11520
|
||||
0x050| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x050| 02 07 00 | ... | key: "C♯ major" (1792)
|
||||
| | | [9]{}: KeySignature
|
||||
0x050| 8f| .| delta: 1920
|
||||
| | | time{}:
|
||||
0x050| 8f| .| delta: 1920
|
||||
0x060|00 |. |
|
||||
| | | tick: 13440
|
||||
0x060| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x060| 02 00 00 | ... | key: "C major" (0)
|
||||
| | | [10]{}: KeySignature
|
||||
0x060| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x060| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 15360
|
||||
0x060| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x060| 02 ff 00 | ... | key: "F major" (65280)
|
||||
| | | [11]{}: KeySignature
|
||||
0x060| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x060| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 17280
|
||||
0x060| ff| .| metaevent: 89 (65369)
|
||||
0x070|59 |Y |
|
||||
0x070| 02 fe 00 | ... | key: "B♭ major" (65024)
|
||||
| | | [12]{}: KeySignature
|
||||
0x070| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x070| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 19200
|
||||
0x070| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x070| 02 fd 00 | ... | key: "E♭ major" (64768)
|
||||
| | | [13]{}: KeySignature
|
||||
0x070| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x070| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 21120
|
||||
0x070| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x070| 02| .| key: "A♭ major" (64512)
|
||||
0x080|fc 00 |.. |
|
||||
| | | [14]{}: KeySignature
|
||||
0x080| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x080| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 23040
|
||||
0x080| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x080| 02 fb 00 | ... | key: "D♭ major" (64256)
|
||||
| | | [15]{}: KeySignature
|
||||
0x080| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x080| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 24960
|
||||
0x080| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x080| 02 fa 00| ...| key: "G♭ major" (64000)
|
||||
| | | [16]{}: KeySignature
|
||||
0x090|8f 00 |.. | delta: 1920
|
||||
| | | time{}:
|
||||
0x090|8f 00 |.. | delta: 1920
|
||||
| | | tick: 26880
|
||||
0x090| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x090| 02 f9 00 | ... | key: "C♭ major" (63744)
|
||||
| | | [17]{}: KeySignature
|
||||
0x090| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x090| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 28800
|
||||
0x090| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x090| 02 00 01 | ... | key: "A minor" (1)
|
||||
| | | [18]{}: KeySignature
|
||||
0x090| 8f 00| ..| delta: 1920
|
||||
| | | time{}:
|
||||
0x090| 8f 00| ..| delta: 1920
|
||||
| | | tick: 30720
|
||||
0x0a0|ff 59 |.Y | metaevent: 89 (65369)
|
||||
0x0a0| 02 01 01 | ... | key: "E minor" (257)
|
||||
| | | [19]{}: KeySignature
|
||||
0x0a0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0a0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 32640
|
||||
0x0a0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0a0| 02 02 01 | ... | key: "B minor" (513)
|
||||
| | | [20]{}: KeySignature
|
||||
0x0a0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0a0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 34560
|
||||
0x0a0| ff 59| .Y| metaevent: 89 (65369)
|
||||
0x0b0|02 03 01 |... | key: "F♯ minor" (769)
|
||||
| | | [21]{}: KeySignature
|
||||
0x0b0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0b0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 36480
|
||||
0x0b0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0b0| 02 04 01 | ... | key: "C♯ minor" (1025)
|
||||
| | | [22]{}: KeySignature
|
||||
0x0b0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0b0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 38400
|
||||
0x0b0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0b0| 02 05| ..| key: "G♯ minor" (1281)
|
||||
0x0c0|01 |. |
|
||||
| | | [23]{}: KeySignature
|
||||
0x0c0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0c0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 40320
|
||||
0x0c0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0c0| 02 06 01 | ... | key: "D♯ minor" (1537)
|
||||
| | | [24]{}: KeySignature
|
||||
0x0c0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0c0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 42240
|
||||
0x0c0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0c0| 02 07 01 | ... | key: "A♯ minor" (1793)
|
||||
| | | [25]{}: KeySignature
|
||||
0x0c0| 8f| .| delta: 1920
|
||||
| | | time{}:
|
||||
0x0c0| 8f| .| delta: 1920
|
||||
0x0d0|00 |. |
|
||||
| | | tick: 44160
|
||||
0x0d0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0d0| 02 00 01 | ... | key: "A minor" (1)
|
||||
| | | [26]{}: KeySignature
|
||||
0x0d0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0d0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 46080
|
||||
0x0d0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0d0| 02 ff 01 | ... | key: "D minor" (65281)
|
||||
| | | [27]{}: KeySignature
|
||||
0x0d0| 9e 00 | .. | delta: 3840
|
||||
| | | time{}:
|
||||
0x0d0| 9e 00 | .. | delta: 3840
|
||||
| | | tick: 48000
|
||||
0x0d0| ff| .| metaevent: 89 (65369)
|
||||
0x0e0|59 |Y |
|
||||
0x0e0| 02 fe 01 | ... | key: "G minor" (65025)
|
||||
| | | [28]{}: KeySignature
|
||||
0x0e0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0e0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 51840
|
||||
0x0e0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0e0| 02 fd 01 | ... | key: "C minor" (64769)
|
||||
| | | [29]{}: KeySignature
|
||||
0x0e0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0e0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 53760
|
||||
0x0e0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0e0| 02| .| key: "F minor" (64513)
|
||||
0x0f0|fc 01 |.. |
|
||||
| | | [30]{}: KeySignature
|
||||
0x0f0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0f0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 55680
|
||||
0x0f0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0f0| 02 fb 01 | ... | key: "B♭ minor" (64257)
|
||||
| | | [31]{}: KeySignature
|
||||
0x0f0| 8f 00 | .. | delta: 1920
|
||||
| | | time{}:
|
||||
0x0f0| 8f 00 | .. | delta: 1920
|
||||
| | | tick: 57600
|
||||
0x0f0| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x0f0| 02 fa 01| ...| key: "E♭ minor" (64001)
|
||||
| | | [32]{}: KeySignature
|
||||
0x100|8f 00 |.. | delta: 1920
|
||||
| | | time{}:
|
||||
0x100|8f 00 |.. | delta: 1920
|
||||
| | | tick: 59520
|
||||
0x100| ff 59 | .Y | metaevent: 89 (65369)
|
||||
0x100| 02 f9 01 | ... | key: "A♭ minor" (63745)
|
||||
| | | [33]{}: EndOfTrack
|
||||
0x100| 00 | . | delta: 0
|
||||
| | | time{}:
|
||||
0x100| 00 | . | delta: 0
|
||||
| | | tick: 61440
|
||||
0x100| ff 2f | ./ | metaevent: 47 (65327)
|
||||
0x100| 00| | .| | length: 0
|
||||
|
76
format/midi/testdata/test.fqtest
vendored
76
format/midi/testdata/test.fqtest
vendored
@ -14,16 +14,22 @@ $ ./fq -d midi dv test.mid
|
||||
0x10| 00 00 00 20 | ... | length: 32 0x12-0x16 (4)
|
||||
| | | events[0:4]: 0x16-0x36 (32)
|
||||
| | | [0]{}: TrackName 0x16-0x23 (13)
|
||||
0x10| 00 | . | delta: 0 0x16-0x17 (1)
|
||||
| | | time{}: 0x16-0x17 (1)
|
||||
0x10| 00 | . | delta: 0 0x16-0x17 (1)
|
||||
| | | tick: 0
|
||||
0x10| ff 03 | .. | metaevent: 3 (65283) 0x17-0x19 (2)
|
||||
0x10| 09 45 78 61 6d 70 6c| .Exampl| name: "Example 1" 0x19-0x23 (10)
|
||||
0x20|65 20 31 |e 1 |
|
||||
| | | [1]{}: Tempo 0x23-0x2a (7)
|
||||
0x20| 00 | . | delta: 0 0x23-0x24 (1)
|
||||
| | | time{}: 0x23-0x24 (1)
|
||||
0x20| 00 | . | delta: 0 0x23-0x24 (1)
|
||||
| | | tick: 0
|
||||
0x20| ff 51 | .Q | metaevent: 81 (65361) 0x24-0x26 (2)
|
||||
0x20| 03 07 a1 20 | ... | tempo: 500000 0x26-0x2a (4)
|
||||
| | | [2]{}: TimeSignature 0x2a-0x32 (8)
|
||||
0x20| 00 | . | delta: 0 0x2a-0x2b (1)
|
||||
| | | time{}: 0x2a-0x2b (1)
|
||||
0x20| 00 | . | delta: 0 0x2a-0x2b (1)
|
||||
| | | tick: 0
|
||||
0x20| ff 58 | .X | metaevent: 88 (65368) 0x2b-0x2d (2)
|
||||
| | | signature{}: 0x2d-0x32 (5)
|
||||
0x20| 04 04 02| ...| bytes: "[4 2 24 8]" 0x2d-0x32 (5)
|
||||
@ -33,7 +39,9 @@ $ ./fq -d midi dv test.mid
|
||||
| | | ticksPerClick: 24
|
||||
| | | thirtySecondsPerQuarter: 8
|
||||
| | | [3]{}: EndOfTrack 0x32-0x36 (4)
|
||||
0x30| 00 | . | delta: 0 0x32-0x33 (1)
|
||||
| | | time{}: 0x32-0x33 (1)
|
||||
0x30| 00 | . | delta: 0 0x32-0x33 (1)
|
||||
| | | tick: 0
|
||||
0x30| ff 2f | ./ | metaevent: 47 (65327) 0x33-0x35 (2)
|
||||
0x30| 00 | . | length: 0 0x35-0x36 (1)
|
||||
| | | [1]{}: track 0x36-0x8e (88)
|
||||
@ -41,75 +49,105 @@ $ ./fq -d midi dv test.mid
|
||||
0x30| 00 00 00 50 | ...P | length: 80 0x3a-0x3e (4)
|
||||
| | | events[0:15]: 0x3e-0x8e (80)
|
||||
| | | [0]{}: TrackName 0x3e-0x51 (19)
|
||||
0x30| 00 | . | delta: 0 0x3e-0x3f (1)
|
||||
| | | time{}: 0x3e-0x3f (1)
|
||||
0x30| 00 | . | delta: 0 0x3e-0x3f (1)
|
||||
| | | tick: 0
|
||||
0x30| ff| .| metaevent: 3 (65283) 0x3f-0x41 (2)
|
||||
0x40|03 |. |
|
||||
0x40| 0f 41 63 6f 75 73 74 69 63 20 47 75 69 74 61| .Acoustic Guita| name: "Acoustic Guitar" 0x41-0x51 (16)
|
||||
0x50|72 |r |
|
||||
| | | [1]{}: ProgramChange 0x51-0x54 (3)
|
||||
0x50| 00 | . | delta: 0 0x51-0x52 (1)
|
||||
| | | time{}: 0x51-0x52 (1)
|
||||
0x50| 00 | . | delta: 0 0x51-0x52 (1)
|
||||
| | | tick: 0
|
||||
0x50| c0 | . | channel: 0 0x52-0x53 (1)
|
||||
0x50| 19 | . | program: 25 0x53-0x54 (1)
|
||||
| | | [2]{}: NoteOn 0x54-0x58 (4)
|
||||
0x50| 00 | . | delta: 0 0x54-0x55 (1)
|
||||
| | | time{}: 0x54-0x55 (1)
|
||||
0x50| 00 | . | delta: 0 0x54-0x55 (1)
|
||||
| | | tick: 0
|
||||
0x50| 90 | . | channel: 0 0x55-0x56 (1)
|
||||
0x50| 30 | 0 | note: "C3" (48) 0x56-0x57 (1)
|
||||
0x50| 48 | H | velocity: 72 0x57-0x58 (1)
|
||||
| | | [3]{}: KeySignature 0x58-0x5e (6)
|
||||
0x50| 00 | . | delta: 0 0x58-0x59 (1)
|
||||
| | | time{}: 0x58-0x59 (1)
|
||||
0x50| 00 | . | delta: 0 0x58-0x59 (1)
|
||||
| | | tick: 0
|
||||
0x50| ff 59 | .Y | metaevent: 89 (65369) 0x59-0x5b (2)
|
||||
0x50| 02 00 01 | ... | key: "A minor" (1) 0x5b-0x5e (3)
|
||||
| | | [4]{}: Controller 0x5e-0x62 (4)
|
||||
0x50| 00 | . | delta: 0 0x5e-0x5f (1)
|
||||
| | | time{}: 0x5e-0x5f (1)
|
||||
0x50| 00 | . | delta: 0 0x5e-0x5f (1)
|
||||
| | | tick: 0
|
||||
0x50| b0| .| channel: 0 0x5f-0x60 (1)
|
||||
0x60|65 |e | controller: "Registered Parameter Number (MSB)" (101) 0x60-0x61 (1)
|
||||
0x60| 00 | . | value: 0 0x61-0x62 (1)
|
||||
| | | [5]{}: Controller 0x62-0x66 (4)
|
||||
0x60| 00 | . | delta: 0 0x62-0x63 (1)
|
||||
| | | time{}: 0x62-0x63 (1)
|
||||
0x60| 00 | . | delta: 0 0x62-0x63 (1)
|
||||
| | | tick: 0
|
||||
0x60| b0 | . | channel: 0 0x63-0x64 (1)
|
||||
0x60| 64 | d | controller: "Registered Parameter Number (LSB)" (100) 0x64-0x65 (1)
|
||||
0x60| 00 | . | value: 0 0x65-0x66 (1)
|
||||
| | | [6]{}: Controller 0x66-0x6a (4)
|
||||
0x60| 00 | . | delta: 0 0x66-0x67 (1)
|
||||
| | | time{}: 0x66-0x67 (1)
|
||||
0x60| 00 | . | delta: 0 0x66-0x67 (1)
|
||||
| | | tick: 0
|
||||
0x60| b0 | . | channel: 0 0x67-0x68 (1)
|
||||
0x60| 06 | . | controller: "Data Entry (MSB)" (6) 0x68-0x69 (1)
|
||||
0x60| 06 | . | value: 6 0x69-0x6a (1)
|
||||
| | | [7]{}: NoteOff 0x6a-0x6f (5)
|
||||
0x60| 83 60 | .` | delta: 480 0x6a-0x6c (2)
|
||||
| | | time{}: 0x6a-0x6c (2)
|
||||
0x60| 83 60 | .` | delta: 480 0x6a-0x6c (2)
|
||||
| | | tick: 0
|
||||
0x60| 80 | . | channel: 0 0x6c-0x6d (1)
|
||||
0x60| 30 | 0 | note: "C3" (48) 0x6d-0x6e (1)
|
||||
0x60| 40 | @ | velocity: 64 0x6e-0x6f (1)
|
||||
| | | [8]{}: NoteOn 0x6f-0x73 (4)
|
||||
0x60| 00| .| delta: 0 0x6f-0x70 (1)
|
||||
| | | time{}: 0x6f-0x70 (1)
|
||||
0x60| 00| .| delta: 0 0x6f-0x70 (1)
|
||||
| | | tick: 480
|
||||
0x70|90 |. | channel: 0 0x70-0x71 (1)
|
||||
0x70| 32 | 2 | note: "D3" (50) 0x71-0x72 (1)
|
||||
0x70| 48 | H | velocity: 72 0x72-0x73 (1)
|
||||
| | | [9]{}: NoteOff 0x73-0x78 (5)
|
||||
0x70| 83 60 | .` | delta: 480 0x73-0x75 (2)
|
||||
| | | time{}: 0x73-0x75 (2)
|
||||
0x70| 83 60 | .` | delta: 480 0x73-0x75 (2)
|
||||
| | | tick: 480
|
||||
0x70| 80 | . | channel: 0 0x75-0x76 (1)
|
||||
0x70| 32 | 2 | note: "D3" (50) 0x76-0x77 (1)
|
||||
0x70| 40 | @ | velocity: 64 0x77-0x78 (1)
|
||||
| | | [10]{}: NoteOn 0x78-0x7c (4)
|
||||
0x70| 00 | . | delta: 0 0x78-0x79 (1)
|
||||
| | | time{}: 0x78-0x79 (1)
|
||||
0x70| 00 | . | delta: 0 0x78-0x79 (1)
|
||||
| | | tick: 960
|
||||
0x70| 90 | . | channel: 0 0x79-0x7a (1)
|
||||
0x70| 34 | 4 | note: "E3" (52) 0x7a-0x7b (1)
|
||||
0x70| 48 | H | velocity: 72 0x7b-0x7c (1)
|
||||
| | | [11]{}: NoteOff 0x7c-0x81 (5)
|
||||
0x70| 83 60 | .` | delta: 480 0x7c-0x7e (2)
|
||||
| | | time{}: 0x7c-0x7e (2)
|
||||
0x70| 83 60 | .` | delta: 480 0x7c-0x7e (2)
|
||||
| | | tick: 960
|
||||
0x70| 80 | . | channel: 0 0x7e-0x7f (1)
|
||||
0x70| 34| 4| note: "E3" (52) 0x7f-0x80 (1)
|
||||
0x80|40 |@ | velocity: 64 0x80-0x81 (1)
|
||||
| | | [12]{}: NoteOn 0x81-0x85 (4)
|
||||
0x80| 00 | . | delta: 0 0x81-0x82 (1)
|
||||
| | | time{}: 0x81-0x82 (1)
|
||||
0x80| 00 | . | delta: 0 0x81-0x82 (1)
|
||||
| | | tick: 1440
|
||||
0x80| 90 | . | channel: 0 0x82-0x83 (1)
|
||||
0x80| 35 | 5 | note: "F3" (53) 0x83-0x84 (1)
|
||||
0x80| 48 | H | velocity: 72 0x84-0x85 (1)
|
||||
| | | [13]{}: NoteOff 0x85-0x8a (5)
|
||||
0x80| 83 60 | .` | delta: 480 0x85-0x87 (2)
|
||||
| | | time{}: 0x85-0x87 (2)
|
||||
0x80| 83 60 | .` | delta: 480 0x85-0x87 (2)
|
||||
| | | tick: 1440
|
||||
0x80| 80 | . | channel: 0 0x87-0x88 (1)
|
||||
0x80| 35 | 5 | note: "F3" (53) 0x88-0x89 (1)
|
||||
0x80| 40 | @ | velocity: 64 0x89-0x8a (1)
|
||||
| | | [14]{}: EndOfTrack 0x8a-0x8e (4)
|
||||
0x80| 00 | . | delta: 0 0x8a-0x8b (1)
|
||||
| | | time{}: 0x8a-0x8b (1)
|
||||
0x80| 00 | . | delta: 0 0x8a-0x8b (1)
|
||||
| | | tick: 1920
|
||||
0x80| ff 2f | ./ | metaevent: 47 (65327) 0x8b-0x8d (2)
|
||||
0x80| 00| | .| | length: 0 0x8d-0x8e (1)
|
||||
|
Loading…
Reference in New Issue
Block a user