Midi Time Signature Explained

FF 58 04 nn dd cc bb – is the construct of the time signature. So this event lives on the track. Outside on the midi file is the 5th element called ticks_per_beat. This is so the notation of the signature used by musicians is decoupled from tempo. We can still preserve the same structure when we play the file faster or slower so let’s plug in some parameters. Below is example of a file I’m working on, sorry if different from yours. I’ve set the tempo to 110 (different from default) so it ends up in the file.

[Midi File Level]
ticks_per_beat = 120

[Track Level - MIDO]
clocks_per_click = 36
denominator = 4
numerator = 4
notated_32nd_notes_per_beat = 8

I have created a midi file in Ableton with half-notes just so we stay sane and can reverse engineer the math for mido package specific. Just so we’re clear I also assumed 4/4 time signature. You don’t have to worry about hex values everything here above is already decimal (!!)

[Midi File Level]
Ticks Per Beat = Time per beat - Microseconds Per MIDI quarter-note [FF 51 03]
RAW HEX = FF 51 03 05 16 15 - number encoded in last 3 bytes
HEX-0852AF = DEC-545455
1 minute = 60,000,000 microseconds
60,000,000 / 545455 = 109.999908333409722 (float) or 110.00 (with 2 digit accuracy)

[Track Level]
RAW HEX = FF 58 04 04 02 24 08
4th byte - nn - numerator  = 04hex = 2dec -  same
5th byte - dd = denominator = 02hex = 2dec - 2^2 = 4 same
6th byte - cc = clocks_per_click = 24hex and 36dec same
7th byte - bb = notated_32nd_notes_per_beat = 8 same

So just to recap. Midi-level ticks_per_beat are providing very accurate actual time representation. How fast do we want to play your midi structure. Track-level bytes 4-7 of the FF 58 04 message give us musical structure. Decoupled (actual time microseconds, bpms etc) from music structure (bars, quarternotes etc)

Wikipedia has audible example of 4/4 vs 12/8

And probably my favourite example
Return to Sauce by Infected Mushroom

Fav Mac Terminal Setup

Andale Mono 13

export PS1="\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "
export CLICOLOR=1
export LSCOLORS=GxFxCxDxCxegedabagaced