Van néhány WAV fájlom, amik egy régi 8 bites számítógép betölthető programjait tárolják.
Továbbá van egy javascript alapú emulátorom, ami az AudioContext segítségével be is tudja tölteni ezeket.
Valamint jelenleg ehhez az emulátorhoz létezik néhány MP3 fájl is, amiben szintén a géphez tartozó programok vannak tárolva, és ezeket is be tudja tölteni az emulátor.
A feladat az lenne, hogy én is tudjak MP3 fájlt generálni a létező WAV fájlomból úgy, hogy ez az emulátor be tudja tölteni.
1 - Azt már megtapasztaltam, hogy az AudioContext objektumnak van egy 'sampleRate' paramétere. Ha ez az érték nem azonos a wav fájl sampleRate értékével, akkor az emulátor nem tudja beolvasni. Ha azonos, gond nélkül betölti.
2 - Érdekes módon, ez a 'sampleRate' paraméter az mp3 fájlok esetén nem azonos az mp3 fájlból killvasható értékkel. Az AudioCintext objektumban ez 48000, míg az mp3-nál a ffprobe parancs 44.1kHz-es értéket mutat.
A parancs, amivel jelenleg próbálok konvertálni:
lame -s 44.1 -b 96 -q 9 -m m program.wav program.mp3
Az ffprobe mind a működő mp3, mind az általam konvertált mp3 esetén ugyanazt az információt mutatja:
..., bitrate: 96 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, mono, fltp, 96 kb/s
A minta mp3 fájlt mégis gond nélkül betölti az emulátor, az enyémet meg nem.
Van ötletetek, hogyan tudnám mp3 formátumba konvertálni a wav fájljaimat, hogy továbbra is működjön a betöltés?
- 3648 megtekintés
Hozzászólások
Probald meg a sox-szal a konverziot: `sox program.wav -c 1 -r 44100 program.mp3`, mindezt kulonbozo -r ertekek mellett (mmint ha ez nem jo akkor 48000 is johet). A -c 1 sem muszaj, de lehet hogy ez is szamit hogy mono legyen az mp3 stream. Lehet hogy a lame alapertelmezesben mono wav-vol is sztereo mp3-at csinal, ellenben a szimulator csak mono mp3-at szeret.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, próbálgattam most ezzel is, de sajnos még ezzel sem megy.
- A hozzászóláshoz be kell jelentkezni
Két tipp:
1. Formátum: itt panaszkodik a költő, hogy a lame szabadon értelmezi a szabvány fejléc fogalmát
2. Az mp3 veszteséges tömörítés és az emberi fülre van kitalálva, lehet a default szűrő kidobott valamit amit te nem hallasz, de a gépnek hiányzik
- A hozzászóláshoz be kell jelentkezni
Igen, én is azt gyanítom, hogy a veszteség viszi el a biteket, de ehhez az emulátorhoz jelenleg csak mp3-ban találok mástól betölthető programot, így azért mégiscsak megoldható valahogy.
- A hozzászóláshoz be kell jelentkezni
+1
flac kene annak
- A hozzászóláshoz be kell jelentkezni
Próbáld OGG/Vorbis-ba, esetleg OPUS-ba konvertálni. Ugyanazon a bitrátán jobb a minőség és emiatt nagyobb eséllyel eszi meg az emulátor.
Ha biztosra akarsz menni, akkor konvertáld át FLAC-ba, amit szükség esetén belerakhatsz OGG konténerbe is.
- A hozzászóláshoz be kell jelentkezni
Vagy az is lehet, hogy az emulátor kezel valamilyen gazdaságosabb formátumot is. TVC-hez pl. "cas" kiterjesztésű fájlokat szokás használni, ami kb. a TVC saját diszk-formátuma.
- A hozzászóláshoz be kell jelentkezni
Ez az emulátor jelenleg csak az AudioContext objektumon keresztül tud betölteni, így csak hangformátum jöhet számításba. Ráadásul a végeredményt egy igazi gépbe is be akarjuk majd tölteni, tehát oda is célszerű a hangformátum. A wav jó, de az emulátor miatt szeretném, hogy meglegyen mp3-ban is.
- A hozzászóláshoz be kell jelentkezni
A kifejezetten erre készített formátumok az adatot tárolják és a paramtéreket, amivel előállítható hangként a gépnek megfelelő formátumban az adat.
Ez azt is jelenti, hogy semmi sem zárja ki azt, hogy audiót generálj belőle és azt használja az emulátorod. 
https://www.youtube.com/watch?v=MAIsOIwgJWA
Úgy látom tzx-hez van javascript hang generátor http://kmp1.github.io/tzx.js/
Nem írtad, hogy milyen 8bites kazetta, milyen géphez. Hogy saját írású vagy mástól felhasznált emulátor. 
Gondolom nem hátrány, ha sokkal kisebb méretű is a "kazetta", mint hangfájlként. Meglepne, ha valaki nem készített volna már olyat vagy nagyon hasonlót a számodra szükséges formátumból is.
- A hozzászóláshoz be kell jelentkezni
Próbáld meg FLAC-ba, ha abból se megy, akkor nem az MP3 konverzióval van a baj. Egyébként érdekes ez a loader, nem tűnik túl megbízhatónak, vajon hogyan érzékeli a tüskéket? A népszerű gépek (C64, Spectrum, CPC) mind négyszögjelek felfutó (vagy lefutó) éleit detektálják.
A jelalakaidon látszik, hogy a működő MP3-ban valamivel szélesebb impulzusok vannak, azt talán könnyen elkapja a loader, míg a nem működőben gondolom van olyan, ami túl keskeny ahhoz, hogy észlelje.
- A hozzászóláshoz be kell jelentkezni
Ezeknél szinte minden esetben két null átmenet között eltelt idő alapján számolták a bit értékét.
Z80/68xx korában még AD a homecomuterekben nem volt.
itt egy mini gif, hogy miként nézett ez ki: https://i.stack.imgur.com/INsNY.gif (a képet nem én csináltam)
- A hozzászóláshoz be kell jelentkezni
Én edge detektorokról tudok, konkrétan a C64-ben a CIA FLAG lába olyan, hogy tud interruptot küldeni fel(vagy le?) futó élre, a Spectrum meg csak nézi a bemenő jelet, ha t időben 0, t+1-ben meg 1, akkor az egy felfutó él. Nincs semmi nullátmenet, eleve csak 0 vagy 1 van.
- A hozzászóláshoz be kell jelentkezni
Igen, erre gondoltam én is, csak tévesen ez a null átmenet ugrott be.
Schmitt trigger volt a bemeneten ami elintézte ezt.
- A hozzászóláshoz be kell jelentkezni
Megpróbáltam a WAV fájlt alacsonyabb mintavételezéssel elkészíteni. Az MP3 fájlnál megtartottam a 44.1kHz-et, mert a működő is ilyen. Sajnos nem sikerült így sem jó MP3 fájlt készítenem.
- A hozzászóláshoz be kell jelentkezni
soxi -val nézd meg a fájlokat - valószínűleg kiderül h mi a turpisság!
"antiegalitarian, antiliberal, antidemocratic, and antipopular"
- A hozzászóláshoz be kell jelentkezni
Köszönöm, ez jó tippnek tűnt!
Sajnos azonban a két mp3 (a működő, meg az enyém) csak a hosszában különbözik.
- A hozzászóláshoz be kell jelentkezni
Az Audacity-vel ha megnyitod a két mp3 fájlt, vizuálisan kereshetsz benne különbségeket.
Lehet, hogy a jelszint nem megfelelő.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, az ötlet nagyon jó, az eredmény azonban csak növelte a tanácstalanságom.
Készítettem egy képernyőképet, ahol látható egymás felett a 3 hangfájl.
- Legfelül a működő, jó WAV fájl. (Mellesleg ezt én generálom.)
- Középen ennek az MP3 változata, amit nem tud betölteni az emulátor.
- Legalul pedig egy jól betöltődő MP3. Itt már a bitek nincsenek szinkronban a felsőkkel, mivel ugye más az adattartalma.
A kódolás az, hogy ha két tüske távolsága 1.6ms, akkor az 0. Ha félúton van még egy tüske, akkor 1. (Nincs sem további szinkron jel, sem crc.)
Látszik, hogy a bitek hosszúsága sincs szinkronban, pedig a felső kettő a dokumentáció szerinti 1.6ms/bit sebességű. De valószínűleg nem ezzel van a probléma, hisz a legfelső WAV problémamentesen betölthető.
Ezek után igazából nincs ötletem.
- A hozzászóláshoz be kell jelentkezni
Az mp3 nem különösebben alkalmas erre, mert frekvencia tartományban dolgozik, a fázist akár teljesen el is dobhatja, az emulátornak pedig szüksége van rá. De ettől még működhet is, csak amolyan szerencsejáték. Én is ezt javasolnám: https://hup.hu/comment/2956670#comment-2956670
Én a js-t megpróbálnám debuggolni, hogy mit csinál, megpróbálnám kiíratni a detektált biteket, és abból látszana, hogy teljesen homály (pl nem egyező mintaidő), vagy időnként téved (tömörítésből adódó hiba), vagy mi a fene van?
Egyébként ez egy nagyon nem optimális adat-tárolási mód, de gondolom tudod :-) Ésszerűbb volna digitálisan tárolni a fájlokat és ha kell a feeling, akkor hanggá konvertálni on-the-fly és lejátszani a usernek, ha meg nem kell, akkor teljesen kihagyni ezt a dolgot a buliból.
- A hozzászóláshoz be kell jelentkezni
Magamtól sosem tárolnék programot mp3-ban. Csak az az egy zavar, hogy minden más program jelenleg mp3-ban van. Ezért érdeke, hogy én miért nem tudom ugyanezt megcsinálni?
Egyébként a js debug nem igazán kivitelezhető. A hangról jövő jelet egy bitre vezeti, és onnantól a rom-ot kellene debug-olnom, de rom debug nincs az emulátorban. A MAME emulátorban van debug, ott tesztelhetném, de ott meg nem olvas be MP3 fájlt. (Mondjuk mást sem.) Tehát túl nagy fának látom a js debugolását egyelőre.
- A hozzászóláshoz be kell jelentkezni
Ha megnézed a felsőt a 0-nál van a zaj. Az alsónál kb -1dB.
- A hozzászóláshoz be kell jelentkezni
Na, ezt a dB mértékegységet nem is értem. Nem tudom, mit jelent a -1dB. De ez a hullám egy bitre van rávezetve. Én azért azt várnám, hogy akármennyire is zajos a teteje, azért az mégiscsak 1-es bit, mint ahogy az aljának a zajossága is 0.
- A hozzászóláshoz be kell jelentkezni
Csak lehet, hogy minden samplet ami > 0 azt 1-nek vesz. A lame --gain opciója segít?
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
> Azt, hogy az egész grafikon lejjebb kerül.
Ez egy amplitúdó diagram, nem? Tehát a hangerő csökkentésétől a nulla felé laposodik, és a nulla a közepén a vízszintes fekete vonal. Fentről lefelé, lentről felfelé.
Amit utána írsz, hogy minden mintából kivonunk valamit, az az igazi.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Ránézésre a következő lehet a baj: a loader-ed null átmenetet (zero cross) keres és az alapján mér bitidőt.
Az első képen a wav érdekes, de akár működhet is, mert a null átmenetet lehet világosan látni. Nem konkrétan 0 jelszintnél kicsivel fölötte egyértelműen eldönthető, hogy 0 vagy 1.
A második képen eléggé „zajos” mert sokat „lebeg” a nulla közelében, emiatt a mérés mindig újra indul sok hibás bittel.
A harmadik megint tiszta jel, mert a fekete vonal keresztezésekor a mérés helyes értékeket ad. Itt is egyértelmű 0 vagy 1 van.
Próbaképpen, próbáld a második jelalakodat eltolni lefelé és akkor nagy valószínűséggel működni fog.
- A hozzászóláshoz be kell jelentkezni
Jókat ajánlottak itt előttem, de én másfele indulnék. Átkonvertálnám a kazettafelvételeket egy külön programmal bináris lemezképpé (ehhez tudni kéne pontosan milyen gépről van szó), és azt etetném meg az emulátorral, ha az nem eszi meg, akkor keresnék másik emulátort. Nem írtad, hogy milyen gép.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
Aircomp 16.
Nem véletlen nem írtam a konkrét típust, mert nem hiszem, hogy mérvadó. A probléma ugyanis nem az, hogy hogyan juttatok be egy programot, az megy. A probléma az, hogy hogyan csináljak MP3-at, amit megesz. Én nem tudok ilyet csinálni, más tud. Az érdekel, mit nem tudok én az MP3 készítésénél, amit más tud.
- A hozzászóláshoz be kell jelentkezni
Nagyobb bitrattel nem próbáltad? 192 pl.
- A hozzászóláshoz be kell jelentkezni
Vigyázz, a 96 kbps kevésnek tűnik, de monó, egy csatornás fájlról van szó, az kb. megfelel a 192 kbps sztereó bitrátának. Egyébként az ötlet nem rossz, meg lehet próbálni kicsit magasabb bitrátán, hátha segít. Nem garantált.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
lame -s 44.1 -b 96 -q 9 -m m program.wav program.mp3
miért a leggyengébb minőségben csinálod? -q 0 a legjobb minőség
Az eredeti wav mono volt-e, ha nem, akkor -m m -a paraméterezést ajánl, hogy jó legyen a mono.
a manuál alapján https://svn.code.sf.net/p/lame/svn/trunk/lame/USAGE
Az AudioContext meg alapértelmezetten azon dolgozik, amire a hangkimeneted állítva van. Gondolom átkonvertálja.
"the options are not specified when creating the audio context, the new context's output device's preferred sample rate is used by default."
https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/AudioCont…
Ha csak ez volt a baj, akkor legközelebb érdemes a manuállal kezdeni :)
De továbbra is értelmesebb lenne rendes formátumot használni és azt konvertálni hanggá, ha kell. Ha más nem valaki már csinált hozzá http://madmac.hu/8bit.hu/homelab/?q=node/5
- A hozzászóláshoz be kell jelentkezni
Hú, az húzós lesz, ahhoz nem sok emulátor és konverter van. Azt hittem, valami népszerűbbről van szó, C64, ZXSpectrum vagy hasonló.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
Ne már, ahogy fentebb is írták, az mp3 veszteséges, tökéletesen alkalmatlan erre.
Ha már mindenképpen hang, lehetne tömör wav is! Sokan azt gondolják, hogy a wav mindig tömörítetlen, de ez nem igaz, csak azt a formáját használjuk leggyakrabban. Gyors fejszámolással arra jutottam, hogy ha 1.6 ms a bitidő, akkor a 8 kHz-es mintavétel bőven elegendő, és teljesen jó lesz a telefonos tömörítés, ami valójában egy dinamika kompresszió, de az időzítéseket nem rontja el. Válaszd a G.711 A-law kódolást, ez 8 kB/s tárhelyet fog foglalni.
Bár tényleg nem tudom, miért nem az adatot tárolod, s miért nem írsz egy programot, ami adott esetben az adatból hangot generál valós időben.
Szerk.: Úgy számolom, még ennek a tömörített formátumnak a használatával is a tényleges adat a hangfile kevesebb, mint 1 %-a lesz, szóval tényleg nem tudom, miért nem a natív adatot tárolod.
tr '[:lower:]' '[:upper:]' <<<locsemegeLOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ne már, ahogy fentebb is írták, az mp3 veszteséges, tökéletesen alkalmatlan erre.
Relative sok audio modemes dolgot szoktam enkodolni/dekodolni mostanaban es nem igazan latom azt hogy mp3/ogg/barmi veszteseges tomorites rontana ezen. Sot. Eleve olyan zajosak ezek hogy ahhoz kepest nem oszt, nem szoroz :) Persze igaz hogy ezek a szalagos felvetelek mas kodolasokat/modemeket hasznalnak mint mondjuk egy radios modulacio, de valojaban azert olyan nagy kulonbsegek nincsenek a spektralis tulajdonsagokban.
- A hozzászóláshoz be kell jelentkezni
Ha tényleg csak annyi a tömörítés, hogy fft, aztán eldobja a magasabb frekvenciájú együtthatókat, majd inverz fft, akkor még rendben is van. Viszont emlékeim szerint például a Dallas DS2130 bár nagyon hatékonyan tömörített, az olyan fázishibákat, értsd, fázisugrásokat okozott a hangban, amitől kásás vacak lett az egész, az ilyen FSK szerű modulációt teljesen megöli. Az emberi beszéd azért marad érthető, mert sok periódusnyit mormog az ember az adott hangból, ha közben van fázisugrás, attól még világos a mormogás tónusa. Illetve az emberi agy kiegészíti a hangból hiányzó részeket.
tr '[:lower:]' '[:upper:]' <<<locsemegeLOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
./cassette audio.mp3 program.binha pedig egy bináris fájlból akarsz kazetta audiót csinálni,
./cassette program.bin audio.mp3Alapból jól fog működni (128 kpbs, minden zéró bit a negatív tartományban), de flagekkel mindenfélét varázsolhatsz. Pl "-o 127 -z -64" hatására az egy bitek hangmintája maximum lesz, a nulla biteké meg a negatív tartomány felénél. Megadható ezen kívül még mindféle úri huncutság is, pl hogy a magnón 7 bit egy bájt, vagy hogy a magas vagy alacsony bitek vannak-e előbb, stb. A sample rate is megadható, bár azzal semmit sem csinál, csak beállítja a fejlécben. Viszont minden, amit fentebb írtak az MP3 formátumról az igaz, de egyáltalán nem ezek miatt alkalmatlan a feladatra, hanem mert a codec ismeretlen mennyiségű csöndet rak a minták elé meg után. Ha teheted, használj inkább WAVE fájlt (azt is kezeli a program, egyszerűen csak ".wav" kiterjesztésű fájlokat adj meg). Persze ha az a JS emu csak mp3-at tud... Egyébként mi az emulátor linkje? Nyílt forrású? A példa MP3-ak letölthetők? Az egyetlen Homelab 4 emulátor, amiről tudok, az sajna zárt forráskódú (https://homelab.8bit.hu/emulator.html) és az csak WAVE-t kezel, MP3-at nem is, és csak HTP programok tölthetők le hozzá (a linkelt HTP2WAV meg már 404). Ps: Linux-ra írtam a proggit, de Windows-on is csont nélkül kell fordulnia mingw-vel (nem használ semmit). Ha szeretnéd, lefordíthatom Win-re, vagy wasm-ra és dobhatok rá egy webservice-t is akár.
- A hozzászóláshoz be kell jelentkezni
Nagyon keményen tolod, elismerésem. Csak így, hogy a gép betöltési-bitkódolási mechanizmusát se ismered, összedobtál ilyen gyorsan egy megoldást rá a semmiből. Ráadásul a kódban a for(i = j = l = 0; i < info.samples; i += length, j++) résznél dobtam egy hátast, ilyet még nem láttam, hogy egyszerre egy ciklusban mindjárt több ciklusváltozót is inicializálsz és léptetsz, legény vagy a gáton, az tuti. Persze, most így utólag végiggondolva nem tiltja semmi, de mivel ilyet még nem láttam senkitől, ezért nem gondoltam rá, hogy lehetséges.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Le vagyok én is nyűgözve! Nagyon köszönöm! Egyelőre sajnos nem megy, de ennyi munkát belém ölni ...
Az ötlet nagyon megtetszett, és egészen reálisnak is tűnt. Legalábbis sokkal előremutatóbb, mint a "használj mást" gondolatok.
Mivel a WAV-ot is én generálom, elsőre egyszerűbb volt átírni magamnál a HIGH és LOW értékeket elcsúsztatva. Próbáltam úgy is, hogy csak a LOW értéket viszem le 0x80-ról 0x70-ra vagy akár 0x68-ra. És próbáltam úgy is, hogy a HIGH értéket is levittem 0xFF-ről 0xF8-ra vagy 0xE8-ra.
Egyik sem volt sikeres. :(
A Te programoddal - már a webservice felülettel - megpróbáltam wav és mp3-at is generálni, de sajnos már a wav sem sikerült. Lett ugyan wav, de nagyon rövid. Nálam 23 másodperc a wav, nálad 3. A formátum, amit használnak az emulátorok, a 8 bites mono wav, 44.1kHz. MP3-ban pedig a működő mp3 96kbps.
Amúgy tényleg nagyon titkolják az információkat. Én egy podcastben hallottam erről az egészről. Van valamilyen homelab facebook csoport, elvileg ott lett meghirdetve, és információk is ott vannak. Én találtam még egy google levlistát is.
Az én konvertereimet eléred a github-on. Ezek már nagyjából működő kódok. A BASIC->HTP konverterem még erősen kezdetleges, és csak helyes BASIC kód esetén ad megbízható HTP fájlt. Valamint azt a visszajelzést kaptam, hogy a windows binárisai hibát dobnak, de - windows híján - ezt még tesztelni sem tudtam egyelőre.
Az emulátor pedig itt van. Én letöltöttem magamhoz, csak úgy tudtam bele saját programokat tenni.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Ott vannak a minta mp3 fájlok is, csak a wget nem szedi le őket, követni kell a js kódot, úgy le lehet tölteni:
Az emulátor alján lévő gombokkal lehet betölteni az emulátorba.
A mintavételezésre tényleg bármit be lehet állítani az emulátorban, de jelenleg 48000Hz van bedrótozva. Nálam már a json fájlban paraméter ez az érték, mert különben WAV fájlból csak a 480000Hz-eset töltötte be. Ha átállítom a sampleRate értékét, akkor már betölti 44100-zal készült wav fájlt is.
A HTP fájl tényleg viszonylag kis szopással szintén betölthető az emulátorba. Nálam már azt is kezeli az emulátor. Ha minden igaz, előbb-utóbb kapcsolatba tudok lépni az írójával, és akkor ezek talán az online változatba is bekerülhetnek.
A 0x68-es értéka alá azért nem mentem a LOW értéknél, mert így már nem ment pozitív tartományba. Valamint a működő MP3 fájlokban sincs lejjebb a minimum.
Amúgy a kódolás hivatalosan úgy történik a WAV fájlban, hogy a 0 bit 1.6ms-re lévő két tüske, az 1-es bit pedig a 0-ás bit két tüskéje között félúton egy harmadik. A bitek pedig magasabbtól az alacsonyabb felé kerülnek a bitfolyamba.
Teszteltem a betöltést, vissza is követtem a ROM-ot betöltés közben, és úgy tűnik, a tüskének egyetlen mintavétel erejéig kell magasnak lennie, így nálam működő betöltést eredményezett ha 50ns volt a tüske hossza, de az is, ha 200ns. Jelenleg 100ns-os tüskéket generálok a wav fájlba.
- A hozzászóláshoz be kell jelentkezni
Úgy látom van frisebb oldala a Homelab emulátornak, amit itt találtunk https://homelab.8bit.hu/emulator.html, a szerző oldalán 1.3 is van http://gaia.atilia.eu/
A htp wav konvertálóknak https://groups.google.com/g/homelab/c/9HCQgJJEjnc
megtalálta a forrását a lista szerint és oda beküldte. De emuwav néven is megvan egyben a kettő, ahogy írta.
Gondolom egész könnyen portolható lenne a js emulátorba a htp támogatás, még akár úgyis, hogy wav-ként dekódolja betöltéskor... vagy gondolom ő is binárissá értelmezi a wavot vissza és akár oda is be lehetne szúrni.
Ja és másik szálon: a wav lehet mp3 tömörítésű is akár, ha mindenképp mp3-as formátummal akar az op küzdeni. Ha csak forrásként használja a js audio ojjektumot, lehet hogy simán megeszi az emulátor.
ffmpeg -i TestPCM.wav -c:a libmp3lame TestMP3.wav
Vagy akár audacity is tudthat úgy menteni.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Másik kommentben írtam, hogy ő valsz félreértette a paraméterezést is és quality-ként a legrosszabbat választotta 9-cel, mert 0 a legjobb. Meg a mono-nál sem mindegy, hogy az eredeti wav mono volt -e vagy stereként tárolva, arra is van külön paraméter. Meg ha a lame nem jó, lehet más programmal is próbálkozni.
Amit régebbi kommentemben linkeltem videót, az gondolom bár más 8bit gépről szól, de ott egy mikrokontrolleres lejátszóval generálja le a hangot és kipróbálja, hogy emulátor és igazi gép mekkora sebességgel képes feldolgozni. Van benne pár érdekesség. Például az, hogy ha jól emlékszem, nem órajel függő hanem jel változás szerint halad. Szóval ez alapján akár teljesen összevissza csúszkálhatna a ritmusa a jelnek. Azzal van baja, ha túlságosan eltorzui a fel és leszálló ág (uggrál le-fel) és félreérti. https://www.youtube.com/watch?v=MAIsOIwgJWA
Azt is érdemes megpróbálni, hogy wav -> mp3 -> wav után a wav-ot eszi -e. Hátha rosszul kezeli az mp3 bemenetet. Nameg össze lehet hasonlítani pl audacity-ben mi a különbség
Akár a működő mp3 példából wavot generálni és azt elkódolni a saját megoldással és audacity-ben öszefiffelni, hogy mi ment el.
- A hozzászóláshoz be kell jelentkezni
const ratio = cpu_freq / buf.sampleRate;
cnt = Math.min(len * ratio, cnt + dcnt);
const i = Math.floor(cnt / ratio);
sample = chan[i] > 0.03;
Mint látható, ez a lehető legrosszabb megoldás, számos kerekítési hibát behoz, mire a cnt-ből (órajeltikk) i (mintaindex) lesz. Na és persze amivel szívunk, hogy az sem biztos, hogy az 1-es bit 0.03-nál mindig nagyobb, a 0-ás meg mindig kissebb.
> Akár a működő mp3 példából wavot generálni és azt elkódolni a saját megoldással és audacity-ben öszefiffelni, hogy mi ment el.
Ne is mondd, nagyon megnéznék én is egy ilyen működő mp3 mintát, de csak a mesében létezik, eddig konkrétan sehonnan sem tudtam ilyent letölteni... Egyik megadott linken sincsen egyetlen egy sem.- A hozzászóláshoz be kell jelentkezni
<input type="file" onchange="tape_from_file(this)">A tape.js-ben pedig kicseréltem a "response" változót beolvasó fetch() sort egy FileReader-es wrapperre:
const localFileAsArrayBuffer = (file) => {
  return new Promise((resolve) => {
    const reader = new FileReader()
    reader.onloadend = () => resolve(reader.result)
    reader.readAsArrayBuffer(file.files[0]);
  })
}
const tape_from_file = async (url) => {
    const AudioContext = window.AudioContext || window.webkitAudioContext;
    var audioCtx = new AudioContext();
/*
    const response = await fetch(url);
    const buf = await audioCtx.decodeAudioData(await response.arrayBuffer());
*/
    const buf = await audioCtx.decodeAudioData(await localFileAsArrayBuffer(url));
    const ratio = cpu_freq / buf.sampleRate;
    const len = buf.length;
    const chan = buf.getChannelData(0);
    let cnt = 0;
    let sample = false;
console.log(buf, cpu_freq, buf.sampleRate, ratio, len, chan);
    return {
        get_cnt: () => cnt,
        get_size: () => len * ratio,
        tick: (dcnt, recording) => {
            cnt = Math.min(len * ratio, cnt + dcnt);
            const i = Math.floor(cnt / ratio);
            sample = chan[i] > 0.03;
console.log(cnt,i,sample);
        },
        write: () => { }, // TODO
        read: () => sample,
        rewind: () => { cnt = 0; },
    };
Így már be tudtam tölteni a hangfájlt, meg is ette, az első console.log szépen kiírta a dekódolt mintákat. De vannak komoly gondok:
https://i.ibb.co/m0tLKb7/ff-honlab.png
(Az első fetch hibát oldaltöltéskor írja ki, a többi sort miután kiválasztottam egy fájlt. A tape-filesel.js fájlhoz nem nyúltam, az az eredeti.)
Először is, nem tudom, miért hiszi, hogy a wav 48000Hz, mikor nagyon nem az.
$ ffmpeg -i tartalom.wav 2>&1| grep Audio Stream #0:0: Audio: pcm_u8 ([1][0][0][0] / 0x0001), 44100 Hz, 1 channels, u8, 352 kb/s $ hexdump -C tartalom.wav | head -4 00000000 52 49 46 46 2c ce 07 00 57 41 56 45 66 6d 74 20 |RIFF,...WAVEfmt | 00000010 10 00 00 00 01 00 01 00 44 ac 00 00 44 ac 00 00 |........D...D...| 00000020 01 00 08 00 64 61 74 61 00 ce 07 00 40 40 40 40 |....data....@@@@| 00000030 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 |@@@@@@@@@@@@@@@@|Ez egyszer probléma. A másik, hogy az is jól látszik, 48000Hz esetén a ratio 83.3333333333333, tehát a kerekítési hiba garantált. Az adatok egyébként megvannak, szépen float-á konvertálódtak, szóval ez nem para. (Azt mondjuk nem értem, hogy lett a sok egyforma 0x40 értékből ennyi különféle float érték. Lehet, hogy az AudiContext forcefully átskálázta 48000Hz-re a mintákat? Ha igen, akkor eleve felejtős, hogy jó pozícióra esnek az értékek... Ez esetben csak 48kHz wav-val szabad eleve próbálkozni, azt talán egységesen alakítja floattá.) Aminél viszont végleg feladtam, a második console.log sor, aminek "tick" hook hívásakor kéne logolnia, na az még csak ki sem íródik. Ez azt jelenti, hogy hiába tölti be a mintákat az AudioContext, azt ez a JS soha még csak nem is értelmezte... Na ennyire már nem vagyok mazochista, hogy még ezt is kidebuggoljam... Ez az emulátor jelen formájában egyáltalán nem képes semmilyen hangfájlból programokat betölteni, pont.
- A hozzászóláshoz be kell jelentkezni
Én letöltöttem az emulátort, aztán a böngésző konzoljában ellenőriztem, milyen fájlokat keres még, és azokat is letöltöttem, ezt betettem egy localon futó webszerverbe, és gond nélkül fut. Betölti az mp3 fájlokat. Semmit nem kellett változtatni. Egyedül a bootstrep.css.css fájlt írtam át bootsterp.css fájlra, és kitömörítettem, mert lokálon nem kezelte a gzippel tömörített tartalmat.
Az AudioContect objektumnak van egy sampleRate propertije. Ezt lehet rendben módosítani, és akkor más wavot is megeszik.
Ami nekem fura, hogy ha ez az érték 48000, akkor is betölti az mp3 fájlt, ami pedig 44100kHz-es.
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy az AudiContext forcefully átskálázta 48000Hz-re a mintákat?
korábban linkeltem a manuálját, ha nincs explicite megadva, akkor a hangkimenet mintavételezésével megy, tuti, hogy átalakítja arra.
https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/AudioCont…
Mégha nem is használja a program semmi hanglejátszásra, de ez a hangkártyához igazodik alapból. Lehet régen 44.1kHz volt elterjedt, amikor írták és valahol támaszkodik erre. Vagy fel kell paraméterezni, hogy annyival menjen. Ha a hangkimenetedet átállítod a gépen, akkor valsz követi most :D
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Én is próbálgattam, az FPGA-s Homelab-emulátorommal (bár ez is nem is emulátor):
Az mp3-akat meg se érzi, WAV-ot meg nem találtam sehol. Bár az én emulátorom szerintem nem model III meg IV, hanem a legelső.
Szerk.: próbaképp megnéztem Spectrummal is, tape2wav-val csináltam tzx-ből egy wav-ot, mplayerrel lejátszottam az FPGA-nak, betöltötte. Majd lame-el átkonvertáltam mp3-ra, első próbálkozásra nem ment. A nyitóban látott -s 44.1 -b 96 -q 9 -m m
 kapcsolókkal viszont működött.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
egyébként htp (homelab 3 4) forműtumú programok ezen az sd kártyán is vannak https://retroemu.hu/z80tape.php
És itt mégtöbb minden
https://nattila.hu/index.php/homelab/homelab-rm32/6-homelab-rm32
Legörgetve a vége felé, a google drive linken ott van htp és wav is némelyikből
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Feltöltöttem pár teszt programot még a fentlévő sokoban mellé. Mindhez van htp és wav is. Ezek a wavok futnak nálam az emulátorban 44100Hz-es beállítással.
A htp formátuma tömören:
- 256 darab 0
- 0xA5
- programnév bájtjai
- 0x00
- Betöltési kezdete cím 2 bájt
- Méret 2 bájt
- Adatbájtok bitjei ömlesztve egymás után. Közben számolja a CRC étékét: a bájtok összegének alsó bájtja
- CRC bájt
- 0x00, ha vége az egésznek. Ha nem 0x00, akkor következik egy újabb ilyen blokk.
A biteket fentebb írtam, két tüske távol=0, 3 tüske közel=1.
 
Szerintem a hello.wav-val ne is próbálkozzál. Az a régi htp2wav konverterrel készült. Nálam le sem játszható, hibás még a wav formátuma is.
Szerk.: Ennek ellenére kipróbáltam, és 441000-re állítva mégis betöltötte az emulátor. Két soros basic program.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
mindkettő 256 nullával indul elvileg.
a wav-nak nem feltétlen az elején van az adat. Simán lehet csend és csak valamikor kezdődik meg az adat lejátszása.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Egyelőre nem sok sikerrel töltögetem a wavokat (sem), azt, hogy mit hoz ki belőlük a gép, nem látom (a hardware csak a bitet látja, abból értelmes byteokat a ROM csinál), debuggolni kellene a ROM rutint (ami FPGA-n annyira nem egyszerű). Annyit látok, hogy vagy FE, vagy FF-t olvas a CPU a bemenő jelszinttől függően a load rutinban, szóval ez a része szerintem jó.
Még megpróbálom visszatölteni azt, amit a SAVE parancs lement, csak épp nincs kéznél jack-jack kábelem, hogy felvegyem.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Úgy látom, Te nem konvertálod az mp3-at, hanem generálod. Ezt ki fogom próbálni én is. (Ami persze nem lesz válasz arra a kérdésre, hogy miért nem tudok a wav-ból működő mp3-at konvertálni, de legalább lehetne mp3 formátumom is.)
Addig azonban ránéztem, a wav-ra, amit a Homelab preset generál, és megvallom, nagyon nem értem. A kódra is ránéztem, azt sem értem, de azt valószínűleg azért, mert elég általánosan van lekódolva. Én csak mintaértékeket írok ki egy wav fájlba egymás után, azt még tudom követni.
A -64-et továbbra is túl soknak tartom. A működő mp3 fájlokban ez sokkal közelebb van a középértékhez.
Azon meg végképp nagyon csodálkozom, hogy az általad generált wav-ot egyáltalán betöltötte az emulátor.
Csatolom ide egy képet, amin felül az általad generált wav van, alul meg egy, a specifikáió szerinti wav. A tüskék hosszának nem lenne szabad néhány mintánál tovább tartani. A biteket a szünetek hossza kódolja.
- A hozzászóláshoz be kell jelentkezni
Csatolom ide egy képet, amin felül az általad generált wav van, alul meg egy, a specifikáió szerinti wav. A tüskék hosszának nem lenne szabad néhány mintánál tovább tartani. A biteket a szünetek hossza kódolja.
Már kíváncsi vagyok arra a ROM rutinra, hogy érzékeli a tüskéket, mert szerintem ez így elég megbízhatatlan, könnyű elszalasztani egyet-egyet. Az, hogy kb. négyszögjellel is működik, inkább arra utal, hogy felfutó éleket detektál, hogy két él közt mi van (azaz hogy milyen széles egy impulzus), nem érdekes. Illetve annyiból érdekes, hogy elég széles legyen ahhoz, hogy észrevegye a 0->1 átmenetet (mert ha túl keskeny, és a két szélén levő csendből vesz mintát, akkor máris hibás a beolvasás).
Ezt a teóriámat alátámasztja, hogy az FPGA-s Homelabom bzt wav-jában már megtalálja a fájlnevet.
Szerk.: https://easyupload.io/zuyjcz egy wav, amit a SAVE paranccsal mentettem (de visszaolvasni már nem tudom - az FPGA bemenetén van egy optocsatoló - MIDI-nek készült igazából -, valószínű nem elég gyors ezekhez a keskeny tüskékhez).
- A hozzászóláshoz be kell jelentkezni
$ ./cassette -v2 record.wav record.htp
wav channels 1 samples 594497 bits 16 (integer)
AM samples 594497 min -32768 max 32767 freq 44100 length 0 usec gap 0 usec
distance   2 occourance     1455
distance   3 occourance     4200
distance   4 occourance     2332
distance   5 occourance     2382
distance   6 occourance     1698
distance   7 occourance     1321
distance   8 occourance     1203
     ...(itt ez még megy egy jó pár képernyő erejéig)...
distance 830 occourance        1
distance 948 occourance        1
distance 979 occourance        1
most likely bit length 1 samples
looking for the most likely start offset (from 0, step 8)
start offset 43686
number of bits in audio 148624, 1 bit 4 samples (8 with 01 sync), 8 big endian bits per byte, gap 0 samples (max 9290 bytes)
binary returned 10643 bytes
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Ha kézzel megadom neki a bithosszt (-l 771), akkor már sokkal jobb a helyzet:
$ ./cassette -v2 -l 771 record.wav record.htp wav channels 1 samples 594497 bits 16 (integer) AM samples 594497 min -32768 max 32767 freq 44100 length 771 usec gap 0 usec looking for the most likely start offset (from 0, step 68) found header: 7 bits worth syncless emptyness between first set bit and actual data start offset 125916 number of bits in audio 17485, 1 bit 34 samples (68 with 01 sync), 8 big endian bits per byte, gap 0 samples (max 1093 bytes) binary returned 911 bytesMost már helyesen megtalálta az első adatbitet, viszont az eredmény még nem az igazi:
$ hexdump -C record.htp 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000100 01 4a 90 8a 98 98 9e 00 2c 81 44 01 fe ff 70 81 |.J......,.D...p.| 00000110 8a 81 8c 80 04 06 84 f0 16 04 ea 04 04 01 68 05 |..............h.| 00000120 5a 05 8c 81 fe ff 40 80 01 d6 fe 00 01 40 80 00 |Z.....@......@..| 00000130 00 00 66 00 00 00 00 00 00 00 00 00 01 81 fc d6 |..f.............| 00000140 40 30 0a 00 00 00 00 78 5a 40 08 40 d6 40 78 38 |@0.....xZ@.@.@x8|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Mivel a kimenetben ott van, hogy "found header" (és ilyenkor az első 7 bitet kihagyja, nullának veszi), valószínűleg ez a baj. Headert kikapcsolva (-h) az eredmény:
$ ./cassette -vh2 -l 771 record.wav record.htp wav channels 1 samples 594497 bits 16 (integer) AM samples 594497 min -32768 max 32767 freq 44100 length 771 usec gap 0 usec looking for the most likely start offset (from 0, step 68) start offset 126392 number of bits in audio 17485, 1 bit 34 samples (68 with 01 sync), 8 big endian bits per byte, gap 0 samples (max 1093 bytes) binary returned 910 bytes $ hexdump -C record.htp 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000100 a5 48 45 4c 4c 4f 00 16 40 a2 00 ff 7f b8 40 c5 |.HELLO..@.....@.| 00000110 40 c6 40 02 03 42 78 0b 02 75 02 02 00 b4 02 ad |@.@..Bx..u......| 00000120 02 c6 40 ff 7f a0 40 00 eb 7f 00 00 a0 40 00 00 |..@...@......@..| 00000130 00 33 00 00 00 00 00 00 00 00 00 00 c0 fe 6b 20 |.3............k | 00000140 18 05 00 00 00 00 3c 2d 20 04 20 6b 20 3c 1c 00 |......<- . k <..| 00000150 00 00 00 80 82 53 41 56 45 20 22 48 45 4c 4c 4f |.....SAVE "HELLO| 00000160 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |"...............| 00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000190 00 00 00 00 60 00 0a a8 22 48 45 4c 4c 4f 22 60 |....`..."HELLO"`| 000001a0 7f ff 91 3a 9f 22 48 45 4c 4c 4f 22 60 35 00 00 |...:."HELLO"`5..| 000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000210 00 81 00 08 01 d6 f2 3f ff ff ff 97 08 04 41 83 |.......?......A.| 00000220 00 04 40 00 3b 27 b8 ed ef de fa 6d be 1f ff fe |..@.;'.....m....| 00000230 95 ff fb 66 40 3f bf bf 9f b6 3f be f7 ff ff fe |...f@?....?.....| 00000240 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000250 ff ff ff ff ff ff 6f ff ff ff ff ff ff ec bf 63 |......o........c| 00000260 ff f3 c0 3c 60 04 e4 0d ff 3c 18 05 ff ff ef ff |...<`....<......| 00000270 fc ce 7f ef ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000280 ff ff ff ff ff ff ff ff ff ff ff df ff af ff ff |................| 00000290 d5 25 e8 02 00 6a 9b 99 7e da 5a 77 fe fe ff bf |.%...j..~.Zw....| 000002a0 fd ff d9 f7 37 ff ff ff ff ff ff ff ff ff ff ff |....7...........| 000002b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|Ez már helyes, igaz a végére a sok zaj bepakolt egy kis szemetet is. Ha Audacity-vel levágom az elejéről meg a végéről a zajt, akkor első hívásra is tökéletesen visszaolvassa, helyesen detektálja a bithosszt és mivel nincs előtte zaj, nem hiszi, hogy lenne benne header.
- A hozzászóláshoz be kell jelentkezni
Bocs, le kellett volna vágnom a zajt (KVM switchem van az FPGA-hoz, így nem tudtam egyszerre megnyomni az ENTER-t a Homelabon és a gépen, ahol a felvételt csináltam).
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
./cassette -2 aircomp_proggi.mp3 aircomp_proggi.htphtp-ből audió:
./cassette -2 -l 771 aircomp_proggi.htp aircomp_proggi.mp3Nem próbáltam, de valószínűleg tökéletesen működik az összes többi Homelab emulátorral és igazi vassal is. Az biztos, hogy az audió-htp irány minden körülmények között
- A hozzászóláshoz be kell jelentkezni
nézd csak, homelab 4 gépkönyv 51-edik oldal, leírja a kazetta kezelést
https://www.holdcomputers.com/holdcomputers_elemei/doc/gepkonyv/homelab…
Ezt használják vajon a korábbiak is?
Itt úgy látszik, hogy az adja 0 vagy 1 hogy két négyszög közt van -e egy harmadik. Ha nincs akkor 0, ha van akkor 1.
Ideális esetben négyszög jelek vannak.
Ja plt is leírta már kb ezt fentebb másik kommentben. Viszont itt részletesebben le van írva azzal együtt, hogy kb hány ms. (A négyszög 0,19 ms ideig tart. Az első és harmadik kezdete közt pedig 1.5 ms telik el.)
A homelab 3 doksiban nem látom http://homelab.8bit.hu/dox/hardver_leiras.pdf
A 20adik oldalon ír valamit az elektronikai megvalósításról.
A youtube videóban másik fajta gépnél 9:30 után elmeséli, hogyan szűrik ki a zajt hasonló négyszögjelekre építő magnós tárolásnál. Több mintát vesz és ha legalább 3 azonos egymás után, akkor veszi négyszög tetejének és a sebességhez is dinamikusan tud igazodni ahogy elmeséli. Nem teljesen ugyanaz a homelab4 tárolás, de hasonló.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
a fastloaderek lehet trükköztek, hogy gyorsabban toljanak át adatot, bár az gondolom ugyanúgy a kazettán volt az elején. Gondolom az a hivatalos sebesség, amit leírtak. Aztán a nyúlás, vagy más problémák miatt változthat közben is.
A homelab 4-et nekem is google dobta ki, az a dizájnos weboldal jópofa eyecandynek, de olvasni vagy gyorsan megtalálni valamit lehetetlen, azt sem találtam meg, hogy honnan van linkelve, hogyan találta meg a google.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Köszönöm!
Ha már így lezárult a projekt, kiderült, hogy végül mi az MP3 trükkje? Miért van az, hogy működő a WAV fájlok MP3-ba konvertálva nem működnek?
- A hozzászóláshoz be kell jelentkezni
Mert működhet szerencsés esetben, de nem kell működnie.
tr '[:lower:]' '[:upper:]' <<<locsemegeLOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
const tape_from_file = async (url) => {
    const AudioContext = window.AudioContext || window.webkitAudioContext;
    var audioCtx = new AudioContext();
    const response = await fetch(url);
    const buf = await audioCtx.decodeAudioData(await response.arrayBuffer());
    const ratio = cpu_freq / buf.sampleRate;
    const len = buf.length;
    const chan = buf.getChannelData(0);
    let cnt = 0;
    let sample = false;
+   let avg = 0;
+
+   for(var i = 0; i < len; len++) avg += chan[i];
+   if(len) avg /= len; else avg = 0.03;
    return {
        get_cnt: () => cnt,
        get_size: () => len * ratio,
        tick: (dcnt, recording) => {
            cnt = Math.min(len * ratio, cnt + dcnt);
            const i = Math.floor(cnt / ratio);
-           sample = chan[i] > 0.03;
+           sample = chan[i] > avg;
        },
        write: () => { }, // TODO
- A hozzászóláshoz be kell jelentkezni
Köszönöm. A js kódod alapján én is próbálgattam a betöltést elemezni. (Gondolom, az avg számolásánál a for ciklus végén "len++" helyet "i++" van.)
Azt látom, hogy ha egyszerűen csak a 0.03-at felemelem 0.2-re, akkor már stabilan beolvassa az én mp3 fájlomat is.
Visszanéztem az mp3 fájlt az audacity segítségével, és látszik, hogy néha esetlegesen tényleg 0.03 feletti értékeket generált.
Ebbe meg is nyugodtam volna, de belenéztem az eredetileg is sikeresen betöltött bombazo_a16 mp3 fájljába is... és az is tele van 0.03 és 0.2 közötti értékekkel. Látom én, hogy az emulátor egy az egyben ennek az összehasonlításnak az eredményét adja vissza, mint TTL jelet a hardvernak, de az azért mégiscsak eléggé valószínűtlen, hogy a bombázó összes olvasási hibáján sikeresen átmegy, míg az enyémen meg nem.
Talán az lehet a nyitja, hogy a bombázó mp3 fájljában ezek a fals értékek sosem mintavételezési pontban vannak. Akkor pedig mégis úgy tűnik, hogy lehet jó mp3 fájlt generálni az eredeti emulátornak is, de ennél tovább nem jutottam...
Mindenképp az emulátor fejlesztőjének megpróbálom továbbítani a betöltésed módosítását.
- A hozzászóláshoz be kell jelentkezni
const tape_from_file = async (url) => {
    const AudioContext = window.AudioContext || window.webkitAudioContext;
    var audioCtx = new AudioContext();
    const response = await fetch(url);
    const buf = await audioCtx.decodeAudioData(await response.arrayBuffer());
    const ratio = cpu_freq / buf.sampleRate;
    const len = buf.length;
    const chan = buf.getChannelData(0);
    let cnt = 0;
    let sample = false;
+   let top = -1.0;
+   let bottom = 1.0;
+   let avg = 0;
+   // megkeressük a legmagasabb és lagalacsonyabb jelet
+   for(var i = 0; i < len; i++) {
+      if(chan[i] > top) top = chan[i];
+      if(chan[i] < bottom) bottom = chan[i];
+   }
+   avg = (top - bottom) / 2;
    return {
        get_cnt: () => cnt,
        get_size: () => len * ratio,
        tick: (dcnt, recording) => {
            cnt = Math.min(len * ratio, cnt + dcnt);
            const i = Math.floor(cnt / ratio);
-           sample = chan[i] > 0.03;
+           // a szerint vágunk, hogy a legmagassabbhoz vagy a legalacsonyabbhoz áll-e közelebb
+           sample = chan[i] > avg;
        },
        write: () => { }, // TODO
Ez nem az átlagot nézi (ami a szinkronjelek miatt el tud mászni fölfelé, ha sok a szünet az elején meg a végén akkor meg lefelé), hanem megnézi, mi a legmagasabb és mi a legalacsonyabb jel, és azt nézi, melyikhez áll közelebb az adott minta. Ez így sokkal megbízhatóbb és atomstabilabb eredményt ad.- A hozzászóláshoz be kell jelentkezni
Ok, de biztos, hogy ez ad stabilabb eredményt. Generált fájloknál ez jónak tűnik, de zajos analóg felvételeknél az átlag nem adhat jobb eredményt? Egy-egy negatív maximális zaj, és oda az egész. Ha már szélsőértékek, akkor inkább a szórásnégyzet kellene... Nem?
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
A konverzió rendben van, meg az is, hogy a konvertált fájlokat betölti mindkét emulátor módosítás.
A kérdés igazából az, hogyha már egyszer sikerül elérnem az emulátor fejlesztőjét, milyen módosítást kínáljak neki. Olyat, ami a generált/konvertált hangfájlokra stabil, vagy olyat, ami esélyesen jó régi magnófelvételeken is.
Szórásnégyzet alatt pedig valami olyasmit tudok elképzelni, hogy mivel a jelek zöme két érték körül fog zsúfolódni, ezért:
1 - meg kell keresni a forrásban a két várható értéket
2 - a mintát felbontani két részhalmazra, attól függően, hogy a konkrét értékek melyik várható értékhez vannak közelebb
3 - ezekre a halmazokra megállapítani a szórásnégyzetet, vagyis a várható értéktől való eltérés várható értékét, és az azon kívül eső mintákat eldobni
4 - az így képzett mintákra venném a minimumot és a maximumot, ezek átlaga adná az 1/0 limitet.
Persze így leírva látszik, hogy ez majdnem azonos eredményt fog adni azzal, mintha a két várható értéket átlaga lenne a limit.
Így hirtelen azt nem látom pontosan, hogy hogyan lehet a bejövő adathalmazból a két várható értéket megmondani, anélkül persze, hogy előre tudom, hogy az egyik 0 körül van, a másik meg 1 körül, de biztos vannak erre jó matematikai módszerek.
- A hozzászóláshoz be kell jelentkezni
előfordulás ^ | | /\ | || /\ | || || | | \__/\/ | |__/ \__ --+--------------------> mintaértékek |4. Ebben a gyakoriságtömbben kell megkeresni a legelső és a legutolsó lokális maximumot (azért így, hogyha esetleg a zaj miatt három vagy mégtöbb csúcs is kialakulna, azok ne zavarjanak be). 5. Ezt a két lokális maximumot kell visszaskálázni floattá, és pont az lesz az általad keresett két érték. Ennek a két értéknek az átlagánál vágni pont ugyanaz, mint azt nézni, melyikhez esik közelebb az adott minta. "abs(top - sample) <= abs(bottom - sample)" === "sample > (top - bottom) / 2". De ez szerintem már bőven overkill, a legutóbbi kódom, ami a minimum és maximum átlagánál vág tökéletesen működött minden általatok linkelt hangfájlra (persze nem 100%-os megoldás, csupán csak minden eddigi mintára jól működő). De ha szeretnéd, nyugodtan berakhatod ezt a fenti algoritmust is a tape.js-be (elég könnyű lekódolni, és a emulátor többi részétől teljesen független, szóval nem para). Ld. https://www.statisticshowto.com/local-maximum/ (Behúzhatsz vagy implementálhatsz egy derivált-függvénykönyvtárat is, de szerintem hulla felesleges. Én kiváltanám egy kevésbé pontos, de jóval egyszerűbb megoldással: ciklus amíg a gyakoriság[i] <= gyakoriság[i + 1] - hiba. Azaz azt nézném, hogy hol esik először a grafikon, a hibát pedig a legnagyobb előforduló gyakoriság alapján határoznám meg. A legutolsó csúcs keresése tök ugyanez, csak tükrözve, a gyakoriság tömb végéről mennék a ciklussal.)
- A hozzászóláshoz be kell jelentkezni
Erős kétségeim vannak afelől, hogy két várható értékkel rendelkező eseményhalmazban az előfordulás-maximumok lennének a várható értékek.
Amúgy abban igazad van, hogy már az átlagos megoldás is megfelelő a legtöbb hangfájlhoz.
És az is jogos, hogy nem biztos, hogy megéri az elméletileg legjobb megoldást implementálni. Ennek ellenére már tényleg érdekel, hogy két várható értékkel rendelkező eseményhalmazban hogyan lehet megtalálni ezt a két várható értéket, de szinte biztos, hogy ezt már nem érdemes ebbe a javascript emulátorba belekódolni.
Nem tudom, Neked volt-e olyan teszted, amit csak a szélsőértékes megoldás töltött be, és az átlagos nem, de egyelőre nekem az átlagos megoldásod jobban tetszik - igaz, inkább csak érzelmi alapon. Azt szerintem csak a nagyon hosszú csend zavarhatja érdemben, ellenben stabilabb a zajjal szemben. Főleg, hogy azért azt is lehet előre tudni, hogy a beolvasandó minták mik lesznek.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Egy egyszerű példa: a mintában van 1000 darab 0.8-as érték, 1000 darab 0.9-es érték, 1000 darab 0.1-es érték, és 1000 darab 0 érték.
A két várható érték: 0.85 és 0.05, és nem maximálisan előforduló minták.
- A hozzászóláshoz be kell jelentkezni
- avg = (top - bottom) / 2; + avg = (top - bottom) / 2 + bottom;Mea culpa, de ettől függetlenül a szövegben jól írtam, végig minimum és maximum átlagáról beszéltem és az eredmények is helyesek.
- A hozzászóláshoz be kell jelentkezni
Tényleg félreértettük egymást. Már nem az algoritmusod működőképességéről beszéltem, csupán az annak nyomán felmerült problémáról, hogy egy véletlen halmazban hogyan állapítod meg a két várható értéket.
Mindegy, annyira nem lényeges.
- A hozzászóláshoz be kell jelentkezni
Értem, mire gondolsz, de előbb szeparáld el a populációkat. Az akkor már nem két, hanem négy populáció, két típusú nullás és két típusú egyes bited van.
tr '[:lower:]' '[:upper:]' <<<locsemegeLOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Erős kétségeim vannak afelől, hogy két várható értékkel rendelkező eseményhalmazban az előfordulás-maximumok lennének a várható értékek.
Miért? Amit rajzolt, az egy histogram. Vízszintes tengelyen van a vizsgált jelenség tulajdonsága, valami idő vagy amplitúdó, hematológiában például sejtméret, függőleges tengelyen a számosság, az, hogy az adott tulajdonságúból mennyi van. Ott lesz ennek a valaminek a csúcsa, ahol a legtöbb van az adott tulajdonságú valamiből. Gauss-eloszlás esetén szerintem ez a várható érték, bár tudom, nem minden Gauss-eloszlású, lehet akár lognormál is. Például épp a PLT-k, ha már ez a neved. :P De szerintem akkor is a csúcs a várható érték, mert ha oda jött a histogramban a legtöbb abból avalamiből, akkor az azt jelenti, hogy az a legvalószínűbb, hogy ott lesz.
Ha több csúcs van, mint a jelen példában, az azért van, mert több populáció van jelen. Például az 1-es és 0-ás bitek populációja, de lehet különböző sejttípus, bármi, amit vizsgálunk.
tr '[:lower:]' '[:upper:]' <<<locsemegeLOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Nem gondolom, hogy a valóságtól olyan elrugaszkodott lenne, hogy egy hardver bizonytalansága folytán az 1-eseket egy adott szórással állítja elő, és a 0-ákat is. Simán elképzelhető, hogy két maximális csúcsod lesz 1-esekből és 2 csúcs a 0-ákból.
Azonban a kérdés igazából arra vonatkozott, hogy tetszőleges - és ezalatt értsd azt, hogy tetszőleges - véletlen halmazon hogyan találsz meg két várható értéket.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Ha valamiféle szórásról, bizonytalanságról beszélünk, a várható értéknél lesz a legtöbb elemed, attól kisebb és nagyobb elem egyre kisebb számosságban jön majd. Mármint egy konkrét mért értékről beszélek, nem az integráljáról, tehát nem az össze kisebbről, vagy összes nagyobbról. Ahhoz, hogy kétpúpú tevéd legyen, valami ronda determinisztikus hibának kell lennie, nem pedig random, szép Gauss-osnak.
tr '[:lower:]' '[:upper:]' <<<locsemegeLOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Azonban a kérdés igazából arra vonatkozott, hogy tetszőleges - és ezalatt értsd azt, hogy tetszőleges - véletlen halmazon hogyan találsz meg két várható értéket.
Sehogy. Valamit kell tudnod a vizsgálandó minta tulajdonságáról, hogy arra szabhasd az algoritmusodat akár adaptívan.
tr '[:lower:]' '[:upper:]' <<<locsemegeLOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A Z80 nekem annyira nem jött be, mert C=64 volt az első gépem, és a 6502 jobban tetszett. De ezek a magyar gépek megérdemelnének nagyobb figyelmet, még ha Z80 proci van benne, akkor is. Kedvet kaptam építeni egy modernizált változatot. Nem túl bonyolult a felépítése, amennyit láttam a kapcsolási rajzok alapján. Mai modernebb integrált áramkörökkel is megépíthető lenne szerintem.
- A hozzászóláshoz be kell jelentkezni
Én megcsináltam FPGA-ra, az elég modern :D
Egyébként meg mi mást modernizálnál? 74-es sorozat ma is létezik, ennél integráltabban CPLD vagy FPGA jöhet szóba.
- A hozzászóláshoz be kell jelentkezni
Modernizált alatt azt értem, hogy a ma is kapható integrált áramkörökből felépíteni. A billentyűzetet megcsinálni valami modern mechanikus kapcsolókból pl. Vagy akár felületszerelt kivitelben kisebb méretben.
- A hozzászóláshoz be kell jelentkezni
Szerintem többeket - köztük engem is - érdekelne egy modernizált változat, főleg, ha egyszerűbb lenne házilag összerakni, mint az eredetit, és persze ugyanúgy nézne ki. Na, jó, gombok lehetnének rajta. Ha a működés elve nem változna, akkor szerintem ez nem olyan nagy szentségtörés. A grafikáját például egyáltalán nem értem. Az emulátorok meg nem, vagy csak erősen korlátozottan tudják emulálni. EPROM helyett EEPROM, DRAM helyett akár statikus memória, és csak egyetlen 32KB-os csip, és csupán 5V-os tápfeszültség a 3 különböző helyett.
- A hozzászóláshoz be kell jelentkezni
Valószínű azért nem jött be, mert az Z80 komolyabb volt, de unalmasabb. Lényegében CP/M alá való, dolgozni szánt platform volt, míg a 6502-es gépek, főleg a C64, meg inkább játékkonzolként szolgáltak, és általában emiatt több játék, jobb grafika, stb. volt elérhető, egy fiatalnak meg ez persze, hogy látványosabb, érdekesebb.
Ugyanez volt anno a DOS-szal is, az első PC-k unalmas gépek voltak, csak text mode, grafikából is sokáig CGA/EGA, meg PC speaker, nem tűnt érdekesnek, nagy számnak, sokan inkább otthonra Amigát vettek, hasonló áron vagy olcsóbban, mert azon jobb grafika, jobb zenei képességek azonnal beleintegrálva, csomó játék, stb.. Aztán ha megnézed, az Amiga ma már sehol sincs, míg az x86 meg virul, igaz már nem valós módú, valós idejű DOS-t használnak rajta, hanem váltott 64 bitre, meg modernebb rendszerekre.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Ez így van, a periféria számít, de azért sokáig a legtöbb gyártónál szabály volt, hogy ha játékgép kell, akkor 6502-re mentek inkább. Sok arcade gépnél is, meg játékkonzoloknál. Ennek ellenére nem azt jelenti ez, hogy nem volt Z80-at használó játékkonzol/gép, csak hogy a legtöbb Z80-as gép nem a játékra volt kihegyezve, hanem CP/M-re, és ezért nem kaptak olyan perifériákat, amik jó grafikát, zenét támogattak volna. Így függ össze távolabbról.
Az Amiga azért nincs, mert elavult, a Commodore nem fejlesztett. Zsákutcába szorította magát a sok spéci, saját fejlesztésű chippel, amit nem tudott később fejleszteni, mert csak inkompatibilis lett volna. Majdnem biztos vagyok benne, hogy nem a MS nyírta ki, annak sose jelentett versenyt a Commodore. A MS mindig is PC-ben, szerverekben, céges-üzleti felhasználásban utazott, ott a Commodore sose volt erős. Ők az otthoni szegmensben voltak azok.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
Nézz utána az Amiga Hombre chipsetnek ;-) Sajnos nem keszült el a Commodore csődje miatt. Elég erős versenyző lett volna az akkori mezőnyben. Volt ott fejlesztés.
Az MS nem volt versenytárs. Hogyan lett volna szoftvercégként? De mint láttuk voltak elég "geci" húzásaik az IT történelemben. Nem, nem ők nyírták ki a Commodore-t, sajnos a vezetőik rossz döntései voltak.
- A hozzászóláshoz be kell jelentkezni
Ahogy bzt kolléga is írta lentebb, ennek nem sok köze volt a két processzorhoz. A C=64 "multimédia" képességeit a VIC-II és a SID adta. Tovább árnyalja a képet, hogy a Sega és az SNK Z80-at használt például a Sega Mastersystem, Game Gear, Neogeo Pocket (Color) konzoljaiban. Ill. később mikor 68000-ra váltottak, a Z80 audio társprocesszorként volt jelen ezekben a gépekben.
Az Amiga sajnos a Commodore rossz üzletpolitikájának köszönheti a "halálát". Bár nem nevezném halálnak. Olyan képességei voltak már akkor, amiről a PC-k csak álmodtak. A Zorro busz például, vagy a méltán emlegetett audio és video képességek.
- A hozzászóláshoz be kell jelentkezni
Mondjuk a NeoGeo Pocketben valamilyen 16 bites Toshiba CPU volt. De attól még a Z80-at rengeteg helyen használták, ahol grafika is volt - számtalan arcade gépben.
Sajnos az Amiga az AGA-val lemaradt a VGA-val szemben, onnan már csak lefelé volt.
- A hozzászóláshoz be kell jelentkezni
Voltak érdekes CPU párosítások abban az időben. De jogos az észrevétel, nem volt pontos. A NeoGeo Pocketben a Z80 már csak "társprocesszor" volt. Ezekkel az arcade vasakkal nem nagyon foglalkoztam.
Az AGA nem a VGA-val szemben maradt le. Az AGA többet tudott, mint ami eredeti VGA specifikációban van és ezt olcsóbban adták. Egy rövid összehasonlítás: https://www.youtube.com/watch?v=Yn7ictdIlug
- A hozzászóláshoz be kell jelentkezni
Csak 92-ben, mire kijött az AGA, már True Color SVGA is volt, aztán ott van, hogy csak 1-bites planar módokat tudott (256 színhez 8 külön memóriaterület), a chipram mérete és elérési sebessége meg nem nőtt annyit, mint amennyit nagyobb felbontású grafika igényelt volna. A Hombre lett volna az igazi előrelépés (papíron legalábbis).
Játékok, amik PC-re vagy MAC-re 640x480-ban mentek, Amigán maradtak 320x200-ak (és jóval szarabbul néznek ki).
- A hozzászóláshoz be kell jelentkezni
Volt SVGA, de milyen áron? Amiből egy komplett Amigát vehettél és annak még hangja is volt, nem egy PC speaker.
Nem vitatom, a PC világ sajnos elhúzott a Commodore és az Amiga mellett. Sokkal érdekesebb lenne a számítógépek világa, ha nem csak az IBM PC vonal marad meg és lesz sikeres.
- A hozzászóláshoz be kell jelentkezni
Érdekesebb lenne, de a PC-k mellett nem maradt esélye semminek. A PC sikere abban van, hogy nyílt szabványokon alapult, és moduláris, ezért sok gyártó össze tudta rakni, klónozni, olcsón adni, fejleszteni (a procin kívül egyedül a BIOS volt zárt, de azt meg cleanroom alapon koppintották le marha ügyesen). Plusz továbbfejlesztésnél általában vigyáztak a visszafelé kompatibilitásra. Nem volt bennük soha annyira spéci chipset, általános chipekből kirakható volt, persze ezt később beleintegrálták gyártók egy chipsetbe, de csak a további olcsósítás miatt. A x86-ot a mai napig még az ARM is csak a mobil szegmensben tudja megfogni, máshol nem.
Az SVGA-t sokáig a VRAM drágította, mert ugye minél magasabb a felbontás és/vagy színmélység, annál több memória kell hozzá, de a memória akkoriban általánosságban is marha drága volt. Persze, egy jó DAC se volt olcsó, azt nem mondom. Meg a jó gép, amivel ki lehetett hajtani értelmesen, bírta sávszélességben azt a grafikát mozgatni, számolni. Ne feledjük, hogy kezdetben minden a proci vállán volt, a gyorsítós megoldások csak később jöttek, előbb a 2D, majd 3D. Plusz kezdetben a tárhely is szűkös volt, ami az egészet elbírta volna, az SVGA-t használó játékok már inkább CD-n jöttek, ami a korai időkben megint nem volt olcsó mulatság, a drive, a vezérlő hozzá. A busz is a VESA és PCI busszal lett hozzá elég tápos, hogy kielégítse mindehhez a sávszéligényt. Monitorból is táposabb kellett neki. Így a korai SVGA-s időkben nem sok előnyt élvezett ki valaki, max. egy vibráló kijlezőn, lassan kitapétázva tudott statikus képekben gyönyörködni, másra nem volt jó.
Szerintem az Amiga és a Commodore kihalása nem a saját hibájuk volt, egyszerűen nem volt esélye semmi másnak a PC-vel szemben. Talán az Alpha, ha nem nyírják ki a bukásra ítélet Itanium miatt, annál talán rezeg a léc, bár ki tudja, mert a Sparc se húzta egy szinten túl, bár az talán az ára miatt. Még az Apple sem kerülte el az x86-ra váltást, bár most ezzel az ARM alapú M1-M2-vel oltári meglepőt gurítottak, érdekes lesz látni ennek az életképességét.
A PC-knek szerintem ott van reálisan a gyenge pontja, hogy a procik és a platform túlságosan csak 2 nagy gyártó kezében van, a többiek hiába is tudnák klónozni, a licenc-jogi korlátok miatt nem merik, és csak rajtuk múlik, hogy mit merre visznek tovább, milyen ütemben, sőt, míg sokáig az Intel volt iszonyat fölényben, addig elég látványosan lassította a fejlődést. Az is igaz, hogy mióta közelítjük a technológiai korlátokat, egyre nehezebb már csíkszélességet csökkenteni és optimalizálni, azóta olyan drága a fejlesztés (meg egyáltalán versenyképes termékkel a piacra belépés), hogy csak a nagyoknak van meg hozzá a tőkéjük. Ugyanez a GPU-knál, bár ott most be tudott szállni harmadikként az Intel, de csak azért, mert megvolt hozzá a tőkéje, míg a versenytársak az idők folyamán Nvidián kívül mind kihullottak, ma már sehol nincsenek, se 3dfx, se Matrox, se S3, de még az ATi is ment be a süllyesztőbe, csak utóbbit megmentette, hogy az AMD felvásárolta.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni