forum speccy.pl
ZX Spectrum => HARDWARE => Wątek zaczęty przez: KWF w 2017.06.16, 23:53:06
-
Skończyły się mi AY-ki, a w pudełku poniewierało się jedno Arduino oraz wolna ATmega8. Zamawiałem AY-ki z różnych źródeł, ale zawsze było czekanie, albo sprzedawca opóźniał, albo nawet odwoływał wysyłkę. Do tego projektu natchnął mnie @Skinner, wspominając przy okazji jakiejś rozmowy o fejsie z AYkiem, że jest emulator na ATmedze, wymieniliśmy kilka wiadomości w tej sprawie i od pomyślu do prototypu minęły prawie 2 miesiące.
Ad rem, cały emulator jest rosyjskim pomysłem, moim wkładem jest jedynie płytka, aby zamontować go zamiast oryginalnego AY-ka w trzewiach Spectrum. Od razu zaznaczę, że emulator nie emuluje portów I/O, a jedynie część odpowiedzialną za generację dźwięku. Emulator w tym stanie nie nadaje się jako zamiennik AY-ka w Toastracku, +2 czy +3, ale można go wykorzystać w klonach tj. JS128K, HQ128K, ZX Nuvo czy częściowo w Chromie (o ile nie korzysta się z porów I/O). Sama płytka jest wymiarów niewiele większych niż AY-3-8912, ma wyprowadzone złączę ICSP, aby można przeprogramować ATmegę, bez wyrywania jej z płytki.
(http://fatla.eu/pub/ZXSpeccy/AYEmul/AY-ATmega8.png)
Na chwilę obecną mam działający prototyp z zegarem 20MHz oraz wgranym 3-kanałowym emulatorem z zegarem 1.75MHz. Pierwsze testy w Chromie poszły dość dobrze, poza tym że dwa połączenia musiałem wykonać kynarem.
Płytka prototypu w Chromie wygląda tak:
(http://fatla.eu/pub/ZXSpeccy/AYEmul/AY-ATmega8_prot_01.jpg)
Zostały mi dodatkowe dwie płytki, czas rozpędzić ATmegę do 27-32MHz i zobaczyć co to cudo potrafi. Tym razem ATmege wlutuję prosto w płytkę i dam niższy kondensator, aby nie budować wieży Babel.
Docelowo w planach jest wersja SMD o wymiarach, jak chip AY.
Jeżeli ktoś szuka więcej informacji o emulatorze, wszystko możne znaleźć na http://www.avray.ru (http://www.avray.ru).
Jakby ktoś polecił jakieś demo w którym AY poci się i wchodzi na wyżyny swoich możliwości, będę zobowiązany.
-
Że tak zapytam, taką jedną płytkę to można u Ciebie nabyć ?
-
Tylko gotowca, po kosztach komponentów na chwilę obecną. Chcesz tę "kynarową" czy poczekasz na finalną?
-
Jak dla mnie, może być i kynarowana.
Nawet w wersji KIT :) to się zlutuje.
-
Dwie mam już w pełni zlutowane (20 i 24MHz), trzecia czeka na kwarc 27MHz. Będziesz "beta testerem" :D
-
Nie nie nadaje sie, toto gra jak gra, a gra jak dziurawe wiadro. Trzeba chyba nie miec sluchu za grosz zeby tego uzywac.
-
Ale to jest ciekawostka.
Zawsze można sobie porównać dźwięki z oryginalnego AY-ka i z takiego "emulatora" w ramach testów muzycznych.
Oby nie zabrakło w Chinach AY-ków, puki my żyjemy :)
Jak to ruski "wynalazek" to przed odsłuchem trzeba coś "łyknąć", to może wtedy tony się złagodzą a harmoniczne wyprostują :P
-
Prędko nie zabraknie, bo AY robiło 6 firm do wykorzystania nie tylko w komputerach, ale też w masowej produkcji automatów do gier i prostych instrumentów. Tylko nie wzięli pod uwagę, jak elektronika się szybko rozwinie i jak dzisiejszy hit stanie się szybko starociem.
A jak gra ten emulator można posłuchać na stronie autora. Gra bardzo źle - Zaxon ma rację. Szkoda zachodu, ale kto zabroni hobbyście lub bogatemu.
-
No dobra, to ja jestem ten "hobbysta" :)
-
W sumie my tu wszyscy jesteśmy hobbystami...:D
-
Zasadniczo :D
-
Yny i hobby to hobby ale poziom jakis trzeba jednak trzymac, to na atmedze zrobilem juz pare lat temu, posluchalem , otrzasnalem sie z wrazenia i szybko zamowilem kolejne 30 prawdziwych AY ;)
-
Czy jak chcemy np. zakończyć jakieś party, puszczamy w ruch emulator AY-ka na Atmega :)
Ew. chcemy się szybko otrząsnąć z sennego stuporu.
-
Sorry, ale czysto to gra Ludovico Einaudi na fortepianie na żywo, a nie 8-bitowy "piździk" z 3 kanałami z głośnika TV :P
-
Klaud,hmm.. sa ludzie ktorzy graja na czystych AY , tych "pizdzikach" , ot przykład ;) , https://www.youtube.com/watch?v=FOx9InNtU3A,
-
Nie mówię, że nie, ale zauważ, że są też tacy co wolą analogowe instrumenty z ich dobrodziejstwem inwentarza. Mnie osobiście "nie jara" muzyka z tego filmiku. Chwała im za twórczość, mają swoich odbiorców, niszę. Z całym szacunkiem, ale Tangerine Dream, Kraftwerk czy Klaus Schulze to nie jest, moje skromne zdanie.
De gustibus non est disputandum.
Hobby to hobby, lepsze lub gorsze pomysły, swoje realizuję dla siebie. Powiedzmy sobie szczerze, ten emulator to takie "bele co", substytut i tyle.
-
Wiesz, Yerzmyey i Ay - Riders to jest nisza w/g ciebie ??
Na AY potrafi cuda zagrac, miedzy innymi dlatego tez go do Tokyo zaprosili zeby zagral koncert, ci, ktorych brzmienie prawdziwego AY jednak jara ;) No ale inni wola udawac ze blaszane wiadro na Atmedze zagra tak samo ;)
O tempora o mores ;)
-
Japońce mają dziwne gusta :P im coś bardziej odjechanego tym bardziej im pasuje, łącznie z automatami z używaną bielizną, a na wjeździe do ich kraju za Playboya musisz tłumaczyć się. :P
Poza tym wyciągasz daleko idące wnioski, z czegoś czego nie napisałem.
-
Do tego projektu natchnął mnie @Skinner, wspominając przy okazji jakiejś rozmowy o fejsie z AYkiem, że jest emulator na ATmedze, wymieniliśmy kilka wiadomości w tej sprawie i od pomyślu do prototypu minęły prawie 2 miesiące.
Drobna poprawka nie @Skinner tylko @Silenter - chyba, że o czymś nie wiem.
Ja jestem zajarany muzyką 8-bitową ale nie w stylu Yerz'a.
Mój projekt trochę przystopował bo @ZAXON zrobił niespodziewanie wznowienie TSFMów i część funduszy odpłynęła, a potem trzeba było obadać co to jest ten TSFM. W między czasie trochę elektroniki mi odparowało bo zasilacz breadboardowy puścił 12V na układy.
Właśnie się pozbierałem i idę dalej.
-
Do tego projektu natchnął mnie @Skinner, wspominając przy okazji jakiejś rozmowy o fejsie z AYkiem, że jest emulator na ATmedze, wymieniliśmy kilka wiadomości w tej sprawie i od pomyślu do prototypu minęły prawie 2 miesiące.
Drobna poprawka nie @Skinner tylko @Silenter - chyba, że o czymś nie wiem.
Tak, Ty Sławku, przepraszam. Mea culpa, późno w noc, 3 wiadomość od osób o podobnych nickach.
Swoją drogą nie zdziwę się, jak dobrze Wam znana osoba w swojego klona HQ128K/laptopa na smd dla każdego, wsadzi ATmege:) Pytał o zastąpienie oryginału AY na rosyjskim forum:
DJORDJE MITIC
Thursday December 24th, 2015 at 03:36 PM
Dear!
Need two things:
1. To replace AY-3-8912 in my Spectrum Sinclair 128K your solution
(...)
-
Parę plików audio, dla różnych zegarów (od 20 do 27MHz) oraz różnych układów:
Pliki Audio (http://fatla.eu/pub/ZXSpeccy/AYEmul/Audio/)
Miłej zabawy w zgadywanie co jest co :D
Mam nadzieję, że @Tygrys i spółka wybaczą mi, używanie ich dema do testów :)
-
Jak na moje ucho, to dwa brzmią tragicznie, a dwa bardzo dobrze!
-
Które? Proszę napisz nazwy plików, które są przyzwoite, a te które są tragiczne.
-
Zakładając, że to ten sam plik źródłowy:
file_1.m4a - drewno,
file_2.m4a - lepiej, nawet całkiem dobrze,
file_3.m4a - jakby brakowało polowy voiców,
file_4.m4a - soczyście, ładnie
-
Tak wszystkie przykłady są z tego samego emulatora w wersji 24.6. Mam 3 prototypy z zegarami: 20, 24 i 27MHz, z dwoma układami ATmega8 i ATmega328P. Płytki zmontowane według tego samego schematu i listy elementów biernych.
Na chwilę obecną wszystkie mają wgraną emulację AY-ka, ale właśnie zmieniam ją na Yamahe. Za platformę testową robi Chrome od @peara, z którego wyjście analogowe podpiąłem do wejścia liniowego makówki. Tam tylko QT i zapis, tego co wychodzi analogowo z Chroma, a jest odgrywane przez BigThings. Zapisuję pierwszą minutę ścieżki dźwiękowej tego dema w m4p i te pliki wystawiłem na swoim serwerze.
Dorzucę jeszcze, co robi emulator z tabelą głośności YM.
Ostatecznie spróbuję rozpędzić AVRa do 30MHz, powyżej może nie pójść w wersji THT.
-
plik 6 gra najwierniej - ktory to ?
Edit: By the way - dla ATMega328p w THT wszystko co wiecej niz 20Mhz to juz duzo, a co dopiero 30 :)
-
Poczekaj do końca tygodnia, wtedy dam znać co jest co. Ankieta zaczyna wyglądać ciekawie. Nie będę psuł zabawy, dopiero zaczęła się.
-
Ale koniec tygodnia już był!!! ;)
-
Zeszłego na bank :)
-
Ok, porobie za adwokata diabła ;)
Czyli zamiast AY-Greka za 1,5 dolara (no dobra, w hurcie ;) ) , robimy i zamawiamy płytki, lutujemy, dajemy Atmegi, programujemy je .. Zaraz, zaraz , dajemy przetaktowane i to o sporo Atmegi ...recht? I mamy kolejny piecyk.
Gdzie tu sens i logika? No chyba ze na zasadzie "bo mozna" no to nie mam wiecej pytan ;)
-
@ZAXON - nie wszystko musi być robione dla kasy czy praktyczności. Dla mnie w tym wszystkim ważniejsza jest frajda.
np. ja sobie kupiłem uszkodzone fdd 3000.
Nie wysłałem go do PEAR'a (pewnie dawno by już w pełni sprawne wróciło). Czeka sobie grzecznie spakowane, czeka na jesienne wieczory. Frajda odkrywania go i naprawiania na pewno będzie większa niż późniejsze używanie.
Zresztą twoje +D wydaje mi się obecnie wygodniejszym rozwiązaniem.
:)
-
@Zaxon, cena jednego AY-3-8912 w jUKej od sprawdzonego sprzedawcy ... 6-7 funtów + przesyłka. W Twoim przypadku nie ma sensu, kupujesz po 1.5 dolca po 100szt. :P
ATmega8 można dostać za 1.5 funta z przesyłka w detalu.
-
EEE nawet taniej - mega8 w pakietach po 5 sztuk z Azji kosztuje 3 funciaki z darmowa przesylka.
-
@screemer: Zapomniałeś dodać, że nie jest z wylutów :D Swoją drogą pisałem o lokalnych dostawcach.
-
Silenter, alez oczywiscie, sam robie sporo roznych dupereli ot tak dla frajdy i zobaczyc gdzie sie tym razem zadymi ;) D+ nie jest moje, to tylko odswieżony stary projekt .
Klaud, i mam pewnosc ze to co zalozylem mi sie nagle nie wygruzi z powodu przegrzania czy bledow w sofcie ;) Atmega8 za 1,5 funta tez moze sie wcale nie chciec krecic na 24,27,czy 30 MHZ ;)
-
o, będę słuchał jutro w dzień :)
-
Dziękuję tym co wzięli udział w głosowaniu.
Przykłady były generowane przez następujące układy:
- file_01 - ATmega328P z zegarem 20MHz, emulator AYka z zegarem 1.75MHz
- file_02 - GI AY-3-8912, segar 1.79MHz
- file_03 - ATmega328P z zegarem 27MHz, emulator AYka z zegarem 1.75MHz
- file_04 - ATmega8-16PU z zegarem 24MHz, emulator AYka z zegarem 1.75MHz
- file_05 - ATmega328P z zegarem 20MHz, emulator YMka z zegarem 1.75MHz
- file_06 - GI AY-3-8912, segar 1.79MHz
- file_07 - ATmega328P z zegarem 27MHz, emulator YM z zegarem 1.75MHz
- file_08 - ATmega8-16PU z zegarem 24MHz, emulator YM z zegarem 1.75MHz
Podsumowując, trzy osoby na 7 głosujących poprawnie wskazały pliki ze ścieżką odtwarzana przez oryginalny układ AY-3-8912 (pliki 2 i 6).
Tak na marginesie, odpaliłem AVR Studio i przeglądnąłem plik źródłowy w ASM, ponieważ byłem zaskoczony tragicznym dźwiękiem z ATmega328P. Skompilowałem pliki i wyszło, że coś nie tak było z tymi pobranymi ze strony autora projektu. Pliki wynikowe różniły się w 80%, jednak nawet nowa kompilacja niewiele pomogła. Mam jeszcze ATmega48 i nie ma wielkiej różnicy pomiędzy dźwięk generowany przez ten układ a przez ATmega8. Także nie ma większych róźnic pomiędzy emulacją AY and YM. Mogę napisać, że tylko układy ATmega8 i ATmega48 dają zadawaląjące rezultaty przy taktowaniu od 20 do 25MHz. Kręcenie AVR w obudowie DIP powyżej 25MHz nie ma sensu.
-
Szóstki byłem pewien. Co do dwójki się wahałem. Za bardzo eksploatowane były efekty szumowe ;)
Gdyby nie wsłuchiwanie się w każdy egzemplarz AmpY nie usłyszałbym żadnej różnicy :D
-
@pear: miałeś łatwiej, ponieważ Chrome wg. Twojego projektu robił za poletko doświadczalne :D
-
Jak do mnie dotrze, to sobie potestuję :)
-
Będzie co testować, ponieważ autor emulatora pracuje nad nowszą wersja ;)
http://www.avray.ru/news/new-version-coming-soon/ (http://www.avray.ru/news/new-version-coming-soon/)
-
To miłe ze strony autora emulatora, że docenił Twój wkład w testowanie jego projektu.
Poczekamy, zobaczymy, co tam nowego powstanie.
-
Pojawiła się nowa wersja emulatora (24.7) z porawkami generatora szumu. Do tego, otrzymałem informację od autora, jak zmieni konfigurację emulacji na AY/YM z dowolnym zegarem, np. 1.79MHz.
Niestety chwilowo, nie będę miał czasu posiedzieć nad tym. Może w przyszły weekend.
-
Kopalnia roku, ale jest nowa wersja wsadu do Atmegi o numerze 25.0 (https://www.avray.ru/ru/ay_ym_emulator/).
Zmiany w poziomach sygnałów wyjściowych dla generatora szumu i tonów. Chyba będę musiał odgrzebać Chroma 128 i sprawdzić jak to bzyczy.
-
Masz może jeszcze płytki do tego emulatora ?
-
Chyba mam do SMD. Poszukam.
-
Ok.
I'am waiting
-
https://oshpark.com/shared_projects/Jp0BUGlk
-
Dzięki :)
Zamówię sobie.
-
Prośba do posiadaczy emulatora o puszczenie programu z załącznika. Pochodzi ze strony http://hypr.ru/blog/747.html Głównie chodzi mi o część gdzie testowane są rejestry AY.
Tak przy okazji to genialna apka do testowania pojedynczych AY i TurboSound.
-
skoti: niezły programik :) do testowania chińskich malowanek
:) Ukazała się nowa wersja (26.0) emulatora: https://www.avray.ru/ay_ym_emulator/ (https://www.avray.ru/ay_ym_emulator/)
-
Schemat emulatora, co wisi na OSHPark.
-
Wgrywanie emulatora to ATmegi8.
Używałem do tego celu programatora TL866A ze złączem ICSP. Aby go wgrać poprawnie emulator należy zwrócić uwagę na:
- skompilowany kod emulatora
- konfigurację emulatora
- bity konfiguracyjne MCU
1. Kod emulatora
W paczce z emulatorem znajdują się skompilowany pliki z kodem emulatora pod kilka układów serii ATmega: 8, 48, 88, 168 i 328. Dodatkowo dla każdego typu MCU są wersje dla 2 kanałów lub 3 kanałów audio oraz wersje z tabelami głośności do emulacji układów typu AY-3-891x lub YM. Do zamiennika rzeczywistego PSG w wersji AY-3-891x na ATmega8 należy wybrać wersję 3 kanałową, dedykowaną do tego MCU i z tabelą głośności np. AY. Kod emulatora wgrywa się do pamięci flash MCU (Code):
(http://fatla.eu/pub/ZXSpeccy/AYEmul/ATmega8_code_flash.png)
2. Konfiguracja emulatora
Plik konfiguracyjny emulatora jest uzależniony od trzech czynników:
- trybu pracy emulatora - w tym przypadku tryb pracy równoległej, ponieważ dane przesyłane są po szynie danych o szerokości 8 bitów
- częstotliwości zegara MCU, np. 24MHz
- częstotliwości zegara podanego na PSG, np. 1.75MHz
Plik konfiguracyjny wgrywamy do pamięci EEPROM MCU (Data):
(http://fatla.eu/pub/ZXSpeccy/AYEmul/ATmega8_data_config.png)
3. Bity konfiguracyjne MCU
Ostatnią rzeczą jest poprawne ustawienie fuse-bitów, a one mają inne wartości dla każdego typu MCU, np, dla ATmega8 odpowiednio:
- fuse low byte = 0xCE
- fuse high byte = 0xCF
Lock-bitów nie ustawiamy (!!!) i bajt je opisujący powinien mieć wartość 0xFF.
(http://fatla.eu/pub/ZXSpeccy/AYEmul/ATmega8_fuses.png)
Wszystkie powyższe informacje są zawarte w pliku tekstowym załączonym do paczki z emulatorem. W tym pliku jest też zawarta instrukcja, w jaki sposób zaprogramować MCU przy użyciu AVRDUDE.
-
Hahaha: R.I.P. AY (https://www.youtube.com/watch?v=Ii5gcyprhAg)
Swoją drogą zmajstrowałem zamiennik w SMD ponad 3 lata temu:
(http://fatla.eu/pub/ZXSpeccy/AYEmul/AY-ATmega8_smd_prot_02.jpg)
-
Raczej wątpię, żeby ktoś uruchomił linię produkcyjną AY-3-89xx, dlatego sprzętowy emulator wydaje się atrakcyjnym rozwiązaniem.
Problemem jest tylko brak portów I/O.
Układy WD 1770 i WD 1772 też się już kończą - ceny powoli robią się na nie kosmiczne.
Więc być może i tu będzie pole do popisu dla emulatora sprzętowego.
-
https://github.com/alexanderk23/ayx - co prawda na STM, ale z portami I/O.
Swoją drogą prawie 2 lata temu Rosjanie rozrysowali całą wewnętrzną strukturę układu AY-3-8910.
Istnieje też niezła implementacja AY/TS w HDL.
Moim zdaniem "emulowany" AY, to tylko kwestia czasu oraz wielkości rynku. Swoją drogą kilka firm nadal nadal robi zamienniki pełnowymiarowego AYka i w sumie nie są one gorsze od oryginału.
-
A tej implementacji AY-ka nie widziałem.
Ciekawe, jak to gra.
-
Trochę odkopię temat, bo jakiś czas temu pojawiła się nowsza (chyba finalna) wersja softu do tego.
Jest też na Github'ie podobny projekt: https://github.com/Yevgeniy-Olexandrenko/avr-ay-board
W porównaniu z wersją Klaudiusza ma to jeszcze dołożone filtry RC na wyjściach ABC, ale z nimi to gra strasznie cicho jednak można jeszcze poeksperymentować zmniejszając rezystory i dobierając kondensatory.
Zmontowałem akurat z nudów na szybciora to cacko na Atmega88-20AU i "ćwierka" mi to w miarę poprawnie przy 30MHz, bo taki kwarc akurat znalazłem. ;)
BTW, zostało mi jeszcze kilka gołych płytek gdyby ktoś się chciał pobawić.
-
Z góry przepraszam za takie wykopaliska, ale trafiłem na ten wątek dopiero teraz, gdy poskładałem sobie dwie płytki v1.4 z układem ATmega48PA@20MHz.
Przejdźmy jednak do rzeczy. Emulacja AY jeśli chodzi o generator dźwiękowy działa. Niestety tryb pracy jako 3 kanały wyjściowe ma pewien mankament. Otóż kanał B jest odtwarzany zdecydowanie ciszej niż A i C. Można to "naprawić" ustawiając tryb pracy jako 2 kanały z programowym mikserem i eliminując standardowy układ miksera na rezystorach. Ewentualnie zmieniając układ by tylko dostosowywał poziom wyjściowy z emulatora (Który jest zdecydowanie większy) do tego co daje oryginalny AY.
Teraz pytanie: Dlaczego tak się dzieje, i dlaczego jeszcze to nie zostało wychwycone i poprawione? Odpowiedź być może jest taka, że w układzie docelowym tego projektu - czyli samodzielnego grajka to nikomu nie przeszkadzało :-X. Pozostaje tylko kwestia skąd to się bierze.
Takie zachowanie w trybie pracy z 3-ma kanałami wynika IMHO z błędnych założeń układowych i programowych.
Jeśli zajrzymy do kodu źródłowego to będzie można zauważyć, że licznik TIMER1 nie tylko pracuje jako generator dwóch przebiegów PWM - 1-bitowy DAC - dla kanałów A i C, ale jest też podstawą czasu generowanego dźwięku. Dlatego też bitowość tego przetwornika zależy od... częstotliwości pracy kwarcu (załącznik).
Przy konfiguracji licznik TIMER1 jest skracany do wartości wymaganej by dźwięk był poprawny w zakresie jego tonacji.
; Defines the counter's TOP value
; ICR1H = 0
; ICR1L = config
out EEARL, YH ; set EEPROM address 2
sbi EECR, b0
in r18, EEDR ; load byte 2 from EEPROM to r18
#if MCU_TYPE == 0
out ICR1H, C00
out ICR1L, r18 ; set PWM speed from byte 2 of EEPROM (affect AY chip frequency)
#else
sts ICR1H, C00
sts ICR1L, r18 ; set PWM speed from byte 2 of EEPROM (affect AY chip frequency)
#endif
; ICR1L value formula (28000000/109375/2 - 1) where 28000000 = 28MHz - AVR oscillator frequency
; 109375 is for 1.75 MHz version, formula is (PSG frequency / 16) e.g. for 2MHz it is 2000000/16 = 125000
Można to zrobić, bo konstrukcja tego licznika na to pozwala.
Natomiast kanał B jest generowany przez licznik TIMER2, którego bitowość PWM nie jest już zależna od kwarcu. I zawsze jest 8 bitowa.
Załóżmy, że kanały A i C są 7 bitowe (mniej więcej tyle ma wyjść z równania), stąd wartość 127 wpisana do rejestru daje wypełnienie 100% - najwyższa amplituda na wyjściu analogowym. Ale nie jest tak dla kanału B, bo wpisanie tam wartości 127 daje nam tylko 50% wypełnienia! I w kodzie nie znalazłem na to działań naprawczych, a dostępne są dwa:
Pierwsze, to skrócenie licznika TIMER2 też do wartości zależnej od kwarcu. Teoretycznie da się to zrobić, bo licznik też można sprzętowo skrócić, ale jest pewien haczyk. Wtedy nie możemy dla kanału B skorzystać z wyjścia OCR2A, tylko trzeba by było skorzystać z wyjścia OCR2B, które jest tak niefortunnie umieszczone, że koliduje z jednym z przerwań zewnętrznych, z którego kod korzysta do reakcji na zmiany BDIR/BC1. Zatem ten sposób naprawy odpada już w przedbiegach.
Zostaje rozwiązanie drugie - programowe. Czyli wartość przekazywana do "przetwornika DAC" trzeba po prostu pomnożyć o jakiś faktor.
Najprościej byłoby po prostu wartość pomnożyć przez dwa: 127*2 = 255, i mamy zależność 127 = 100% wypełnienia.
#elif CHANNELS == 3
// three channel version ----------------------------------------
lsl OutB ; napraw głośność B (szybkie, pomnóż OutB przez 2)
#if MCU_TYPE == 0
out OCR2,OutB
#else
sts OCR2A,OutB
#endif
// --------------------------------------------------------------
#endif
Lecz nie mamy pewności co do tego, czy dla danego kwarcu wartość max będzie właśnie <= 127 by się po przemnożeniu zmieściła w 8 bitach. Dlatego można pójść nieco inną drogą - nieco kopiując rozwiązanie kilka linijek wyżej (Mikser programowy dla dwóch kanałów).
#elif CHANNELS == 3
// three channel version ----------------------------------------
mov YL,OutB ; TMP = TMP + (TMP/4 + TMP/8);
lsr OutB ; napraw głośność B (bezpieczne, zwiększ o ok. 65%)
lsr OutB
add YL,OutB
lsr OutB
add OutB,YL
#if MCU_TYPE == 0
out OCR2,OutB
#else
sts OCR2A,OutB
#endif
// --------------------------------------------------------------
#endif
Można jeszcze poeksperymentować z formułą, choć będzie to wpływać na długość kodu, a zatem na szybkość wykonania pętli emulacji.
Jak znajdę chwilę czasu to przetestuje oba rozwiązania.
ps. Jest jeszcze jedna możliwość poprawy tego kodu, choć wymaga daleko idących zmian. Całkowite odcięcie timingów od generowania PWM. Czyli: timingami zajmuje się niewykorzystany licznik TIMER0 pracujący w trybie CTC, czym zachowujemy elastyczność i zależność tonacji od częstotliwości kwarcu. Zaś liczniki TIMER1 i TIMER2 puszczamy na 8 bitów, i wtedy grają równo...
-
Ciekawe obserwacje i spostrzeżenia, widzę że trochę to rozkminiales, ja nie byłem aż tak dociekliwy. :)
Kolejny problem to brak obsługi portu równoległego i w związku z tym zastosowanie tego np w Amstrad CPC będzie problemem bo na tym bazuje obsługa klawiatury.
-
@ArturM: dzięki za te informacje, tylko wszystkie zmiany byłyby oddzielną dystrybucją od oryginalnej. Zresztą zamiennik od Bena lub Charliego też jest odpryskiem tego co zrobił autor tego emulatora.
-
"Wiesz co robi ten miś? On odpowiada żywotnym potrzebom całego społeczeństwa. To jest miś na skalę naszych możliwości. Ty wiesz co my robimy tym misiem? My otwieramy oczy niedowiarkom. Patrzcie, mówimy, to nasze, przez nas wykonane i to nie jest nasze ostatnie słowo!" :D
W sumie to chciałbym tylko sprawdzić czy moje wnioski były słuszne i czy taka modyfikacja da zamierzony efekt.
I drobna autopoprawka. "Bezpieczny" kod miał wyglądać tak:
mov YL,OutB ; TMP = TMP + (TMP/2 + TMP/4);
lsr OutB ; napraw głośność B (bezpieczne, zwiększ o ok. 65%)
add YL,OutB
lsr OutB
add OutB,YL
-
ps. Jest jeszcze jedna możliwość poprawy tego kodu, choć wymaga daleko idących zmian. Całkowite odcięcie timingów od generowania PWM. Czyli: timingami zajmuje się niewykorzystany licznik TIMER0 pracujący w trybie CTC, czym zachowujemy elastyczność i zależność tonacji od częstotliwości kwarcu. Zaś liczniki TIMER1 i TIMER2 puszczamy na 8 bitów, i wtedy grają równo...
No, proszę. Ktoś chyba doszedł do takich samych wniosków. Otóż istnieje kod zwany avr-psg, który w 99,9% właśnie w ten sposób poprawia to oprogramowanie układowe (Różnica jest kosmetyczna co do wykorzystania sposobu jak skracać licznik TIMER0). Zatem mamy:
- licznik TIMER0 jako konfigurowalna poprzez dane w EEPROM podstawa czasu,
- liczniki TIMER1 i TIMER2 działają jako 8 bitowe w trybie FastPWM - więc mamy 3 identyczne przetworniki DAC 1-bit,
- z tego co analizowałem, to poprawiono też tabelę głośności i obwiedni by operowała na 8 bitach.
Jak to gra? IMO nieźle. Możecie się sami przekonać odsłuchując nagrania. Specjalnie nagrania są zapisane w wysokiej jakości jako FLAC 24-bit 48KHz. Wszystkie nagrane w tych samych warunkach, przez wejście liniowe prosto z mojego Multiinterface. Odtwarzaniem zajmował się HQ48 SMD z uruchomionym programem SoundTracker. AVR-PSG działał na ATmega48PA taktowanym 20MHz (bez OC :P ).
https://filebin.net/asv278if9delwx5u# (plik zip, 150MB)
-
Gdzie można poczytaj o tym kodzie "avr-psg"? Mógłbyś podzielić się linkiem?
-
Gdzie można poczytaj o tym kodzie "avr-psg"? Mógłbyś podzielić się linkiem?
https://github.com/Yevgeniy-Olexandrenko/avr-ay-board/tree/main/firmware/avr-psg
-
Dzięki. Nie zauważyłem, że ta wersja jest tez na githubie.