From 5c67403cb479eeaf11bf6b3592671d5bec68875c Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Mon, 17 Oct 2022 01:54:49 -0400 Subject: [PATCH] More work on ADSR envelope. --- applecorn.po | Bin 819200 -> 819200 bytes mainmem.audio.s | 76 ++++++++++++++++++++++++++++++------------------ 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/applecorn.po b/applecorn.po index 18e7fe25ca8f13fa3a143e1079e8584a17052f64..7bc75f46c7f4d24d95f6da0c73a404e197d7aedb 100644 GIT binary patch delta 832 zcmYk2OGq0*9L8sN^DwJzgQT*($Q+td$)??1NDXD_gIY)rEw%*@1D#B^7l~AghaMI* zOAd<^6sbbIBwd3@w$zdssP!Ppr3Zylk=TQ%U_G>#LhvHk(sc5uIuGXi{_~sf&#qx8 zhN0yB4yJ4RisNqYW*>MQ3^Bks0I)7t;Jg25KnAD76#xwA2Mz2pH~{DCSTW=H%=+u7 za!LZ1NKqAl{^0el23i-zardah?XJ}lwOVzWVV@SG9rF(Y*Wh<3i?SG0#DF3OWl@n@ zOICVCsWIz{?&8&fP3FyjM-H{>&D)R|q>H`{QRs#kmd*iRC#*D5Q;rn^vp+Dn@Nx0%qyJHaVCjv z5P>j?=$=i-@nCukXH2Zqtaa}=Z8MCec9R delta 909 zcmY*XUr19?96tB%pI##+i{?w7tX1ZgbA(z9%QCPCQv$(5oE>j3vdF{-9|qH#=A{Is zFjy}eCl%Q>CXR)FActn7CXsV$kfu<+_!10X0t?rfv#Gyx4t(G5e82Df&f!RsMUpHd z1~qrA_l&x{q`v}Go6?T}X&t}>;K9)wRkcN6FSG@K1GfOUW6C~$8mxoE2@vq8L%ac$ z@5vHKTh64p02G^wvlCJVO0ok_bxyS|Gahe?$78)5e>Y$|G;q^!4*rBi#v-H1Vl1#2 zO+`kFd3TzPsS&tP8|8YlcwJktZVLo&tAail>@4-240c``*1`>?n=HcgJV6T&HUa>5 zF^?+*eA8o|lXx&RL?h9;4|5Cj{q#b3hDJm4OW|l}flhy+(~-#M5M5n)Lz!w{94I*D zA0AEZ&CErx58`nRPDE}I&jRm?ZAZc$($yc)9>U|iJU8UNibA(h decay RTS -:DECAY +:DECAY LDY #ENVAD ; Parm: delay change/step + LDA (A1L),Y ; Get value of parm + PHA + LDY #ENVALD ; Parm: level at end of delay + LDA (A1L),Y ; Get value of parm + PLY +* JSR ADSRPHASE ; Generic ADSR phase handler + BCS :NEXTSECT ; Phase done -> sustain RTS -:SUSTAIN +:SUSTAIN LDY #ENVAS ; Parm: delay change/step + LDA (A1L),Y ; Get value of parm + TAY + LDA #$00 ; Target level zero +* JSR ADSRPHASE ; Generic ADSR phase handler RTS :NEXTSECT INC AMPSECT,X ; Next section RTS -* Update volume. Called by ADSRENV. -* On entry: A - Change of volume/step, X is audio channel # -* X is preserved -*UPDVOL STX OSCNUM -* CLC -* ADC CURRAMP,X ; Add change to current -* STA CURRAMP,X ; Update -* TAY -* JSR ENSQAMP ; Update Ensoniq regs -* RTS +* Handle any individual phase of the ADSR envelope. Called by ADSRENV. +* On entry: A - level at end of phase, X - audio channel, Y - change/step +* On return: CS if end of phase, CC otherwise. X preserved. +ADSRPHASE CMP CURRAMP,X ; Compare tgt with current level + BNE :S1 ; Not equal to target, keep going + SEC ; CS to indicate phase is done + RTS +:S1 STA :TARGET ; Target level + TYA ; Change/step -> A + CLC + ADC CURRAMP,X ; Add change to current amp + BCS :CLAMP ; If wrapped, clamp to target + CPY #$00 ; Check sign of change/step + BMI :DESCEND ; Descending amplitude + CMP :TARGET ; Compare with target + BCS :CLAMP ; If target < sum, clamp to target + BRA :UPDATE +:DESCEND CMP :TARGET ; Compare with target + BCC :CLAMP ; If target >= sum, clamp to target + BRA :UPDATE +:CLAMP LDA :TARGET ; Recover target level +:UPDATE STA CURRAMP,X ; Store updated amplitude + TAY ; Tell the Ensoniq + JSR ENSQAMP + CLC ; CC to indicate phase continues + RTS +:TARGET DB $00 + ***************************************************************************** * Ensoniq DOC Driver for Apple IIGS Follows ...