{"abstract":"F, G, A and B read one semitone sharp (F4 reports 66) while C, D and E stay correct.","category":"Music interval and transposition theory","checks":8,"contract":"Input a spelled pitch string: uppercase letter A-G, any run of accidentals (# = +1, b = -1, x = +2), then a signed integer octave where C4 = 60 and C-1 = 0. Return the MIDI key number, or None for malformed text or results outside 0..127.","evaluation_group":"w2-music-interval-spelled-midi","failed_approach":"The half-step correction compares letters alphabetically, so A and B (which sort before E) keep the extra semitone.","family":"w2-music-interval-spelled-midi-natural-letter-table","id":"FA-80846","implementations":{"attempt":{"sha256":"029ab794bdf82b929714ad98e8c4fee82653147d4cf9322f409dccca3ad7ba8e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    names = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11}\n    if not isinstance(x, str) or len(x) < 2 or x[0] not in names:\n        return None\n    i = 1\n    acc = 0\n    while i < len(x) and x[i] in '#bx':\n        acc += {'#': 1, 'b': -1, 'x': 2}[x[i]]\n        i += 1\n    tail = x[i:]\n    neg = tail.startswith('-')\n    digits = tail[1:] if neg else tail\n    if not digits.isdigit():\n        return None\n    octave = -int(digits) if neg else int(digits)\n    midi = (octave + 1) * 12 + 'CDEFGAB'.index(x[0]) * 2 - (1 if x[0] > 'E' else 0) + acc\n    if midi < 0 or midi > 127:\n        return None\n    return midi\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('C4', 60), ('A4', 69), ('C-1', 0), ('G#9', None), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('B4', 71)], [('G9', 127), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('Fx4', 67), ('Ebb4', 62), ('Dbbb4', 59), ('Bb3', 58)], [('B#3', 60), ('Dbbb4', 59), ('Cb-1', None), ('B-1', 11), ('E4', 64), ('C0', 12), ('D#0', 15), ('A0', 21)], [('Fx4', 67), ('F4', 65), ('B4', 71), ('C0', 12), ('D#0', 15), ('Cx-1', 2), ('H4', None), ('Bx-1', 13)], [('B-1', 11), ('B4', 71), ('Bb3', 58), ('H4', None), ('C', None), ('c4', None), ('C#', None), ('Ab-1', 8)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"oracle %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"592b8df12820ec30de01676d81b1596d6a2bc9fad0811efcbc15c14376c2ea05","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    names = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11}\n    if not isinstance(x, str) or len(x) < 2 or x[0] not in names:\n        return None\n    i = 1\n    acc = 0\n    while i < len(x) and x[i] in '#bx':\n        acc += {'#': 1, 'b': -1, 'x': 2}[x[i]]\n        i += 1\n    tail = x[i:]\n    neg = tail.startswith('-')\n    digits = tail[1:] if neg else tail\n    if not digits.isdigit():\n        return None\n    octave = -int(digits) if neg else int(digits)\n    midi = (octave + 1) * 12 + 'CDEFGAB'.index(x[0]) * 2 + acc\n    if midi < 0 or midi > 127:\n        return None\n    return midi\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('C4', 60), ('A4', 69), ('C-1', 0), ('G#9', None), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('B4', 71)], [('G9', 127), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('Fx4', 67), ('Ebb4', 62), ('Dbbb4', 59), ('Bb3', 58)], [('B#3', 60), ('Dbbb4', 59), ('Cb-1', None), ('B-1', 11), ('E4', 64), ('C0', 12), ('D#0', 15), ('A0', 21)], [('Fx4', 67), ('F4', 65), ('B4', 71), ('C0', 12), ('D#0', 15), ('Cx-1', 2), ('H4', None), ('Bx-1', 13)], [('B-1', 11), ('B4', 71), ('Bb3', 58), ('H4', None), ('C', None), ('c4', None), ('C#', None), ('Ab-1', 8)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"oracle %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"2c492173f06455be85b9803aec74ba9d1441e9e732b46b1d2f41ec863ec8a7a7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    names = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11}\n    if not isinstance(x, str) or len(x) < 2 or x[0] not in names:\n        return None\n    i = 1\n    acc = 0\n    while i < len(x) and x[i] in '#bx':\n        acc += {'#': 1, 'b': -1, 'x': 2}[x[i]]\n        i += 1\n    tail = x[i:]\n    neg = tail.startswith('-')\n    digits = tail[1:] if neg else tail\n    if not digits.isdigit():\n        return None\n    octave = -int(digits) if neg else int(digits)\n    midi = (octave + 1) * 12 + names[x[0]] + acc\n    if midi < 0 or midi > 127:\n        return None\n    return midi\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('C4', 60), ('A4', 69), ('C-1', 0), ('G#9', None), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('B4', 71)], [('G9', 127), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('Fx4', 67), ('Ebb4', 62), ('Dbbb4', 59), ('Bb3', 58)], [('B#3', 60), ('Dbbb4', 59), ('Cb-1', None), ('B-1', 11), ('E4', 64), ('C0', 12), ('D#0', 15), ('A0', 21)], [('Fx4', 67), ('F4', 65), ('B4', 71), ('C0', 12), ('D#0', 15), ('Cx-1', 2), ('H4', None), ('Bx-1', 13)], [('B-1', 11), ('B4', 71), ('Bb3', 58), ('H4', None), ('C', None), ('c4', None), ('C#', None), ('Ab-1', 8)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"oracle %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic bounded teaching model with a stipulated toy contract; it is not a complete music notation or theory engine. 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-music-interval-spelled-midi-natural-letter-table","generated_at":"2026-09-29T14:49:57.442866+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Pitch spelling and interval arithmetic decide the notes that notation, transposition and analysis tools display or play.","repair":"Restore the natural letter table step so that it reads `names[x[0]] + acc`.","root_cause":"The natural-letter offset is derived as twice the letter index, ignoring the E-F and B-C half steps of the diatonic scale.","sha256":"c366e083338b430ea1a39b62f04811deef928a98e0366d557b773edb23ba0789","title":"Spelled pitch to MIDI key number: letters treated as evenly spaced whole tones · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.594,"exit_code":1,"observations":[{"actual":60,"check":"oracle 0","expected":60,"passed":true},{"actual":70,"check":"oracle 1","expected":69,"passed":false},{"actual":0,"check":"oracle 2","expected":0,"passed":true},{"actual":null,"check":"oracle 3","expected":null,"passed":true},{"actual":null,"check":"oracle 4","expected":null,"passed":true},{"actual":61,"check":"oracle 5","expected":60,"passed":false},{"actual":59,"check":"oracle 6","expected":59,"passed":true},{"actual":72,"check":"oracle 7","expected":71,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"oracle 0\", \"actual\": 60, \"expected\": 60, \"passed\": true}, {\"check\": \"oracle 1\", \"actual\": 70, \"expected\": 69, \"passed\": false}, {\"check\": \"oracle 2\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"oracle 3\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 5\", \"actual\": 61, \"expected\": 60, \"passed\": false}, {\"check\": \"oracle 6\", \"actual\": 59, \"expected\": 59, \"passed\": true}, {\"check\": \"oracle 7\", \"actual\": 72, \"expected\": 71, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.613,"exit_code":1,"observations":[{"actual":60,"check":"oracle 0","expected":60,"passed":true},{"actual":70,"check":"oracle 1","expected":69,"passed":false},{"actual":0,"check":"oracle 2","expected":0,"passed":true},{"actual":null,"check":"oracle 3","expected":null,"passed":true},{"actual":null,"check":"oracle 4","expected":null,"passed":true},{"actual":61,"check":"oracle 5","expected":60,"passed":false},{"actual":59,"check":"oracle 6","expected":59,"passed":true},{"actual":72,"check":"oracle 7","expected":71,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"oracle 0\", \"actual\": 60, \"expected\": 60, \"passed\": true}, {\"check\": \"oracle 1\", \"actual\": 70, \"expected\": 69, \"passed\": false}, {\"check\": \"oracle 2\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"oracle 3\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 5\", \"actual\": 61, \"expected\": 60, \"passed\": false}, {\"check\": \"oracle 6\", \"actual\": 59, \"expected\": 59, \"passed\": true}, {\"check\": \"oracle 7\", \"actual\": 72, \"expected\": 71, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.463,"exit_code":0,"observations":[{"actual":60,"check":"oracle 0","expected":60,"passed":true},{"actual":69,"check":"oracle 1","expected":69,"passed":true},{"actual":0,"check":"oracle 2","expected":0,"passed":true},{"actual":null,"check":"oracle 3","expected":null,"passed":true},{"actual":null,"check":"oracle 4","expected":null,"passed":true},{"actual":60,"check":"oracle 5","expected":60,"passed":true},{"actual":59,"check":"oracle 6","expected":59,"passed":true},{"actual":71,"check":"oracle 7","expected":71,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"oracle 0\", \"actual\": 60, \"expected\": 60, \"passed\": true}, {\"check\": \"oracle 1\", \"actual\": 69, \"expected\": 69, \"passed\": true}, {\"check\": \"oracle 2\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"oracle 3\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 5\", \"actual\": 60, \"expected\": 60, \"passed\": true}, {\"check\": \"oracle 6\", \"actual\": 59, \"expected\": 59, \"passed\": true}, {\"check\": \"oracle 7\", \"actual\": 71, \"expected\": 71, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}