Public-ready: JSON tune specs, first-class loop API, licence, AGENTS.md

- MidiFile.set_loop(): one call writes LOOP_START/END, RPR LOOP
  START/END (Reaper) and LoopBegin/End markers - every engine finds
  its dialect; reader now parses markers and the smoke test asserts
  the round-trip
- tools/make_tune.py: declarative JSON spec -> fully arranged MIDI
  with style presets (dos_adventure, n64_ambient, chiptune_racing);
  the agent-friendly front door, no Python required
- tunes/specs/: demo tune 04 'Tea Break at the Terminal' (Am/112,
  loop bars 4-20) generated entirely from JSON
- AGENTS.md: spec schema, score grammar, verification loop, looping
  conventions for game BGM
- MIT LICENSE; history audited clean of credentials
This commit is contained in:
Hermes Agent committed 2026-10-17 06:59:04 +00:00
1 parent c3cd91d04f
commit 633eb92352
15 files changed
+387 -9

No files matched your search

+1 -2
View File
@@ -132,8 +132,7 @@ def build():
mf.add_track(lead); mf.add_track(counter); mf.add_track(bass)
mf.add_track(acomp); mf.add_track(d)
# loop points for game engines: intro plays once, A-B-A' loops
lead.marker(bar(4), "LOOP_START")
lead.marker(bar(28), "LOOP_END")
mf.set_loop(bar(4), bar(28))
return mf
+1 -2
View File
@@ -104,8 +104,7 @@ def build():
harp.note(bar(23), N(p), TPQ * 6, 40)
mf.add_track(lead); mf.add_track(pad); mf.add_track(harp); mf.add_track(bass)
lead.marker(bar(4), "LOOP_START")
lead.marker(bar(20), "LOOP_END")
mf.set_loop(bar(4), bar(20))
return mf
+1 -2
View File
@@ -128,8 +128,7 @@ def build():
mf.add_track(lead); mf.add_track(harm); mf.add_track(stabs)
mf.add_track(bass); mf.add_track(d)
lead.marker(bar(2), "LOOP_START")
lead.marker(bar(26), "LOOP_END")
mf.set_loop(bar(2), bar(26))
return mf
@@ -0,0 +1,18 @@
{
"name": "04_tea_break_at_the_terminal",
"style": "dos_adventure",
"bpm": 112,
"key": ["A", "minor"],
"loop": {"start_bar": 4, "end_bar": 20},
"fills_at": [11, 19],
"melody_start_bar": 4,
"chords": [
["A", "m"], ["F", ""], ["G", ""], ["A", "m"],
["A", "m"], ["A", "m"], ["F", ""], ["F", ""],
["G", ""], ["G", ""], ["A", "m"], ["A", "m"],
["A", "m"], ["A", "m"], ["F", ""], ["G", ""],
["A", "m"], ["G", ""], ["A", "m"], ["A", "m"],
["A", "m"], ["F", ""], ["G", ""], ["A", "m"]
],
"melody": "A4-8 C5-8 E5-4 A5-2 | G4-8 A4-8 C5-4 E5-2 | F5-8 E5-8 F5-8 A5-8 G5-4 F5-4 | E5-4 C5-4 F5-2 | D5-8 E5-8 G5-4 B5-2 | A5-8 B5-8 A5-8 G5-8 D5-4 G5-4 | C6-8 B5-8 C6-8 E6-8 D6-4 C6-4 | A5-2 E5-4 A5-4 | E5-8 G5-8 A5-4 C6-2 | B5-4 A5-4 E5-2 | A5-8 C6-8 A5-8 F5-8 E5-4 F5-4 | G5-8 A5-8 B5-4 D6-2 | C6-1 | B5-8 A5-8 G5-4 D5-2 | A5-8 G5-8 A5-8 C6-8 E6-4 D6-4 | A5-1"
}