Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- opt cex,mex
- ;stale dla dileja i flangera
- bufferN equ 4096
- mix equ 0.5
- mixStep equ 0.1
- mixMax equ 0.9
- ;stale dla dileja
- delay equ bufferN/2
- ;stale dla flangera
- delaytime equ 220
- depth equ 7 ;potega do, której podnosimy 2 zeby uzyskac depth
- modspeedMin equ 20
- modspeed equ 40
- modspeedMax equ 80
- modspeedStep equ 10
- fun0 equ $13E00
- funN equ 256
- funB equ $13E00
- funC equ 2
- ;stale dla dynamiki
- tabwyk equ 12 ; 2^tabwyk = tabN I MUSI TAK BYĆ BO BĘDZIE KONIEC ŚWIATA
- tabN equ 4096
- tabB equ 0 ; tutaj zaczynaja sie tablice
- tabC equ 4 ; liczba tablic
- tab0 equ tabB+tabN/2 ;srodek tablicy nr 0
- tab1 equ tab0+tabN ;srodek tablicy nr 1
- ;tablice
- org Y:tabB
- ;tablica 0 czyli: wzmocnienie/przesterowanie ----------------------------------------------------------------------
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC -1.0
- ENDM
- DUPF i,0,tabN/2,1
- DC i/(tabN/2.0)*1.9999999-1.0
- ENDM
- DUPF i,0,tabN/4,1
- DC 0.99999999
- ENDM
- ;tablica 1 czyli: LAMPA --------------------------------------------------------------------------------------------
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/4.0)*0.125-0.5
- ENDM
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/4.0)*0.375-0.375
- ENDM
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/4.0)*0.375
- ENDM
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/4.0)*0.125+0.375
- ENDM
- ;tablica 2 czyli: noise gating ----------------------------------------------------------------------
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/4.0)-1.0
- ENDM
- DUPF i,0,tabN/2,1 ;"petla" od 0 do tabN/4 co 1
- DC 0.0
- ENDM
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/4.0)*0.99999
- ENDM
- ;tablica 3 czyli: compressor-limiter ----------------------------------------------------------------------
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/4.0)*0.25-0.5
- ENDM
- DUPF i,0,tabN/2,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/2.0)-0.5
- ENDM
- DUPF i,0,tabN/4,1 ;"petla" od 0 do tabN/4 co 1
- DC i/(tabN/4.0)*0.25+0.5
- ENDM
- ;koniec tablic -------------------------------------------------------------------------------------------------------
- ;funkcja dla flangera
- ;funkcja trojkat
- org Y:$13E00
- DUPF i,0,256/4,1
- DC i/(256.0/4.0)*0.99999
- ENDM
- DUPF i,0,256/2,1
- DC i/(256.0/2.0)*(-1.99999)+0.99999
- ENDM
- DUPF i,0,256/4,1
- DC i/(256.0/4.0)-1.0
- ENDM
- org P:$100
- init
- ;-------------------------------------------------------------------------
- ;dilej
- ;-------------------------------------------------------------------------
- ;M0 - rejestr modulo dla probek sygnalu wejsciowego
- ;R0 - rejestr adresowy
- ;M1 - rejestr modulo dla probek dileja
- ;R1 - rejestr adresowy
- ;X0 - mix
- ;N2 - wlacz flanger/dilej (0 - dilej, 1 - flanger)
- move #(bufferN-1),m0
- move #(bufferN-1),m1
- move #$0,r1 ;stad czytamy
- move #delay,r0 ;tu piszemy
- move #1,n2
- move #mix,x0
- ;-------------------------------------------------------------------------
- ;flanger
- ;-------------------------------------------------------------------------
- ;M6 - rejestr modulo dla probek sygnalu wejsciowego
- ;R6 - rejestr adresowy
- ;N6 - rejestr ofsetu
- ;M1 - rejestr modulo dla probek dileja
- ;R1 - rejestr adresowy
- ;M4 - rejestr modulo dla probek sygnalu modulujacego
- ;R4 - rejestr adresowy
- ;N4 - rejestr przesuniecia
- ; x1 - delaytime
- ;move #(bufferN-1),m0
- ;move #(bufferN-1),m1
- ;move #$0,r1 ;stad czytamy
- move #delaytime,r6 ;tu piszemy
- move #delaytime,x1
- move #$FF,m4
- move #$13F00,r4
- move #modspeed,m5
- move #0,r5
- ;-------------------------------------------------------------------------
- ;dynamika
- ;-------------------------------------------------------------------------
- ;R7 - rejestr adresowy wspolczynnikow skalowania
- ;N7 - rejestr inkrementacji
- ;M2 - znacznik wlaczenia dynamiki
- move #tab0,r7
- move #1,m2
- repeat ;glowna petla programu
- in a
- move n2,b
- tst b
- .IF <EQ>
- ;POCZATEK EFEKTU DELAY----------------------------------------------------------------------------------
- move a,x:(r1)+ a,y1 ;probka do bufora kolowego
- ;move r3,x0 ;mix w x0
- mpy y1,x0,a x:(r0)+,y0 ;probka przeskalowana w a, probka opozniona w y0
- move #0.999999,b
- sub x0,b
- move b,y1
- ;w b==>y1 mamy mix-1, a my chcemy mnozyc przez 1-mix, stad minus przed x1!
- mac -y1,y0,a ;przeskalowana probka opozniona doakumulowana a
- ;KONIEC EFEKTU DELAY-------------------------------------------------------------------------------------
- .ELSE
- ;POCZATEK EFEKTU FLANGER--------------------------------------------------------------------------------
- move a,x:(r6)+ ;z a do pamieci
- move #0.999999,b
- sub x0,b
- move b,y0
- move a,y1
- ;w b==>y1 mamy mix-1, a my chcemy mnozyc przez 1-mix, stad minus przed y1!
- mpy -y1,y0,a ; w akumulatorze jest aktualna probka przeskalowana
- move y:(r5)+,y0 ; to tylko inkrementuje r5
- ; r5 jest modulo m5
- move r5,b
- tst b
- ; NIE WSTAWIAJ NIC MIEDZY TYMI INSRUKCJAMI, bo zniszczysz świat
- .IF <EQ>
- move y:(r4)+,b ; ta linijka sluzy tylko inkrementacji r4
- .ENDI
- move y:(r4),b ;wczytujemy do b probke sinusa
- asr #24-depth,b,b ;teraz mamy calkowitaliczbowa wartosc sinusa w B. NIE KASUJ TEJ LINIJKI NAWET JAK NIE OGARNIASZ
- add x1,b
- neg b
- ;move r6,x1 ; wczytuje do x adres aktualnie przetwarzanej probki
- ;add x1,b ; teraz mamy aktualny dilej w B :D
- ; NIE WSTAWIAJ NIC MIEDZY TYMI INSRUKCJAMI, bo zniszczysz świat
- ;.IF <MI>
- ; add #bufferN,b
- ;.ENDI
- move b,n6
- ; wczytaj próbkę i pomnóż ją przez wsp. mix
- move x:(r6+n6),y0 ; r6 - adres aktualnie przetwarzanej probki, n6 -ofset
- ;move #mix,y1
- mac y0,x0,a ;w x0 jest mix
- ;KONIEC EFEKTU FLANGER-----------------------------------------------------------------------------------
- .ENDI
- ;EFEKT DYNAMIKI----------------------------------------------------------------------------------------------------
- move m2,b
- tst b
- .IF <NE>
- asr #24-tabwyk,a,a ;teraz mamy calkowitaliczbowa wartosc sygnalu [-tabN/2;tabN/2). NIE KASUJ TEJ LINIJKI NAWET JAK NIE OGARNIASZ
- move a1,n7
- move y:(r7+n7),a ; probka wyjsciowa w a
- .ENDI
- ;KONIEC EFEKTU DYNAMIKI-------------------------------------------------
- out a
- ;OBSLUGA KLAWIATURY-------------------------------------------------------
- get a ; obsluz klawiature
- tst a ; ustaw znaczniki
- .IF <NE> ; sprawdza znacznik Z
- clb a,b ; policz wiodace bity akumulatora A
- add #22,b
- .IF <EQ> ; 0 - poprzednia funkcja flangera
- move r4,a ;aktualny poczatek tablicy w a
- sub #funB,a
- .IF <NE>
- sub #funN-funB,a
- move a,r4
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 1 - zmniejsz mix
- move x0,a
- tst a
- .IF <NE>
- ;move x0,a
- sub #mixStep,a
- move a,x0
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 2 - zmniejsz dilej
- move x:(r0)+,y0 ; ta instrukcja tylko zwieksza r0
- .ENDI
- sub #1,b
- .IF <EQ> ; 3 - zmniejsz częstotliwość sygnału modulującego
- move m2,a
- sub #modspeedMin,a
- tst a
- .IF <NE>
- sub #modspeedStep-modspeedMin,a
- move a,m2
- move #0,r2
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 4 - poprzednia funkcja dynamiki
- ;poprzedni adres funkcji dynamiki
- move r7,a ;aktualny srodek tablicy w a
- sub #tab0,a
- ;.IF <EQ> ;jesli aktualna byla tab0
- ; move #tabC*tabN-tabN/2,r7
- ;.ENDI
- .IF <NE>
- sub #tabN-tab0,a
- move a,r7
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 5 - włącz/wyłącz dynamikę
- move m2,a
- tst a
- .IF <EQ>
- move #1,m2
- .ELSE
- move #0,m2
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 6 - następna funkcja dynamiki
- move r7,a ;aktualny srodek tablicy w a
- sub #tab0+(tabC-1)*tabN,a
- ;.IF <EQ> ;jesli aktualna byla ostatania tablica
- ; move #tab0,r7
- ;.ENDI
- .IF <NE>
- add #tab0+tabC*tabN,a
- move a,r7
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 7 - zwiększ mix
- move x0,a
- sub #mixMax,a
- tst a
- .IF <NE>
- ;move x0,a
- add #mixStep,a
- add #mixMax,a
- move a,x0
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 8 - zwiększ dilej
- move x:(r0)-,y0 ; ta linijka tylko zmniejsza r0
- .ENDI
- sub #1,b
- .IF <EQ> ; 9 - zwiększ częstotliwość sygnału modulującego
- move m2,a
- sub #modspeedMax,a
- tst a
- .IF <NE>
- add #modspeedStep+modspeedMax,a
- move a,m2
- move #0,r2
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 10 - następna funkcja flangera
- move r4,a ;aktualny poczatek tablicy w a
- sub #funB+(funC-1)*funN,a
- .IF <NE>
- add #funB+funC*funN,a
- move a,r7
- .ENDI
- .ENDI
- sub #1,b
- .IF <EQ> ; 11 - przelacz dilej/flanger
- move n2,a
- tst a
- .IF <EQ>
- move #1,n2
- .ELSE
- move #0,n2
- .ENDI
- .ENDI
- .ENDI
- ;KONIEC OBSLUGI KLAWIATURY---------------------------------------------------
- forever
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement