From 4bdac7404ad8e43ac953c6a94af4a8a27ce225f1 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sun, 3 Jul 2022 00:55:25 +0200 Subject: [PATCH] added sustain to psg envelope --- compiler/res/prog8lib/cx16/psg.p8 | 14 ++++++++++++-- examples/cx16/bdmusic.p8 | 8 ++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/compiler/res/prog8lib/cx16/psg.p8 b/compiler/res/prog8lib/cx16/psg.p8 index 3136381af..346908bb6 100644 --- a/compiler/res/prog8lib/cx16/psg.p8 +++ b/compiler/res/prog8lib/cx16/psg.p8 @@ -41,9 +41,10 @@ psg { cx16.vpoke(1, reg, cx16.vpeek(1, reg) & %11000000 | pw) } - sub envelope(ubyte voice_num, ubyte attack, ubyte release) { + sub envelope(ubyte voice_num, ubyte attack, ubyte sustain, ubyte release) { envelope_states[voice_num] = 255 envelope_attacks[voice_num] = attack * $0040 + envelope_sustains[voice_num] = sustain envelope_releases[voice_num] = release * $0040 if attack attack = 0 @@ -75,11 +76,19 @@ psg { if msb(cx16.r0) & %11000000 or envelope_attacks[cx16.r15L]==0 { cx16.r0 = mkword(63, 0) envelope_attacks[cx16.r15L] = 0 - envelope_states[cx16.r15L] = 1 ; start release + envelope_states[cx16.r15L] = 1 ; start sustain } envelope_volumes[cx16.r15L] = cx16.r0 } 1 -> { + ; sustain + if envelope_sustains[cx16.r15L] { + envelope_sustains[cx16.r15L]-- + } else { + envelope_states[cx16.r15L] = 2 ; start release + } + } + 2 -> { ; release cx16.r0 = envelope_volumes[cx16.r15L] - envelope_releases[cx16.r15L] if msb(cx16.r0) & %11000000 { @@ -110,5 +119,6 @@ psg { ubyte[16] envelope_states uword[16] envelope_volumes uword[16] envelope_attacks + ubyte[16] envelope_sustains uword[16] envelope_releases } diff --git a/examples/cx16/bdmusic.p8 b/examples/cx16/bdmusic.p8 index 752dd84b1..e2a4fc9f5 100644 --- a/examples/cx16/bdmusic.p8 +++ b/examples/cx16/bdmusic.p8 @@ -12,8 +12,8 @@ main { psg.voice(1, psg.RIGHT, 0, psg.NOISE, 0) psg.freq(0, 1000) psg.freq(1, 2000) - psg.envelope(0, 50, 5) - psg.envelope(1, 80, 6) + psg.envelope(0, 50, 0, 5) + psg.envelope(1, 80, 0, 6) sys.wait(100) psg.silent() cx16.restore_irq() @@ -68,8 +68,8 @@ main { ubyte note1 = msb(note) psg.freq(0, vera_freqs[note0]) psg.freq(1, vera_freqs[note1]) - psg.envelope(0, 255, 6) - psg.envelope(1, 255, 6) + psg.envelope(0, 255, 0, 6) + psg.envelope(1, 255, 0, 6) print_notes(note0, note1) sys.wait(10) }