atarionline.pl RMT player działający z ROMu i nie tylko - 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:
         
        CommentAuthorPecus
      • CommentTime22 Jul 2025 15:07 (3 dni temu) zmieniony
       
      Panowie!

      Robiąc kiedyś Scorcha, który na A5200 działać musiał z carta, napotkaliśmy z Pirxem problem playera RMT.
      Oryginalnie player ten używa samomodyfikacji kodu do... no właśnie nie bardzo wiadomo. Jest dzięki temu kilka komórek na stronie zerowej zajętych mniej i dość fikuśna procka uruchamiająca wybrany efekt za pomocą skoku względnego (podmieniany jest bajt offsetu tego skoku).
      Pirx wtedy pozmieniał tę procedurę tak, by tego wszystkiego nie robiła i działała z ROM.

      Teraz robiąc inny program, chciałem użyć tamtej procedury, ale niestety, Pirx przyciął ją wtedy do potrzeb konkretnej muzyki i wyciął obsługę pewnych efektów(a chyba nawet wszystkich, bo nie znalazłem tam tego fikuśnego skoku :) ), które teraz były potrzebne.

      Wziąłem więc ostatnią znaną mi procedurę playera RMT i jeszcze raz to zrobiłem - tym razem inaczej, bo trzeba było zachować wszystkie efekty.

      No i daję ją Wam teraz.

      Jest - tak jak oryginał - kompilowana warunkowo, więc w zależności od użytych w muzyce efektów zajmuje mniej lub więcej miejsca.
      Użyłem dyrektywy MADS ".zpvar" dla wszystkich zmiennych na stronie zerowej, więc w swoim programie wystarczy zadeklarować początek tego obszaru (a najlepiej używać jej dla wszystkich swoich zmiennych na ZP :) ).
      Jedyne co, trzeba zrobić, by działała z ROM, to przenieść gdzieś blok pozostałych zmiennych - oznaczony w kodzie.

      Dodatkowo dodałem funkcję PSEUDOSTEREO.
      Wystarczy dodać w pliku feat.txt (lub gdziekolwiek w kodzie) linijkę:
      PSEUDOSTEREO equ 1
      i jeśli gramy muzykę monofoniczną na jednym POKEYu (parametr STEROMODE = 0) to będzie grana na dwóch z przesunięciem o ramkę. Daje to efekt lekkiego pogłosu pomiędzy kanałami stereo - sprawdźcie w Scorchu :)

      W stosunku do oryginału objętość kodu będzie nawet mniejsza (jeśli używamy wielu efektów) lub o kilka bajtów większa (jeśli efektów nie używamy). Różnice minimalne.
      Na stronie zerowej rezerwuje o 3 (jeśli nie ma efektów i stereo) do 8 (jeśli użyte są wszystkie efekty i stereo) bajtów więcej niż oryginał.
      Pseudo stereo wydłuża kod (w stosunku do standardowego mono) o 4 b(ajty).
      • 2:
         
        CommentAuthorjhusak
      • CommentTime22 Jul 2025 16:07 (3 dni temu) zmieniony
       
      4 bity?

      Tak czy inaczej DZIĘKI PECUS DZIĘKI PIRX!

      Trzeba by to dodać gdzieś do repo albo na atariki.
      • 3: CommentAuthorkski
      • CommentTime22 Jul 2025 22:07 (3 dni temu) zmieniony
       
      Zastanawiałem się niedawno czy byłoby dużo roboty tak zrobić, w końcu (z innych powodów) użyłem pamięci rozszerzonej. Dzięki Wielkie wrócę do projektu popatrzę na to.

      Pozwolę sobie podpiąć się do tematu z innym pytaniem. Normalnie mam muzykę na trzech kanałach a czwarty zostaje pusty na sfx w grze. A gdyby tak czwarty kanał grał zawszę najmniej istotną ścieżkę muzyki, która na czas sfx byłaby zatrzymywana, a po zakończeniu kontynuowana (od właściwego momentu oczywiście). Nie oczekuję żeby ktoś to za mnie pisał, ale jeżeli ktoś już wie jak rmt player działa, jest to realne?
      • 4:
         
        CommentAuthorPecus
      • CommentTime23 Jul 2025 09:07 (3 dni temu)
       
      No niestety.... Bez przeróbki playera to nie zadziała tak jakbyś chciał.
      Efekt to - jak wiesz - zwyczajny instrument grany na wybranej ścieżce i jeśli na tej ścieżce zagra bezpośrednio po nim (bo tak się akurat w muzyce ułoży) jakiś inny instrument, to wyciszy natychmiast ten efekt. W szczególnych przypadkach może to wystąpić nawet ramkę po zagraniu efektu i wtedy praktycznie go nie usłyszysz.

      Można by zastanowić się nad taką modyfikacją playera, która wprowadzi flagę wyłączjącą na ścieżce z efektami granie nutek muzyki.
      Ale tak czy inaczej kontrolować tę flagę trzeba by było z poziomu programu głównego.

      To by było prostsze (choć nie takie proste, bo kod bywa tutaj "dziwny") rozwiązanie.

      Można by także dodać wewnętrzną flagę mówiącą playerowi, że wybrzmiewa SFX i, w efekcie, zabraniającą grać innym instrumentom na tym kanale. Ale to wymaga głębszej analizy dość (jak już pisałem) zawikłanego i nieskomentowanego kodu. Pewnie by się dało, ale... jak? Nie wiem :) (jeszcze ;) ).
      • 5:
         
        CommentAuthorjhusak
      • CommentTime23 Jul 2025 10:07 (3 dni temu) zmieniony
       
      Wystarczy zrobić prockę zapisującą dźwięki z pamięci do kanałów pokeya w playerze, a następnie podmieniać z gry tę pamięć jak gra efekt. Player wtedy nie wrzuca w pokeya dźwięków, tylko w te pamięć buforową. 10 minut roboty. I trzeba tę prockę dobrze zsynchronizować, czyli: player, efekty, Procka wrzucająca dane do pokeya.
      • 6:
         
        CommentAuthorPecus
      • CommentTime23 Jul 2025 11:07 (3 dni temu) zmieniony
       
      Już popatrzyłem w kod.
      Druga opcja wydaje się łatwiejsza do zaprogramowania niż myślałem.

      Trzeba dodać jedną zmienną na ZP i znaleźć w kodzie miejsce, gdzie kończy się wybrzmiewanie instrumentu ... + jeden warunek.

      Na oko da się to w 8miu bajtach kodu zmieścić.

      I pamiętajmy, że ta sama procedura inicjuje granie efektu oraz innych instrumentów (sfx ma parę rozkazów na początku więcej), więc ogarnięcie tego nie jest trywialne.

      Moj pomysł jest taki:
      Jest sobie flaga o domyślnej wartości $ff, każde wybrzmienie dowolnego instrumentu (a SFX to normalny instrument) do końca ustawia ją także na tę wartość.
      Odpalenie SFX zmienia tę flagę na numer kanału na którym gra SFX.
      W procedurze inicjującej granie instrumentu na jej początku porównywany jest numer kanału z wartością flagi. Jeśli są równe nie gramy instrumentu (bo to oznacza, że na tym kanale gra jeszcze SFX).

      Gotowe :)

      Jedno ustawienie flagi po wybrzmieniu na $ff - 4 bajty kodu
      Jedno porównanie i skok warunkowy - 4 bajty kodu
      Eee no zapomniałem, ustawienie flagi na numer kanału na początku sfx - 2 bajty :)

      czyli 10 a nie 8 bajtów.

      :)

      Tylko trzeba w dobrych miejscach je dodać, a to wymaga analizy kodu i czasu.

      Oops... no i trzeba sprawdzać na którym kanale gra wybrzmiewany instrument i ustawiać flagę na $ff tylko jeśli gra na ścieżce którą wskazuje flaga .... kurde jeszcze ze 4 bajty.
      • 7:
         
        CommentAuthorjhusak
      • CommentTime23 Jul 2025 11:07 (3 dni temu)
       
      Zboczył Cię Pecus ten Scorch :) w kierunku sizecodingu :)
      • 8:
         
        CommentAuthorPecus
      • CommentTime23 Jul 2025 13:07 (3 dni temu) zmieniony
       
      Trochę tak.... ale nie zmieściłem się w 12 bajtach :)
      15 mi wyszło + jedna dodatkowa komórka na ZP.

      Napisałem to na sucho, zgodnie z wcześniejszym pomysłem.... muszę sprawdzić czy i jak działa :)

      No teoretycznie (i praktycznie) działa.
      Czyli jeśli uruchomimy SFX na którymś z kanałów, to puki ten efekt nie wybrzmi, nie zagra na nim żaden inny instrument.
      Ja nie bardzo mam to na czym testować (w sensie mam tylko jedną muzykę do testów), ktoś chce?
      Bo to, że działa to ja wiem, ale czy dobrze działa i brzmi, to już nie :P


      kurde... no już widzę, że da się 2 bajty uszczknąć :)

      Uszczknąłem i znalazłem drobny błąd (nie psuł playera ale czasem mógł powodować złe brzmienie instrumentu współdzielącego ścieżkę z efektem).

      Potestowałem na ile umiałem i mogłem i jest dobrze.

      Postanowiłem dodać to więc jako jedną z opcji kompilacji :)

      Wystarczy zadeklarować w pliku feat.txt (albo gdziekolwiek w kodzie):
      SFX_PRIOR equ 1

      Aaaa i może to brzmieć źle jeśli używamy na kanale na którym odgrywamy efekty łączenia kanałów albo filtrów. No ale bez tej opcji też tak jest.

      Smacznego.

      P.-S. Koncepcja jest dokładnie taka jak opisałem wcześniej z jedną drobną różnicą. Flaga ma domyślnie wartość $80 a nie $ff, bo oszczędza to 2 bajty :) Tak się składa że player oznacza sobie koniec odegrania instrumentu wartośćią $80, no a skoro jest już w akumulatorze...
      • 9: CommentAuthorkski
      • CommentTime23 Jul 2025 21:07 (2 dni temu)
       
      Bardzo wielkie dzięki Pecus. Teraz nie mogę ale w weekend sprawdzę jak działa i na pewno dam znać.
      • 10:
         
        CommentAuthorpirx
      • CommentTime25 Jul 2025 12:07 (1 dzień temu)
       
      dobry werk!