diff --git a/examples/cx16/bdmusic.p8 b/examples/cx16/bdmusic.p8 new file mode 100644 index 000000000..64135cc8c --- /dev/null +++ b/examples/cx16/bdmusic.p8 @@ -0,0 +1,127 @@ +%import textio +%import syslib +%import floats + +main { + +sub start() { + + txt.print("will play the music from boulderdash,\nmade in 1984 by peter liepa.\npress enter to start: ") + void c64.CHRIN() + txt.clear_screen() + + repeat { + uword note + for note in notes { + ubyte note1 = lsb(note) + ubyte note2 = msb(note) + uword freqR = freq(note1) + uword freqL = freq(note2) + cx16.vpoke(1, $F9C0, lsb(freqR)) + cx16.vpoke(1, $F9C1, msb(freqR)) + cx16.vpoke(1, $F9C2, %10111111) ; left, max volume + cx16.vpoke(1, $F9C3, %10000000) ; triangle + cx16.vpoke(1, $F9C4, lsb(freqL)) + cx16.vpoke(1, $F9C5, msb(freqL)) + cx16.vpoke(1, $F9C6, %01111111) ; right, max volume + cx16.vpoke(1, $F9C7, %10000000) ; triangle + + ; TODO ADSR of some kind? + + print_notes(note1, note2) + sys.wait(10) + } + } +} + +sub freq(ubyte note) -> uword { + float fword = freqs_hz[note-10] / (48828.125 / 131072.0) ; formula from the Vera PSG docs + return fword as uword +} + +sub print_notes(ubyte n1, ubyte n2) { + txt.nl() + txt.plot(n1, txt.DEFAULT_HEIGHT-1) + txt.color(7) + txt.chrout('Q') + txt.plot(n2, txt.DEFAULT_HEIGHT-1) + txt.color(4) + txt.chrout('Q') +} + + + ; details about the boulderdash music can be found here: + ; https://www.elmerproductions.com/sp/peterb/sounds.html#Theme%20tune + + uword[] notes = [ + $1622, $1d26, $2229, $252e, $1424, $1f27, $2029, $2730, + $122a, $122c, $1e2e, $1231, $202c, $3337, $212d, $3135, + $1622, $162e, $161d, $1624, $1420, $1430, $1424, $1420, + $1622, $162e, $161d, $1624, $1e2a, $1e3a, $1e2e, $1e2a, + $142c, $142c, $141b, $1422, $1c28, $1c38, $1c2c, $1c28, + $111d, $292d, $111f, $292e, $0f27, $0f27, $1633, $1627, + $162e, $162e, $162e, $162e, $222e, $222e, $162e, $162e, + $142e, $142e, $142e, $142e, $202e, $202e, $142e, $142e, + $162e, $322e, $162e, $332e, $222e, $322e, $162e, $332e, + $142e, $322e, $142e, $332e, $202c, $302c, $142c, $312c, + $162e, $163a, $162e, $3538, $222e, $2237, $162e, $3135, + $142c, $1438, $142c, $1438, $202c, $2033, $142c, $1438, + $162e, $322e, $162e, $332e, $222e, $322e, $162e, $332e, + $142e, $322e, $142e, $332e, $202c, $302c, $142c, $312c, + $2e32, $292e, $2629, $2226, $2c30, $272c, $2427, $1420, + $3532, $322e, $2e29, $2926, $2730, $242c, $2027, $1420 + ] + + float[] freqs_hz = [ + ; first 10 are unused so should index by i-10 + 44.6, + 47.4, + 50.4, + 53.4, + 56.6, + 59.6, + 63.5, + 67.1, + 71.3, + 75.5, + 80.0, + 84.7, + 89.3, + 94.9, + 100.7, + 106.8, + 113.2, + 119.3, + 127.1, + 134.1, + 142.7, + 151.0, + 160.0, + 169.5, + 178.5, + 189.7, + 201.4, + 213.6, + 226.3, + 238.5, + 254.1, + 268.3, + 285.3, + 301.9, + 320.0, + 339.0, + 357.0, + 379.5, + 402.9, + 427.3, + 452.6, + 477.0, + 508.2, + 536.5, + 570.7, + 603.8, + 639.9, + 678.0, + 714.1 + ] +}