FAILURE MAP
← Case archive

FA-81681 / MIDI event timing / Open access

Loop-region playback event firing: loop wraps to the song start · case 01

After the first pass the song position jumps to tick 0 instead of the loop start, replaying the intro.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The wrapped position omits the loop start offset.

VERIFIED REPAIR

Restore the wrap origin step so that it reads `ls + (p - le) % L`.

Unsuccessful approach: Reducing modulo the loop end instead of the loop length skews every pass after the first.

Case contract

Input [loop_start, loop_end, events, from_tick, to_tick]. Playback runs over playback ticks p in [from, to). Song position is p while p < loop_end, afterwards loop_start + (p - loop_end) mod (loop_end - loop_start). Every event whose song tick equals the song position fires as [p, event_tick]. Requires 0 <= loop_start < loop_end and 0 <= from < loop_end, else 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) != 5:
        return None
    ls, le, events, start, stop = x
    if not 0 <= ls < le or start >= le or start < 0:
        return None
    L = le - ls
    hits = []
    for p in range(start, stop):
        song = p if p < le else (p - le) % L
        for e in sorted(events):
            if e == song:
                hits.append([p, e])
    return hits
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([4, 8, [4, 6], 0, 16], [[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]), ([4, 8, [8], 0, 16], []), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 9, 10], None), ([5, 5, [5], 0, 5], None), ([4, 8, [4], -1, 4], None)], [([4, 8, [4, 6], 0, 16], [[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]), ([4, 8, [8], 0, 16], []), ([4, 8, [7], 0, 20], [[7, 7], [11, 7], [15, 7], [19, 7]]), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([5, 5, [5], 0, 5], None), ([4, 8, [4], -1, 4], None)], [([4, 8, [8], 0, 16], []), ([4, 8, [7], 0, 20], [[7, 7], [11, 7], [15, 7], [19, 7]]), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 3, 12], [[4, 4], [8, 4]]), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])], [([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 3, 12], [[4, 4], [8, 4]]), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])], [([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 9, 10], None), ([5, 5, [5], 0, 5], None), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])]]
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 fixtureActualExpectedOutcome
oracle 0[[4, 4], [6, 6]][[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]Failed
oracle 1[][]Passed
oracle 2[[0, 0], [2, 2], [5, 5], [6, 0], [8, 2], [10, 0], [12, 2]][[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]Failed
oracle 3[[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]][[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]Passed
oracle 4NoneNonePassed
oracle 5NoneNonePassed
oracle 6NoneNonePassed
oracle 7NoneNonePassed

SHA-256 / 0b9641c4918f59b799eccfb4e30faae699b729add310607041260759fb5a1f92

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) != 5:
        return None
    ls, le, events, start, stop = x
    if not 0 <= ls < le or start >= le or start < 0:
        return None
    L = le - ls
    hits = []
    for p in range(start, stop):
        song = p if p < le else ls + (p - le) % le
        for e in sorted(events):
            if e == song:
                hits.append([p, e])
    return hits
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([4, 8, [4, 6], 0, 16], [[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]), ([4, 8, [8], 0, 16], []), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 9, 10], None), ([5, 5, [5], 0, 5], None), ([4, 8, [4], -1, 4], None)], [([4, 8, [4, 6], 0, 16], [[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]), ([4, 8, [8], 0, 16], []), ([4, 8, [7], 0, 20], [[7, 7], [11, 7], [15, 7], [19, 7]]), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([5, 5, [5], 0, 5], None), ([4, 8, [4], -1, 4], None)], [([4, 8, [8], 0, 16], []), ([4, 8, [7], 0, 20], [[7, 7], [11, 7], [15, 7], [19, 7]]), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 3, 12], [[4, 4], [8, 4]]), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])], [([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 3, 12], [[4, 4], [8, 4]]), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])], [([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 9, 10], None), ([5, 5, [5], 0, 5], None), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])]]
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 fixtureActualExpectedOutcome
oracle 0[[4, 4], [6, 6], [8, 4], [10, 6]][[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]Failed
oracle 1[[12, 8]][]Failed
oracle 2[[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [12, 2]][[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]Failed
oracle 3[[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]][[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]Passed
oracle 4NoneNonePassed
oracle 5NoneNonePassed
oracle 6NoneNonePassed
oracle 7NoneNonePassed

SHA-256 / 73cf0d7a9b9e11d9100169b73b408af9cc070b4272b3bdb0e582f2cc2549e164

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) != 5:
        return None
    ls, le, events, start, stop = x
    if not 0 <= ls < le or start >= le or start < 0:
        return None
    L = le - ls
    hits = []
    for p in range(start, stop):
        song = p if p < le else ls + (p - le) % L
        for e in sorted(events):
            if e == song:
                hits.append([p, e])
    return hits
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[([4, 8, [4, 6], 0, 16], [[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]), ([4, 8, [8], 0, 16], []), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 9, 10], None), ([5, 5, [5], 0, 5], None), ([4, 8, [4], -1, 4], None)], [([4, 8, [4, 6], 0, 16], [[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]), ([4, 8, [8], 0, 16], []), ([4, 8, [7], 0, 20], [[7, 7], [11, 7], [15, 7], [19, 7]]), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([5, 5, [5], 0, 5], None), ([4, 8, [4], -1, 4], None)], [([4, 8, [8], 0, 16], []), ([4, 8, [7], 0, 20], [[7, 7], [11, 7], [15, 7], [19, 7]]), ([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 3, 12], [[4, 4], [8, 4]]), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])], [([2, 6, [0, 2, 5], 0, 14], [[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]), ([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 3, 12], [[4, 4], [8, 4]]), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])], [([0, 4, [0, 3], 0, 10], [[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]), ([4, 8, [1, 5], 6, 14], [[9, 5], [13, 5]]), ([3, 5, [3, 4, 5], 0, 12], [[3, 3], [4, 4], [5, 3], [6, 4], [7, 3], [8, 4], [9, 3], [10, 4], [11, 3]]), ([4, 8, [4], 8, 9], None), ([4, 8, [4], 9, 10], None), ([5, 5, [5], 0, 5], None), ([10, 20, [12, 19], 15, 40], [[19, 19], [22, 12], [29, 19], [32, 12], [39, 19]]), ([1, 9, [1, 8], 0, 20], [[1, 1], [8, 8], [9, 1], [16, 8], [17, 1]])]]
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 fixtureActualExpectedOutcome
oracle 0[[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]][[4, 4], [6, 6], [8, 4], [10, 6], [12, 4], [14, 6]]Passed
oracle 1[][]Passed
oracle 2[[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]][[0, 0], [2, 2], [5, 5], [6, 2], [9, 5], [10, 2], [13, 5]]Passed
oracle 3[[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]][[0, 0], [3, 3], [4, 0], [7, 3], [8, 0]]Passed
oracle 4NoneNonePassed
oracle 5NoneNonePassed
oracle 6NoneNonePassed
oracle 7NoneNonePassed

SHA-256 / 9d3da0b7395fe7a35164d51a362e82abcb21a4e4bd83486436bd91a1e8d586d2

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:05.119321+00:00.

Case digest / 0623e51cd1c7096ed44b5fd04dadf34ab24ddecad871e71c1fd8c9fdbdaacd9e