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
     
    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
     
    ja zawsze robiłem to z initem i też jestem ciekawy czy to było zbędne :)
    • 3:
       
      CommentAuthorshanti77
    • CommentTime6 Oct 2016
     
    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 zmieniony
     
    • 5:
       
      CommentAuthorshanti77
    • CommentTime6 Oct 2016 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 zmieniony
     
    W 6502 może zachodzić konflikt między NMI a IRQ: ->link<-
    • 7: CommentAuthorwieczor
    • CommentTime6 Oct 2016 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
     
    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 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
     
    O zaoszczędzenie taktów właśnie mi chodziło, super.
    • 11:
       
      CommentAuthorshanti77
    • CommentTime6 Oct 2016
     
    @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 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
     
    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 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).