atarionline.pl SFX-Tracker - 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:
       
      CommentAuthorpebe
    • CommentTime29 May 2021 zmieniony
     
    @jhusak: Heap nie był złym pomysłem, tylko nie potrzebnie dublowałem dane pod inną postacią. On w dalszym ciągu jest, bo inaczej nie wyrobiłbym się kompletnie z pamięcią.

    Przy pierwotnym założeniu, gdzie była możliwość zdefiniowania 100 SFX i TABów (razem 200), gdzie każdy z nich mógł mieć długość do 128 pozycji, a na każdą pozycję przypadały 2 bajty informacji to daje: 200*128*2=50KB! To "dużo" :P za dużo
    Muszę mieć dynamiczne zarządzanie pamięcią inaczej dupa zbita.

    ale... Już jest lepiej. Już jest postęp.

    Dublowanie danych wyeliminowanie. Teraz czas na dublowanie kodu.

    PS. Programowanie to ogólnie sztuka - Zwłaszcza dobre programowanie to sztuka kompromisów i wyczucia.

    Wiele, wiele lat nie tworzyłem programów na "tak ograniczonej przestrzeni".

    Programowanie, przy założeniu, że pamięć jest "nieograniczona", potrafi zejść na psy - i zeszło. Można stracić wyczucie kompromisu. Bo czym się przejmować, jak można zrzucić odpowiedzialność na klienta - kup więcej RAM/większy HDD/SSD/Grafikę... itd,itp.

    Powrót do korzeni, jakim jest ATARI 8-bit to dobry powód do tego, by przypomnieć sobie, że można napisać świetny program (wiem, schlebiam sobie :P), mając do dyspozycji bardzo ograniczone zasoby.

    END OF PS :D
    • 2:
       
      CommentAuthorpebe
    • CommentTime29 May 2021 zmieniony
     
    Nie taki diabeł straszny, gdy baba z wozu :D

    Tym optymistycznym akcentem, chciałem powiedzieć, że odzyskałem ponad 3,5KB RAMu. Cały dzień, caluśki, ale jestem zadowolony.

    Nie obyło się bez strat, ale Te straty nie są aż tak poważne jakby się mogło wydawać:
    - ograniczyłem ilość możliwych do zdefiniowania SFXów i TABów do 64 - zmniejszyło to tablice wskaźników i mogłem je upchać na jednej stronie
    - katalog dysku obsługuje 48 plików na stronę - ograniczyłem rozmiar listy uniwersalnej do 1KB, zrobilo się więcej miejsca pod ROMem
    - upchałem pod ROM, co tylko mogłem dać radę (a jeszcze można ciut wcisnąć)
    - nawet nie wiedziałem, że nie działa zapis i odczyt plików :P - naprawiłem
    - SFX-Engine nie miał dostępu do pamięci pod ROMem - nie widział danych. Już widzi.
    - SFX->PLY w końcu wydaje spodziewane dźwięki... JUUUUPIII! :D Co prawda, testowałem Tylko dla modulacji HFD, ale to już postęp.

    Właśnie, co do ostatniego punktu, te dźwięki są jakieś... dziwne. Trochę się domyślam dlaczego, ale nie jestem tego pewny i mam nadzieję, że nie będzie to budować dużej ilości problemów (dla mnie)

    Spróbujcie stworzyć najprostszy SFX, np:
    VOL: 98765432100
    DST: AAAAAAAAAA-
    MOD: ----------8
    VAL: ----------0


    (wprowadzanie funkcji spod ENTERa jeszcze nie działa :/)

    Przejdźcie do opcji SFX->PLY (menu bar) i brzdąknijcie kilka nut. Nie chcę sugerować odpowiedzi, ale... czy one "charczą"?

    Ktoś? Coś?

    XEX w załączniku. Update na GitHubie.
    • 3: CommentAuthormarok
    • CommentTime30 May 2021
     
    Mi pod Altirrą nic nie charczy - osobiście kompletnie nic takiego nie słyszę (i wydaje się, sprawdzałem również z poziomu "console" i ustawianego breaka (na zapis do rej.), odtwarzać dźwięk (zapisywać w rejestry pokeya) jak jest to faktycznie wyedytowane).


    Jeśli chodzi o ergonomię możliwie idealną (dla użytkownika), takie (nad obowiązkowe) pytania:

    Przeskok w edycji (np. w SFX) o mnogie pozycje jest możliwy (albo do rozważenia)? (chodzi mi o szerokość ekranu lub na początek/ koniec definicji).

    Bardzo już opcjonalne (niekoniecznie rzeczywiście przydatne - na pewno nie wszystkim - i na pewno można przywyknąć do braku czegoś podobnego), ale niekiedy (przy ustawionej nieco opóźnionej (dla osobistych przyzwyczajeń jednych - innym może wybrana odpowiadać, a za szybka przeszkadzać) reakcji programu na wciśnięty 'klawisz przewijający') wybieranie numerka "z ręki", byłoby też ok (albo przeskok o ileś tam pozycji, co 10?, jakąś inną kombinacją?).


    Mało pamięci do wykorzystania, więc trzeba z czegoś rezygnować (co by się chciało), nieco się ograniczać (do tych potrzebniejszych, istotniejszych rozwiązań), itp., więc rozumiem, że tego rodzaju ewentualne postulaty mogą nie być teraz na miejscu (może tylko warto je sobie odnotować, jako zaistniałe - gdyż niektóre sygnały od użytkowników mogą czasem się powtarzać - i może dopiero wtedy można się nad nimi jakoś poważniej zastanowić, może nawet z innej strony rozwiązując przyczynę jakiejś zgłaszanej (upatrywanej) drobnej niedogodności (tą wielością podobnych sygnałów też potwierdzoną), jeśli pozostanie na to czas i miejsce).
    • 4:
       
      CommentAuthorpebe
    • CommentTime30 May 2021 zmieniony
     
    Mi pod Altirrą nic nie charczy - osobiście kompletnie nic takiego nie słyszę


    Może to moje przeczulenie w kwestii zmian natężenia generowanego dźwięku, bo tylko wtedy to słychać.

    Przeskok w edycji (np. w SFX) o mnogie pozycje jest możliwy (albo do rozważenia)? (chodzi mi o szerokość ekranu lub na początek/ koniec definicji).


    skok o wielkość ekranu/listy jest już dawno zaimplementowany, w praktycznie każdym miejscu, gdzie jest dużo danych. Przytrzymaj CONTROL ze strzałkami :)
    • 5:
       
      CommentAuthorjhusak
    • CommentTime30 May 2021
     
    A testowałeś na real atari? Emulator atari800 (Czyli każdy na nim oparty) potrafi przy pewnych okolicznościach charczeć.
    • 6:
       
      CommentAuthorpebe
    • CommentTime30 May 2021 zmieniony
     
    @jhusak: nie mam możliwości przetestowania na prawdziwym sprzęcie :( nie mam ATARI ;( (o matkoooo, jak to boooliii... ;((( )

    Na Atari800 (tym dostępnym natywnie pod linuxa) nie odpala mi XEXa.
    Pod AtariWin800 jest podobny efekt.

    Podkreślić należy, że słychać ten "niecny" efekt tylko przy czystym dźwięku (zniekształcenie $A), ale tak jak pisałem wcześniej. Być może dlatego, że różnica pomiędzy poszczególnymi głośnościami dźwięku, np. 9,8,7,6... daje się wyczuć, przez brak przejścia przez 0 (mam nadzieje, że wiecie o co mi chodzi :P)
    Przy generowaniu przebiegu prostokątnego, w momencie, gdy membrana jest wychylona (poziom 9), zmniejszenie głośności przez POKEY (np. do 8), powoduje lekkie "opadnięcie" membrany (do wymaganego poziomu głośności). Brak aproksymacji pomiędzy tym przejściem, powoduje delikatny trzask, a niska bezwładność membrany dodatkowo wzmacnia ten efekt.

    A może po prostu, cyfrowe odwzorowanie POKEYa, jest zbyt dokładne i stąd taki efekt.

    Mylę się? :D Może, nie wiem. :P
    • 7:
       
      CommentAuthorpebe
    • CommentTime30 May 2021 zmieniony
     
    Zasiadłem dziś przed komputerem i zdziałałem co następuje:

    1. Jak zwykle, ogarnąłem kilka błędów

    2. SFX Engine gra na wszystkie (zaprojektowane) sposoby (a nawet więcej)
    Mała uwaga! Silnik nie sprawdza zakresów przy funkcji MOD/JUMP TO - może się zwiesić!

    3. Edycja MOD/VAL wprowadza zmiany, jednak nie wykrywa, aktualnego ustawienia, co może być mylące

    AD.2. Jest funkcjonalność, która nie jest zaimplementowana w SFXMM.
    Standardowo (i z założenia) modulacja ma być relatywna, tzn. od momentu "zagrania" nuty, modulacja modyfikuje częstotliwość bazową względem ostatniej jej wartości.

    Jest zaimplementowana funkcjonalność, która pozwala na pracę modulatorów w trybie absolutnym, tzn. zagrana nuta "trzyma" częstotliwość, a modulacją ją tymczasowo zmienia, po czym nuta wraca do swojej częstotliwości inicjacyjnej. To odpowiada bardziej zasadzie działania np. RMT.

    Jak na razie, cały silnik (a raczej UNIT) zabiera 642 bajty.
    Nie implementowałem jeszcze dyrektyw konfigurujących proces kompilacji.

    Co oferuje UNIT SFX_Engine:
    INIT_SFXEngine(_SFXModModes,_SFXList,_TABList,_SONGData:word);

    Inicjacja silnika. Okresić trzeba mapę pamięci:
    _SFXModModes - tablica trybów modulacji dla poszczególnych SFXów
    _SFXList - tablica wskaźników (na razie względne) dla definicji SFXów
    _TABList - tablica wskaźników (na razie względne) dla definicji TABów
    _SONGData - tablica układów TABów

    Dlaczego wartości względne?
    Gdyż nadal pracuje z użyciem HEAP, a on operuje na tablicy array[0..0] of byte, której przypisuje przez ABSOLUTE miejsce w pamięci.
    Jak wymyślę, jak to usprawnić, to się to zmieni.

    SetNoteTable(_note_val:word);

    Ustawia miejsce definicji tablicy nut.
    Jej układ jest liniowy, tzn. 0 to nuta C-0, 1 to C#0, 2 to D-0, itd...

    SFX_Start();

    Rozpoczęcie pracy silnika SFX.

    SFX_ChannelMute(channel:byte);

    Wycisza podany w channel kanał dźwiękowy. Dokładniej to wyłącza odtwarzany w podanym kanale, aktualny SFX. (muszę zmienić tą nazwę na SFX_ChannnelOff)

    SFX_Mute();

    Tu podobnie jak w SFX_ChannelMute, tylko dla wszystkich kanałów.
    Ta procedura jest odpalana podczas wyłączania silnika SFX.

    SFX_Note(channel,note,modMode:byte; SFXAddr:word);

    channel - kanał na którym będzie odtwarzany SFX
    note - nuta (numer kolejny 0->C-0, 1->C#0, 2->D-0, itd.)
    modMode - tryb modulacji. Silnik nie czyta tych danych samodzielnie.
    SFXAddr - adres definicji SFXa

    Problem jest taki, że w definicjach (SFXów oraz TABów) znajdując się na samym początku nazwy, które trzeba ominąć, stąd w definicji adres w pamięci komputera, a nie numer ID SFXa

    SFX_End();

    Wyłączenie silnika SFX.

    ---

    Muszę przyznać, że projektowanie SFXów nie należy do najłatwiejszych czynności. Jednak na chwilę obecną, musi tak być, do póki nie zrobię Playera.

    Następny krok, odtwarzanie TABa.

    W załączniku XEX. Na GitHubie najświeższy kod.
    • 8:
       
      CommentAuthorpebe
    • CommentTime30 May 2021
     
    Na dobranoc, jeszcze trochę pobawiłem.

    - "Ciutkę" zmniejszyłem UNIT SFX_Engine (629 bajtów)
    - Zmieniłem nazwy funkcji w UNIT SFX_Engine na bardziej odpowiadające.
    - Dodałem możliwość zmiany oktaw w trybie pianina (SFX->PLY) klawiszami TAB i SHIFT+TAB.

    Dla zabawy, ustawiłem POKEY na 15kHz - brak tablic nut dla tego trybu, więc fałszuje :P ale brzmi bosko.

    XEX w załączniku. GitHub zaktualizowany.
    • 9:
       
      CommentAuthorpebe
    • CommentTime1 Jun 2021 zmieniony
     
    Dziś dzień dziecka.

    Wykorzystałem tą sytuacje i "pyknąłem" skromną aktualizację - rym nie zamierzony.

    Troszkę ulepszeń pod kątem wykorzystania SFX-Engine i mała wizualizacja dla pianina. Prosta, ale sympatyczna. Jak już ogarnę Playera, pomyślę nad PianoScopem :D Taką sobie nazwę wymyśliłem dla wizualizacji liniowej natężenia dźwięku.

    Obecnie trochę to szwankuje, ale to przez rozdzielczość "PianoScopu" która ma ledwo 4 punkty - to ciut mało.

    XEX w załączniku i świeży GitHub.
    Dodatkowo mały plik, który można wczytać pod SFXMM z prostymi definicjami SFX.

    Wszystkie dziecięcego.
    • 10:
       
      CommentAuthorpebe
    • CommentTime2 Jun 2021 zmieniony
     
    Wczoraj był Dzień Dziecka - fajnie ^_^

    Dziś, jest dzień SFX Engine :P gdyż mogę z pełną odpowiedzialnością stwierdzić, że prace nad nim ukończyłem.

    Ostateczna forma silnika została opisana tu > ->link<- < (wybaczcie, tylko wersja angielska)

    Z ciekawostek dodam, że silnik można dostosować i minimalna wersja mieści się w 114 bajtach, zaś pełna to 282 bajty - mowa o samym SFX_TICK, procedurze w assemblerze.

    Wykorzystanie strony zerowej to maksymalnie 8 bajtów, w wersji minimum to 5 bajtów

    Są też rzeczy, których SFXMM nie wspiera, a silnik je posiada (patrz dokumentacja) W skrócie:
    - modulacja w trybach: Relatywnym i Absolutnym
    - praca w trybie bez sekcji modulatora; mniejsze zapotrzebowanie na pamięć definicji SFXa (1 bajt na krok)

    ---

    Cieszę się, gdyż w końcu mogę złapać oddech i zająć się "grajkiem". Zgadnijcie jaka będzie robocza nazwa dla niego? :D

    Pozdrawiam fanów, obserwatorów i przechodniów.

    PeBe
    • 11: CommentAuthormono
    • CommentTime2 Jun 2021
     
    Roboczą nazwą dla grajka będzie "Grajek" :)
    • 12:
       
      CommentAuthorpebe
    • CommentTime2 Jun 2021
     
    @mono: Brawo Ty :D Wygrałeś Talon na Balon XD ;) Nie no, żartuje hihi.

    Ale tak, Grajek to robocza nazwa.
    • 13: CommentAuthormono
    • CommentTime2 Jun 2021
     
    Brawo ja. To może "Janko Muzykant"? Dziękuję za talon :)
    • 14:
       
      CommentAuthorpebe
    • CommentTime2 Jun 2021
     
    Określenia Grajek już używałem wcześniej, więc weszło mi w krew - "Ta, krew od razu..." (Dzień świra) XD

    Janko Muzykant tak patriotycznie brzmi hihi - bardziej pasuje do nazwy kodowej programu lub zamiast SFX Music Maker to SFX John The Musican hahahah...
    • 15: CommentAuthormono
    • CommentTime2 Jun 2021 zmieniony
     
    Johnnie the Concert-Meisster!
    Chociaż to pewnie bardziej Jasio niż Janko... Ciekawe jak by to brzmiało poprawnie?

    Edit: Muzykant to chyba właśnie Grajek. "Mistrz Jaskier - słynny bard i wierszokleta!".
    • 16:
       
      CommentAuthorpebe
    • CommentTime2 Jun 2021
     
    @mono: Skoro wspomniałeś o Jaskierze :D to może:
    "Grosza daj Wiedźminowi..." XD

    ŻART. Nie czuję się Wiedźminem programowania, a SFXMM to projekt z pasji do programowania oraz do ATARI.
    • 17: CommentAuthormarok
    • CommentTime4 Jun 2021
     
    Tak trochę z boku tematu, ale mam takie skojarzenie i pomysł, iż wydaje mi się, że opracowywany format może się okazać na tyle elastyczny, że dało by się w przyszłości (przez niego) edytować stare melodie z gier. Tzn. najpierw importować do tego formatu, a później dopiero edytować, lub choćby tylko w takiej formie "przeglądać" (byłoby już miło).

    Do tego potrzebny byłby oczywiście konwerter, a źródłem danych wartości bezpośrednio z rejestrów pokeya (asapscan Foxa i sap pliki dają łatwą możliwość dostępu do takich zapisów). Taki konwerter to nie jest z pewnością taka zbyt znów łatwa rzecz do skonstruowania (w TurboPascalu? choćby), ale jest spokojnie do ogarnięcia przez kogoś (szkoda, że sam się nie czuję za bardzo na siłach, bo pewnie nic bym nie mówił, a bym już zaczął robić).

    Jest jeszcze taka rzecz, o której może warto pomyśleć.

    Rejestr AUDCTL ma tutaj charakter "FIX" (znaczy ustalony na początku i stały). To wartość 0, ale można chyba pozwolić (gdzieś w założeniach formatu) określić tą wartość na początek na względnie dowolną.
    Najlepiej wszak byłoby jakoś tą wartość móc zmieniać (czasem choćby tylko raz na muzyczkę, bo tylko tyle mogłoby być z tego potrzebne) w przebiegu danych muzyczki.

    Poza tym, jeśli ta wartość od początku lub później, mogłaby przybierać postać różną od 0 i choćby łączyć kanały, to trzeba by chyba pomyśleć o tym, jak korzystać z bardziej rozbudowanej tablicy wartości częstotliwości (poza tymi 64 pierwszymi) i by player wiedział z której części tablicy korzystać 'dla nut' z której ścieżki/ kanału (w zależności od AUDCTL).
    Tutaj rzecz jest trochę może skomplikowana i nie do końca dla mnie przynajmniej klarowna (w szczegółach), ale pewne automatyczne asumpcje dla playera można by uczynić przy tego rodzaju podejściu do tematu.

    Jest wszak jeden jeszcze mniejszego może kalibru problem, jeśli już można by łączyć kanały i korzystać z oddzielnych tablic (zakładając, że w tą stronę to by poszło, bo miałoby to sens dla Autora), czyli wyliczanie nowych wartości po modulacji. Tutaj "przepełnienie" z jednego kanału mogłoby (a potencjalnie nawet powinno) rzutować na wartość drugiego, łączonego kanału (inkrementacja). Mogłyby być z tym spore kłopoty od strony skutecznego oprogramowania, dlatego głównie stąd nie wiem, czy ma to w ogóle sens i nie stawia pod znakiem zapytania całość tych koncepcji.
    • 18:
       
      CommentAuthorpebe
    • CommentTime4 Jun 2021
     
    @marok: Sprawa z rejestrem AUDCTL jest kwestią ilości wolnego miejsca na kod pozwalający zaimplementować taką funkcjonalność. Obecnie tego miejsca jest znośna ilość (ok. 4200 bajtów), jednak, mam jeszcze do zrobienia:
    - edytor SONG - prawdopodobnie bez "ficzerów", choć nie dam sobie ręki uciąć :P
    - możliwość zapisu/odczytu pojedynczych SFXów
    - wczytywanie tematów kolorystycznych
    - bardzo bym chciał zrobić czytelne błędy IO (nie sam ich kod numeryczny), choć to jest sprawa trzeciorzędna i opiera się głównie o zasoby, których mam wolnych 392 bajty.
    - może choć trochę wesprzeć, niewspierane przez SFXMM, a dostępne w SFX-Engine możliwości, jak: simple mode - bez modulatorów; relatywna/absolutna modulacja. Simple mode jest o tyle kłopotliwy, że cała definicja SFXa jest pozbawiona wartości MOD/VAL i dane składające się na definicje są "jedno bajtowe" (nie dwu, jak w przypadku użycia modulatorów)

    Co do konwertera, to... może dasz się zmotywować jakoś? :D To byłby genialny dodatek do SFXMM. Formatu już raczej nie ruszę, bo jest (wg mnie) optymalny. Więc, może jednak? To by pozwoliło też dopieścić dokumentację, z którą sam już nie bardzo daję rady.

    W kwestii łączenia kanałów, tu się sprawa mocno komplikuje. Przede wszystkim dlatego, koszt dla modulatorów jest (bym powiedział) ogromny. Obecnie na definicję SFXa przeznaczonych jest 128 pozycji obwiedni. Przy złączonym kanale spada do 85,(3), bo dla każdej wartości MOD/VAL musiałbym przeznaczyć dwa bajty. Do tego tablice, kolejny zestaw. Ten patent na razie odpada.

    ---

    generalnie, co raz bliżej końca. Aktualnie siedzę nad możliwością odtwarzania TABów.

    Dużo zmian uczyniłem i sporo ulepszeń:
    - zmieniłem sposób kodowania TABów na bardziej zorganizowany
    - wizualny "koniec" w edycji SFX i TAB
    - w trybie edycji TAB, odtwarza SFXa
    - odrobina skrótów klawiszowych:
    w trybie SFX Playback: TAB/SHIFT-TAB- zmiana oktawy; InversVideo-tryb multi channel (te same klawisze w trybie edycji TABa)
    w trybie edycji TABa: strzałki LEWO/PRAWO - zmiana SFXa
    - przy edycji wierszy TABa (klawisz ENTER i opcja) pokazywany jest monit z informacją, jaką wartość podać i z jakiego zakresu
    - organizacja pamięci:
    rejestry SFX-Engine $F0-$FC (nie zoptymalizowany obszar)
    system $0300-$043f (bufor IO)
    rejestry SFX-Engine $06C0-$06ff (sporo niewykorzystanych)
    kod SFXMM $2000>
    zmienne SFXMM <$B400
    system $B400-$BFFF (PMG, ekran i jego bufor, zestaw znaków,bufory edycji, wizualizacja pianina)
    zasoby $C000-$CBFF (dane UI, bufor listy uniwersalnej)
    tablice SFXMM $CC00-$CFFF
    dane $D800-$FFF9 (heap)

    Z ciekawostek, czysty kod assemblera dla SFX-Engine, mieści się obecnie na niespełna dwóch stronach (431 bajtów, bez odtwarzania SONGów) Wykorzystanie strony zerowej to 9 bajtów.
    Nie jest to najszybszy kod, ale wydaje mi się, że (póki co) udaje mi się zachować dobrą równowagę względem szybkości do objętości. Wymagania pamięciowe też nie są olbrzymie i w dużej mierze, zależą od wielkości utworu. Stałą wielkością charakteryzuje się Tylko tablica nut i wynosi 64 bajty, reszta jest dynamiczna.

    XEX w załączniku, GitHub na bieżąco :P

    Pozdrawiam Wszystkich.
    • 19:
       
      CommentAuthorpebe
    • CommentTime5 Jun 2021 zmieniony
     
    Tak. SFXMM odtwarza TABy ^_^

    ->link<-

    Wybaczcie, nie wiem jak tu wstawić film :(
    • 20:
       
      CommentAuthorKaz
    • CommentTime5 Jun 2021
     

    pebe:

    Wybaczcie, nie wiem jak tu wstawić film :(


    Wybaczamy i informujemy: wstawić link z przedrostkiem www (www.youtube.com cośtam), a nie skrót linku (youtu.be cośtam):

    • 21:
       
      CommentAuthorpebe
    • CommentTime5 Jun 2021
     
    @KaZ: idzie zginąć bez Ciebie. Dzięki.
    • 22:
       
      CommentAuthorpebe
    • CommentTime5 Jun 2021 zmieniony
     
    "This is a good day for sciene" (Dexter's Laboratory)

    Oooo tak. Zdecydowanie to dobry dzień na odkrycia :D
    Właśnie ukończyłem prace nad możliwością odtworzenia TABa. Gra znakomicie. Aż jestem ciekaw, jak będzie z synchronizacją, gdy zagrają wszystkie cztery kanały na raz(?) :D:D

    Ale i na to sposób mam :P

    Nieco wzbogaciłem możliwości funkcyjne TABa, a dokładniej zwiększyłem ilość możliwych powtórzeń z 9 do 63 (samo z siebie tak wyszło)
    Poza tym,reszta funkcji bez zmian.

    Obecnie silnik SFX to 471 bajtów. Zużycie strony zerowej bez zmian.

    Teraz moduł SONG.

    Macie Lewki ^_^
    XEX w załączniku i jak zwykle świeży GitHub.

    "Omlet di fromage" (Dexter's Laboratory) - zdanie które podbiło świat Dextera ;)

    PS. Tak. Uwielbiam bajki.
    • 23:
       
      CommentAuthorsun
    • CommentTime7 Jun 2021
     
    Dałem PLY na pustym tabie i mam zapętlony stroboskop, fajowe :)
    • 24:
       
      CommentAuthorpebe
    • CommentTime7 Jun 2021
     
    @sun: zobacz, ile się natrudziłem żeby był stroboskop. sesese... dzięki za docenienie, że fajowe ;)

    A tak na serio. Dzieje się tak, bo nie sprawdzam, czy odtwarzany TAB jest zdefiniowany i "grajek" szarżuje po pamięci, jak szalony i psoci :|
    Podobnie może się zachować w przypadku SFXów. Jeżeli nie będzie zdefiniowany to może się włączyć strobo :P

    Generalnie sam "grajek" nie sprawdza istnienia definicji ani SFXów ani TABów. Po prostu pobiera dane i "jedzie z koksem"

    Podsumowując. Muszę to ogarnąć po stronie programowej, bo w "grajku" nie będę budował sprawdzania tych stanów.
    • 25:
       
      CommentAuthorpebe
    • CommentTime7 Jun 2021 zmieniony
     
    Poprawiłem błąd wskazany przez @sun. Trochę to kosztowało pamięci, ale jest (mam nadzieję) już bezpiecznie.
    Obecnie próba skorzystania z niezdefiniowanego SFXa lub TABa kończy się komunikatem "UNKNOW DEFINITION".
    Będę musiał pomyśleć nad wskaźnikiem przy listach SFX/TAB, pokazującym który element jest zdefiniowany.
    Doszedł skrót klawiszowy w trybie edycji TAB. CONTROL+RETURN wywołuje listę SFXów.

    Zacząłem też prace nad modułem SONG - w załączonym XEXie już można wejść w moduł i się poruszać po nim. Przewidywane możliwości to:
    - ustawianie tempa (TEMPO)
    - możliwość ustawiania pętli (REPEAT) oraz skoków (JUMP)
    - funkcja CHANNEL OFF - wyłączająca zapętlony TAB
    - funkcja END SONG

    Raczej nic ponad standard.
    • 26:
       
      CommentAuthorsun
    • CommentTime7 Jun 2021
     
    @pebe: tak, sam player nie musi nic sprawdzać, zakłada, że ma co grać i niech gra.
    • 27:
       
      CommentAuthorpebe
    • CommentTime9 Jun 2021 zmieniony
     
    Optymalizacja, optymalizacja, optymalizacja...

    Aż dziw bierze, jak potrafią się schować bajty w pamięci :D

    Moduł edycji SONG, prawie na ukończeniu. Nie ma jeszcze procedury odtwarzania SONGów.

    Mam nadzieję, że spodoba się nowy, nieco czystszy styl prezentacji w TAB.

    Usunąłem trochę BUGów, usprawniłem to i owo, dając miejsce na nowe BUGi :P

    Tradycyjnie: XEX w załączniku, na GitHubie najświeższy kod.
    • 28:
       
      CommentAuthorpebe
    • CommentTime11 Jun 2021 zmieniony
     
    Ukończenie SFXMM.

    Choć to jeszcze nie ten czas to co raz bliżej.
    Jak zwykle, coś wyszło i się pokomplikowało. A wyszło to, że:
    - jakoś nie zgrywają mi się nuty - chodzi o strojenie.

    Więc zrobiłem Note Tune - funkcja modułu SFX, mająca na celu dostrojenie nut dla SFXa.

    Do tej pory, SFX-Engine korzystał z jednej tablicy nut, bo założenie było takie: strojenie będzie się odbywało w TABach, za pomocą funkcji Note Value.
    Owszem, można tak, ale ma to swój jeden, bardzo wielki minus. Jest to cholernie żmudne (to mniejsza część minusa) i nie pozwala prawidłowo skorzystać z modulatora NLM (Note Level Modulate) (to ta większa część minusa)

    Rozwiązaniem powyższego, jest zastosowanie definiowanych Tablic nut.

    Technicznie
    Każda definicja SFX, będzie miała możliwość zdefiniowania własnej tablicy nut. To będzie kosztowało 64 bajty więcej do definicji SFXa lub nic, w przypadku zastosowania predefiniowanej tablicy nut.
    Tablica ta, będzie określona na początku definicji SFXa i jej obecność będzie oświadczona w tablicy definicji tablic (wiem, brzmi okropnie). Brak definicji to wartość $FFFF w tablicy tablic inna zaś wartość, to wskaźnik to definicji.
    Obrazowo
    Tablica wskaźników definicji tablic nut (sić)
    SFX +-#0-+-#1-+-#2-+-#3-+-#4-+-#5-+-#6-+-#7-+-#8-+-#9-+
    Ptr |C000|xxxx|yyyy|FFFF|FFFF|FFFF|FFFF|FFFF|FFFF|... |
    +----+----+----+----+----+----+----+----+----+----+
    xxxx,yyyy - miejsce w pamięci predefiniowanych tablic nut (zawarte gdzieś w bibliotece SFX-Engine)

    Definica SFX #0*
    $C000-$C03F 64 bajty tablicy nut
    $C040-$C065 właściwa definicja SFXa

    Definicja SFX #1*
    $C066-$C09F definicja SFXa

    Definicja SFX #2*
    $C0A0-$C0AF definicja SFXa

    *-wersja bez nazwy SFX. W przeciwnym przypadku, należy doliczyć jeszcze długość nazwy SFXa (14 bajtów)

    Powyższy schemat poglądowy, przedstawia organizację danych definicji SFXów dla:
    - SFX#0 ze zdefiniowaną własną tablicą nut
    - SFX#1 z domyślną tablicą nut.
    - SFX#2 z predefiniowaną tablicą nut

    Adresy definicji SFXów, są czysto hipotetyczne.
    ---

    Wiem, że wygląda to dość topornie, a odwołanie do tablicy jest czasochłonne, ale nie wpadłem na inny pomysł :(

    ---

    Częściowo zaimplementowany mechanizm Note Tune jest dostępny w dołączonym XEXie.

    Obsługa jest bardzo prosta.
    Po zdefiniowaniu obwiedni SFXa, przechodzimy do SFX->OPT->NOTE TUNE. Pokazuje się "szkielet" klawiatury (jednooktawowej) wraz z wskaźnikami (patrz zrzut)
    Klawiszami nut (jak w trybie pianina SFX->PLY) wybierany jest dźwięk - zaznaczany jest on na ekranie. Strzałkami góra/dół, dokonywana jest zmiana częstotliwości dla danej nuty.
    Oktawy można zmieniać za pomocą klawiszy TAB/SHIFT+TAB.
    Wychodzi się klawiszem ESC.

    UWAGA! TO JEST WERSJA POGLĄDOWA FUNKCJONALNOŚCI. MODYFIKUJE ONA GŁÓWNĄ TABLICĘ NUT. NIE JEST TWORZONA KOPIA TABLICY DLA WYBRANEGO SFXa.

    ---

    Taka ciekawostka, która spowodowała opóźnienie zakończenia prac nad programem. Dobrze, że miałem miejsce na to :P
    • 29:
       
      CommentAuthorpebe
    • CommentTime11 Jun 2021
     
    Na szybko "sklecony" film prezentujący funkcjonalność Note Tune
    • 30:
       
      CommentAuthorsmector
    • CommentTime11 Jun 2021
     
    • 31:
       
      CommentAuthorpebe
    • CommentTime12 Jun 2021 zmieniony
     
    @smector: ale ze mnie ciapciak - dzięki :D
    • 32: CommentAuthormarok
    • CommentTime12 Jun 2021
     
    Nie mam szczególnych powodów pytać (nie potrzebuję tego wiedzieć do niczego - wspominałem o jakimś konwerterze, ale nic się tu nie dzieje i chyba, prawie na pewno, nie będzie - sorry), próbuję zrozumieć


    w definicji SFX: z domyślną lub z predefiniowaną - gdzie i jak będzie to zaznaczone?

    jeśli by się zdarzyło, że są dwa SFX, które mają korzystać ze zdefiniowanej tablicy nut przypisanej dla pierwszego z SFX, to drugi będzie się do tych wartości (tej tablicy) mógł odwołać? - jako właśnie do "predefiniowanej"?
    (co w przypadku zmiany wzajemnej kolejności tych SFX w pamięci lub skasowania tego z definicją uwspólnionej tablicy?)

    domyślna tablica nut: zapisana na stałe w playerze?

    - z tego co pamiętam, mpt player (jako może jedyny) nie ma takiej tablicy (dla wartości "jednokanałowych"), może też ten player nie musiałby mieć

    jeśli jednak nie ma być tej domyślnej tablicy zapisanej bezpośrednio w playerze, to gdzie byłaby zapisana w danych SFX?


    Tradycyjnie, tablice zajmują miejsce jedna za drugą w jednym ciągu, choć jest również prawdą o nich to, że nie można ich dowolną ilość (elastycznie) określać. W tym przypadku i tak jednak prawdopodobnie łatwiej byłoby mieć je wszystkie razem, w jednym bloku (osobno od definicji SFX). Tak się przynajmniej może wydawać, chociaż tutaj wszystko zależy od oprogramowania tego - co jak komu wygodniej i poręczniej zrobić (do jakiego rozwiązania doprowadzić).


    Może to nazbyt daleko idące (w sugerowaniu czegoś), ale napiszę o tym, co wydaje mi się niegłupie. Format SFX po opracowaniu (choć jeszcze przed definitywnym jego "zamknięciem") poddałbym być może otwartej krytyce osób w tym względzie dobrze rozeznanych i (najlepiej) "łebskich", jeśli tylko chcieliby się w nim rozeznać.
    (W doborze adresatów, kierowałbym się autorstwem wpisów w atariki dla opisanych tam formatów.)

    Jeśli mogę tak teraz o tym ogólnie napisać, to program ładnie i funkcjonalnie wygląda - jest zachęcający. Ta nowa funkcja "strojenia" jest w mojej percepcji z rozmysłem rozwiązana (ale nie sprawdzałem jeszcze jak to działa i czy faktycznie wszystko da się w niej zrobić - obejrzałem filmik, nie wszystko z niego zrozumiałem).
    • 33:
       
      CommentAuthorpebe
    • CommentTime12 Jun 2021 zmieniony
     
    @marok:
    wspominałem o jakimś konwerterze, ale nic się tu nie dzieje i chyba, prawie na pewno, nie będzie - sorry

    Nic się nie dzieje z tego powodu. Nie mogę Cię zmusić do pisania. Nie jest to rzecz niezbędna do działania programu, a wręcz Tylko dodatek - taki zewnętrzny "plugin".

    Nie mam szczególnych powodów pytać (...) próbuję zrozumieć

    Zacznę może od głównego zamysłu SFX-Engine i postaram się nie rozpisać :) (nic nie sugeruje, absolutnie nic)

    Minęło już trochę czasu, odkąd zacząłem prace nad tym projektem i mogę śmiało stwierdzić, że podstawowe założenie jest następujące:
    Dać potencjalnemu użytkownikowi możliwie jak najbardziej elastyczny silnik dźwiękowy.

    Co za tym idzie?
    Każdy element danych silnika jest definiowany przez adresy bazowe i serię dyrektyw ( ->link<- )

    Funkcja wczytująca dane stworzone przez SFXMM będzie jeszcze raz napisana, z uwzględnieniem konfiguracji silnika SFX.
    Funkcja eksportująca plik SFXMM będzie tworzyła plik OBJ bez zbędnych informacji (nagłówków, nazw SFX/TAB) o możliwie optymalnym rozkładzie danych.
    Na potrzeby programu SFXMM, dane są ze sobą łączone, jak np. tablica nut oraz dane obwiedni (definicji) SFXa. Jednak nie ma konieczności trzymania tych informacji razem.
    Zważywszy na fakt, że program (sam z siebie) ma dość duże wymagania, co do ilości pamięci, wszystkie dane są trzymane "w kupie" (na stercie/HEAP) To mi umożliwia dynamiczne zarządzanie nimi.

    w definicji SFX: z domyślną lub z predefiniowaną - gdzie i jak będzie to zaznaczone?

    Domyślna - to jedna z predefiniowancyh (skrót myślowy) w tym przypadku tablica PureNotes.
    Predefiniowane tablice, to tablice wzięte z RMT: Pure, Bass1, Bass2.

    Oznaczenie o rodzaju wykorzystanej tablicy nut zapewne znajdzie się na ekranie edycji SFXa, a może na wirtualnej klawiaturze piania (prawy górny róg jest wolny) - jeżeli o to chodzi(?)

    co w przypadku zmiany wzajemnej kolejności tych SFX w pamięci lub skasowania tego z definicją uwspólnionej tablicy?


    Zmiana wzajemnej kolejności? Jak mam to zrozumieć?
    Jeżeli chodzi o alokację w pamięci programu SFXMM to program zadba o to, by dane były prawidłowo ulokowane w tablicach. Player nie musi się "martwić" o nic - on pobiera informacje ze stałych, odgórnie zdefiniowanych miejsc (plik konfiguracyjny sfx_engine.cobf.inc) w trakcie kompilacji.
    Skasowanie SFXa zawierającego definicję tablicy nut, która jest współdzielona z innym SFXem to kwestia sprawdzenia:
    - czy kasowany SFX zawiera definicję tablicy nut (sprawdzenie tablicy wskaźników tablic nut)
    - jeżeli zawiera, skopiowanie tablicy do tymczasowego obszaru
    - usunięcie SFXa ze sterty (tu automat przelicza adresy w tablicy wskaźników SFX)
    - dodanie do pierwszego SFXa, który korzystał z tablicy nuty, definicji tablicy nut
    - aktualizacja tablicy wskaźników tablic definicji nut

    To tak w luźnym skrócie. Ilość tablic może szokować, ale nie jest taka straszna jakby się wydawało i jest to wymagane przez sam program SFXMM, a nie silnik SFX.
    Może kiedyś zrobię infografikę na ten temat.

    z tego co pamiętam, mpt player (jako może jedyny) nie ma takiej tablicy (dla wartości "jednokanałowych"), może też ten player nie musiałby mieć

    Nie znam algorytmów wyliczających dzielnik dla nut. Jeżeli jest mega prosty, mógłbym go zimplementować, zyskując na predefiniowanych tablicach.

    jeśli jednak nie ma być tej domyślnej tablicy zapisanej bezpośrednio w playerze, to gdzie byłaby zapisana w danych SFX?


    Wszystkie predefiniowane tablice będą umieszczone w bibliotece SFX_Engine. Jak przystało na założenie, będzie możliwości ich doboru wedle potrzeb i wykorzystania - tak jak ma to miejsce w przypadku definiowania wykorzystanych modulatorów, czy buforowania wyjścia audio.

    Tradycyjnie, tablice zajmują miejsce jedna za drugą w jednym ciągu, choć jest również prawdą o nich to, że nie można ich dowolną ilość (elastycznie) określać.

    Owszem. Wszystko zajmuje miejsce: predefiniowane tablice nut, tablice nut użytkownika, definicje SFX i TAB. Do tego należy dopisać: tablice wskaźników SFX i TAB, tablica określająca rodzaj modulacji SFX i główna tablica z danymi do której odwołują się tablice wskaźników (relatywnie, bądź absolutnie - to jest określane dyrektywą kompilatora i stosowany jest odpowiedni kod).

    Tablice zajmują miejsce ;) Dlatego oparłem się o dynamiczną alokację danych, gdzie maksymalny rozmiar pliku to niespełna 10KB - może mało, może dużo, czas pokaże.
    Oszczędności szukam w sposobie integracji danych i ich podziału, np. predefiniowane tablice nut, mają swoje miejsce w pamięci i myślę, że w większości przypadków powinny wystarczyć, a zdefiniowane przez użytkownika (a przypisane do SFXa) będą mogły być współdzielone pomiędzy inne SFXy.
    SFXy i TABy mogą mieć różną wielkość od 1 do 128 elementów. Dodatkowe funkcje w SFX i TAB (skoki i pętle) mają uprościć optymalizacje i zużycie danych przez plik SFXMM.

    W tym przypadku i tak jednak prawdopodobnie łatwiej byłoby mieć je wszystkie razem, w jednym bloku (osobno od definicji SFX).

    Jak już pisałem wcześniej (w głównym założeniu). Wszystkie dane mają mieć możliwość dostosowania do potrzeb użytkownika końcowego.
    Definicje SFXów mogą być trzymane razem, TABów razem, tablice nut razem. To kwestia programisty, jak je rozmieści.
    Po to są tablice wskaźników, by to umożliwić.

    ---

    Owszem, to wszystko rzutuje na wydajność silnika, bo adresowanie pośrednie jest czasochłonne, jednak... coś za coś.
    Kod silnika SFX jest otwarty i skomentowany ( ->link<- ), więc każdy może dostosować go do własnych potrzeb (jeśli umie programować w asm6502) - a jeśli nie umie, to korzysta z "dobrodziejstw" udostępnionych przeze mnie (obecna dokumentacja jest mało aktualna - to się nadrobi) lub korzysta z innego oprogramowania. Nic na siłę.

    ---

    Zaczynając pisać SFX Trackera, myślałem o prostym programie, którym "poukładam" nuty, aby je odtworzyć w postaci melodii, jednak wyszedł "potwór" - pod względem wielkości i możliwości.
    Jak to się przyjmie w obecnym świecie ATARI - czas pokaże.
    Ja tworzę. Sam pewnie, w miarę korzystania z biblioteki SFX-Engine, będę ją jeszcze dostosowywał/ulepszał, o czym zamierzam pisać (pewnie nie raz) bo najlepszym sprawdzianem możliwości jest test na żywym organizmie ;) (hardcorowo, ale skutecznie :P)
    • 34: CommentAuthormarok
    • CommentTime12 Jun 2021
     
    Hej.

    Dzięki za poświęcony czas na (pewnie trudną) analizę tego, co napisałem i obszerne wyjaśnienia.

    Wróciłem w wątku do sprawy konwertera, bo sam ten temat rozpocząłem i chciałem odnieść się do Twojej zachęty, by za tym pomysłem poszło z mojej strony zasadniczo coś więcej (wydało mi się to na miejscu).

    Całej tej koncepcji elastycznego silnika nie udało mi się dotąd z całą pewnością zrozumieć (muszę zmierzyć się z dokumentacją, na którą wskazałeś), więc uznaję, że zabierałem głos w tych sprawach niepotrzebnie (nieprzygotowany).

    W szczegółach, co do zmiany kolejności SFX itd., to wydało mi się to skomplikowaną operacją z pewnymi może nieoczywistymi pułapkami, ale jak czytam teraz z przedstawionego opisu, nie ma tu obaw, że czegokolwiek nie uwzględniłeś w swoich założeniach obsługi danych "sterty".

    Mpt player nie ma algorytmów wyliczających dzielnik dla nut. Nie to miałem na myśli pisząc to, co napisałem. Chodziło mi wyłącznie o to, że tablice częstotliwości (dzielników) są zapisywane w danych modułu, więc przez analogię założyłem, że Twoje rozwiązanie będzie w tym względzie musiało mieć podobnie (interesowały mnie dotyczące tego szczegóły).

    Predefiniowane tablice, tak jak teraz o tym czytam i próbuję to interpretować z Twojej odpowiedzi (kopia 4 tablic z RMT) zakłada chyba, że te tablice będą generowane raczej w obszarze playera, niż danych SFX. Moduły korzystające z predefiniowanych tablic będą (same w sobie) dzięki temu krótsze - to oczywista tego korzyść.
    • 35:
       
      CommentAuthorpebe
    • CommentTime13 Jun 2021 zmieniony
     
    Cóż... bańka prysła...

    Cóż... Próbowałem zaimplementować proces łączenia tablic nut z definicją SFXa, jednak kod rozrósł się niebotycznie, a wszystko za sprawą dość sporej ilość 16 bitowych operacji.
    Próbowałem też nieco innego podejścia, ale zjadły mnie zasoby - fragment pamięci, gdzie trzymam wszystkie dane UI. Nie dałem rady upchać tak jak chciałem, a nie chciałem już skracać ilości definicji SFX/TAB. Uważam, ze to zbyt duży koszt, jak na taką funkcjonalność.

    Cóż... Postanowiłem ograniczyć możliwość tworzenia własnych tablic nut i (o zgrozo) będą Tylko 4 :( Każdą będzie można ustawić na swoją modłę, a ich predefiniowane wartości będą pochodziły z RMT - tablice puretone, bass1, bass2 i jedna użytkownika, którą będzie trzeba stworzyć od podstaw (jest "zerowa")

    Cóż... Mógłbym dać więcej, jednak musiałbym ograniczyć rozmiar sterty, a nie chcę tego robić, gdyż 10KB to nie jest dużo na dane utworu, a jeszcze mniej mogłoby być niekorzystne dla programu.

    Cóż... Nie wiem, czy taka opcja przypadnie do gustu potencjalnemu użytkownikowi, jednak, z dwojga złego, lepiej mieć 4 tablice nut, niż nie mieć nic.

    Cóż... Jak na razie, nie publikuje XEXa, bo nie ma co publikować. Program mam w małej rozsypce i będę go jutro porządkował.

    To już 38 dni od rozpoczęcia prac i przyznam się szczerze, że opadam już z sił nad tym "tworem" i zaczyna mnie on męczyć.
    • 36:
       
      CommentAuthorbocianu
    • CommentTime14 Jun 2021
     
    To już 38 dni od rozpoczęcia prac i przyznam się szczerze, że opadam już z sił nad tym "tworem" i zaczyna mnie on męczyć.


    Trochę offtopic, ale pomyśl, że niektórzy siedzą nad swoimi projektami od listopda, prawie codziennie ;) Też mam już dosyć i doskonale Cię rozumiem. Ale pomyśl, jak wspaniale będzie SKOŃCZYĆ i móc powiedzieć sobie - zrobiłem to!

    Znajdź moc w sobie i się nie poddawaj. Zrób sobie tydzień przerwy, nikt Cie nie goni ;)
    • 37:
       
      CommentAuthorjhusak
    • CommentTime14 Jun 2021 zmieniony
     
    A niektórzy siedzą LATAMI :) Trzymaj do końca!
    • 38: CommentAuthorpin
    • CommentTime14 Jun 2021
     
    Jeśli jest problem z upchnięciem tego w 64k to po co to na siłę upychać, 128k nie jest złym rozwiązaniem.
    • 39:
       
      CommentAuthorpebe
    • CommentTime14 Jun 2021 zmieniony
     
    @bocianu: ja nie mogę robić sobie przerw - mam dobrą pamięć ale krótką... szybko zapominam ;)

    @jhusak: Ę? No wiesz, latami to siedzę i się uczę programowania i tego nigdy nie mam dość ;) To jest jak uzależnienie. Choć przerwy mogą działać na niekorzyść - miałem taką i trudno było wrócić, ale się udało ;)

    Tak czy inaczej. @bocianu, @jhusak: Dzięki za słowa trzymające na duchu.
    Cholernie chcę skończyć ten projekt.

    @pin: Ja ledwo "ogarniam" zasady na 64KB a co dopiero na 128 XD. To nie jest czas ani miejsce na taką przeróbkę. Może, ale to MOŻE w wersji 2.0 SFXMM. Tu trzeba innego podejścia, całkiem innej organizacji programu, danych i w ogóle wszystkiego.

    A tym czasem...

    Ogarnąłem kwestię z tablicami nut. Jak pisałem. Są cztery tablice, które można modyfikować do woli w tym jedna, którą tworzy się całkowicie od podstaw. Nie działają jeszcze opcje LOAD/SAVE z menu OPT funkcji EDIT NOTE TABLE.

    W obecnym wydaniu SFXMM, zapisuje definicje tablic nut do pliku oraz ustawienia dla poszczególnych SFXów. Plik jest oznaczony wersją 1.1 ($11) i przez starsze wersje nie będzie czytany - wyjdzie błąd 12 - błędny format lub 13 - błędny tag sekcji, w zależności czy zawiera sekcję tablicy nut, czy też nie.
    Natomiast obecna czyta starsze pliki, nie pobierając wymaganych przez wersję 1.1 informacji. Czy to potrzebne? Nie wiem, ale małym kosztem to poszło, więc jest możliwość.

    W załączniku XEX i oczywiście na GitHubie najświeższy kod.
  1.  
    Hmm, ja po 38 dniach to mam zazwyczaj gotową tylko display listę :D
    • 41:
       
      CommentAuthorpirx
    • CommentTime14 Jun 2021
     
    ja po 38 dniach mam tylko wpis w google tasks
    • 42:
       
      CommentAuthorpebe
    • CommentTime14 Jun 2021 zmieniony
     
    @mgr_inz_rafal, @pirx: witki mi opadły :DDDD

    zaś mam mały problem, bo...

    Zrobiłem sobie mały test. Do tej pory uruchamiałem SFXMM z XEXa a operacje IO były wykonywane na dysku H:
    Postanowiłem wrzucić program na image dyskietki z DOSem i uruchomiłem.
    Działa, ale...

    Przy każdej operacji IO mruga mi ekranem :| Przepatrzyłem wszystko:
    - Display List - jest przed ROMem. Zawiera wywołanie DLI, ale DLI jest w czasie operacji nieaktywne. Próbowałem nawet z usuniętym bitem DLI. Też mruga.
    - Dodałem przed operacjami IO wyłączenie obsługi SFX-Engine.
    I nic to nie dało. Nadal mruga.

    W trakcie wczytywania, pobieram blok danych do bufora ($300) i jeśli to konieczne, przenoszę go do obszaru pod ROMem. Operacja powtarza się, dopóki nie skończy się plik, lub nie napotka błędu w bloku (zły format)

    Podobnie jest z zapisem. Najpierw wypełniam bufor danymi konkretnego bloku, a na sam koniec robię BlockWrite całego bufora. I tak aż nie zapiszę wszystkiego.

    - Nie wiem, czy prawidłowo przywracam przerwanie.

    Procedura inicjująca jest taka:
    INIT_SFXEngine();
    NMIEN:=%00000000;
    GetIntVec(iVBL, oldVBL);
    SetIntVec(iVBL, @SFX_tick);
    NMIEN:=%01000000;

    W INIT_SFXEngine() ustawiam rejestry kanałów oraz inicjuje POKEYa w następujący sposób:
    AUDCTL:=%00000000;
    SKCTL:=%00;
    SKCTL:=%11;


    Procedura wyłączania silnika jest następująca:
    SFX_Off();
    NMIEN:=%00000000;
    SetIntVec(iVBL, oldVBL);
    NMIEN:=%01000000;


    SFX_Off() resetuje rejestry kanałów.

    Jedyna sytuacja, kiedy nie mruga to włączenie w Altirze patcha na SIO - ale to chyba nie w tym rzecz :P

    Co robię nie tak? Irytujące jest to mruganie. :/

    Przesyłam swój image z programem. DOS 2.5, SFXMM w najnowszej wersji i testowy plik SONG2.SMM
    • 43: CommentAuthormono
    • CommentTime14 Jun 2021
     
    Displaylista jest za długa i prawdopodobnie nie dociera do JVB. W jakim celu masz przed JVB 5 pustych linii?
    • 44: CommentAuthortebe
    • CommentTime15 Jun 2021
     
    było o tym już kilka razy, Display List nie może być pod ROM-em, jeśli chcesz przeprowadzać operację I/O
    • 45:
       
      CommentAuthorpebe
    • CommentTime15 Jun 2021
     
    @tebe: nie czytasz uważnie - DL nie jest pod ROMem ($BBE0-$BBF8)

    @mono: WOW! Nie wiem, po co ja dałem na końcu 5 pustych linii, ale je usunąłem i zniknęło miganie. Dziękuję.
    • 46: CommentAuthormono
    • CommentTime15 Jun 2021 zmieniony
     
    Tak, warto liczyć linie bo jeśli JVB nie zmieści się na ekranie, wtedy ANTIC będzie kontynuował przetwarzanie dlisty w następnej ramce i tam wykona JVB, co zaskutkuje jak nietrudno się domyślić pustym ekranem. Stąd mruganie. A czemu tylko podczas I/O? Podczas normalnej pracy systemu na przerwaniu VBLK ustawiany jest adres displaylisty na bazie rejestrów-cienii DLPTRS i wtedy ekran nie mruga. W przypadku zaś gdy wykonujemy operacje I/O system wchodzi w tryb krytyczny (ustawiany jest rejestr CRITIC) i DLPTRS nie jest ustawiany, co skutkuje mruganiem z wyżej opisanych powodów.

    Przypomnę jeszcze pewną wytyczną, której sam od jakiegoś czasu hołduję. Niestety te 240 linii skanningowych, które Antic wyświetla nie zawsze widać na każdym TV CRT. Stąd zalecane jest pozostawienie 8 pustych linii u góry i 8 pustych linii u dołu - czyli wykorzystanie max 224 linii skanningowych obrazu. Nie ma oczywiście obowiązku stosowania się, bo na nowych LCD i innych plazmach problemu nie ma, na monitorach CRT chyba też problemów nie ma - tylko na TV i to starszych i to NTSC.
    • 47:
       
      CommentAuthorjhusak
    • CommentTime15 Jun 2021 zmieniony
     
    @pebe: niesamowite jest to, że przeżywam jakby dejavu. Sam na te błędy kiedyś napotykałem, spotykałem się z takimi problemami, jakie Ty masz teraz. Dzięki za tę retrospekcję, pobudza wspomnienia :)

    BARDZO BARDZO dobrze robisz, że publicznie opisujesz trudy tworzenia. Pobudzi to na pewno Pirxa czy mgr inz Rafała do pełniejszej realizacji swoich planów, nie mówiąc o mnie, czy jeszcze kimś, kto również chciałby coś zmajstrować :)
    • 48:
       
      CommentAuthorpebe
    • CommentTime15 Jun 2021 zmieniony
     
    @mono: Dzięki raz jeszcze za wykrycie tego błędu - nie doszedłbym do tego sam. A Twój opis jest rewelacyjny. Nie wiedziałem, że tak to funkcjonuje.

    Przypomnę jeszcze pewną wytyczną...

    Wytyczna kojarzy mi się "WALL-E" (BTW uwielbiam tą bajkę) ;)

    Zgodzę się, że dobrze się trzymać wymienionej wytycznej, jednak... co raz mniej CRTków na świecie - są dobre i złe strony tego procederu, ale nie o tym ta rozmowa.

    ...tylko na TV i to starszych i to NTSC

    Szczęście w nieszczęściu, Nas Europejczyków ten problem prawie nie dotyczy :F

    Errare humanum est.

    @jhusak: jest mi bardzo miło na Twe słowa, a już "w niebo wzięty" się poczuję, jeśli ktoś dzięki temu wenę poczuję - rym nie zamierzony :D

    Tak sprzętowo nie podchodziłem do programowania odkąd dostałem pierwszego PCta (tj. około 97 ubiegłego stulecia). Wtedy jeszcze przez kilka lat próbowałem rozgryzać "Jak to działa", później zaczęły pojawiać się API i różne biblioteki, które tą wiedzę "przykryły" i owiały "ostrym cieniem mgły" ;)

    ATARI jest cudownym sprzętem, gdzie wszystko zależy od programisty. Gdzie tylko on właściwie programuje maszynę. I to jest cudowne - ma się wpływ na tyle rzeczy, a na jeszcze więcej się nie ma :P ;)
    • 49:
       
      CommentAuthorpebe
    • CommentTime17 Jun 2021
     
    Jak powstaje klik klawiszy w ATARI?
    Jak stworzyć swój własny (niepowtarzalny) klik?
    Czy uważacie, że bezgłośne sterowanie w SFXMM jest na plus?
    • 50: CommentAuthormono
    • CommentTime17 Jun 2021 zmieniony
     
    Beeperem: ->link<- co 8 linii skanningowych zmienia się stan na przeciwny przez $80 linii skanningowych:
    F983: A2 7E     LDX #$7E
    F985: 48 PHA
    F986: 8E 1F D0 STX $D01F ;CONSOL
    F989: AD 0B D4 LDA $D40B ;VCOUNT
    F98C: CD 0B D4 CMP $D40B ;VCOUNT
    F98F: F0 FB BEQ $F98C
    F991: CA DEX
    F992: CA DEX
    F993: 10 F1 BPL $F986
    F995: 68 PLA

    finalnie wychodzi fala ok 1kHz. Pewnie dało by się identyczną wygenerować generatorem POKEY-a.