Soita Sid sample !

Aloittaja virgo, tammikuu 24, 2012, 13:25

« edellinen - seuraava »

virgo

moni varmaan miettiin miten se sidillä tehdään no tässäpä hieman codia
selväähän on että samplet soitetaan NMI keskeytyksillä mutta tässä ihan
ilman keskeytyksiä malli esimerkki ja ilman aika korjausta coodissa saattaa olla
virheitä koska kirjoitin sen ulkomuistista...

*=$1000
sample =$1000
start
sei ;keskeytykset pois
lda #<sample ;asetetaan samplen osoiteen alatavu
ldx #>sample ; ---===--  ylä tavu
sta $fe ; alatavu nollasivulle
stx $ff ; ylätavu ---===---

ldy #0 ; nollataan Y
loop lda ($fe),y ; ladataan sample tavu
pha ;tallennetaan pinoon
lsr
lsr
lsr
lsr ;siirretään tavun ylin 4 bittiä alimmaiseksi
sta $d418 ;  sample volume rekisteriin
sta $d020 ; vähän väriä
jsr wait ;odotetaan ettei mene liian nopeasti
pla ;palautetaan sample tavu pinosta
and #$0f ;siivotaan jo käytetyt ylimmät bitit pois
sta $d418 ; ja taas volume rekisteriin uusi sample
sta $d020 ;lisää väriä
jsr wait ;odotellaan
inc $fe ;lisätään sample osoitetta yhdellä
bne tsek ;menikö jo yli
inc $ff ;lisätään ylintä osoite tavua yhdellä
tsek
lda #$fb
cmp $dc01 ;onko CTRL näppäintä painettu
bne loop ;ei ole jatketaan
cli ;keskeytykset päälle
rts ;paluu basiciin tms.

wait   ldx #0 ; x=0
loop2 dex ; x=x-1
   bne loop2 ; pyöritetään looppi2 kunnes päästään taas 0
   rts

sample koostuu yleisimmin kahdesta osasta koska volume rekisteri on vain 4 bittinen
yhteen tavuun siis mahtuu kaksi sample otantaa


Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

virgo


Hahahaha...

vihdoin löysin 8bit sample malli rutiinin
tuota pitääkin alkaa urakalla tutkimaan selvästi siinä on vielä
parantamisen varaa... kertoilen sitten kun oma rutiini polpahtaa pinnalle xF
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

virgo

#2
perskules...

sain kyllä rutiinin toimimaan mutta...
jotenkin epäilen ettei se ole sitä mitä etsin
tällä hetkellä ajan samplerillä ääntä sisään ja tuuppaan sen ulos tuolla 8bit sid rutiinillani
jouduin jopa ronkkimaan aidon rutiinin vicius sid demosta
mikä on sama kuin netissä kerrottu esimerkki
ongelma vain on se etten saa kyseisellä rutiinilla pihaustakaan omasta vehkeestäni

malli esimerkki ei toimi ellen ensimmäistä lda #$11 muuta lda #$10 muotoon
ihmettelen tätä koska itse demossa äänet toimivat aivan hyvin ?!?
tosin Wanha sid 6581 filtterit eivät toimi ihan niin hyvin kuin videossa
vaan niiden soundi on paljon räkäisempi ja resonassia on reilummin o7
ajan ohjelmaa ilman keskeytyksiä ja pimennetyllä ruudulla jotta BaadLinet ei häiritse
samalla hieman mietin sitä ettei ääni kuulosta koviin hyvältä jos sample soitto taajuus
laskee jonkin verran tarkoittaa sitä että 4bit samplea voin ajaa alemmallakin taajuudella
ja se ei silti kuulu itse äänessä tämä rutiini taas vaatii ruurta näyte taajuutta ?!?
eli epäilen ettei rutiini toimi oikein oletus on että 8bit sämpleä pitäisi pystyä ajamaan
hitaammalla taajuudella sen suuremman dynaamisuuden vuoksi
olenko nyt ihan metsässä ?

tiedän että aito vicius koodi ajaa sampleä fiksatulla irq rasteri ajastuksella ja näin välttää badline häsän...

8bit_sid lda #$11 <- tämä pitää muuttaa #$10 muotoon että toimii ?!?!
sta $d412
lda #$ 09
sta $d412

lda sample,x
sta $d40f
nop
lda #$01
sta $d412


tässä avaava artikkeli asiasta
http://codebase64.org/doku.php?id=base:vicious_sid_demo_routine_explained
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

virgo

ok
tässä hieman omia Sample rutiineija teillekin ihmeteltäväksi
samplen soitossa ajastus on tärkeimpiä äänenlaatuun vaikuttavia
asioita kuten tässä esteltävässä rutiinissä

ensimmäinen rivi BIT $DD0D
käynnistetään ajastus uudelleen heti alussa
näin varmistetaan että seuraavakin sample tulee "tarkasti" halutun ajan kuluttua
koska laskuri alkaa heti tämän jälkeen laskea seuraavaa keskeytys aikaa
ohjelmoijalle jääkin sitten vain ajastaa itse samplen soittaminen molemmissa
osissa (C64 4bit samplet koostuvat kahdesta samplesta ala ja ylä osa)
tarkalleen samalla ajastuksella kuin edellinen
tietenkään tämä ei ole mahdollista kovin tarkasti badline ja prosessorin suorittamien
käskyjen erilaistan suoritus aikojen suhteen keskeytykset eivät pysty keskeyttämään
itse käskyjen suoritusta
(eivät edes ystiset NMI keskeytykset vaikka pystyvätkin ajamaan IRQ keskeytysten ylitse)
joten sen täytyy odottaa kunnes se on suoritettu loppuun
tämä voi kestää 2-6 kellojaksoon kielletyt käskyt tästä vieläkin enemmän
rutiini olettaa että olet jo kytkenyt ylemmän Romin pois päältä
ja asettaa keskeytykset suoraan Hard puolelle eli FFFE ja FFFF
Soft osotteet 0318 ja 0319 NMI keskeytyksille
soiton ajotuksen kannalta kellojaksot mitä käytät ennen STA $D418
käskyä ovat merkityksellisiä kuten huomaat molemmissa ajastus on 20 kellosykliä
voit alemmasta rutiinista poistaa "ylimääräiset" NOP lauseet mutta se vaikuttaa hieman
äänen laatuun tosin keskeytys vie vähemmän kello jaksoja ja pystyt ajamaan sitä
ylemmillä kierroksilla ilman että kone kaatuu...
äänen korkeuttahan säädellään LO $dd04 ja HI $dd05 arvoilla
jos HI on 0 ja Lo menee alle $35 alkaa C64 kaatuminen lähestymään
eikä prossa ehdi juuri muuta tekemäänkään kuin ajamaan pelkkää NMI keskeytys looppia
ORA lauseet ovat jos käytät SID puolta ja käytää myös Filttereitä

         *= $1000

NMIS     LDA #<NMI
         LDX #>NMI
         STA $FFFA
         STX $FFFB
         LDA #$81
         STA $DD0D
         BIT $DD0D
         RTS

; DON'T FORGET SET $DD04 AND $DD05
; $DD05=0 $DD04<35 AND C64 GONA FLIP
;****************************

  ; ************************
  ; *  BB = A REC SAVE     *
  ; *  6C = SAMPLE TEMP    *
  ; *  SAMPLE = SAM READER *
  ; ************************

                             ;CLOCK
NMI      BIT $DD0D           ;CYCLES
         STA $BB         ;3
         LDA $6C         ;3   6
         LSR A           ;2   8
         LSR A           ;2   10
         LSR A           ;2   12
         LSR A           ;2   14
SU1      ORA #0          ;2   16 *
         STA $D418       ;4   20
         INC SAMPLE+1    ;6   26
         BNE END1        ;3   29
         INC SAMPLE+2    ;6

END1     LDA #<NMI2      ;2   31
         STA $FFFA       ;4   35
         LDA $BB         ;3   38 TOTAL
         RTI             ;    * 38-2=36

KILL     LDA #0
         STA $DD0E
         LDA #8
         ORA VOL
         STA $D418
         JMP END1

NMI2
         BIT $DD0D
         STA $BB        ;3
         LDA $6C        ;3    6
         NOP            ;2    8  *
         NOP            ;2    10 *
         NOP            ;2    12 *
         AND #$0F       ;2    14
SU2      ORA #0         ;2    16 *
         STA $D418      ;4    20
SAMPLE   LDA $1000      ;4    24
         CMP #$F0       ;2    26
         BEQ KILL       ;2/3  28
         STA $6C        ;3    31

END2     LDA #<NMI      ;2    33
         STA $FFFA      ;4    37
         LDA $BB        ;3    40 TOTAL
         RTI                 ;* 40-8=32

  ;     * = CAN REMOVE
  ;     SAMPLE MUST END $F0
  ;    ---------------------
  ;******************************


Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500