1

Apropos sąsiedniego topicu i tego, że lepiej pisać kod niz bzdury na forum... no to nie piszę bzdur na forum, ale za to kod :)

Zabawa, nostalgia i opanowywanie kodowania na blaszaka, a konkretnie, SDL2.0. Bardzo pozytywne biblioteki.

Jest to, jak w tytule, grajka do muzyczek napisanych na SIDa. W formacie z Propellerowego SIDCog playera. Z rastrami a'la atari 8bit i czcionką od ST. Czyli miszmasz toatlny :)  SID produkcji własnej, bez gotowych dlli, ale za to porządnie antyaliasowany, i pracuje @960 kHz. Filtry i combined zaimplementowane.

Programik wrzucę jak już będzie miał wszystkie opcje działające, bo póki co nie zmienia katalogów z muzyczkami. No i właśnie wsadziłęm jakiegoś buga który raz na kilka minut, w przypadkowych chwilach, robi dziury w dźwięku. :)

Post's attachments

20151208_153242.JPG 668.55 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.

2

Jak ktoś chce się pobawić w allpha-testera, to krótkie info o programie i link do paczuszki wrzuciłem tu: http://eksperymenty.edu.pl/index.php/pl/sid-player - potrzebny 64-bitowy system, prawdziwa karta graficzna i kawałek szybkiego procka (>3 GHz). Kartę dźwiękową najlepiej ustawić na natywny format grajka, czyli 96 kHz/16bit.

3

Coś mi nie chce działać… ;)
http://i.imgur.com/W6RPKhl.png

.: miejsce na twoją reklamę :.

4

gimbom zazwyczaj cos nie dziala

pik33: soft spoko ale z wymaganiami to ostro poplynales :)

5 Ostatnio edytowany przez pik33 (2015-12-09 08:41:27)

Docelowo ma działać też na malinie, ale ta wersja jest na windę. 64-bitową, bo takim kompilatorem akurat skompilowana.  Wymagania spadną, po prostu kod pisany jak leci prawie bez optymalizacji. SID bierze 15% rdzenia @ 4 GHz :(

@Skrzyp: spróbuję skompilować toto także @ OpenSuse :)

Komuś ruszyło?

PS: Na OpenSuse nie ma lekko, chleb po 8 i bez maku. A konkretnie:

- wrośnięte w system pulseaudio robi kuku dla dźwięku. Przy żądanej liczbie sampli=480 zwraca w 'obtained' 240. No ale to jest akurat do ominięcia. Tylko trzeba wylistować drivery itd itp; pod windą chodzi na domyślnych. Próba unieruchomienia PA źle się kończy (brak dźwięku)

- grafika nie działa jak trzeba. Wyświetla się białe okienko. Żeby na nim pojawił się obraz, trzeba zminimalizować i przywrócić. Fullscreen zawiesza X. (ctrl-alt-f2 -> kill -9 project1). Coś nie tak z SDL2, albo po prostu trzeba zainstalować proprietary driver do nvidii.

- windowsowy kompilat startuje spod wine i działa wszystko za wyjątkiem dźwięku.

Szybciej pójdzie mi to na malinie, bo tam mam chodzącą całą tą retromaszynę i nie mam tylko SIDa. Ten SID natomiast nie da się skopiować żywcem do maliny, bo za wolno działa. Trzeba po prostu przetłumaczyć go na asm.

6

Ten SID natomiast nie da się skopiować żywcem do maliny, bo za wolno działa. Trzeba po prostu przetłumaczyć go na asm.

Ciekawi mnie kiedy mit "asembler == szybkość" wymrze w końcu. Szczególnie w sytuacji gdy optymalizacje w kompilatorach potrafią wygenerować wydajniejszy kod niż napisany z ręki.

Z drugiej strony - na ARM11 (r/pi 1/0) to będzie rzeźba w gównie. R/pi 2 ma NEON i parę innych dodatków więc może da radę ;D

7 Ostatnio edytowany przez pik33 (2015-12-09 15:07:27)

To nie jest mit. To real na malinie, testowany osobiście.

Pętla w fpc, -o1 - 30ns
Z optymalizacją -o3 - 15 ns
Szybki podgląd do wygenerowanego kodu - :(

asm, pierwsze podejście, 6  ns; po optymalizacji (ręcznej) ~4.5 ns

Te 4.5 ns na pętlę oznacza 11000 mikrosekund na ramkę. Mam 16667 mikrosekund.

Czyli kompilator= no way, asm - działa.

To samo będzie z tym sidem. Teraz mam 900 mikrosekund na 5-milisekundową ramkę. Na blaszaku. Malina (wersja 2) jest wolniejsza ~10 razy rdzeń do rdzenia od akurat tego blaszaka (testowane). Więc dostanę na pewno >5 milisekund; nie będzie miało szans zadziałać. W asm jestem w 100% pewny że wcisnę tego sida.

Apropos kompilatora i jego wydajniejszego kodu... to jest nowy mit, wynikający najprawdopodobniej stąd, że zanika sztuka programowania w asemblerze. Warto zdeasemblować i pooglądać co kompilatory generują. Na -o1 to jest katastrofa; -o3 lepiej, ale też ręce opadają. Kompilatory wydają się nic nie wiedzieć o przeplataniu rejestrów i tym podobnych arkanach czarnej asemblerowej magii :) która pozwala przyspieszyć  kod na przykład przez.. dodanie w jego środek nopa (tak... w 6502 to by była herezja:)   )

8

mazi napisał/a:

gimbom zazwyczaj cos nie dziala

Dziwne, że w takim razie u Ciebie ruszyło.

.: miejsce na twoją reklamę :.

9

pik33 napisał/a:

- wrośnięte w system pulseaudio robi kuku dla dźwięku. Przy żądanej liczbie sampli=480 zwraca w 'obtained' 240. No ale to jest akurat do ominięcia. Tylko trzeba wylistować drivery itd itp; pod windą chodzi na domyślnych. Próba unieruchomienia PA źle się kończy (brak dźwięku)

To błąd nie w pulseaudio, tylko taki misfeature w SDL-owym backendzie dla pulseaudio. Zawsze zwraca 2 razy mniejszy bufor niż zażądano. Walczyłem z tym w Atari800.

A8CAS - narzędzie do 100% archiwizacji kaset Atari

10

Zawsze można srać na pulseaudio i inne wytwory Poetteringa. Polecam, znacznie odstresowywuje :)

.: miejsce na twoją reklamę :.

11

Można, ale spróbuj to zrobić w takim opensuse, żeby nie ucichł na zawsze i żeby połowa rzeczy nagle nie zaczęła krzyczeć, że wymaga pulseaudio. Da się, ale nie mam na to po prostu czasu. Chyba żeby postawić tę Zuzię na czysto i dopilnować żeby nie było tam PA od samego początku.

Starczy że raz niechcący zainstalowałem to na malinie razem z czymś innym. Potem to wyrzucałem, bo malina natychmiast przestała grać, a zaczęła skrzeczeć.  Apt-get purge niewiele dało, trzeba było jeszcze pracowicie poszukać plików konfiguracyjnych do których to coś się dopisało, ale się już samo nie odpisało, i wyrzucić ręcznie (sudo nano) jego wpisy.

------------------------
Z drugiej strony jak napiszę coś co ma działać pod współczesnym linuxem to muszę się dostosować: nie napiszę komuś ze ma się pozbyć PA z systemu.. :(

12

Krótki napisał/a:
pik33 napisał/a:

- wrośnięte w system pulseaudio robi kuku dla dźwięku. Przy żądanej liczbie sampli=480 zwraca w 'obtained' 240. No ale to jest akurat do ominięcia. Tylko trzeba wylistować drivery itd itp; pod windą chodzi na domyślnych. Próba unieruchomienia PA źle się kończy (brak dźwięku)

To błąd nie w pulseaudio, tylko taki misfeature w SDL-owym backendzie dla pulseaudio. Zawsze zwraca 2 razy mniejszy bufor niż zażądano. Walczyłem z tym w Atari800.

this->spec.samples /= 2; /* Mix in smaller chunck to avoid underruns */

Kogoś tam pomiksowało??? Smaller chunks to avoid underrun???

13 Ostatnio edytowany przez pik33 (2016-04-28 08:35:14)

Grajka dostała 6502. A nawet "65032 (?)". Znalazłem gotowca pod nazwą Fake6502. http://rubbermallet.org/fake6502.c Napisany w C - nie mój język ojczysty - ale czytelnie. Przetłumaczyłem na pascala. Oryginał jest czystym 6502 z illegalami. Dopisałem instrukcje 65C02. Illegale pod x3,x7,xB i XF zostały :). Żeby zrobić z tego coś, co skorzysta z większej ilości RAMu, dodałem mu rejestry segmentowe. Są 32-bitowe, ea:=segment shl 8 + ea6502. Więc jest 40 bitów przestrzeni adresowej :). Instrukcje ldc, ldd, stc, std, phc, phd, plc, pld upakowałem ( z wyjątkiem jednej)  pod x2. Duża przestrzeń jest potrzebna jeśli to coś ma na przykład z poziomu 6502 grać "wszystko" (pliki .dmp mają na ogół  >64 KB)

W rezultacie grajka, oprócz plików .dmp ze zrzutami rejestrów SIDa gra teraz także pliki .sid. Póki co, PSID. RSID muszę jeszcze rozpracować. W następnej kolejności do obróbki pójdzie nasz ojczysty .sap. POKEYa muszę spreparować :).

Paczkę z nową wersją grajki wrzucę, jak zrobię w niej porządek. Bo zagrała prawidłowo 5 minut temu, wyświetla na ekranie mnóstwo info niezbędnego do debugowania zamiast tego co trzeba i wciąż nie porusza się po katalogach, co teraz stało się już niezbędne.

PS: ten 6502 działa na blaszaku z "częstotliwością" ~300 MHz. Około 70 milionów instrukcji na sekundę. Zapuściłem na malinie. Jak zwykle, 1:10, ~30 MHz, ~7 MIPS. Pod SID/SAP/co-tam-jeszcze-playera i 7 MIPS wystarczy :) Ale to nie jest czasowo optymalny kod. Za dużo wywołań funkcji.

14

pik33 napisał/a:

Instrukcje ldc, ldd, stc, std, phc, phd, plc, pld upakowałem ( z wyjątkiem jednej)  pod x2.

szacun, wlasciwe posuniecie: wolne przedrostki: $02,$12,$22,$32,$42,$52,$62,$72,$92,$B2,$D2,$F2

:-)

http://atari.pl/hsc/ad.php?i=1.

15 Ostatnio edytowany przez pik33 (2016-04-28 09:04:07)

Nieparzyste są zajęte przez 65C02. Zostało mi 7 miejsc. Dlatego jedną (pld) wpakowałem pod $44. Mam jeszcze parę nopów na rozszerzenia poza zakresem 3/7/B/F - 54, D4, F4 5C, DC, FC - póki co, robia NOP. Żeby było konsekwentnie, zdaje się nie obejdzie się też bez segmentu stosu. Tu push i pull nie ma sensu, trzeba zrobic ld i st. Poza tym chcę kiedyś zrobić instrukcje "g32/go8" - wszystkie opcody i adresowanie zostają bez zmian, tyle że A, X, Y, PC i SP dostają 32 bitów. Nic więcej nie chcę dodawać, to ma być nadal tak proste jak 6502.

16 Ostatnio edytowany przez pik33 (2016-04-29 13:11:39)

Jak ktos chce sie pobawic w alpha-testera, załączam próbkę. Potrzebny windows x64. Program oczekuje sidów w D:\sid.

Post's attachments

sid004.zip 1.73 mb, liczba pobrań: 2 (od 2016-04-29) 

Tylko zalogowani mogą pobierać załączniki.

17 Ostatnio edytowany przez pik33 (2016-04-29 13:22:20)

PS: klawiszologia: strzałki w górę/dół - poruszanie się po liście, enter - wybór pliku/katalogu , 1-100 Hz, 2-200 Hz, 4-400 Hz, 3 - 150 Hz, 5-50 Hz, f1,f2,f3 - kanał 1..3 on/off,  p-pause/resume, esc - wyjście, i - raster interrupts :) , f - fullscreen on/off, +,- na klawiaturze numerycznej - zmienia subsong

Program prosi kartę dźwiękowa o 96 kHz/16 bitów.

18

Wyniki eksperymentów z programem, odkąd dostał dostęp do katalogów (=HVSC) są takie, że większość PSIDów gra.. ale nie wszystkie. Sporo po prostu nie działa. Coś jeszcze jest niedorobione...

Dwie rzeczy chcę mieć teraz w związku z tym programem. Chcę to mieć na malinie, i żeby odtwarzało także SAPy. Do tego celu trzeba zaimplementować POKEYa, który wygląda na rzecz trochę bardziej złożoną niż SID.

19

Grajka zagrała na malinie. Tyle że: za pierwszym podejściem procedura się nie wyrabiała. Posiedziałem nad kodem, pooptymalizowałem, JEST! Wyrabia się w ramce. 19.5 milisekundy na 20. Na malinie trójce... Ta sama procedura na blaszaku - 600 mikrosekund...

Ten SID o tyle potrzebuje tej mocy, że po pierwsze działa 1:1, 985 kHz, a po drugie uprzestrzennilem mu wyjście, co spowodowało ze zamiast jednego filtra muszą być 3 niezależne dla każdego kanału, a na koniec mikser. Ale tez i kompilator fpc na ARMa daje mało optymalny kod. Pooglądałem go sobie...

Wylazły też inne kwiatki: kompilowany na platformę x64 kod "wytrzymał" obliczenia na 32-bitowych intach, których wyniki pośrednie nie mieściły się na 32 bitach. Po prostu natywny format jest 64-bitowy... błąd związany z przepełnieniem oczywiście natychmiast wyszedł na 32-bitowej malince.

19 milisekund na Raspberry Pi 3 oznaczało po prostu brak możliwości uruchomienia tej zabawki na malince dwójce. W tej sytuacji wyjścia nie było i  tak jak przewidywałem, w ruch poszedł asembler. Na pierwszy ogień do przepisania poszły filtry. Z 19 milisekund zrobiło się 13. Ciekaw jestem ile jeszcze urwę tych milisekund...

Jak już urwę tyle, że zagra na nie podkręcanej dwójce, wrzucę próbkę. Po czym spróbuje podpiąć do grajki także POKEYa, coby zagrała także nasze rodzime SAPy.

20

// z dyskusji o SwinSID'zie
21:25:09 <asie> poza tym
21:25:19 <asie> emulacja SIDa dokladna wymaga 1GHz Pentium III i jest to udowodnione juz od sporego czasu
21:25:26 <asie> moze byc podobna, i SwinSID jest close enough do gier
21:25:31 <asie> ale do demek to sie nie nada, zapomnij xD
21:25:41 <asie> predzej w FPGA uwierze
.: miejsce na twoją reklamę :.

21

skrzyp napisał/a:

(...)wymaga 1GHz Pentium III (...)

Czyli mniej więcej mocy 1 rdzenia maliny 2/3.

Ale moja emulacja nie jest też dokładna. Z zegarem 1:1 idą akumulatory fazy i generatory poszczególnych fal. Moduł ADSR tez jest 1:1 - działa co próbkę - ale jest tylko zgrubnym przybliżeniem tego, co robi prawdziwy SID (nie mówiąc już o ADSR Bug). Są filtry, ale tutaj to juz w ogóle są schody, bo nie ma dwóch takich samych sidów, więc filtry sa zrobione zgodnie ze specyfikacją: częstotliwośc ~=wartość rejestru*5.8 + 30. Nie ma póki co mozliwości odtwarzania sampli.

Jeśli chodzi o czas, najwięcej czasu da się chyba zaoszczędzić na module ADSR, zwłaszcza, jeśli się zrobi tak jak w SIDzie, czyli licznik inkrementowany co cykl i dane z tabelki.

Najwięcej w tym przypadku daje przejście na asm, bo kod który wychodzi z kompilatora jest kompletnie nieoptymalny. Jak piszę w asm to na przykład wiem jakie wyniki za chwile wykorzystam i trzymam je w rejestrach; raz ładuję do rejestru wskaźnik do struktury, a później dodaję tylko offsety. Albo wiem ze w tym konkretnym miejscu potrzebuję 64 bitów na wynik pośredni wiec wstawiam tam instrukcję smull  a potem koryguje wynik do 32 bitów zamiast deklarować zmienne jako int64. itd, itp.

Apropos FPGA, docelowo to tam pójdzie :) Zresztą, mam ja sida w swojej retromaszynie (temat retromaszyny jest tutaj: http://forums.parallax.com/discussion/1 … 80-enabled a tutaj http://www.par.pl/Archiwum/2015/2-2015/ … -Propeller jest artykuł )  na FPGA, ale tam za niego robi SIDCog na zaszyty w FPGA mikrokontroler Propeller. Od tego SIDCoga w ogóle zaczęło się moje zainteresowanie SIDem. Ten emulator działa tam na 44100 Hz, wraz z ewentualnymi aliasami. A robiąc własny emulator przynajmniej mogę zrozumieć, jak ten chip pracuje w środku, a bez tego nie ma mowy o własnej implementacji SIDa w FPGA.

22

Ty uważaj, bo zaraz znowu przyjdzie jakiś "ekspert" i zacznie wołać, że nie ma sensu programować w asmie, przecież GCC tworzy taki smaczny i pożywny i zdrowy kod wynikowy… :D

.: miejsce na twoją reklamę :.

23

Niech sobie ekspert woła. Przepisanie samych filtrów na asm urwało 6 milisekund z 19.

24 Ostatnio edytowany przez pik33 (2016-05-23 19:02:36)

Chciałem miec grajka na malinie, to i mam go na malinie. Jak ktoś che się pobawic w alpha-testera, paczuszka poniżej. Potrzebuje SDL 1.2. Trzeba rozpakować zipa do wybranego katalogu po czym odpalić pliczek o pięknej nazwie "project1". Działa zarówno spod X jak i spod konsoli.

A PS: gałkologia: strzałki w górę i w dół poruszaja się po plikach, enter - wybór, F1..F3 chn 1..3 on-off, Num+, Num- - zmienia subsong, 1..5 zmiana częstotliwości: 1-100 Hz, 2-200 Hz, 3-150 Hz, 4-400 Hz, 5-50 Hz, esc-wyjście.

PS2: uruchamiany na malinie #3 - nie testowałem na #2. Powinien się wyrobić i na dwójce.

Post's attachments

sidplay.zip 346.74 kb, liczba pobrań: 1 (od 2016-05-23) 

Tylko zalogowani mogą pobierać załączniki.

25

Zaktualizowałem stronę domową grajka.

http://eksperymenty.edu.pl/index.php/pl/sid-player