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?
- 3638 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
> Na, ezt a dB mértékegységet nem is értem.
Decibel, hangerő.
> Nem tudom, mit jelent a -1dB.
Azt, hogy az egész grafikon lejjebb kerül.
Amikor generálod a wav-odat, fixen minden 0-ás bithez tartozó sample értékből vonj ki egy konstanst. (Az nem derült ki számomra, hogy hány bites a wav-od, de ha 8 bites, akkor mondjuk 0 helyett használj -16-ot, ha 16 bites, akkor -4096-ot. A lényeg, hogy az a negatív szám, amit nullának használsz, abszolút értékben nagyobb legyen, mint az mp3 kódolás által behozott zaj. Tehát amikor Audacityben megnyitod, az egész nulla körüli hullámzás teljes egészében átkerüljön a negatív tartományba, pont úgy, mint ahogy 3. hullám esetében láthatod.)
- 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
> Amit utána írsz, hogy minden mintából kivonunk valamit, az az igazi.
Nem, nem azt írtam, és sokkal biztonságosabb, ha csak a 0 (bit nincs beállítva) mintákból vonod ki, az 1 (bit be van állítva) értékeket meg hagyod olyan magasan, amilyen magasan csak lehet. (Ha mindenből kivonsz, akkor még véletlenül azok is átkerülnének a negatív tartományba, aztán csak hüppögni fog az emulátor).
- 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:]' <<<locsemege
LOCSEMEGE
- 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:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Összedobtam neked gyorsba' egy kis toolt erre.
https://gitlab.com/bztsrc/cassette
Teljesen függőségmentes, csont nélkül fordul egy make-re.
Ha egy mp3-ból akarsz kiszedni egy programot, akkor
./cassette audio.mp3 program.bin
ha pedig egy bináris fájlból akarsz kazetta audiót csinálni,
./cassette program.bin audio.mp3
Alapbó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
Kösz :-)
Reggel rittyentettem hozzá egy webservice-t, úgyhogy már fordítani sem kell, böngészőből használható: https://bztsrc.gitlab.io/cassette/
> 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.
Na igen, jól jönne pár minta audió, az biztos, így most csak azokkal tudtam tesztelni, amiket én generáltam (ami nem 100%, hogy megfelel az emunak is, bár elvileg jók). A mellékelt Audacity képernyőképet néztem illetve találtam egy régi Delphi-s Homelab HTB convertálót, abból próbáltam meg kimazsolázni a lényeget. A biztonság kedvéért azért tettem a proggiba több opciót is, hogy lehessen finomhangolni újrafordítás nélkül, ha esetleg benéztem volna valamit.
Egyébként meg a francnak kell ennyire eldugni az infókat, a Neumann társaság oldalán sehol sem találtam a minta mp3-at, amiket plt kolléga emleget, pedig állítólag ők írták ki a Homelab versenyt, de azt az oldalt sem találom.
> 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.
Ha igazán el akarod dobni az agyad, akkor tudok mutatni olyan C kódot, ami tele van csupa olyan dologgal, amit a C megenged, de még nekem is leesett az állam tőle (és nem IOCCC): https://home.hccnet.nl/h.g.muller/progress.html (görgess le a lap aljára, ott a kód). Ezzel stressz-teszteltem a C fordítómat :-)
- 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
> Egyelőre sajnos nem megy, de ennyi munkát belém ölni ...
Á, csak unatkoztam vasárnap délután. Egyébként szívesen csiszolom addig, amíg jó nem lesz, ehhez csak pár tutira működő mintafájlra lenne szükségem (no meg nem lenne hátrány egy működő emulátor, amivel tesztelhetek).
> Próbáltam úgy is, hogy csak a LOW értéket viszem le 0x80-ról 0x70-ra vagy akár 0x68-ra.
Az lehet még kevés, ha a zaj így is még átlóg a pozitív tartományba. Nálam a default 0x40.
> Lett ugyan wav, de nagyon rövid. Nálam 23 másodperc a wav, nálad 3.
A proggim nem foglalkozik az időtartammal, külön beállíthatod, mennyi minta erejéig tartson egy bit. Az Audacity-s képernyőképeden nem volt mértégegység, ezért ezt nem tudtam, alapból 4 mintát állítottam. Próbáld meg a "bit's length"-et 30-ra állítani, úgy már az én proggim is 23 mp körüli wav-ot fog kreálni.
> 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.
Írni 8 bites mono wav-ot ír (a Hz állítható, de alapból 44.1kHz az is), olvasni pedig mindféle wav-ot olvas (8-bit, 16-bit, 24-bit, 32-bit, float, mono-sztereó), . Az MP3-nál is választható a 96kpbs, de ott alapból 128kpbs-re raktam, mert a 96-nál túl nagy volt a wav-hoz képest a zaj.
Itt sokkal inkább kérdéses, hogy milyen formátumú mintákat használ az MP3, illetve hogy milyen MPEG chunkokat tartalmaz. Én Xing fejlécet használok, elvileg az a legáltalánosabban elterjedt (de nem szabványos, alapból ugyanis nem lehet megadni, mennyi csend van a minták előtt és után, csak nem szabványos fejléccel). Én 16 bites előjeles integer mintákat mentek (mert a LAME azt használ alapból), de mintha a Te MP3-ad float lenne. Nem tudom, ez számít-e (azon kívül, hogy a float-ba mentett minta minimum kétszer akkora helyet foglal a winyón).
> Az én konvertereimet eléred a github-on. Ezek már nagyjából működő kódok.
Köszönöm, ránézek! Remélem össze tudunk hozni a két repóból egy jól működő konvertert!
> A BASIC->HTP konverterem még erősen kezdetleges, és csak helyes BASIC kód esetén ad megbízható HTP fájlt.
Na igen, ezzel a részével az én proggim egyáltalán nem foglalkozik, csakis a bitkolbász hangmintákká alakításával oda-vissza. És ebbe nem is mennék bele, ezt meghagyom Neked :-)
> Az emulátor pedig itt van. Én letöltöttem magamhoz, csak úgy tudtam bele saját programokat tenni.
Köszönöm! Ezt is megnézem. Ebben vannak működő példa mp3-ak, ugye? Ha nincsenek, esetleg fel tudnál tenni párat valahova (mp3 és htp formátumban, hogy összevethessem öket)? 1-2 program már elég lenne, hogy kinyomozzam, miért nem működnek a programjaink.
- A hozzászóláshoz be kell jelentkezni
> Az emulátor pedig itt van. Én letöltöttem magamhoz, csak úgy tudtam bele saját programokat tenni.
Meg is van, wget -r :-) Látom, a beolvasás itt van a https://gergo.erdi.hu/projects/honlab/_build/tape.js fájl 54. sorában. Elvileg ennek sztereó mintát is meg kéne ennie, mert fixen a bal csatornát használja csak. A Hz is elvileg mindegy (bár a konkrét értéktől függően csúnya kerekítési hibákat képes behozni ez a megoldás). És igen, elvileg OGG Vorbis és FLAC is menne.
Jól látszik, hogy nem kezel felfutó éleket, csak kiszámolja, hányadik mintára esik egy-egy bit, és az is látszik, hogy 0.03-nál nagyobb értékeket vesz 1-nek, ami ennél kissebb az 0. Azt nem tudom, hogy ez a AudioContext mit csinál, ha a hangminta nem float. De ha floattá konvertál automatikusan, akkor jó, ha meg nem, akkor 0.03-ból lesz 0 és úgy hasonlítja integerként, ami megintcsak jó nekünk. Azt viszont nem látom sehol, hogy ebből a bitkolbászból mikor csinál bájtokat, az egy másik fájlban lenne?
És az is látszik, hogy esélytelen a HTP támogatás jelen formájában, főleg a hibakezelés komplett hiánya miatt. Alaposan át kéne írni a tape.js-t, hogy azt is megegye (de nem lehetetlen. Ha az AudioContext.decodeAudioData elhasal, akkor a hibakezelőjében lehetne megpróbálni az arrayBuffer-ből olyan tömböt csinálni, amit majd a sample[]-ből csinál (nem tudom, hogyan, nem ebben a fájlban van lekezelve, az biztos).
Ellenben példa mp3 itt sincs. Fel tudnál tenni párat github-ra vagy valahova?
- 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
> Ú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/
Kösz!
> A htp wav konvertálóknak https://groups.google.com/g/homelab/c/9HCQgJJEjnc
Megnéztem, két linket tuttam kinyerni innen: http://gaia.atilia.eu/downloads/ és https://nattila.hu/index.php/homelab/homelab-rm32 Sajnos elég kevés a forrás, a legtöbb bináris, és példa mp3-ak vagy wav-ok egyiken sincsenek. Egyébként a groups-ban azt írja, "A file-t feltoltottem a csoport archivumaba, remelhetoleg nem okoz gondot leforditani az egy szem .C forrastfilet egy kelloen elszant erdeklodonek", na ezt nem sikerült megtalálnom, talán mert nem vagyok tagja a group-nak vagy valami propritetary JS kéne hozzá, amit a tűzfalam blokkol, nemtom.
Ha esetleg valaki rá tudja tenni kezét erre az "egy szem C forrásfájlra", és meg is osztaná velünk, az tök jó lenne.
> Gondolom egész könnyen portolható lenne a js emulátorba a htp támogatás,
Igen, szerintem is ez lenne az ideális. Mondjuk wav/mp3 továbbra sem ártana, mert igazi vasra csak úgy lehet átjátszani.
> Ja és másik szálon: a wav lehet mp3 tömörítésű is akár
Igen, a RIFF egy konténer formátum, nem is ezzel van a baj. A gond az, hogy az alkalmazott MPEG veszteséges tömörítés, és arra próbálunk rájönni, milyen codec paraméterek esetén marad a gép számára továbbra is értelmezhető. Egyelőre a paramétereink nem jók, a tömörítés által behozott zaj olvashatatlanná teszi a programot az emulátor számára.
- 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
> 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.
Na jó, de az én progimmal generált mp3 se megy (pedig ott mindezekre direkt odafigyeltem).
> Például az, hogy ha jól emlékszem, nem órajel függő hanem jel változás szerint halad.
Igen, az én programom is így működik (illetve nálam külön beállíthatod, mekkora hézag van a bitek (és ha van, a bájtok) között). Az emulátor azonban nem így működik, az biza erősen órajel (és kerekítési hiba) függő. Konkrétan
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.
const ratio = cpu_freq / buf.sampleRate;
cnt = Math.min(len * ratio, cnt + dcnt);
const i = Math.floor(cnt / ratio);
sample = chan[i] > 0.03;
> 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
Ha szépen akarom kifejezni magam, akkor alaposan leszoptam a harcifaszt ezzel a JS emulátorral...
Első dolog, hogy képtelenség lokálban futtatni, mert a fetch mindenképp hibát dob (hiába állítottam be az FF-nek, hogy ne tegye, meg lokálban egyébként se legyen CORS meg XSS ellenőrzés, akkor se megy).
Szóval, egy kicsit belenyúltam a kódba. index.html:
<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
Megnéztem a másik emulátort is (gaia.atilia.eu-st). A wav-ot sikerült felcsatolni vele, felismerte (menü > Magnó > WAV csatolása). Parancsba beírtam, hogy "LOAD", majd enter (ez kínszenvedés volt, mivel minden 30-40 karakterleütésből egyszer fogadta csak el...). Aztán minden hibaüzenet nélkül lefagyott? Legalábbis nem történt semmi, csak a kurzor nem villogott tovább. Próbálgattam különböző menüpontokat, erre meg GenProt és crash.
(Ja, egyébként a "bit's length"-et 72-re kell állítani, akkor pont olyan hosszú lesz a wav, mint a htp2h2wav proggival.)
- 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
> Az mp3-akat meg se érzi, WAV-ot meg nem találtam sehol.
Itt vannak: https://gergo.erdi.hu/projects/honlab/_build/image/hl2/ De csak az aknasz_a16.mp3 és a bombazo_a16.mp3 működik, a többi mp3 nem. A wav-ok mind mennek.
A hello.wav-ot próbálgatom most, abban esetleg tudnál segíteni, hogy ebből mégis milyen bitkolbászt olvas ki a géped? https://gergo.erdi.hu/projects/honlab/_build/image/hl2/hello.wav Már csak önmagában az, hogy egyáltalán hány bitet kódol ez a nyamvadt wav rohadt nagy segítség lenne. Ez így nagyon nem fog menni, ha nincs olyan adathalmaz, ami meglenne htp-ben meg wav-ban is, képtelenség. Rosette-i kő nélkül nem megyek semmire.
Próbáltam, lefutattam mindenféle beállítással loop-ban a konverteremen a hello.wav-ot, de nem volt olyan kombináció, amiben az 0xA5 szerepelt volna. Elvileg ennek kéne lennie az első bájtnak, bár az Audacity-vel nézegetve a hullámot erősen kétlem, hogy ezekből a csúcsokból bárhogy is kiolvasható lenne. Van 4 egyforma szélességű, üresség, egy fél szélességű majd 13 egyforma szélességű, újabb üresség, aztán 4 pont ugyanolyan, az elején. Ebből a mintából hogy jönne ki mégis 10100101?
Szóval tud bárki olyan homelab programot, ami megvan wav-ban, be is tudja tölteni (akármelyik emulátor), és ugyanakkor megvan binárisban is (htp), hogy lássam, milyen biteket tartalmaz az a bizonyos wav? Működő wav2htp-ben nem is reménykedem, pedig az megoldaná a gordiuszi csomót (a Delphis sajnos szar, és ha működik, akkor is csak logol, nem ment le htp fájlt. A többi link meg mind 404).
> próbaképp megnéztem Spectrummal is
Az tök más tészta, az frekvencia modulált. Ott lényegtelen a pontos szint, csak az számít, hogy mi az X tengely metszés gyakorisága. Jóval érzéketlenebb az mp3 zajra, mint az amplitudó modulált (mondjuk ha a zaj metszi az X tengelyt, az ott is galibát okoz).
- 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
> egyébként htp (homelab 3 4) forműtumú programok
Megtaláltam, de egy konvertáló írásához nekem pontosan ugyanaz a program htp-ben és wav-ban is kell.
> a google drive linken
...amihez proprietary JS futtatása szükséges, így nálam nem játszik. A listát látom, de a letöltés nem működik.
- 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
> Feltöltöttem pár teszt programot még a fentlévő sokoban mellé.
Tökéletes, köszönöm! Ezzel így menni fog!
> A biteket fentebb írtam, két tüske távol=0, 3 tüske közel=1.
Hát, a gyakorlatban sajnos biztos nem. A hello.wav és a bombazo.wav eleje sem ilyen, pedig mindkettő 256 nullával indul elvileg.
Meg aztán próbáltam az e szerint működő h2htp2wav programoddal átkonvertált tartalom.htp-t betölteni, de nem ette meg az emulátor. Szóval jóval több turpisság van itt a háttérben...
> Szerintem a hello.wav-val ne is próbálkozzál. Az a régi htp2wav konverterrel készült.
Nem biztos, hogy konvertált, elég sok benne a zaj, szerintem ez így lett digizve magnóról.
> Ennek ellenére kipróbáltam, és 441000-re állítva mégis betöltötte az emulátor. Két soros basic program.
Igen, nálam is betöltötte (bár 48kHz-n, de a 72 mintányi hosszú tüskék valóban inkább 41kHz-re utalnak), és pont azért választottam, mert ilyen kicsi kétsoros, gyorsan lehet vele tesztelni.
Köszönöm a mintákat, a tehén program kifejezetten alkalmasnak tűnik tesztelésre! Elég kicsi és megvan wav-ban és htp-ben is! Tökéletes!
- 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 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.
Nyilván, erre számítok is, nem ez a baj. Itt egy kép, hogy érthetőbb legyen:
https://i.ibb.co/QmHHd7Z/hello-wav.png
A kép jobb oldalán sorjáznak szépen adott időközönként a tüskék, ez 11 nulla bitet kódol (ennyi látszik legalábbis a képen), ezek adják a 256 nulla bájt elejét. Ez rendben is van, ennek a kezdetét helyesen detektálja a programom. Viszont ami előtte van, a 4 + fél+13 + 4 + üresség, na az a gond. Ha ezt az egészet valami csoda folytán 7 darab 0 bitnek veszem, akkor az összes többi bitet már helyesen értelmezi, és a lementett htp 256 nullával kezdődik, majd 0xA5 HELLO-val folytatódik.
A gond az, hogy ötletem sincs, hogy jelenthetne ez 7 darab 0 bitet (igazából ez az egész most kimarad, mert kidobja a zajszűrő, ugyanis hiányoznak belőle a sync bitek).
- 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
Azért kösz!
> 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
Igen, tudom, de azt reméltem hátha raktál bele már egy debug-ot vagy valami. Pont ez a gond, hogy hiába pakolom tele console.log-al, a JS emuból sem derül ki, hányadik mintát használja végül a bájthoz (igazából minden mintát TÖBBSZÖR is kiolvas, ugyanis az órajelszámláló lassabban lépked, mint a rato, 83.333, így több cnt értékre is ugyanaz az i mintaindex jön ki).
- A hozzászóláshoz be kell jelentkezni
Na, frissítettem a repót meg a webservice-t is. Bekerült egy csomó minden. Mivel lusta vagyok alapból, ezért lett preset választó, hogy ne kelljen mindig felkattogtatni a Homelab paramétereit.
1. az általam generált wav és mp3-akat stabilan konvertálja oda-vissza
2. mind az mp3-at, mind a wav-ot hiba nélkül betölti az emulátor
3. ha a betöltött wav-ot le tudja futtatni az emulátor, akkor a betöltött mp3-at is.
Azonban nem fenékik tejfel minden, a rövid programok (hello, tehen) tökéletesen futnak is, viszont a hosszabbaknál (pl bombazo), előbb-utóbb szétcsúszik a szinkron, és a program végére zagyvaságot tölt be. Hogy ezt miért nem veszi észre az emulátor, és miért nem dob rá error-t, az passz. Nem erre lenne a checksum a végén?
Szóval a betöltés hiba nélkül lefut, de ha kiadom a LIST-et, akkor csak a program eleje jó, egy idő után átcsap másnapos ASCII artba. Ez tuti, hogy az órajel / frekvencia kerekítési hibákból adódik, valahogy vigyelembe kell vennem ezt a generáláskor.
Szóval alakul, de még van mit csiszolni rajta. A hello.mp3 és a tehen.mp3 már tökéletes. (Megj: kézzel beraktam a kódba, hogy a 7. bittől kezdje, így lett hello.htp-m, abból generáltam. A TEHEN.wav-ot csont nélkül és hibátlanul mentette tehen.htp-be.)
- 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
> egy wav, amit a SAVE paranccsal mentettem (de visszaolvasni már nem tudom
Megpróbáltam én is visszaolvasni. A wav 1.2M, ennek több, mint a fele zaj. Ráeresztve a proggimat nem is csoda, hogy nem tudja detektálni, milyen időközzel vannak a sync bitek.
$ ./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 bytes
Most 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 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.
Hát biztos nem. Mármint értem, hogy elvileg így kéne lennie, a JS emulátor nagyon nem így működik, az biztos.
Ha tényleg a felfutó éleket figyeli, a biteket akkor sem a szünet kódolja, szóval a szélesség tök mindegy (amíg az nagyobb, mint a mintavételezési gyakoriság). Ha érdekel, a megadott bithosszt (length) két részre bontom, set-re és stop-ra. A set részbe kerül a magas jel, ha a bit egy, a stop rész meg mindig az alacsony szint. https://gitlab.com/bztsrc/cassette/-/blob/main/encode.c#L72 Ha túl vastag neked a tüske, akkor e két változó arányával könnyedén állítható. Lehet berakok egy kapcsolót, amivel meg lehet majd ezt adni.
> Én csak mintaértékeket írok ki egy wav fájlba egymás után, azt még tudom követni.
Én se csinálok mást. A külső ciklus végigmegy a bájtokon https://gitlab.com/bztsrc/cassette/-/blob/main/encode.c#L91 (i a bájtszámláló, l az ezidáig kiírt hossz)
Aztán a belső ciklus végigmegy a biteken https://gitlab.com/bztsrc/cassette/-/blob/main/encode.c#L93 (nb = number of bits, ez Himelabnál mindig 8)
A cikluson belül ha kell prefix szinkronjel (sy & 1), akkor kitesz set hosszan magas jelet, majd stop hosszan alacsony jelet (Homelabnál ez nincs).
Aztán kikerül az adatbit, hasonlóan set hosszan magas vagy alacsony jel a bit értékétől függően, majd stop hosszan alacsony jel.
Végül ha suffix szinkronjeles (sy & 2), akkor kitesz set hosszan magas jelet, majd stop hosszan alacsony jelet (Homelabnál ez mindig van).
Kb. ennyi.
Ez viszont nem jó megoldás. Az a baj vele, hogy diszkrét számú mintát tesz ki minden bithez, holott a beolvasáskor (elvileg) időarányosan számítódik ki, hogy hányadik mintából kell olvasni, ezért a kerekítési hibák miatt a bitek hosszának változnia kéne a hangmintában, különben elcsúszik a jel egy idő után (a kerekítési hiba nagyságától függően N minta olvasás után már az N - 1. vagy N + 1. mintát fogja olvasni az N. helyett, ami nyilván nem jó).
Ezen dolgozom most épp, hamarosan kész. A beolvasást már feltúrbóztam. Kidobtam a high-pass filtert, mert semmi értelme, bekerült helyette egy hullámnormalizáló, és egy kis heurisztika, ami képes felismerni a fejlécet (ami a 256 nulla bájtot előzi meg, és vagy van, vagy nincs a mintáitokban. Ha van, akkor mindig az első bájt legmagasabb bitje az első igazi adatbit, egyébként a legalacsonyabb bitjével kezdődik). A normalizálás azért kellett, mert nagyon sok minta elnyűtt szalagról származik, ezért elég viccesek, itt egy kép, hogy lássátok miért volt gigaszopás: https://i.ibb.co/RY0PDBH/magnorol.png
Az eredmény, hogy minden hangmintát, amit linkeltetek, atomstabilan konvertál htp-vé. Még a kerekítési hibás cuccot kijavítom a generálásnál (esetleg vékonyabbra teszem a tüskét), és feltöltöm a javított változatot.
> Már kíváncsi vagyok arra a ROM rutinra, hogy érzékeli a tüskéket
Igen, most már én is. Lehet ráeresztem a diszasszemblálómat, anno csináltam hozzá Z80 utasítástáblát is (bár csak pár triviális tesztet futtattam rá, ha az emlékem nem csal). https://gitlab.com/bztsrc/udisasm
Én egyébként nem foglalkozom a felfutó élekkel (csak FM kódolás esetén). AM kódolásnál ha van szinkronjel, akkor egyszerűen megkeresem azt a mintaközt, ahol minden szinkronbit magas jelű, ezt lefelezem, és ezután egyszerűen minden ennyedik mintát nézem, hogy magas vagy alacsony jel-e. Ez remekül működik az összes eddigi beszerzett mintára (igen, még azoknál az mp3-aknál is tökéletes, amik a JS emuhoz voltak, de a JS emu sem volt képes beolvasni, pl. hoki.mp3 vagy hello.mp3)
- A hozzászóláshoz be kell jelentkezni
Na kérem, frissítettem a repót és a webservice-t: https://bztsrc.gitlab.io/cassette/
Ez most tutibiztos, bármilyen hangmintát, amit csak adtatok, magabiztosan és hiba nélkül konvertál htp-vé (a legrosszabb, amit láttam, hogy pár extra nulla bájtot rakott a végére, ha a proggi után még volt valami nagy zaj a hangmintában).
A másik irány is megy, minden általa generált mp3-at csont nélkül beolvas az emulátor. Példák itt találhatók: https://gitlab.com/bztsrc/cassette/-/tree/main/examples
Akad néhány htp fájl, ami hiba nélkül betöltődik, azonban a listázásra kriksz-krakszok jelennek meg. Kicsit összehasonlítgattam a binárisokat, és arra jutottam, ez nem a generáló vagy a betöltő hibája, hanem valószínűleg ezek nem Aircomp 16 kompatíbilis programok (hanem Homelab 3 vagy ilyesmi). Az egyik ilyen az a hoki.mp3 és hoki.wav, amit a JS emu mellé adtak, megjegyzem abból a wav-ot sem tudta lefuttatni. A htp-t gyönyörűen ki tudtam nyerni belőlük, és az abból generált mp3-amat is hiba nélkül betölti, de aztán ugyanaz, mint az eredeti wav esetében, nem listázható és nem futtatható.
Ha valaki parancssorból akarná használni, akkor annyi változott, hogy eddig a bithosszt -l kapcsolóval minták számában kellett megadni. Ezentúl μs-ben (milliomod másodperc). Alapból a vicces fejléceket detektálja, és nem generálja, de a -h hatására kihagyja a detektálást, ill. generáláskor mindig beteszi.
Gyorssegítség:
audióból htp:
./cassette -2 aircomp_proggi.mp3 aircomp_proggi.htp
htp-ből audió:
./cassette -2 -l 771 aircomp_proggi.htp aircomp_proggi.mp3
Nem 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 operában volt megy, és esélyes, hogy a htp-audió iránynál is max pár kapcsolón kell csak kicsit tologatni.
Használjátok egészséggel!
ps: próbáltam -32-vel, a legtöbb esetben ment, de pl. a hoki.mp3-nál nem volt elég (betöltési hibát eredményezett), ezért hagytam -64-en az alapértelmzést, de nyugodtan próbálgassátok -32-vel.
ps2: ja és igen, a tüskék szélességét benéztem, eredetileg fordítva akartam: bithossz 1/4-e a szignál, 3/4-e az üres, nem fordítva. Ez is javítva lett.
- 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
> nézd csak, homelab 4 gépkönyv 51-edik oldal, leírja a kazetta kezelést
Ezt jó lett volna látni korábban :-) Sajnos az általatok linkelt hangminták azonban nem felelnek meg az itt leírtaknak. E szerint a fejléc 256 darab nulla bájt, csakhogy a valóságban a fejlécek ilyenek (a képen az alsó három hullám):
https://i.ibb.co/RY0PDBH/magnorol.png
Azaz van pár bit (néha 1 rövid, 1 hosszú, 1 rövid vagy inkább 1 hosszú, 1 rövid csoport, majd üresség, de egyszer olyan is előfordult, hogy 1 hosszú, üresség, 1 rövid csoport). Empirikusan arra is rájöttem, hogy ha van ilyen fejléc, akkor az 7 bitnyi, szinkronjel nélküli 0 bitnek felel meg, tehát a legelső szabályos (a leírásban is szereplő) adatbit ilyenkor nem az első bájt legelső, hanem az első bájt legutolsó bitje. Ezt követi 255 darab szabályos nulla (a második szabályos adatbit már mindig a második bájt legelső bitje), majd a 0xA5. Tehát a legelső nulla bájt kódolása nagyon nem olyan, mint ami a leírásban szerepel, a többinél már stimmel.
> A négyszög 0,19 ms ideig tart. Az első és harmadik kezdete közt pedig 1.5 ms telik el.
Ez sem igaz a megadott mintákra. A legtipikusabb 44100Hz, ahol az első és harmadik négyszög kezdete (két szinkronbit) között 34-36 minta van, tehát nem 1.5 ms, hanem 34 * 1/44100 = 0.000771 szekundum, azaz 771 mikroszekundum telik el. A tüskék hossza pedig nagyon ingadozik, szóval az sem 0.19 ms.
> 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
Ez jó trükk, én is hasonlót csinálok. Megnézem, mi a legnagyobb és legkissebb érték a mintákban, aztán normalizálom: ami a legnagyobbhoz áll közelebb, abból mind teteje lesz, ami meg a legkissebbhez, abból mind alja (a fenti képen a felső három hullámot kezeli ez, amikor a függőleges zérus elmászkál meg az alja a pozitív tartományba lóg néha). Ezután megszámolom, hogy a felfutó élek között mennyi minta a különbség, és hogy az hányszor fordul elő, majd a leggyakoribbat veszem. Így a sebességtől tök függetlenül határozom meg, hogy hány minta hosszú egy bit. Ez tök jól működik bármilyen hangmintára, hacsak nincs túlsúlyban a zaj. (Egy kicsit összetettebb az ellenőrzésem, mert a leggyakoribb távolságra megnézem, hogy mindig kijön-e a magas szinkronbit, és ha nem, akkor a második leggyakoribb közt veszem, és arra szintén leellenőrzöm ugyanezt.)
- 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
Na, most már csak az a kérdés, hogy plt kolléga tudja-e használni.
Mégegyszer, ez csak bináris és audió között konvertál, tehát a htp előállítása BASIC-ből továbbra is Rád és a h2bas2htp programodra marad.
> Gondolom az a hivatalos sebesség, amit leírtak.
Igen, csak épp az összes linkelt mintában jóval kevesebb a bithossz a megadottnál. Engem mondjuk nem zavar. Egyébként megpróbáltam még ennél is kissebb bithosszal, az emulátornak az sem okozott gondot, de nem tudom, hogy igazi vason végül működne-e. Mindesetre így az audiófájlok mérete (és a betöltési idő az emulátorban) drasztikusan lecsökkenthető, ha más nem, a tesztelés idejére mindenképp megéri alacsonyabbra venni.
- 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:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
> Mert működhet szerencsés esetben, de nem kell működnie.
Hát, ez hülyén hangzik, de igazából frappáns megfogalmazása a dolognak :-)
> 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?
Mindenféle csillagegyüttállás szükséges ahhoz, hogy menjen. A teljesség igénye nélkül pár buktató (a magyarázathoz https://i.ibb.co/RY0PDBH/magnorol.png):
1. Az MP3 bitrátája nagyban befolyásolja, mennyire zajos. A 96-os a lehető legrosszabb választás ebből a szempontból, mert az a legzajosabb, legnagyobb ingadozást produkáló.
2. Az emulátor 0.03-nál vág, tehát ideális esetben minden alacsony érték (ingadozással együtt) ez alá kell essen, minden magas érték (ingadozással együtt) e fölé. Ez a képen alulról a második hullámon jól látszik, hogy a tömörítés miatt mennyire nem mindig jön össze.
3. Mivel az MP3 kodek adaptív, sokszor előfordul, hogy ha egymásután több közeli tüske is van, akkor utánna az első tömörített alacsony érték elkezd "felfelé mászni", jócskán 0 fölé. A képen a legalsó hullám jól példázza ezt (nézd azt a pontot, ahonnan a legelső adatbitet kell venni. Elvileg 0 bit lenne, de a konkrét értéke 0.03 fölötti, így az emulátor 1-es bitnek veszi).
4. Az MP3 kodek nem képes arra, hogy a becsomagolt mintát ugyanakkorára csomagolja ki. Ezért szükséges egy nem szabványos (de általánosan elterjedt) plusz fejléc. A Xing fejléc tartalmazza ugyanis, mennyi mintát toldott hozzá a kodek. Ha ez a fejléc hiányzik, akkor szinte biztosan el fogja rontani az emulátor. Itt az a gond, hogy a kodek által beszúrt minták alacsony és magas szintje tök független attól, ami az eredeti mintában van, viszont a zaj erre is rárakódik bizonyos esetekben (hogy mikor és miért, arra nem jöttem rá). A legalsó hullám a hoki.mp3, ezen látszik (bár ha kinagyítanánk, jobban látszana). Az első 14 tüskét megelőző nullás vonal igazából nem mind nulla minta, hanem a nulla körül ingadoznak, több is átmegy 0.03 fölé. Mégegyszer, ez nem feltétlenül az eredeti minta hibája, ilyent a kodek is beszúr a tömörített adat elejére.
Megjegyzem a legtöbb gondot az okozza, hogy kicsit trehány módon lett megírva az emulátor, a 0.03-nál vágás eléggé esetleges és nem jó megoldás. Azzal meg például egyáltalán nem is foglalkozik, hogy a legelső igazi adatbitet detektálja, szóval bármilyen zaj a minta elején könnyedén bekavarhat neki (a ROM-beli beolvasó rutin valamennyire képes ezt ellensúlyozni, de nem minden minta esetében, az ugyanis már nem látja az eredeti jelszintet, csak 0-ákat meg 1-eseket).
Itt egy kis peccs a tape.js-re, ami drasztikusan javítja az emulátor beolvasási rátáját (de még így sem tökéletes, továbbra sem fog minden MP3-al működni, csak jóval többel):
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
> a for ciklus végén "len++" helyet "i++" van.
Upsz, valóban. Fáradt voltam ár...
> 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.
Igen, már az is sokat segít.
> 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.
Biztos nem, mert a mintavételezési pontok kevesebb, mint 1 mintányira vannak (azaz nem az van, hogy átugor pár mintát mintavételezéskor, hanem ugyanazt a mintát többször is mintavételezi). A ROM beli beolvasókódban is van további hibaszűrés, simán lehet, hogy az megoldja a bombázó esetén.
> Mindenképp az emulátor fejlesztőjének megpróbálom továbbítani a betöltésed módosítását.
Akkor inkább ezt a módsítást továbbítsd kérlek, ez sokkal jobb:
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
> zajos analóg felvételeknél az átlag nem adhat jobb eredményt?
Csak néha. Nagyban függ a zajtól, hogy mennyi az előtte-utánna beszúrt nulla, de még az is befolyásolja, hogy egy bitnyi jelnek hány százaléka a tüske, és ez hogy aránylik a magas ill. alacsony szinthez. Szóval fene tudja, lehet, jobb eredményt ad bizonyos hangfájlok esetén, de szerintem ha a tüske nem a bittávolság fele stabil magas = -alacsony mellett, akkor biztos torz lesz. De simán lehet, hogy minden rendelkezésre álló hangmintáknál jól működik, vagy lehet, hogy csak párnál működik. No meg az is lehet, hogy a torzítás pont jobb eredményt ad végül, fene tudja.
> Egy-egy negatív maximális zaj, és oda az egész.
Az általatok linkelt hangmintáknál nálam jól bevált, mondjuk azokban nem volt ilyen. Egyébként ja, az félreviheti, bár nem valószínű (esélyes, hogy hiába egy negatív maximális zaj, attól az alacsony minták még mindig ahhoz közelebb esnek, semmint a magashoz. Persze csak általában.)
> Ha már szélsőértékek, akkor inkább a szórásnégyzet kellene... Nem?
Nem tudom, itt konkrétan mit értesz szórásnégyzet alatt, de SZVSZ a legtutibb az lenne, ha egy tömbbe összeszámolnánk, melyik minta hányszor fordul elő, és ebben keresnénk az első ill. utolsó lokális maximumot, aztán ezek átlagánál vágnánk. Nyilván ez float esetén nem megoldható (túl sok a lehetséges mintaérték), de 8-bites PCM-nél (ahol az előfordulás tömb elemszáma 256 lenne) simán működik. Végtelenségig lehet bonyolítani persze, a kérdés inkább az, hogy milyen mintáink vannak, és mi az az algoritmus, ami már elegendő hozzájuk. 100%-os tuti megoldás úgysincs, túl sok a lehetséges zavaró tényező ahhoz, hogy mindet számításba lehessen venni.
A Cassette egyébként azt csinálja, hogy legelőször is normalizálja a jelet. Minden olyan minta, ami a magashoz áll közelebb, abból fixen 1.0-át csinál, amik meg nem, azokból fixen -1.0-át. Ezután nem foglalkozik többet a konkrét minták értékével, simán csak az előjelet használja helyette (+ = 1, - = 0). Ennél a megoldásnál nem zavar be egy-két negatív vagy pozitív tüske, és nem is túl számolásigényes (no meg utólag tettem bele, és így nem kellett átírnom a már meglévő kódot :-) ).
- 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
> Olyat, ami a generált/konvertált hangfájlokra stabil, vagy olyat, ami esélyesen jó régi magnófelvételeken is.
E kettő nem zárja ki egymást. A mostani változat is stabil a konvertált hangfájlokra, szóval ezügyben nem kell tenni semmit. Szerintem a legjobb az, ami egy minimális heurisztikát tartalmaz, így jó eséllyel működni fog régi felvételekre is, de továbbra is kezeli a konvertált fájlokat. Legalábbis emulátor felhasználói szemszögből ez a legcélszerűbb (konvertált most is jó, legyen jó egy átlagos régi felvételre is, de túlbonyolítani, hogy extrém hangfájlokra is működjön nem kell). SZVSZ.
> Í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.
Pontosan úgy, ahogy írtam.
1. A float-ot át kell skálázni bájtra (mivel a float-nak túl sok lehetséges értéke van, a bájtnak meg csak 256).
2. Ezután össze kell gyűjteni egy a tömbbe, melyik minta hányszor fordul elő.
3. Mivel ahogy írtad, a legtöbb minta a 0-ás jelszint és az 1-es jelszint körül csoportosul (igen, ez egy feltételezés, de olyan, amire digitális jeleket tartalmazó hangfájlok esetén nyugodtan támaszkodhatunk), azért ennek a gyakoriságtömbnek a grafikonja tutira így fog kinézni:
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
> 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.
Mármint szerinted nem a gyakoriságtömb két szélső csúcsa fogja jelezni a legvalószínűbb 0-ás és 1-es jelszintet? Pedig erre mérget vehetsz, hogy így van.
És ez még akkor is igaz, ha a jel nagyon zajos (jó sokat ingadozik a 0-ás, 1-es jelszint körül), vagy a hangmintában az előtte-utánna a nulla körüli ingadozás jóval hosszabb, mint a valós adat, vagy akár néha-néha nagyobbat ingadozik, mint a jelszintek szintje.
> Neked volt-e olyan teszted, amit csak a szélsőértékes megoldás töltött be, és az átlagos nem
Nem linkeltetek olyant, de szintetikusan elő tudtam állítani azt a hangmintát, ami nagyon nagyon hasonlít egy tipikus igazi hangmintára, de mégis elvérzik. Bitszélesség 36 minta, tüskeszélesség 2 minta, 1-es szint 0.5, 0-ás szint -0.25. Ekkor a mezei átlag jóval azalá a szint alá kerül amibe az mp3 zaja már bezavar. (A sok alacsony jelszint az induló 256 nulla bájtban túlontúl leviszi az átlagot. A minimum / maximum felénél nézve 0.362-nél vág, ami tökéletes.) Persze ez fordítva is igaz, tudok olyan szintetikus hangmintát előállítani, amin meg ez utóbbi módszer hasal el, csakhogy érzésre ez extrémebb, kevésbé hasonlít az igazi hangmintákhoz, mint az, amin a mezei átlag hasal el. De csak SZVSZ.
> Főleg, hogy azért azt is lehet előre tudni, hogy a beolvasandó minták mik lesznek.
Valóban, de ezt igyekeztem elkerülni a konvertáló megalkotásakor, igyekeztem a lehető legjobban általánosítani, hogy minnél több (remények szerint jövőbeli) programmal is működjön majd. A meglévő mintákat csak tesztelésre használtam.
- 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
> 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.
Nem értem, valamit nagyon benéztél. Ezekre a számokra is tökéletesen működik mindhárom algoritmus, amit adtam.
A mezei átlag: (1000*0.8+1000*0.9+1000*0.1+1000*0)/4000 = 0.45.
Az egyszerű szélsőérték esetén: top = 0.9 és bottom = 0, ezek átlaga 0.45, tehát minden ennél nagyobbat 1-as bitnek vesz, minden ennél kissebbet 0-ás bitnek, ami szintén hibátlan.
A bonyolultabb gyakoriságtömbös szintén helyes eredményt ad: ahol először esik a grafikon, az a 0.8 (első csúcs), ahol legutoljára emelkedik, az meg a 0.1 (utolsó csúcs). Ennek a kettőnek az átlaga ugyancsak 0.45, tehát ez is hibátlanul konvertál bitekké (0.1-es léptékkel. Ha a léptéked kissebb, 0.01, akkor a 0.9-et és 0-át fogja megtalálni csúcsoknak, de ekkor szintén helyes az eredmény).
Mint említettem volt, mindkét utóbbi algoritmus olyan, hogy nem zavarja őket, ha a 1-es és 0-ás jelszintek körül ingadozás van; a vágási szintet mindkettő tűrhető hibahatáron belül állapítja meg. A legelső mezei átlag azonban el tud csúszni a hibahatáron túlra. A JS kódba becsúszott egy kis hiba, lefelejtettem hozzáadni az alsóértéket, helyesen:
- 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:]' <<<locsemege
LOCSEMEGE
- 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:]' <<<locsemege
LOCSEMEGE
- 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
> Simán elképzelhető, hogy két maximális csúcsod lesz 1-esekből és 2 csúcs a 0-ákból.
Nem számít. A legelső csúcsot veszed a legvalószínűbb 1-es jelszintnek, a legutolsót meg a legvalószínűbb 0-ásnak, és ezek felénél vágsz. Tök mindegy, hogy hány csúcs van.
> 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. Egy tetszőleges véletlen halmazban nem biztos, hogy szerepel két olyan érték, amit keresel. Nincs olyan matematikai módszer, ami kiad két számot egy olyan adathalmazból, amiben nincs is két szignifikáns érték (kikéve a politikai indíttatásból kozmetikázott statisztikát, de azt most hagyjuk). Pl: mi van akkor, ha az adathalmazod 0,0,0,0,0 vagy 3,3,3,3 vagy 1,2,3,4,5 vagy 5,4,3,2,1; ezek egyikéből sem fogsz tudni kivenni két várható értéket, ha megfeszülsz, akkor sem, mivel vagy minden minta tök egyforma, vagy minden minta tök különböző.
- 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:]' <<<locsemege
LOCSEMEGE
- 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:]' <<<locsemege
LOCSEMEGE
- 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
> 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.
Mondjuk a Z80-nak és a 6502-nek pont semmi köze azokhoz, amiket felsoroltál. Grafikát, zenét, stb. mind a perifériák adják, nem a CPU.
Érdekesség: a Gameboy-ban is lényegében Z80-as proci volt (csak kicsit megkavarták az utasításkódolását, de a regisztereik például tök ugyanazok), aztán mégis tolta a grafikát meg a zenét.
> Aztán ha megnézed, az Amiga ma már sehol sincs
Na, azért itt álljunk meg egy szóra. Az Amiga nem azért nincs, mert ne lett volna jó gép, vagy a népnek ne kellett volna. Pont ellenkezőleg, túl nagy volt rá a kereslet. A gyártó Commodore ezért előrendeléseket vett fel, azonban chiphiány miatt nem tudott gyártani, és így nem tudta a vállalt határidőre teljesíteni ezeket. Emiatt csődölt be, és szűnt meg az összes terméke, többek között az Amiga is. Ennek szimplán elcseszett üzletvezetési okai voltak, semmi technikai.
(Rossz nyelvek szerint a chiphiány azért alakult ki, mert a Microsoft bosszúból felvásárolta a Commodore elől az alkatrészeket. Ez nem tudom, hogy mennyire igaz, de az tény, hogy volt egy kis nézeteltérésük a BASIC miatt, amit a Commodore a Microsofttól vásárolt (Commodore szerint) / licenszelt (Microsoft szerint). A különbség a kettő között ugye az, hogy fel kell-e tüntetni a MIcrosoft nevét a terméken vagy sem. Ez egyedül a C=128 esetében történt meg, az összes többi Commodore gép sosem írta ki, hogy a BASIC kitől származik. Az is tény, hogy a Microsoft-ot piszkosul zavarta a Commodore sikere, és komoly riválist látott az Amigában a PC-vel szemben, amire ekkor már komoly szerződéseket kötött az IBM-el, az eredeti, híres DOS szerződésen túl, pl. OS/2-n is dolgoztak, meg hát gőzerővel tolták már a Windows-t is.)
- 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