Advertisement
Guest User

Untitled

a guest
Jul 11th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     opt cex,mex
  2. ;stale dla dileja i flangera
  3. bufferN equ 4096
  4. mix equ 0.5
  5. mixStep equ 0.1
  6. mixMax  equ 0.9
  7.  
  8. ;stale dla dileja
  9. delay   equ bufferN/2
  10.  
  11. ;stale dla flangera
  12. delaytime   equ 220
  13. depth       equ 7 ;potega do, której podnosimy 2 zeby uzyskac depth
  14. modspeedMin equ 20
  15. modspeed    equ 40
  16. modspeedMax equ 80
  17. modspeedStep    equ 10
  18. fun0        equ $13E00
  19. funN        equ 256
  20. funB        equ $13E00
  21. funC        equ 2
  22.  
  23. ;stale dla dynamiki
  24. tabwyk  equ 12      ; 2^tabwyk = tabN I MUSI TAK BYĆ BO BĘDZIE KONIEC ŚWIATA
  25. tabN    equ 4096
  26. tabB    equ 0       ; tutaj zaczynaja sie tablice
  27. tabC    equ 4       ; liczba tablic
  28. tab0    equ tabB+tabN/2 ;srodek tablicy nr 0
  29. tab1    equ tab0+tabN   ;srodek tablicy nr 1
  30.  
  31. ;tablice
  32.     org Y:tabB
  33.    
  34. ;tablica 0 czyli: wzmocnienie/przesterowanie ----------------------------------------------------------------------
  35.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  36.         DC -1.0
  37.     ENDM
  38.    
  39.     DUPF i,0,tabN/2,1
  40.         DC i/(tabN/2.0)*1.9999999-1.0
  41.     ENDM
  42.    
  43.     DUPF i,0,tabN/4,1
  44.         DC 0.99999999
  45.     ENDM
  46.    
  47. ;tablica 1 czyli: LAMPA --------------------------------------------------------------------------------------------
  48.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  49.         DC i/(tabN/4.0)*0.125-0.5
  50.     ENDM
  51.    
  52.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  53.         DC i/(tabN/4.0)*0.375-0.375
  54.     ENDM
  55.    
  56.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  57.         DC i/(tabN/4.0)*0.375
  58.     ENDM
  59.    
  60.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  61.         DC i/(tabN/4.0)*0.125+0.375
  62.     ENDM
  63.    
  64. ;tablica 2 czyli: noise gating ----------------------------------------------------------------------
  65.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  66.         DC i/(tabN/4.0)-1.0
  67.     ENDM
  68.    
  69.     DUPF i,0,tabN/2,1    ;"petla" od 0 do tabN/4 co 1
  70.         DC 0.0
  71.     ENDM
  72.    
  73.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  74.         DC i/(tabN/4.0)*0.99999
  75.     ENDM
  76.    
  77. ;tablica 3 czyli: compressor-limiter ----------------------------------------------------------------------
  78.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  79.         DC i/(tabN/4.0)*0.25-0.5
  80.     ENDM
  81.    
  82.     DUPF i,0,tabN/2,1    ;"petla" od 0 do tabN/4 co 1
  83.         DC i/(tabN/2.0)-0.5
  84.     ENDM
  85.    
  86.     DUPF i,0,tabN/4,1    ;"petla" od 0 do tabN/4 co 1
  87.         DC i/(tabN/4.0)*0.25+0.5
  88.     ENDM
  89.    
  90. ;koniec tablic -------------------------------------------------------------------------------------------------------
  91.    
  92. ;funkcja dla flangera
  93.     ;funkcja trojkat
  94.     org Y:$13E00
  95.     DUPF i,0,256/4,1
  96.         DC i/(256.0/4.0)*0.99999
  97.     ENDM
  98.    
  99.     DUPF i,0,256/2,1
  100.         DC i/(256.0/2.0)*(-1.99999)+0.99999
  101.     ENDM
  102.    
  103.     DUPF i,0,256/4,1
  104.         DC i/(256.0/4.0)-1.0
  105.     ENDM
  106.    
  107.     org P:$100
  108.    
  109.     init
  110.     ;-------------------------------------------------------------------------
  111.     ;dilej
  112.     ;-------------------------------------------------------------------------
  113.     ;M0 - rejestr modulo dla probek sygnalu wejsciowego
  114.     ;R0 - rejestr adresowy
  115.    
  116.     ;M1 - rejestr modulo dla probek dileja
  117.     ;R1 - rejestr adresowy
  118.    
  119.     ;X0 - mix
  120.    
  121.     ;N2 - wlacz flanger/dilej (0 - dilej, 1 - flanger)
  122.    
  123.     move #(bufferN-1),m0
  124.     move #(bufferN-1),m1
  125.     move #$0,r1 ;stad czytamy
  126.     move #delay,r0  ;tu piszemy
  127.    
  128.     move #1,n2
  129.    
  130.     move #mix,x0
  131.     ;-------------------------------------------------------------------------
  132.     ;flanger
  133.     ;-------------------------------------------------------------------------
  134.     ;M6 - rejestr modulo dla probek sygnalu wejsciowego
  135.     ;R6 - rejestr adresowy
  136.     ;N6 - rejestr ofsetu
  137.    
  138.     ;M1 - rejestr modulo dla probek dileja
  139.     ;R1 - rejestr adresowy
  140.    
  141.     ;M4 - rejestr modulo dla probek sygnalu modulujacego
  142.     ;R4 - rejestr adresowy
  143.     ;N4 - rejestr przesuniecia
  144.    
  145.     ; x1 - delaytime
  146.    
  147.    
  148.     ;move #(bufferN-1),m0
  149.     ;move #(bufferN-1),m1
  150.     ;move #$0,r1    ;stad czytamy
  151.     move #delaytime,r6  ;tu piszemy
  152.    
  153.     move #delaytime,x1
  154.    
  155.     move #$FF,m4
  156.     move #$13F00,r4
  157.    
  158.     move #modspeed,m5
  159.     move #0,r5
  160.    
  161.     ;-------------------------------------------------------------------------
  162.     ;dynamika
  163.     ;-------------------------------------------------------------------------
  164.     ;R7 - rejestr adresowy wspolczynnikow skalowania
  165.     ;N7 - rejestr inkrementacji
  166.     ;M2 - znacznik wlaczenia dynamiki
  167.     move #tab0,r7
  168.     move #1,m2
  169.    
  170.    
  171.        
  172.     repeat  ;glowna petla programu
  173.         in a
  174.        
  175.         move n2,b
  176.         tst b
  177.         .IF <EQ>
  178.             ;POCZATEK EFEKTU DELAY----------------------------------------------------------------------------------
  179.             move a,x:(r1)+ a,y1 ;probka do bufora kolowego
  180.             ;move r3,x0 ;mix w x0
  181.             mpy y1,x0,a x:(r0)+,y0 ;probka przeskalowana w a, probka opozniona w y0
  182.             move #0.999999,b
  183.             sub x0,b
  184.             move b,y1
  185.             ;w b==>y1 mamy mix-1, a my chcemy mnozyc przez 1-mix, stad minus przed x1!
  186.             mac -y1,y0,a    ;przeskalowana probka opozniona doakumulowana a
  187.             ;KONIEC EFEKTU DELAY-------------------------------------------------------------------------------------
  188.         .ELSE
  189.             ;POCZATEK EFEKTU FLANGER--------------------------------------------------------------------------------
  190.             move a,x:(r6);z a do pamieci
  191.             move #0.999999,b
  192.             sub x0,b
  193.             move b,y0
  194.             move a,y1
  195.             ;w b==>y1 mamy mix-1, a my chcemy mnozyc przez 1-mix, stad minus przed y1!
  196.             mpy -y1,y0,a    ; w akumulatorze jest aktualna probka przeskalowana
  197.            
  198.             move y:(r5)+,y0 ; to tylko inkrementuje r5
  199.             ; r5 jest modulo m5
  200.             move r5,b
  201.             tst b
  202.             ; NIE WSTAWIAJ NIC MIEDZY TYMI INSRUKCJAMI, bo zniszczysz świat
  203.             .IF <EQ>
  204.                 move y:(r4)+,b ; ta linijka sluzy tylko inkrementacji r4
  205.             .ENDI
  206.            
  207.             move y:(r4),b ;wczytujemy do b probke sinusa
  208.             asr #24-depth,b,b ;teraz mamy calkowitaliczbowa wartosc sinusa w B. NIE KASUJ TEJ LINIJKI NAWET JAK NIE OGARNIASZ
  209.             add x1,b
  210.             neg b
  211.             ;move r6,x1 ; wczytuje do x adres aktualnie przetwarzanej probki
  212.             ;add x1,b   ; teraz mamy aktualny dilej w B :D
  213.             ; NIE WSTAWIAJ NIC MIEDZY TYMI INSRUKCJAMI, bo zniszczysz świat
  214.             ;.IF <MI>
  215.             ;   add #bufferN,b
  216.             ;.ENDI
  217.            
  218.             move b,n6
  219.            
  220.             ; wczytaj próbkę i pomnóż ją przez wsp. mix
  221.             move x:(r6+n6),y0   ; r6 - adres aktualnie przetwarzanej probki, n6 -ofset
  222.             ;move #mix,y1
  223.             mac y0,x0,a ;w x0 jest mix
  224.             ;KONIEC EFEKTU FLANGER-----------------------------------------------------------------------------------
  225.         .ENDI
  226.        
  227.         ;EFEKT DYNAMIKI----------------------------------------------------------------------------------------------------
  228.         move m2,b
  229.         tst b
  230.         .IF <NE>
  231.             asr #24-tabwyk,a,a ;teraz mamy calkowitaliczbowa wartosc sygnalu [-tabN/2;tabN/2). NIE KASUJ TEJ LINIJKI NAWET JAK NIE OGARNIASZ
  232.             move a1,n7
  233.             move y:(r7+n7),a ; probka wyjsciowa w a
  234.         .ENDI
  235.         ;KONIEC EFEKTU DYNAMIKI-------------------------------------------------
  236.        
  237.         out a
  238.        
  239.         ;OBSLUGA KLAWIATURY-------------------------------------------------------
  240.                     get a   ; obsluz klawiature
  241.                 tst a   ; ustaw znaczniki
  242.                 .IF <NE>        ; sprawdza znacznik Z
  243.                         clb a,b ; policz wiodace bity akumulatora A
  244.                         add #22,b
  245.                                                
  246.                         .IF <EQ>    ; 0 - poprzednia funkcja flangera
  247.                                 move r4,a   ;aktualny poczatek tablicy w a
  248.                 sub #funB,a
  249.                 .IF <NE>
  250.                     sub #funN-funB,a
  251.                     move a,r4
  252.                 .ENDI
  253.                         .ENDI
  254.                        
  255.                         sub #1,b
  256.                         .IF <EQ>    ; 1 - zmniejsz mix
  257.                 move x0,a
  258.                 tst a
  259.                 .IF <NE>
  260.                     ;move x0,a
  261.                     sub #mixStep,a
  262.                     move a,x0
  263.                 .ENDI
  264.                         .ENDI
  265.                                
  266.                         sub #1,b
  267.                         .IF <EQ>    ; 2 - zmniejsz dilej
  268.                                 move x:(r0)+,y0 ; ta instrukcja tylko zwieksza r0
  269.                         .ENDI
  270.                                
  271.                         sub #1,b
  272.                         .IF <EQ>    ; 3 - zmniejsz częstotliwość sygnału modulującego
  273.                 move m2,a
  274.                 sub #modspeedMin,a
  275.                 tst a
  276.                 .IF <NE>
  277.                     sub #modspeedStep-modspeedMin,a
  278.                     move a,m2
  279.                     move #0,r2
  280.                 .ENDI
  281.                         .ENDI
  282.                        
  283.             sub #1,b
  284.                         .IF <EQ>    ; 4 - poprzednia funkcja dynamiki
  285.                                 ;poprzedni adres funkcji dynamiki
  286.                 move r7,a   ;aktualny srodek tablicy w a
  287.                 sub #tab0,a
  288.                 ;.IF <EQ>   ;jesli aktualna byla tab0
  289.                 ;   move #tabC*tabN-tabN/2,r7
  290.                 ;.ENDI
  291.                 .IF <NE>
  292.                     sub #tabN-tab0,a
  293.                     move a,r7
  294.                 .ENDI
  295.                                
  296.                         .ENDI
  297.                        
  298.             sub #1,b
  299.                         .IF <EQ>    ; 5 - włącz/wyłącz dynamikę
  300.                 move m2,a
  301.                                 tst a
  302.                 .IF <EQ>
  303.                     move #1,m2
  304.                 .ELSE
  305.                     move #0,m2
  306.                 .ENDI
  307.                         .ENDI
  308.                        
  309.             sub #1,b
  310.                         .IF <EQ>    ; 6 - następna funkcja dynamiki
  311.                                 move r7,a   ;aktualny srodek tablicy w a
  312.                 sub #tab0+(tabC-1)*tabN,a
  313.                 ;.IF <EQ>   ;jesli aktualna byla ostatania tablica
  314.                 ;   move #tab0,r7
  315.                 ;.ENDI
  316.                 .IF <NE>
  317.                     add #tab0+tabC*tabN,a
  318.                     move a,r7
  319.                 .ENDI
  320.                         .ENDI
  321.                        
  322.             sub #1,b
  323.                         .IF <EQ>    ; 7 - zwiększ mix
  324.                                 move x0,a
  325.                 sub #mixMax,a
  326.                 tst a
  327.                 .IF <NE>
  328.                     ;move x0,a
  329.                     add #mixStep,a
  330.                     add #mixMax,a
  331.                     move a,x0
  332.                 .ENDI
  333.                         .ENDI
  334.                        
  335.             sub #1,b
  336.                         .IF <EQ>    ; 8 - zwiększ dilej
  337.                                 move x:(r0)-,y0 ; ta linijka tylko zmniejsza r0
  338.                         .ENDI
  339.                        
  340.                         sub #1,b
  341.                         .IF <EQ>    ; 9 - zwiększ częstotliwość sygnału modulującego
  342.                 move m2,a
  343.                 sub #modspeedMax,a
  344.                 tst a
  345.                 .IF <NE>
  346.                     add #modspeedStep+modspeedMax,a
  347.                     move a,m2
  348.                     move #0,r2
  349.                 .ENDI
  350.                
  351.                         .ENDI
  352.                        
  353.                         sub #1,b
  354.                         .IF <EQ>    ; 10 - następna funkcja flangera
  355.                                 move r4,a   ;aktualny poczatek tablicy w a
  356.                 sub #funB+(funC-1)*funN,a
  357.                 .IF <NE>
  358.                     add #funB+funC*funN,a
  359.                     move a,r7
  360.                 .ENDI
  361.                         .ENDI
  362.                        
  363.                         sub #1,b
  364.                         .IF <EQ>    ; 11 - przelacz dilej/flanger
  365.                                 move n2,a
  366.                                 tst a
  367.                 .IF <EQ>
  368.                     move #1,n2
  369.                 .ELSE
  370.                     move #0,n2
  371.                 .ENDI
  372.                         .ENDI
  373.                        
  374.                        
  375.                        
  376.                 .ENDI
  377.         ;KONIEC OBSLUGI KLAWIATURY---------------------------------------------------
  378.     forever
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement