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:
1 parent
c3cd91d04f
commit
633eb92352
15 files changed
+387
-9
No files matched your search
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
Reference in new issue
Block a user