Aktualności: C64 Power - online od stycznia 2000 !

Autor Wątek: SFX + muzyka na c64 w assemblerze?  (Przeczytany 2619 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline BagoZonde

  • Level 6
  • ******
  • Wiadomości: 1055
    • http://www.commocore.com
SFX + muzyka na c64 w assemblerze?
« dnia: 17 Listopada 2010, 18:26 »
 Witam!  
   
  Dzięki  pomocy  tutaj  na  forum  jak  i  własnym  dociekaniu,  udało  mi  się  zaimplementować  w  assemblerze  program,  który  odtwarza  muzykę  np:  spod  $8000  na  przerwaniu  -  PRG  z  Goat  Trackera.  
   
  Mam  pytanie,  czy  wiecie  czy  istnieje  możliwość  dodania  dodatkowych  efektów  dźwiękowych  na  tym  czwartym  \'tajemniczym\'  kanale,  który  można  wykorzystać.    
   
  Chodzi  mi  o  dodanie  drobnych  efektów  dźwiękowych  do  gry,  którą  piszę  -  jak  klik  czy  \'power  chord\'  po  kliknięciu  na    
  jakąś  opcję.  
   
  Zapewne  słabo  szukałem  mimo  kilku  książek  i  zasobów  internetu.  
   
  Z  góry  dzięki  za  pomoc,  choćby  nakierowanie.  
   



Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #1 dnia: 17 Listopada 2010, 23:59 »
 chodzi  ogolnie  o  bombardowanie  rejestru  glosnosci.  raczej  nie  wykorzystasz  tego  racjonalnie  bo  to  mocno  obciaza  procka  oraz  sypie  sie  jesli  w  muzyce  wykorzystywane  sa  filtry.  W  starszych  goatach  byly  na  pewno  do  wyboru  playery  typu  \'game\'  gdzie  jeden  z  kanalow  mozna  bylo  wykorzystac  jako  sfx,  nie  sprawdzalem  jak  w  nowszych  GT.  
   
  poszukaj  o  odtwarzaniu  sampli  na  rej.  glosnosci  sida  ($d418)
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline BagoZonde

  • Level 6
  • ******
  • Wiadomości: 1055
    • http://www.commocore.com
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #2 dnia: 18 Listopada 2010, 01:02 »
 Dzięki  za  odpowiedź.  
  Do  napisania  tego  postu  na  forum  właśnie  zdeterminowało  mnie  to,  że  próba  wykorzystania  $D418  \'szarpie\'  muzykę  i  właśnie  zniekształca  dźwięki  na  filtrach,  o  których  wspomniałeś.  SFX  pyrka  jedynie.  
   
  Generalnie  do  testów  w  czasie  odtwarzania  muzyki  przepisałem  na  szybko  w  assembler  pewien  basicowy  program  -  efekt  strzału.  Działa  ok  osobno,  ale  razem  z  muzyką  słychać  tylko  pyrkanie  tego  dźwięku  (muzyka  dzielnie  znosi  ten  \'dodatek\')  i  szarpanie  filtrów.  Napisałem  to  do  testów  na  takim  pseudo  -  timerze  biorącym  wartość  spod  $A2  żeby  spowolnić  generowanie  SFX  ale  mimo  tego  dźwięk  SFX  jest  ucinany  właśnie  przez  przerwanie  -  choć  trwać  powinien  w  pętli  pare  sekund.  Wkleję  ten  programik,  choć  nie  wiem  czy  jest  sens:  
   
  LDX  #$0F  
   
  LOOP:  
  STX  $D418  
  DEX  
   
  LDA  #$81  
  STA  $D404  
   
  LDA  #$0F  
  STA  $D405  
   
  LDA  #$28  
  STA  $D401  
   
  LDA  #$C8  
  STA  $D400  
   
  TIMER:  
  LDA  $A2  
  BNE  TIMER  
   
  CPX  #$0B  
  BCS  LOOP  
   
  LDA  #$00  
  STA  $D404  
  STA  $D405  
   
  powyższy  kod  wykonywany  jest  cały  czas  w  pętli.  
   
  Wygląda  więc  na  to,  że  SFX  sobie  podaruję  -  wolałbym  muzykę  na  3-ech  kanałach.  Chyba,  że  odpowiedź  może  znalazłbym  w  samym  module  muzycznym,  choć  brak  dokładnej  znajomości  C64,  którego  dopiero  się  uczę  -  chyba  dyskwalifikuje  moje  \'samotne\'  poszukiwania  ;).

Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #3 dnia: 18 Listopada 2010, 14:12 »
 robisz  blad  w  zalozeniach.    
  napisz  sobie  procedurke  ktora  na  przerwaniu  NMI  generuje  prostokat  (czyli  naprzemiennie  wrzucasz  w  nibbel  mlodszy  d018  wartosci  0  oraz  16)o  f  powiedzmy  2khz  i  dopiero  potem  wlacz  muzyke  jakas  3  chn  przy  uzyciu  IRQ.  
   
  to  co  zrobiles  nie  odgrywa  tak  naprawde  na  rejestrze  glosnosci  nic  co  by  mialo  sample  przypominac  ;)    
   
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline BagoZonde

  • Level 6
  • ******
  • Wiadomości: 1055
    • http://www.commocore.com
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #4 dnia: 18 Listopada 2010, 14:15 »
 Ok  dzięki,  sprawdzę  to.  Ten  listing,  który  wklepałem  powyżej  odgrywa  taki  a`la  strzał  -  szum.  Spróbuję  popracować  więc  nad  założeniami.  W  każdym  bądź  razie  tak  czy  siak  wchodzę  tak  naprawdę  na  jakiś  kanał  czy  nie?  W  muzyce  wykorzystuję  filtr  przeważnie  na  trzecim  kanale.  
   

Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #5 dnia: 18 Listopada 2010, 16:24 »
 tajemniczy  kanal  to  wlasnie  $d418  :)  ogolnie  odgrywanie  sampli  polega  na  zapisywaniu  ich  (4bit  sampli)  do  mlodszej  polowy  $d418.  ale  to  jest  jak  DAC,  wiec  musisz  go  bombardowac  odpowiednimi  czestotliwosciami.  wyjscie  timera  w  c64    nie  jest  podlacozne  do  wejscia  sida  -  gdyby  tak  bylo,  to  faktycznie  mozna  by  sztucznie  otrzymac  dodatkowy  kanal  na  ktorym  bez  udzialu  procka  mozna  by  robic  prostokat,a  tak  to  musisz  \'machac\'  wartoscia  $d418  z  duza  czestotliwoscia.  
   
  tutaj  masz  przyklady  konkretne:  
  http://codebase64.org/doku.php?id=base:sid_programming\' target=_blank>http://codebase64.org/doku.php?id=base:sid_programming
  rozdzial  `Samples  aka  Digis`  
   
  Ty  w  swoim  kodzie  natomiast  bardzo  rzadko  wpisujesz  do  do  $d418  -  to  nie  zadziala  po  porstu,  najwyzej  raz  na  jakis  czas  uslyszysz  jakis  \'pierd\'.  co  i  tak  nie  zmienia  faktu  ze  odtwarzanie  czegos  takiego  mocno  obciaza  procka  bo  kazda  probka  musi  byc  wczytana  i  wpiana  do  $d418,  a  w  przypadku  sida  prmitywny  efekt  dzwiekowy  to  tylko  kilka  wpisow  do  reejstru  i  syntezator  sie  zajmie  wszystkim  sam  (to  niestety  nie  jest  amiga  z  25kanalowym  kontrolerem  DMA  i  wspoldzielonym  CHIP  RAM....  gdzie  odtwarzanie  MODow  jest  praktycznie  w  100%  sprzetowe  i  nie  obciaza  cpu)  
   
   
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #6 dnia: 18 Listopada 2010, 16:26 »
 chociaz  ogolnie  chyba  odwolam  to  co  napsialem  jeszcze  razp  rzejrzalem  kod..  y  tam  chyba  robisz  przebieg  piloksztalnty  w  ostatecznosci  ale  nie  wiem  z  jakas  czestotliwoscia.  generalnie  najpierw  sprobouj  wygenerowac  jakikolwiek  dzwiek  na  $d418  (NMI)  a  potem  sporbouj  przy  tym  odtwarzac  normlana  3kanalowa  muzyke  (IRQ).
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline BagoZonde

  • Level 6
  • ******
  • Wiadomości: 1055
    • http://www.commocore.com
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #7 dnia: 18 Listopada 2010, 22:04 »
 Dzięki  rafvte,  na  razie  walczę  z  tym,  żeby  w  ogóle  jakieś  NMI  zrobić.  O  ile  IRQ  łyknąłem  w  jeden  wieczór  to  NMI  jest  jeszcze  dla  mnie  jakąś  magią.  Jam  świeżak  w  assie,  jednomiesięczny  ;).  Wiem  tylko,  żeby  wrzucić  wektor  do  własnej  procedury  pod  $0318  i  $0319.  Książki  nt.  assemblera  delikatnie  NMI  omijają  z  daleka  ;).  Może  co  do  literatury  nie  trafiłem  na  tą  \'Jedyną\'  ;).  
   

Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #8 dnia: 19 Listopada 2010, 10:13 »
 przyklad  o  tytule  \'nmi  sample  player\'  powinien  Ci  duzo  rozjasnic
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline BagoZonde

  • Level 6
  • ******
  • Wiadomości: 1055
    • http://www.commocore.com
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #9 dnia: 19 Listopada 2010, 10:32 »
 Właśnie  ten  przykład  mnie  trochę  przeraził  jako,  że  nie  korzystam  z  dobrodziejstw  turboassemblerów  a  piszę  w  surowym  assemblerze  na  monitorze  Action  Replay  7.5.  Rozkminię  to  NMI,  kwestia  czasu.  Pod  IRQ  tego  podpinać  nie  ma  co?  Nie  miałem  zbyt  wiele  czasu  by  się  tym  pobawić  więc  pytam.  
   
  Offtopicowo  zaś  inna  rzecz  jeszcze  wczoraj  mi  nie  \'pojszła\'  po  myśli.  Chciałem  zrobić  screen  blink  na  pewien  czas,  ale  niestety  po  wyłączeniu  ekranu  nie  działa  mi  jego  ponowne  włączenie.  
   
  Za  bazę  wziąłem  to:  bit  4  pod  $D011  (53265)  w  zależności  od  tego  czy  jest  0  czy  1  -  wyłącza  lub  włącza  ekran.  
   
  Poke`owanie  działa,  zaś  moje  przełożenie  tego  pod  ass  już  nie  bardzo:  
   
  POKE  53265,  PEEK(53265)  AND  239  
  LDA  $D011  :  AND  #$EF  :  STA  $D011  
   
  POKE  53265,  PEEK(53265)  OR  16  
  LDA  $D011  :  ORA  #$10  :  STA  $D011  
   
  Co  ciekawe  raz  uruchomiony  programik  napisany  pod  assemblerem  poprawnie  mi  wyłączył  ekran,  poczekał  na  jakiś  klawisz  i  po  naciśnięciu  włączył  ekran  z  powrotem,  a  ponowne  uruchomienie  wyłączyło  ekran,  ale  już  po  wciśnięciu  klawisza  nie  włączyło  ekranu  z  powrotem.  
   

Offline Kisiel

  • Level 7
  • *******
  • Wiadomości: 11447
  • Number 7 in all users competition...
    • http://wiki.projekt64.filety.pl/doku.php
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #10 dnia: 19 Listopada 2010, 13:01 »
 pewnie  jakiś  zwis.
idz wyprostowany wśród tych co idą na kolanach

...w przypadku checi zakupu UK1541,GA,MA,T8500,T7501 prosze o kontakt na Facebooku, haslo: UK1541....

Offline BagoZonde

  • Level 6
  • ******
  • Wiadomości: 1055
    • http://www.commocore.com
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #11 dnia: 19 Listopada 2010, 13:36 »
 Racja  Kisiel,  to  zwis,  bo  nawet  przerwanie  programu  i  wpisanie  po  omacku  poke  nie  przywraca  ekranu.  Pytanie  tylko  dlaczego,  skoro  -  no  chyba  przecież  -  ten  sam  program  napisany  pod  BASIC  przełącza  mi  ekran  na  blink  5  razy  a  nawet  100  (stu  nie  sprawdzałem  ;)).  
   

Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #12 dnia: 19 Listopada 2010, 14:07 »
 nie  hardkoruj  w  monitorze  skoro  sa  asemblery!  ;d
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline uka

  • Level 3
  • ***
  • Wiadomości: 101
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #13 dnia: 19 Listopada 2010, 14:49 »
 BagoZonde  najprościej  to  tak  mogłoby  wyglądać.  Spacją  dajesz  on/off.  
   
  .C:c000      20  19  C0      JSR  $C019  
  .C:c003      AD  11  D0      LDA  $D011  
  .C:c006      29  EF            AND  #$EF  
  .C:c008      8D  11  D0      STA  $D011  
  .C:c00b      20  19  C0      JSR  $C019  
  .C:c00e      AD  11  D0      LDA  $D011  
  .C:c011      09  10            ORA  #$10  
  .C:c013      8D  11  D0      STA  $D011  
  .C:c016      4C  00  C0      JMP  $C000  
  .C:c019      A9  EF            LDA  #$EF  
  .C:c01b      CD  01  DC      CMP  $DC01  
  .C:c01e      D0  FB            BNE  $C01B  
  .C:c020      CD  01  DC      CMP  $DC01  
  .C:c023      F0  FB            BEQ  $C020  
  .C:c025      60                  RTS  
  .C:c026      4C  03  C0      JMP  $C003

Offline uka

  • Level 3
  • ***
  • Wiadomości: 101
SFX + muzyka na c64 w assemblerze?
« Odpowiedź #14 dnia: 19 Listopada 2010, 14:54 »
 i  jeszcze  to,  bo  lepiej  widać  co  i  jak  ;)  
   
                  .org    $c000  
       
  start   jsr  klawisz                  
  ;--------------------------------------- --------  
  off   lda  $d011  
     and  #$ef  
     sta  $d011  
  ;--------------------------------------- --------  
     jsr  klawisz     
  on   lda  $d011  
     ora  #$10  
     sta  $d011  
     jmp  start  
  ;--------------------------------------- --------  
  klawisz   lda  #$ef  
     cmp  $dc01  
     bne  klawisz+2  
     cmp  $dc01  
     beq  klawisz+7  
     rts  
  ;--------------------------------------- --------  
     jmp  off  
  ;--------------------------------------- --------