21. septembra 2015

SAA1099Tracker

Všetci si pekne posadajte, rozpoviem Vám jeden príbeh, ktorý sa skutočne stal. Napínavý príbeh zo života programátora a popularizátora 8bitov o hľadaní tej správnej cesty a formy pre svoje myšlienky. Príbeh o tom, ako sa môže trikrát zmeniť forma, dizajn či názov, ale cieľ, chuť a nosná myšlienka zostáva stále rovnaká - a tou je vytvoriť vlastný chiptune music tracker...

TL;DR: Rozuzlenie príbehu na konci článku so skúšobnou verziou...

Na začiatku toho všetkého bolo ticho. Ticho pretínané iba bzučaním beepra PMD 85, do ktorého sme sa snažili s bráchom priniesť trochu tej krásy 8bitovej hudby, ktorá na tejto platforme chýbala. Najskôr to boli odvážne pokusy vytvoriť od podlahy vlastný hudobný interfejs, no napokon sme siahli po hotovom zvukovom obvode, ktorý tak nejak zostal zabudnutý v minulosti - Philips SAA-1099. Veď napokon, celú story o vzniku tohto interfejsu si môžete prečítať v tomto našom staršom článku...

Čo je na tomto príbehu dôležité je to, že od prvotných pokusov a neskôr prototypov zvukového interfejsu MIF 85 bolo mojou snahou priniesť s ním aj tracker - hudobný sekvencer, ktorým by bolo možné preň hudbu vytvárať. Veď uznajte, načo by bol zvukový interfejs, keby muzikanti nedostali poriadny nástroj na tvorbu? (konkrétne presne na to, k čomu doteraz MIF 85 slúži, tj. prezentácia pár skonvertovaných skladieb zo Sam Coupé :)

Vývoj trackera som započal vlastne hneď po tom, ako sme na papier dali prvú špecifikáciu ešte pôvodne zamýšľanej Musica II interface. Začal som ho programovať priamo v assembleri i8080 a mal to byť natívny program pre PMD 85 a kompatibilné. Keď som nadizajnoval grafické prostredie, napísal ovládanie kurzora (ktorý akceleroval, heč!), následne ovládanie UI prvkov, dátové uloženie obsahu tracklistu (miesto, kde sa píšu samotné hudobné dáta) a jeho následné vykresľovanie, zistil som, že ak by tam malo byť ešte hradlo, tak to tých úbohých 2MHz proste neutiahne. V tom čase sa dĺžka obslužného kódu začala približovať (tuším) 10 kilobajtom a tak som to už pri programovaní samotnej editácie v trackliste vzdal a usúdil, že tadiaľto cesta nevedie...

Druhá iterácia, ktorú som začal vyvíjať na jar 2012 už niesla názov MIF85Tracker a mala prívlastok multi-platformovej GNU/GPL aplikácie, primárne vyvíjanej na systémy založené na unixe. Postavil som to na knižnici SDL a celé grafické prostredie bolo zobrazované a ovládalo sa v "obyčajnom čiernom okne" a celkovo dizajn vychádzal z rovnakých základov ako pôvodný program na PMD 85. Tu vlastne boli vymyslené a naprogramované triedy pre hradlo, zobrazovanie tracklistu a idea editora samplov a ornamentov, ktorých kód prakticky prežil až dodnes a iba s drobnými zmenami boli používané v každej ďalšej iterácii trackera. Po pár mesiacoch, keď som potreboval už po X-tý krát zmeniť dizajn kvôli zmene konceptu či novej feature a opäť ručne prekopať celý grafický look a v kóde ručne poposúvať pozície elementov, povedal som si, že ani tadiaľto cesta nevedie...

ono to skutočne fungovalo!

Do ďalšej iterácie som sa pustil až po roku a grafický interfejs som postavil na knižnici wxWidgets, ktorá poskytuje jednotné API ku natívnym ovládacím GUI prvkom daného operačného systému. Samotný dizajn aplikácie sa potom môže veľmi rýchlo prispôsobovať požiadavkám pomocou výborného vizuálneho design-editora wxFormBuilder, ktorý navyše generuje hotový obslužný kód a ten sa jednoducho inculuduje do projektu a implementujú sa už iba obslužné rodičovské metódy. Obsluhu zvukového výstupu som zas zveril knižnici PortAudio, ktorá rieši celý ten "cirkus" okolo ovládačov daného operačného systému a výberu výstupného zariadenia a ku všetkému sa pristupuje jednotným rozhraním. Začalo to všetko úžasne klapať, práca mi išla naozaj ako po masle a už po pár mesiacoch, v decembri 2013 som funkčnú alfa-verziu prezentoval na JHCone...

Na projekte som spokojne pracoval až do leta 2014, kým neprišli prvé žalostné výkriky od užívateľov Windows s dotazmi ako tracker spustiť či skompilovať a prečo som to už neurobil na túto ich najlepšiu a najpoužívanejšiu platformu®. Radšej pominiem bez hejtu fakt, že ako autor open-source projektu, ktorý vyhlásim za multiplatformový a použijem multiplatformové knižnice nie som povinný zabezpečovať kompatibilitu naprieč platformami a vytvárať pre ne kompiláty sám (alebo na drzovku: "Je to open-source? Váľa sa to na internetoch? Tak si to stiahni, skompiluj, pridám ťa do projektu, commitni úpravy kvôli kompatibilite a vydaj balíčky na stiahnutie pre všetkých!"). Lenže ja som nedbal na svoje psychické zdravie i podujal som sa urobiť si medzi Windowsákmi kamarátov a zhotoviť pre nich kompilát sám... predsa, 8bit hudobníci nemusia byť rovno programátori a dá sa povedať, že tracker potrebuje k životu práve hudobníkov.

Nebudem vás napínať: Prežil som si peklo! Po niekoľkých týždňoch celovečerných pokusov a omylov o skompilovanie knižnice wxWidgets pre Windows som konečne dostal akési .dll, po ktorého použití s mojim kódom som smutne zistil, že kompilácia trackera skončí na akejsi nezmyselnej chybe linkera na akomsi vstupom bode, základnej inicializácii mimo môj kód a dosah. Vyskúšal som hafo rôznych verzií knižnice, kompilačných prostredí či vývojových prostredí až som jedného dňa konečne úspešne skompiloval tracker do .exe. A viete, čo sa po jeho spustení stalo? Vôbec nič, pretože sa to zrúbalo na inicializácií knižnice PortAudio. Niekoľko ďalších preplakaných nocí ma stálo skompilovanie PortAudio správne napojené na DirectX, no potom sa to stalo: Spustil sa MIF85Tracker na Windowse! Prvotné nadšenie okamžite ochladlo, keď som zistil, že sa nevykreslil výpis tracklistu ani editora samplov, že nefunguje ovládanie editora myšou a že test klávesnice funguje so spoľahlivosťou predpovede počasia inuitského meteorológa pre Južnú Sicíliu. (len pre info: Windows verzia wxWidgets nedovoľuje programovo vyvolať udalosť prekreslenia elementu z ošetrenia vstupno-výstupnej udalosti, čo som využíval práve na vykreslenie tracklistu a sample-editora po ošetrení kláves, myši, či vo voľnom čase procesora, keď sa v trackliste niečo zmenilo pri prehrávaní).

Výsledok bol skrátka taký, že by bolo nutné prekopať pre tento OS celé zobrazovacie jadro a tiež úplne inak testovať myš a klávesnicu, ktorých udalosti sa líšili v dosť podstatných detailoch. Aby to nestačilo, tak sa mi začali množiť hlásenia linux užívateľov, ktorým knižnica PortAudio nefungovala spoľahlivo a mala problém s detekciou a inicializáciou zariadenia (mne samému sa to tak správalo na pracovnom PC) a hrozilo, že budem musieť implementovať zvukový výstup cez knižnicu SDL, tj. vrátiť sa späť k tomu, od čoho som pred rokom upustil.
Tieto všetky faktory, predstava tých mohutných úprav a tie hodiny strateného času s kompiláciou niečoho, čo nakoniec nefunguje ma demotivovali natoľko, že všetky chystané nápady, featury a rozpracované časti kódu som nechal ležať ľadom ďalší rok a riešil som radšej rodinné záležitosti...

Nuž ale poznáte ma... Nedalo mi to a celý čas som rozmýšľal nad tým, ako sa úplne odpútať od závislosti na platforme a použiť "niečo hotové". Niečo, kde je už "od výroby" odladený a spoľahlivo funkčný zvukový výstup, bezproblémové zobrazovanie vykresleného obsahu a naprieč platformami jednotné ošetrenie vstupno/výstupných udalostí. Ak si všetky tieto požiadavky postavíte vedľa seba a pridáte trocha racionálneho pohľadu do budúcnosti, tak vám vyjdu tieto kľúčové slová: HTML5, Canvas, WebAudioJavaScript.
Ako bonus ešte bolo potrebné vyriešiť názov, ktorý ma trápil už pred rokom a musím uznať, že bol zvolený značne egoisticky. Interfejs MIF 85 predsa nie je jediný, ktorý využíva Philips SAA-1099 a tracker by tak mohol slúžiť aj iným 8bit platformám. Čo na to počítač Sam Coupé? Čo na to niekoľko zvukových interfejsov pre ZX-Spectrum? A co na to Jan Tleskač?

A tak vznikol SAA1099Tracker - HTML5/JavaScript webová aplikácia pre moderné prehliadače, ktorá sa snaží udržať komfort desktopovej aplikácie, takže je možné ju ovládať klávesovými skratkami a po načítaní je schopná pracovať úplne offline. Momentálne si môžete tracker vyskúšať či pozrieť si stránky projektu:

[ GitHub projekt | prvá verejná alpha verzia ]

Jediné, čo budete potrebovať je moderný web-browser podporujúci potrebné štandardy [ Chrome: 21+, Firefox: 25+, Opera: 15+, Safari: 6.2+ ]. Internet Explorer nie je podporovaný z logických dôvodov - žiadne z požadovaných štandardov nepodporuje, ale v budúcnosti snáď Edge bude použiteľný... snáď! Ak ste niekto, kto si užíva Internet Explorer 6 na svojom Windows XP, alebo ste takí "haxorz", čo šmejdia po webe v konzolovom Lynxe, tak tu máte smolu - tracker si neužijete a prípadný hejt si môžete nechať pre seba, pretože aj certifikovaný a jediný pravý technomorous dal tomuto článku like, heč! ;))
Mimochodom, aby sa vám na obrazovku vošli všetky ovládacie prvky a mohli ste aplikáciu pohodlne používať odporúčam rozlíšenie obrazovky minimálne 1280x768. Sorry, ale na responzivitu sa pri desktopovej aplikácii hrať nebudem...

Momentálne si môžete v trackeri vyskúšať zvukový výstupzáklady editácie v trackliste a editore samplov. Na ukážku som pripravil niekoľko demosongov importovaných zo Sam Coupé, ktoré nájdete v menu Import » Demosong.
Ohľadom zvukového výstupu musím upozorniť na to, že momentálne je veľkosť zvukového buffera (latencie) napevno nastavená iba na 80 ms, pri čom sa môže stať, že sa buffer nemusí stíhať napĺňať pri veľkej záťaži napr. prekresľovaním obrazovky. Neskôr bude v nastaveniach samozrejme možnosť si veľkosť buffera upraviť a prispôsobiť tak výkonu vášho počítača. Do budúcnosti sa plánujú aj cloudové služby s možnosťou prihlásiť sa k účtu, s ktorým sa bude synchronizovať kompletný stav aplikácie tak, ako ju používateľ zanechal. Takisto mám v pláne tracker zabaliť do Google Chrome Aplikácie bežiacej vo vlastnom okne.

Čo dodať na záver? Vývoj trackera som započal 1. júna 2015 a včera večer som dosiahol magickú hranicu - 128. commit na githube, takže ten vývoj bol naozaj extrémne intenzívny. Teraz na chvíľu zvoľním, načerpám sily a potom sa pustím do všetkého, čo zatiaľ chýba: Editor ornamentov, vstupno-výstupné operácie (tam sa musím ešte rozhodnúť o formáte zdrojového súboru muziky), blokové operácie, undo-redo a samozrejme, kompiláciu pre 8bity...


PS: Ohľadom kompilácie vás určite poteší, že Roman tento víkend dokončil prvú odladenú rutinu pre PMD 85, ktorá už prehráva kompilát SAA1099Trackera. Zatiaľ pozná iba základnú sadu tracklist príkazov (C, E, F), ale je jasné, že cieľ je na dosah, priatelia! ;)

28 komentárov:

  1. fuj web aplikacie su otras. Ak si nevies poradit s kroskompilaciou co tak sa pozriet ako to robia podobne softy ? skus pozriet napr na MIXXX

    OdpovedaťOdstrániť
    Odpovede
    1. Je to fakt skvelé a motivujúce, pretože trvalo iba 5 hodín a 40 minút, kým sa neobjavil prvý hejt. Správne, tak to má byť! Každý začínajúci projekt, či myšlienku treba už v zárodku zakopať tou pravou dobroprajnosťou typickou pre náš región. Mám to tu rád... ;)

      Takže milý anonymný hrdina: Koľko "kroskompilačných" projektov máš za sebou, že do mňa kopeš s takou istotou toho, že som neskúmal "ako to robia podobne softy"? Všetky "podobne softy" na to idú klasicky tak, že pre každú platformu je tak jedna hromada separátneho kódu. Videl si ty vôbec, koľko ľudí robí napr. tebou zmieňovaný MIXXX? To sa hejtuje od klávesnice na človeka, čo je na celý softvér sám, že? ;)

      A nakoniec: O takých 10 rokov sa ťa opýtam, či sú web-aplikácie otras, ok? ;)

      Odstrániť
    2. neber to ako hejt na tvoj kod (gui sa mi naopak paci), skor nie som moc nadseny tym, akym smerom sa vyvijaju dnesne aplikacie - vsetko na webe, vsetko ovladat dotykom, obkladacky v style w8 atd... ja som skor zastancom klasickych desktopovych aplikacii pisanych v c/c++ (ziadne javy .nety a pod)

      co sa mna tyka povacsinou som robil kroskompilatory pre rozne linux based systemy. My sa ale teraz bavime o win kompilacii. Tam sa mi osvedcil projekt MXE. - mam pod nim skompilovanych viacero QT-based projektov...

      Odstrániť
    3. Vidíš to... splietaš tu o Jave, .NETe (ktoré z duše nenávidím) a pritom si zjavne nepochopil, že toto tu celé stojí na statickom webovom obsahu, čisté HTML5 a JavaScript.
      A potom tu spomenieš QT? QT je akože dobré? To fakt? :)))

      Vieš, ja sám som sa obával toho, ako to JavaScript zvládne... Vieš, koľko benchmarkov som predtým robil a ako dlho som ten JavaScript optimalizoval? Teraz to beží tak, že procesor je pri prehrávaní a prekresľovaní tracklistu zaťažený na ZLOMOK toho, ako ho vyťažovala pôvodná natívna aplikácia (na i7čkách to nepresiahne 1% procáku!).
      Tak sa ešte raz porozprávajme o natívnych desktopových aplikáciách...

      Odstrániť
    4. z duse nenavidis javu a .NET a napises to v javascripte. LOL

      Odstrániť
    5. tak, a teraz si sa strápnil pred celým publikom, keď si tieto veci dal do prímeru... maj sa pekne, ahoj ;)

      Odstrániť
    6. fajn clanok a pekny projekt.. paci sa mi ked sa niekto snazi vyzmykat z html5/JS co to da .. tato platforma ma velku buducnost este len pred sebou .. palec hore

      inak do buducna keby si chcel riesit nejaku zlozitejsiu hudobnu aplikaciu na ktoru by uz JS nestihal (realtime audio narocnejsie, dsp processing a tak), kukni toto, osobne som to pozreal len okrajovo ale bolo mi to doporucene fakt dobrym C++ programatorom ako paradny multiplatformovy framework pre hudobne aplikacie

      http://www.juce.com/

      Odstrániť
    7. ahoj Marek, ďakujem za pozitívne slová. Tiež si myslím, že svoje najsilnejšie momenty má JavaScript ešte iba pred sebou. Juce samozrejme poznám a skúšal som ho použiť aj na tracker v období, keď som hľadal vhodné technológie na jeho realizáciu. Uznať sa mu musí to, ako kvalitne má riešený zvukový processing a výstup, ale ten balast okolo, na ktorom človek musí staviať GUI je šialený kanón na vrabce a nadizajnovať tam tento tracker by bolo za trest.
      Ohľadom realtime audia a DSP processingu, tak na všetko toto je WebAudio pripravené a schopné generovaný signál modulovať efektovými filtrami: https://goo.gl/Vrt66K ... keď si človek prejde to API, tak možnosti do budúcnosti sú šialené ;)

      Odstrániť
    8. Mne sa Webaplikacie celkom pacia. A v zivote som nevidel ziaden tak vymakany PSG tracker na webe... Je ich zopar ale su pomale. U mna mas velke plus. Idem to postnut na Chipmusic.Org...

      Odstrániť
  2. Doufám, že do budoucna bude méně takových románů a více funkčního SW.

    OdpovedaťOdstrániť
    Odpovede
    1. k tej narážke na dĺžku článku: veď preto ten TL;DR na začiatku ;))

      Odstrániť
    2. Nejde mi o délku článku, špíše o důvody, proč bylo o čem psát. Článek je poutavý, ale cesta k funkčnímu programu je nějaká moc dlouhá.

      Odstrániť
  3. šmánkote ... to bych nečekal, že dva ze tří prvních komentů budou hejty. Smutná doba.
    Martine, nevšímej si toho. Tvořit je dobré a důležité. A že alfa verze nemusí všude dělat to, co bylo zamýšleno se dá očekávat (v Safari 6.2.8 tato verze nejede, ve FF problém není) - od toho je to alfa-verze open-soure projektu. Palec hore od jiného anonyma ;-)

    OdpovedaťOdstrániť
    Odpovede
    1. díki moc za pozitívne slová! Aha, takže ani v Safari 6.2 to nenabehne? Nemám to ako otestovať, takže som iba porovnával tabuľky kompatibility potrebných featur a štandardov a vyšlo mi, že už 6.2ka by to mohla zvládať... tak teraz neviem, či sa mi niekedy podarí dostať k Macu, aby som odtrasoval na čom to spadne, ale asi rovno v článku upravím kompatibilitu na "Safari: 7+", ktoré vyšlo už pred 2 rokmi, tak jakýpakcopak :)

      Odstrániť
    2. Safari (6.2.8) ihned po načtení stránky hlásí:

      Failed to load resource: the server responded with a status of 404 (Not Found) ... http://saa1099tracker.borik.net/js/jquery.min.map

      [Error] TypeError: Argument 1 ('callback') to DOMWindow.requestAnimationFrame must be a function
      requestAnimationFrame (Commons.min.js, line 22)
      loop (Commons.min.js, line 22)

      ... a potom při pohybu přes prostředí trackeru vyhazuje další chyby, což ale může být důsledek těch prvních.
      Načíst demo lze (jednou), přehrát už ne.

      Odstrániť
  4. Gratuluju a několik palců hore dávám: za JS, za TS, za emulaci s WebAudiem,...

    OdpovedaťOdstrániť
  5. Bez nátlaku sa priznám, že ja som jeden z tých "windowsákov", ktorý bol mierne sklamaný z neexistencie windows verzie, pretože som veľmi, ale veeeeeľmi chcel oprášiť nejaké moje staré motívy a pretvoriť ich (alebo sa aspoň posnažiť) do SAA formátu. Alpha verziu som okoštoval, čo-to som ti oznámil, teším teda, kedy budem môcť plnohodnotne pracovať na tom :)

    OdpovedaťOdstrániť
  6. Ahoj Martin,

    GRATULUJEM !!! spravil si obrovsky kusisko prace !!! keby som tusil ako sa pise hudba v trackeri, tak Ti hned jednu napisem :)

    NoroSoft

    OdpovedaťOdstrániť
  7. Tak ako som sľúbil, trochu benchmarkovania. CPU je Core2 Solo U3500 @ 1.40GHz, Firefox verzia 39.0 a zaťaženie okolo 50% (najmenej 40, najviac 70). Naviac, ako pozerám, tak mám cpufreq governator "powersave", takže CPU beží na 800MHz. Spokojnosť :-)

    Tiež som to skúšal rozbehať na Raspberry Pi 1, ale nedarí sa. Nemôžem mať všetko :-)

    mike/zeroteam

    OdpovedaťOdstrániť
  8. Mne to konci na nekonecnom loadingu :( Konzola hlasi 404 na http://saa1099tracker.borik.net/js/jquery.min.map (vid https://dl.dropboxusercontent.com/u/20370200/Temp/saa1099-bug.png). Safari Version 9.0 (11601.1.56)

    OdpovedaťOdstrániť
    Odpovede
    1. Vďaka tebe a príspevku Anonymného vyššie sa mi podarilo nájsť problémové miesto, cez ktoré sa Safari nevedelo preniesť. Teraz by už mala prejsť inicializácia v poriadku. Ešte raz díky!

      Odstrániť
    2. Jakožto "Anonym vyššie" potvrzuji, že už to na tom Safari fičí :-) ... dobrá práce

      Odstrániť
    3. skvelé, teším sa, ešte vám opravím ten rozhodený infopanel s časom a frames ;)

      Odstrániť
  9. Verzia 1.1.3 je online!
    Pribudol plne funkčný Ornament editor, taktiež Sample editor bol značne vylepšený a prebehla optimalizácia emulácie SAA1099 a je teraz menej náročná na pamäť.

    OdpovedaťOdstrániť
  10. Skvělá práce, díky..rád to vyzkouším i když s trackery to zatím moc neumím.

    OdpovedaťOdstrániť
  11. Neodpustím si to nekro, ale fakt úžasnej počin - klobouk dolů!

    OdpovedaťOdstrániť