1
1
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:
twystd 2024-08-21 19:59:34 -07:00
parent 54a0cf1284
commit 59b1faa4b9
8 changed files with 292 additions and 128 deletions

View File

@ -15,7 +15,7 @@
- notes
- (?) add to probe group
- [ ] tick field
- [x] tick field
- [ ] assert available bytes
- [x] fix gaps

View File

@ -1,6 +0,0 @@
package midi
type context struct {
running uint8
casio bool
}

View File

@ -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 {

View File

@ -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,
}

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)