Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@
*.py text eol=lf
*.md text eol=lf
*.json text eol=lf

# Preserve the approved binary stream and literal per-note audit bytes.
examples/doebel/DOEBEL.VGM binary
examples/doebel/NOTES.csv binary
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,9 @@ non-owning speaker callback contract. `examples/dos_sfx_demo.c` builds as
finite harpoon, silent gap, conch and all-channel stop sequence from
foreground retrace polling only.

[`examples/doebel/`](examples/doebel/README.md) adds an optional three-tone
"Doebelinschmirtz Incorporated" jingle example using `lt_score`.
`DOEBEL.EXE` plays it once in foreground DOS; the checked-in score header and
PSG VGM need no Python preparation. The recognizable tune is a reduction of
the referenced *Evil Jingle*, with separate musical attribution in the example.

183 changes: 183 additions & 0 deletions examples/doebel/APPROVED.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
/* Frozen register fixture from the approved host audition.
* Musical attribution: README.md. Do not regenerate from candidate notes.
*/
#ifndef DOEBEL_APPROVED_H
#define DOEBEL_APPROVED_H
typedef struct { unsigned frame; lt_u8 byte; } doebel_approved_write;
#define DOEBEL_APPROVED_WRITES 173U
static const doebel_approved_write doebel_approved[] = {
{ 0U, 0x9fU },
{ 0U, 0xbfU },
{ 0U, 0xdfU },
{ 0U, 0xffU },
{ 0U, 0x9fU },
{ 0U, 0xbfU },
{ 0U, 0xdfU },
{ 0U, 0xffU },
{ 0U, 0xe4U },
{ 0U, 0x80U },
{ 0U, 0x14U },
{ 0U, 0x94U },
{ 0U, 0xacU },
{ 0U, 0x1aU },
{ 0U, 0xbbU },
{ 0U, 0xcaU },
{ 0U, 0x2fU },
{ 0U, 0xd9U },
{ 4U, 0x92U },
{ 4U, 0xb9U },
{ 4U, 0xd7U },
{ 48U, 0x95U },
{ 48U, 0xbcU },
{ 55U, 0xbfU },
{ 56U, 0x9fU },
{ 57U, 0x8dU },
{ 57U, 0x17U },
{ 57U, 0x94U },
{ 61U, 0x92U },
{ 75U, 0xdaU },
{ 77U, 0x95U },
{ 82U, 0xdfU },
{ 84U, 0x9fU },
{ 86U, 0x80U },
{ 86U, 0x14U },
{ 86U, 0x94U },
{ 86U, 0xacU },
{ 86U, 0x1aU },
{ 86U, 0xbbU },
{ 86U, 0xcaU },
{ 86U, 0x2fU },
{ 86U, 0xd9U },
{ 90U, 0x92U },
{ 90U, 0xb9U },
{ 90U, 0xd7U },
{ 160U, 0xdaU },
{ 161U, 0xbcU },
{ 162U, 0x95U },
{ 167U, 0xdfU },
{ 168U, 0xbfU },
{ 169U, 0x9fU },
{ 171U, 0x8dU },
{ 171U, 0x10U },
{ 171U, 0x94U },
{ 171U, 0xa3U },
{ 171U, 0x15U },
{ 171U, 0xbbU },
{ 171U, 0xc7U },
{ 171U, 0x2aU },
{ 171U, 0xd9U },
{ 175U, 0x92U },
{ 175U, 0xb9U },
{ 175U, 0xd7U },
{ 218U, 0xbcU },
{ 219U, 0x95U },
{ 225U, 0xbfU },
{ 226U, 0x9fU },
{ 228U, 0x83U },
{ 228U, 0x15U },
{ 228U, 0x94U },
{ 232U, 0x92U },
{ 245U, 0xdaU },
{ 247U, 0x95U },
{ 252U, 0xdfU },
{ 254U, 0x9fU },
{ 256U, 0x8dU },
{ 256U, 0x10U },
{ 256U, 0x94U },
{ 256U, 0xa3U },
{ 256U, 0x15U },
{ 256U, 0xbbU },
{ 256U, 0xc7U },
{ 256U, 0x2aU },
{ 256U, 0xd9U },
{ 260U, 0x92U },
{ 260U, 0xb9U },
{ 260U, 0xd7U },
{ 331U, 0xbcU },
{ 331U, 0xdaU },
{ 332U, 0x95U },
{ 338U, 0xdfU },
{ 339U, 0x9fU },
{ 339U, 0xbfU },
{ 341U, 0x82U },
{ 341U, 0x0eU },
{ 341U, 0x94U },
{ 341U, 0xadU },
{ 341U, 0x11U },
{ 341U, 0xbbU },
{ 341U, 0xc7U },
{ 341U, 0x35U },
{ 341U, 0xd9U },
{ 345U, 0x92U },
{ 345U, 0xb9U },
{ 345U, 0xd7U },
{ 416U, 0xdaU },
{ 417U, 0xbcU },
{ 418U, 0x95U },
{ 423U, 0xdfU },
{ 424U, 0xbfU },
{ 425U, 0x9fU },
{ 426U, 0x82U },
{ 426U, 0x0eU },
{ 426U, 0x94U },
{ 426U, 0xadU },
{ 426U, 0x11U },
{ 426U, 0xbbU },
{ 426U, 0xc7U },
{ 426U, 0x35U },
{ 426U, 0xd9U },
{ 430U, 0x92U },
{ 430U, 0xb9U },
{ 430U, 0xd7U },
{ 473U, 0xbcU },
{ 473U, 0xdaU },
{ 474U, 0x95U },
{ 480U, 0xdfU },
{ 481U, 0x9fU },
{ 481U, 0xbfU },
{ 483U, 0x82U },
{ 483U, 0x0eU },
{ 483U, 0x94U },
{ 483U, 0xadU },
{ 483U, 0x11U },
{ 483U, 0xbbU },
{ 483U, 0xc7U },
{ 483U, 0x35U },
{ 483U, 0xd9U },
{ 487U, 0x92U },
{ 487U, 0xb9U },
{ 487U, 0xd7U },
{ 558U, 0xdaU },
{ 559U, 0x95U },
{ 559U, 0xbcU },
{ 565U, 0xdfU },
{ 566U, 0xbfU },
{ 567U, 0x9fU },
{ 568U, 0x82U },
{ 568U, 0x0eU },
{ 568U, 0x94U },
{ 568U, 0xadU },
{ 568U, 0x11U },
{ 568U, 0xbbU },
{ 568U, 0xc7U },
{ 568U, 0x35U },
{ 568U, 0xd9U },
{ 572U, 0x92U },
{ 572U, 0xb9U },
{ 572U, 0xd7U },
{ 927U, 0xdaU },
{ 928U, 0xbcU },
{ 929U, 0x95U },
{ 934U, 0xdfU },
{ 935U, 0xbfU },
{ 936U, 0x9fU },
{ 1023U, 0x9fU },
{ 1023U, 0xbfU },
{ 1023U, 0xdfU },
{ 1023U, 0xffU },
{ 1023U, 0x9fU },
{ 1023U, 0xbfU },
{ 1023U, 0xdfU },
{ 1023U, 0xffU },
};
#endif
24 changes: 24 additions & 0 deletions examples/doebel/APPROVED.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"listening_approval": "Chad heard and approved DOEBEL-HOST.WAV on 2026-10-25; requested optional libtandy example",
"native_status": "passed normal completion, Escape cleanup and timer restoration on emulated Tandy HX; see NATIVE.json",
"publication": "approved by Chad on 2026-10-25",
"reference_wav_sha256": "9bd189015904bda25c5e75dff501696a7641934bb3ffeec87e3278f719d00b0d",
"reference_trace_sha256": "7d36113c4de4a210990410ddc2804a450a25fa419677f3dbb9c21213124a080c",
"per_note_audit_sha256": "d2de6d6634df6d537b78c4143e8c098f9dd46a3667b1e13f9fa8152876c3e6ae",
"score_json_sha256": "f1d913b8a3ef83cb692dbadd20341470469295632e4f1f7bb2204f89fcf47661",
"vgm_sha256": "2e495869bf4712937bfc296dc7be192147527cbc43a5f284f0867859779ebff3",
"frames": 1023,
"service_hz": 240,
"notes": [
10,
8,
8
],
"gain": 0.18,
"native_attenuation": [
2,
9,
7
],
"psg_writes": 173
}
50 changes: 50 additions & 0 deletions examples/doebel/DOEBEL.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/* Optional PSG reduction of the referenced Evil Jingle opening.
* Musical attribution and usage: README.md.
* Generated from editable DOEBEL.json; developer-only generator.
*/
#ifndef DOEBEL_SCORE_H
#define DOEBEL_SCORE_H
#include "lt_score.h"
#define DOEBEL_SERVICE_HZ 240U
#define DOEBEL_END_TICK 2304U
static const lt_score_note doebel_0[] = {
{ 0U, 128U, 320U }, /* M01 F4 */
{ 128U, 192U, 381U }, /* M02 D4 */
{ 192U, 384U, 320U }, /* M03 F4 */
{ 384U, 512U, 269U }, /* M04 G#4 */
{ 512U, 576U, 339U }, /* M05 E4 */
{ 576U, 768U, 269U }, /* M06 G#4 */
{ 768U, 960U, 226U }, /* M07 B4 */
{ 960U, 1088U, 226U }, /* M08 B4 */
{ 1088U, 1280U, 226U }, /* M09 B4 */
{ 1280U, 2112U, 226U }, /* M10 B4 */
};
static const lt_score_note doebel_1[] = {
{ 0U, 128U, 428U }, /* H01 C4 */
{ 192U, 384U, 428U }, /* H02 C4 */
{ 384U, 512U, 339U }, /* H03 E4 */
{ 576U, 768U, 339U }, /* H04 E4 */
{ 768U, 960U, 285U }, /* H05 G4 */
{ 960U, 1088U, 285U }, /* H06 G4 */
{ 1088U, 1280U, 285U }, /* H07 G4 */
{ 1280U, 2112U, 285U }, /* H08 G4 */
};
static const lt_score_note doebel_2[] = {
{ 0U, 192U, 762U }, /* B01 D3 */
{ 192U, 384U, 762U }, /* B02 D3 */
{ 384U, 576U, 679U }, /* B03 E3 */
{ 576U, 768U, 679U }, /* B04 E3 */
{ 768U, 960U, 855U }, /* B05 C3 */
{ 960U, 1088U, 855U }, /* B06 C3 */
{ 1088U, 1280U, 855U }, /* B07 C3 */
{ 1280U, 2112U, 855U }, /* B08 C3 */
};
static const lt_score doebel_score = {
LTSCORE_VERSION, 4U, 192U, 2112U, 2304U, 355030UL,
{ doebel_0, doebel_1, doebel_2 },
{ 10U, 8U, 8U },
{ 2U, 9U, 7U },
{ 4U, 6U, 8U },
0, 0U, 0, 0U
};
#endif
Binary file added examples/doebel/DOEBEL.VGM
Binary file not shown.
75 changes: 75 additions & 0 deletions examples/doebel/DOEBEL.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
"title": "Doebelinschmirtz Incorporated — private PSG sketch",
"status": "LOCAL DEVELOPER AUDITION; native testing and explicit publication approval pending",
"reference": {
"title": "Evil Jingle (from Phineas and Ferb), opening measures 1–3",
"publisher_preview": "https://www.musicnotes.com/sheetmusic/sheet-music-boss/evil-jingle/MN0202127",
"preview_image": "https://www.musicnotes.com/product/image/MN0202127/large",
"arranger_page": "https://sheetmusicboss.com/2019/10/21/evil-jingle-from-phineas-and-ferb-piano-tutorial/",
"credit": "Words/music credited on preview to Danny Jacob, Jeff Marsh, Jon Barry, Zac Moncrief, Dan Povenmire and J.G. Orrantia; piano arrangement Andrew Wrangell; edited Samuel Dickenson.",
"scope": "Melody transcribed from the visible licensed opening preview. Three-tone reduction, approximate 2:1 swing and PSG articulation are arrangement decisions, not an exact recording recreation. No reference recording or score image is distributed."
},
"ppq": 192,
"tempo_us": 355030,
"tempo_bpm_reference": 169,
"psg_clock_hz": 3579545,
"service_hz": 240,
"one_shot_end_tick": 2304,
"silent_loop_start_tick": 2112,
"noise": "muted",
"pc_speaker": "unused",
"master_linear_gain": 0.18,
"normalization": "none; all stems and mix use identical gain",
"voices": [
{
"channel": 0,
"role": "reference melody",
"attenuation": 2,
"release_gap_ticks": 4,
"notes": [
{"id":"M01","start":0,"end":128,"pitch":"F4","reference":"m1 beat1, swung eighth"},
{"id":"M02","start":128,"end":192,"pitch":"D4","reference":"m1 offbeat1, swung eighth"},
{"id":"M03","start":192,"end":384,"pitch":"F4","reference":"m1 beat2, quarter"},
{"id":"M04","start":384,"end":512,"pitch":"G#4","reference":"m1 beat3, swung eighth, written sharp"},
{"id":"M05","start":512,"end":576,"pitch":"E4","reference":"m1 offbeat3, swung eighth"},
{"id":"M06","start":576,"end":768,"pitch":"G#4","reference":"m1 beat4, quarter"},
{"id":"M07","start":768,"end":960,"pitch":"B4","reference":"m2 beat1, quarter"},
{"id":"M08","start":960,"end":1088,"pitch":"B4","reference":"m2 beat2, swung eighth"},
{"id":"M09","start":1088,"end":1280,"pitch":"B4","reference":"m2 offbeat2 tied through beat3, combined as one event"},
{"id":"M10","start":1280,"end":2112,"pitch":"B4","reference":"m2 offbeat3 tied into m3 dotted half; one event, final beat rests"}
]
},
{
"channel": 1,
"role": "reduced inner harmony; omissions intentional",
"attenuation": 9,
"release_gap_ticks": 6,
"notes": [
{"id":"H01","start":0,"end":128,"pitch":"C4"},
{"id":"H02","start":192,"end":384,"pitch":"C4"},
{"id":"H03","start":384,"end":512,"pitch":"E4"},
{"id":"H04","start":576,"end":768,"pitch":"E4"},
{"id":"H05","start":768,"end":960,"pitch":"G4"},
{"id":"H06","start":960,"end":1088,"pitch":"G4"},
{"id":"H07","start":1088,"end":1280,"pitch":"G4"},
{"id":"H08","start":1280,"end":2112,"pitch":"G4"}
]
},
{
"channel": 2,
"role": "reference bass D2/E2/C2 raised one octave for PSG range",
"attenuation": 7,
"release_gap_ticks": 8,
"notes": [
{"id":"B01","start":0,"end":192,"pitch":"D3"},
{"id":"B02","start":192,"end":384,"pitch":"D3"},
{"id":"B03","start":384,"end":576,"pitch":"E3"},
{"id":"B04","start":576,"end":768,"pitch":"E3"},
{"id":"B05","start":768,"end":960,"pitch":"C3"},
{"id":"B06","start":960,"end":1088,"pitch":"C3"},
{"id":"B07","start":1088,"end":1280,"pitch":"C3"},
{"id":"B08","start":1280,"end":2112,"pitch":"C3"}
]
}
]
}
Loading
Loading