FA-81771 / MIDI event timing / Open access
Time Signature meta event decoding: declared length of time signature not checked · case 01
A malformed event declaring length 5 or 3 is decoded as if valid.
ROOT CAUSE
The meta-event length byte is not validated.
VERIFIED REPAIR
Restore the meta length byte step so that it reads `or data[2] != 4`.
Unsuccessful approach: Rejecting only short declarations still accepts a declared length of five.
Case contract
Input [bytes, ppq]. bytes must be FF 58 04 nn dd cc bb with nn > 0, dd <= 6 and bb > 0. The denominator is 2**dd; the metronome click is cc MIDI clocks (24 per quarter) converted to ticks as ppq*cc//24; the bar length in ticks is ppq*4*nn//denominator. Return [nn, denominator, click_ticks, bar_ticks] or None.
Why this case matters
MIDI sequencers, file readers and synth drivers depend on exact event ordering and tick/time arithmetic.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
if not isinstance(x, list) or len(x) != 2:
return None
data, ppq = x
if len(data) != 7 or data[0] != 0xFF or data[1] != 0x58:
return None
nn, dd, cc, bb = data[3:7]
if nn == 0 or dd > 6 or bb == 0 or ppq <= 0:
return None
den = 2 ** dd
click = ppq * cc // 24
bar = ppq * 4 * nn // den
return [nn, den, click, bar]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 6, 3, 36, 8], 480], [6, 8, 720, 1440]), ([[255, 88, 4, 3, 2, 24, 8], 100], [3, 4, 100, 300]), ([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 4, 5, 4, 6, 8], 90], [5, 16, 22, 112]), ([[255, 88, 4, 2, 1, 48, 8], 96], [2, 2, 192, 384]), ([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 5, 4, 2, 24, 8], 480], None)], [([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 4, 5, 4, 6, 8], 90], [5, 16, 22, 112]), ([[255, 88, 4, 2, 1, 48, 8], 96], [2, 2, 192, 384]), ([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 4, 4, 2, 24, 8], 0], None), ([[255, 88, 4, 0, 2, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None)], [([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 4, 4, 2, 24, 8], 0], None), ([[255, 88, 4, 0, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 7, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 89, 4, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 2, 24, 0], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450])], [([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 4, 7, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None), ([[255, 89, 4, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 2, 24, 0], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450]), ([[255, 88, 4, 4, 0, 96, 8], 120], [4, 1, 480, 1920])], [([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 6, 3, 36, 8], 480], [6, 8, 720, 1440]), ([[255, 88, 4, 3, 2, 24, 8], 100], [3, 4, 100, 300]), ([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450]), ([[255, 88, 4, 4, 0, 96, 8], 120], [4, 1, 480, 1920])]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("oracle %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| oracle 0 | [4, 4, 480, 1920] | [4, 4, 480, 1920] | Passed |
| oracle 1 | [6, 8, 720, 1440] | [6, 8, 720, 1440] | Passed |
| oracle 2 | [3, 4, 100, 300] | [3, 4, 100, 300] | Passed |
| oracle 3 | [7, 8, 45, 315] | [7, 8, 45, 315] | Passed |
| oracle 4 | [5, 16, 22, 112] | [5, 16, 22, 112] | Passed |
| oracle 5 | [2, 2, 192, 384] | [2, 2, 192, 384] | Passed |
| oracle 6 | [3, 16, 22, 67] | [3, 16, 22, 67] | Passed |
| oracle 7 | [4, 4, 480, 1920] | None | Failed |
SHA-256 / fe989e32fd6bd7fbb238f5254bbd45ce48e199165678369f0679f8a7099554c6
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
if not isinstance(x, list) or len(x) != 2:
return None
data, ppq = x
if len(data) != 7 or data[0] != 0xFF or data[1] != 0x58 or data[2] < 4:
return None
nn, dd, cc, bb = data[3:7]
if nn == 0 or dd > 6 or bb == 0 or ppq <= 0:
return None
den = 2 ** dd
click = ppq * cc // 24
bar = ppq * 4 * nn // den
return [nn, den, click, bar]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 6, 3, 36, 8], 480], [6, 8, 720, 1440]), ([[255, 88, 4, 3, 2, 24, 8], 100], [3, 4, 100, 300]), ([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 4, 5, 4, 6, 8], 90], [5, 16, 22, 112]), ([[255, 88, 4, 2, 1, 48, 8], 96], [2, 2, 192, 384]), ([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 5, 4, 2, 24, 8], 480], None)], [([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 4, 5, 4, 6, 8], 90], [5, 16, 22, 112]), ([[255, 88, 4, 2, 1, 48, 8], 96], [2, 2, 192, 384]), ([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 4, 4, 2, 24, 8], 0], None), ([[255, 88, 4, 0, 2, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None)], [([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 4, 4, 2, 24, 8], 0], None), ([[255, 88, 4, 0, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 7, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 89, 4, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 2, 24, 0], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450])], [([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 4, 7, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None), ([[255, 89, 4, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 2, 24, 0], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450]), ([[255, 88, 4, 4, 0, 96, 8], 120], [4, 1, 480, 1920])], [([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 6, 3, 36, 8], 480], [6, 8, 720, 1440]), ([[255, 88, 4, 3, 2, 24, 8], 100], [3, 4, 100, 300]), ([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450]), ([[255, 88, 4, 4, 0, 96, 8], 120], [4, 1, 480, 1920])]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("oracle %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| oracle 0 | [4, 4, 480, 1920] | [4, 4, 480, 1920] | Passed |
| oracle 1 | [6, 8, 720, 1440] | [6, 8, 720, 1440] | Passed |
| oracle 2 | [3, 4, 100, 300] | [3, 4, 100, 300] | Passed |
| oracle 3 | [7, 8, 45, 315] | [7, 8, 45, 315] | Passed |
| oracle 4 | [5, 16, 22, 112] | [5, 16, 22, 112] | Passed |
| oracle 5 | [2, 2, 192, 384] | [2, 2, 192, 384] | Passed |
| oracle 6 | [3, 16, 22, 67] | [3, 16, 22, 67] | Passed |
| oracle 7 | [4, 4, 480, 1920] | None | Failed |
SHA-256 / 11b5c2a4b815320f40946392d575d7737d66c949490199e4425f29049573643d
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
if not isinstance(x, list) or len(x) != 2:
return None
data, ppq = x
if len(data) != 7 or data[0] != 0xFF or data[1] != 0x58 or data[2] != 4:
return None
nn, dd, cc, bb = data[3:7]
if nn == 0 or dd > 6 or bb == 0 or ppq <= 0:
return None
den = 2 ** dd
click = ppq * cc // 24
bar = ppq * 4 * nn // den
return [nn, den, click, bar]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 6, 3, 36, 8], 480], [6, 8, 720, 1440]), ([[255, 88, 4, 3, 2, 24, 8], 100], [3, 4, 100, 300]), ([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 4, 5, 4, 6, 8], 90], [5, 16, 22, 112]), ([[255, 88, 4, 2, 1, 48, 8], 96], [2, 2, 192, 384]), ([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 5, 4, 2, 24, 8], 480], None)], [([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 4, 5, 4, 6, 8], 90], [5, 16, 22, 112]), ([[255, 88, 4, 2, 1, 48, 8], 96], [2, 2, 192, 384]), ([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 4, 4, 2, 24, 8], 0], None), ([[255, 88, 4, 0, 2, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None)], [([[255, 88, 4, 3, 4, 6, 8], 90], [3, 16, 22, 67]), ([[255, 88, 4, 4, 2, 24, 8], 0], None), ([[255, 88, 4, 0, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 7, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 89, 4, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 2, 24, 0], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450])], [([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 4, 7, 24, 8], 480], None), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None), ([[255, 89, 4, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 4, 2, 24, 0], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450]), ([[255, 88, 4, 4, 0, 96, 8], 120], [4, 1, 480, 1920])], [([[255, 88, 4, 4, 2, 24, 8], 480], [4, 4, 480, 1920]), ([[255, 88, 4, 6, 3, 36, 8], 480], [6, 8, 720, 1440]), ([[255, 88, 4, 3, 2, 24, 8], 100], [3, 4, 100, 300]), ([[255, 88, 4, 7, 3, 12, 8], 90], [7, 8, 45, 315]), ([[255, 88, 5, 4, 2, 24, 8], 480], None), ([[255, 88, 3, 4, 2, 24, 8], 480], None), ([[255, 88, 4, 9, 3, 18, 8], 100], [9, 8, 75, 450]), ([[255, 88, 4, 4, 0, 96, 8], 120], [4, 1, 480, 1920])]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("oracle %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| oracle 0 | [4, 4, 480, 1920] | [4, 4, 480, 1920] | Passed |
| oracle 1 | [6, 8, 720, 1440] | [6, 8, 720, 1440] | Passed |
| oracle 2 | [3, 4, 100, 300] | [3, 4, 100, 300] | Passed |
| oracle 3 | [7, 8, 45, 315] | [7, 8, 45, 315] | Passed |
| oracle 4 | [5, 16, 22, 112] | [5, 16, 22, 112] | Passed |
| oracle 5 | [2, 2, 192, 384] | [2, 2, 192, 384] | Passed |
| oracle 6 | [3, 16, 22, 67] | [3, 16, 22, 67] | Passed |
| oracle 7 | None | None | Passed |
SHA-256 / 90abffadac0b16439f731c7a5fa320e091350aea9b088bf899572cf5c8a2f1ae
Verification & scope
A deterministic bounded teaching model with a stipulated toy contract; it is not a complete Standard MIDI File or MIDI 1.0/2.0 implementation. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:50:06.015553+00:00.
Case digest / dd44c257824f1a5b723ede74d20f09120029f4e377ecdbbcf791e805cbbc47cd