package Ġio . github . ph ant am anta 4 4 . ko bo i . audio Ċ Ċ import Ġio . github . ph ant am anta 4 4 . ko bo i . memory . Freq High Register Ċ import Ġio . github . ph ant am anta 4 4 . ko bo i . memory . Freq Low Register Ċ Ċ class ĠAudio D ac ( private Ġval Ġdisable : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ enabled : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġenabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ enabled ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ enabled Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! value ) Ġdisable () ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠSw eeper ( private Ġval Ġlo : ĠF req Low Register , Ġprivate Ġval Ġhi : ĠF req High Register , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġgenerator : ĠIS quare Audio Generator , Ġprivate Ġval Ġdisable : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġvar Ġperiod : ĠInt Ġ= Ġ 0 Ġ// Ġin Ġ 1 2 8 ths Ġof Ġa Ġsecond ĊĠĠĠ Ġvar Ġshift : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġ_ operation : ĠOperation Ġ= ĠOperation . ADD ĊĠĠĠ Ġvar Ġoperation : ĠOperation ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ operation ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( subtract ed Ġ&& Ġvalue Ġ== ĠOperation . ADD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverflow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ operation Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġeffective Period : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( period Ġ== Ġ 0 ) Ġ 8 Ġelse Ġperiod ĊĠĠĠ Ġvar Ġenabled : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġvar Ġfreq Reg Val : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtimer : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġsubtract ed : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġcycle () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( enabled Ġ&& Ġ-- timer Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= Ġeffective Period ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( period Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shift Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfreq Reg Val Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . period Ġ= Ġ 2 0 4 8 Ġ- Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo . value Ġ= Ġ( it Ġand Ġ 0 xFF ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhi . freq Bits Ġ= Ġ( it Ġand Ġ 0 x 7 0 0 ) Ġ ush r Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubtract ed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtimer Ġ= Ġeffective Period ĊĠĠĠĠĠĠĠ Ġif Ġ( shift Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġperiod Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Period Ġ= Ġoperation . apply ( freq Reg Val , Ġfreq Reg Val Ġ ush r Ġshift ) ĊĠĠĠĠĠĠĠ Ġif Ġ( operation Ġ== ĠOperation . SUB TRACT ) Ġsubtract ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( new Period Ġ>= Ġ 2 0 4 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverflow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Period Ġand Ġ 0 x 7 FF ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġoverflow () Ġ{ ĊĠĠĠĠĠĠĠ Ġdisable () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠLength Counter ( private Ġval Ġcounter Max : ĠInt , Ġprivate Ġval Ġdisable : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġvar Ġenabled : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġcounter : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġcycle () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( enabled Ġ&& Ġcounter Ġ> Ġ 0 Ġ&& Ġ-- counter Ġ== Ġ 0 ) Ġdisable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( counter Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Ġ= Ġcounter Max ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset And Enable () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( counter Ġ<= Ġ 1 ) Ġcounter Ġ= Ġcounter Max Ġ- Ġ 1 ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠVolume Envelope ( private Ġval Ġchannel : ĠI Audio Channel < I Audio Generator >) Ġ{ ĊĊĠĠĠ Ġvar Ġinitial Volume : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġenabled : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġvar Ġperiod : ĠInt Ġ= Ġ 1 Ġ// Ġin Ġ 6 4 ths Ġof Ġa Ġsecond ĊĠĠĠ Ġvar Ġoperation : ĠOperation Ġ= ĠOperation . SUB TRACT ĊĊĠĠĠ Ġvar Ġvolume : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġtimer : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġcycle () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( enabled Ġ&& Ġ++ timer Ġ> Ġperiod ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Volume Ġ= Ġoperation . apply ( volume , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Volume Ġin Ġ 0 .. 1 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Ġ= Ġnew Volume ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . volume Ġ= Ġnew Volume Ġ/ Ġ 1 5 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . volume Ġ= Ġnew Volume Ġ/ Ġ 1 5 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġvolume Ġ= Ġinitial Volume ĊĠĠĠĠĠĠĠ Ġtimer Ġ= Ġ 0 ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠWave Indexer ( private Ġval Ġgenerator : ĠI Wave Pattern Audio Generator ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIND ICES : ĠList < Pair < Int , ĠBoolean >> Ġ= Ġ( 0 .. 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠlistOf ( it Ġto Ġtrue , Ġit Ġto Ġfalse ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDIV IDER _ BOUND : ĠInt Ġ= Ġ 2 ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġperiod : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġdivider : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcounter : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġindex : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġcycle () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(++ divider Ġ== ĠDIV IDER _ BOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(-- counter Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Ġ= Ġperiod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ( index Ġ+ Ġ 1 ) Ġ% Ġ 3 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Index () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġdivider Ġ= Ġ- 6 ĊĠĠĠĠĠĠĠ Ġcounter Ġ= Ġperiod ĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġupload Index () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Index () Ġ{ ĊĠĠĠĠĠĠĠ ĠIND ICES [ index ]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . active Byte Ġ= Ġit . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . high N ib ble Ġ= Ġit . second ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ enum Ġclass ĠOperation ( val Ġapply : Ġ( Int , ĠInt ) Ġ-> ĠInt ) Ġ{ ĊĊĠĠĠ ĠADD ( Int :: plus ), ĊĠĠĠ ĠSUB TRACT ( Int :: minus ) Ċ Ċ }