atarionline.pl Rmt player zmiana muzyki - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1:
         
        CommentAuthorshanti77
      • CommentTime5 Oct 2016 22:10
       
      Jeśli chcę zmienić odgrywaną muzykę, to za każdym razem muszę wywołać rmt_init, czy można w jakiś sposób wykonać skok do innej muzyki bez wywoływania ponownie init'a? Chodzi o muzyczki znajdujące się w jednym utworze tylko na innej pozycji.
      • 2:
         
        CommentAuthorxeen
      • CommentTime5 Oct 2016 22:10
       
      ja zawsze robiłem to z initem i też jestem ciekawy czy to było zbędne :)
      • 3:
         
        CommentAuthorshanti77
      • CommentTime6 Oct 2016 08:10
       
      Mam przy okazji jeszcze jedno pytanie, co stanie się jeśli podczas obslugi przerwania vblk nastąpi przerwanie DLI, według moich obserwacji wynika,że przerwanie DLI nie zostanie obsłużone, czy mam rację?
      • 4: CommentAuthormono
      • CommentTime6 Oct 2016 09:10 zmieniony
       
      • 5:
         
        CommentAuthorshanti77
      • CommentTime6 Oct 2016 09:10 zmieniony
       
      Jak włącze bosconian w trybie ntsc to w momencie zmiany condition na yellow na moment sypie się prawy panel. W przerwaniu dli jest tam odpalane przerwanie timer4. Mam wrażenie ,że odpalenie muzyki w przerwaniu, z rmt_init wydłuża przerwanie na tyle, że zachodzi na przerwanie dli, ale może jest inny powód.

      Edit
      -----
      Teraz jak nad tym pomyślałem, to chya faktycznie jest inny powód, przedłużone vblk powoduje, że zmieniam pamięć obrazubw dlist po rozpoczęciu rysowania ekranu i to może powodować takie efekty na obrazie.
      • 6: CommentAuthormono
      • CommentTime6 Oct 2016 10:10 zmieniony
       
      W 6502 może zachodzić konflikt między NMI a IRQ: ->link<-
      • 7: CommentAuthorwieczor
      • CommentTime6 Oct 2016 11:10 zmieniony
       
      ldx #0
      lda <new_address
      ldy >new_address


      stx v_abeat ; zerujesz licznik wierszy w patternie

      sta p_song
      sty p_song+1 ; ustawiasz nowy wiersz w songu


      x ustawiasz na numer wiersza w patternie od którego chcesz odtwarzać, a / y - na adres wiersza w songu. Problem polega na tym że jest to właśnie adres, a nie numer więc musisz sobie znaleźć gdzie się wiersze zaczynają. Każdy wiersz zajmuje odpowiednio 4 bajty - dla songu mono lub 8 - dla stereo i licznik p_song o tyle jest zwiększany.

      W procedurze rmt_init można sobie podpatrzeć jak początkowa wartość p_song jest ustalana, albo podczas grania muzyki (po pierwszym inicie) podpatrzeć sobie debugerem :)

      Polecałbym tylko robić powyższą operację przed albo po wywołaniu playera, czyli jeśli chodzi na vblanku to właśnie tam ;) Następne wywołanie będzie grało już od nowej pozycji.
      • 8:
         
        CommentAuthorshanti77
      • CommentTime6 Oct 2016 12:10
       
      Dzięki, o to mi właśnie chodziło, taka funkcja "goto", rozumię że będzie to szybsze od wywoływania init ?
      • 9: CommentAuthorwieczor
      • CommentTime6 Oct 2016 12:10 zmieniony
       
      No natychmiastowe, init robi masę rzeczy, inicjalizuje pokeya, oblicza właśnie adres startu, ustawia liczniki itp. Jeśli już gra, a adresy znasz to nie jest to potrzebne.
      • 10:
         
        CommentAuthorshanti77
      • CommentTime6 Oct 2016 13:10
       
      O zaoszczędzenie taktów właśnie mi chodziło, super.
      • 11:
         
        CommentAuthorshanti77
      • CommentTime6 Oct 2016 18:10
       
      @wieczór w teorii wszystko powinno działać, ale w praktyce mam ciszę, żadnej muzyczki tylko sfx słychać, chyba że czegoś jeszcze brakuje.
      • 12:
         
        CommentAuthorshanti77
      • CommentTime6 Oct 2016 22:10 zmieniony
       
      U mnie działa tylko coś takiego:
      ;init
      ldx <(adres_z_p_song-4)
      ldy >(adres_z_p_song-4)
      stx p_song
      sty p_song+1
      jsr GetSongLine


      dla linii 7, oryginalnie było
      ;oryginał
      ldx #<MODUL
      ldy #>MODUL
      lda #7
      jsr rmt_init

      tylko nie wiem czy to jest w sumie szybsze.
      • 13: CommentAuthorwieczor
      • CommentTime7 Oct 2016 01:10
       
      A widzisz, nie przewidziałem że trzeba jeszcze coś wywołać. Myślałem że bazuje tylko na tym liczniku. Ta pierwsza metoda jest szybsza na pewno, bo init zawiera jeszcze sporo innych rzeczy.
      • 14:
         
        CommentAuthorshanti77
      • CommentTime7 Oct 2016 05:10 zmieniony
       
      Poprawiłem troche ten wzor bo u siebie troche to inaczej obliczam. Ogólnie musi to być właściwy adres pomniejszony o liczbę track'ów, procedura GetLine sama dodaje sobie liczbe tracków. Nie jestem pewny czy dla linii 0 zawsze będzie to poprawnie działać bo przed nią nic nie ma, ale u mnie działa.

      Wzór dla ułatwienia, dla mono(4 kanały)
      AdresTracka0 - 4 + nrTrackaDoOdtworzenia*4


      Muszę jeszcze sprawdzić czy po skoku do GetSongLine trzeba jeszcze wywoływać rmt_play, przeglądając kod wydaje mi się, że procedura sama na końcu skacze do rmt_p3 (rmt_play skacze tam jesli nie ma końca tracka).