Ez mellékprojekt. Nem szolgáltatás, nem szerepel az árlistán, és filmzenét sem vállalok vele. Prototípus, amely a stúdió egyetlen gépén fut. A csak böngészőben futó fele Musiccer néven nyilvános a Labs oldalon; a modellekre épülő fele nem. Azért írok róla, mert építés közben olyasmit tanultam a helyi modellekről, ami a fizetős munkámban is hasznomra válik.
Ami nem hagyott nyugodni: egy építészeti filmet megvágnak, színkorrigálnak, jóváhagynak, és ekkor kell hozzá harminc–kilencven másodpercnyi zene. Zenei stockkönyvtár – projektenként fizetni kell érte, aztán elmegy egy délután azzal, hogy az ember sorra elveti ugyanazt a hat „corporate-uplifting” számot, amelyet mindenki más is használ. Zeneszerző – nagy filmhez ő a jó választás, egy előcsarnokban szóló loophoz viszont túlzás. Állandó bosszúság, hogy melyik licenc melyik felhasználásra érvényes. Pontosan az a fajta probléma, amit egy vasárnap elkezdek piszkálgatni.
Képmodelleket már most is a saját hardveremen futtatok (a teljes utómunka-pipeline-t), legalább annyira a titoktartás, mint a költségek miatt. A hangnál kiderült, hogy ugyanaz a feladat, csak más köntösben: egy maréknyi nyílt modell, mindegyik saját Python-környezettel és saját elképzeléssel arról, mi számít fájlnak, köztük pedig rengeteg hálátlan bekötési munka. Ez a bekötés maga a munka. A képeknél is az volt.
Egy Flask-szerver egy porton, kilenc statikus oldal, minden modell egy kis HTTP API mögött. Nincs buildlépés, nincs npm, nincs adatbázis. A generált fájlok az output/ mappába kerülnek, minden feladat saját könyvtárba.
- Szimbolikus hangszerelés. A SymphonyGen – ütemre kvantált harmóniavázzal kondicionált hierarchikus modell, amelyet elfogadtak az ISMIR 2026 konferenciára – zenekari MIDI-t ír a nulláról vagy egy akkordmenetből kiindulva. Három kiadott checkpointja van, futásonként legfeljebb négy változatot ad.
- Szövegből MIDI. Az AMAAI Lab text2midi modellje szöveges leírásból készít MIDI-vázlatot.
- Folytatás és kíséret. A Stanfordon fejlesztett Anticipatory Music Transformer vagy ott folytatja a komponálást, ahol a MIDI-fájl véget ér, vagy dallamként kezeli azt, és szólamokat ír köré.
- Audió. Az ACE-Step 1.5 helyi alfolyamatként fut: promptból valódi hanganyagot készít, megadott BPM-mel és hangnemmel.
- Elemzés, a másik irányba. A Basic Pitch hanganyagból MIDI-t ír át, a Demucs négy sávra (stemre) bontja a számot, a Matchering pedig egy referenciafelvételhez igazítva masterel egy mixet.
- Hang. Egyetlen szoftveres szintetizátor az egész alkalmazáshoz: js-synthesizer 1.13.0 és libfluidsynth 2.4.6 WebAssemblyben, ugyanazzal a GeneralUser GS soundfonttal, amellyel a szerveroldali FluidSynth renderel. Tizenhat MIDI-csatorna, egy sztereó kimenet, ezért a sávonkénti hangerőt és panorámát a CC7 és a CC10 szabályozza, nem pedig egy gain node, amely itt nem is létezhetne.
Két dolog nem a gépen fut: a GrooVAE első használatkor a Google CDN-jéről tölti le a dobos checkpointjait, az eszközoldalak pedig CDN-ről töltik be a MIDI-lejátszó könyvtárukat.
A kezdőlap egy vázlatfüzet: akkordmenet-szerkesztő, dallamsáv, dobrács, hatvankét skála, kadenciák jelölése, reharmonizációs javaslatok, negatív harmóniás tükrözés, dalszövegsáv, Web MIDI be- és kimenet.
A dobsáv külön oldalt kapott: hangszerenként euklideszi lépésszerkesztő, a minta gyűrűkként megrajzolva, és két gomb, amely átadja az ütemet a GrooVAE-nek, hogy humanizálja vagy újrajátssza.
Ehhez kapcsolódik az a rész, amire senkinek sem volt szüksége: egy világtérkép. Skálák, dobminták és ütemmutatók a származási helyükre tűzve, valamint ötvenöt hagyományos dal negyvenhat országból és régióból, mindegyik betölthető a vázlatfüzetbe. Eredetileg arra szolgált, hogy egy ismeretlen skála mondjon is valamit. Megtartottam, mert tetszett.
Innen az anyag a dalszerkesztőbe kerül: canvasra rajzolt idővonal MIDI- és audiosávokkal, mozgatható, rövidíthető, kettévágható és loopolható klipekkel, klipenkénti hullámformával, metronómmal, beszámolással, mentéssel és visszavonással. A transzport egész tickekben számol, negyedhangonként 480-nal; egy 25 ms-onként futó ütemező tölti fel a 150 ms-os előretekintési ablakot – ez a bevett, két időforrásra épülő megoldás, és ettől nem okoz gondot a lejátszás közbeni szerkesztés.
Ugyanez az oldal ugyanarra az adatmodellre egy második nézetet is kínál: egy session-rácsot, amelyet egy az egyben az Abletontól vettem át, ahelyett hogy újra feltaláltam volna. Sávonként egyszerre egy klip szól, az indítás ütemre vagy negyedre kvantált, a jelenetek a sorok, és egy QWERTY-billentyűrács négy jelenetet és nyolc sávot fed le. Bounce-oláskor a szerver FluidSynth-tel rendereli a MIDI-sávokat, ezeket egy OfflineAudioContext-ben összekeveri az audioklipekkel, és a kész mixet visszateszi az output/ mappába.
Az egyetlen tervezési döntés, amelyet vitában is megvédenék, épp a legkevésbé ötletes. Minden előállító egy feladatkönyvtárat hoz létre egy kis manifest.json fájllal: mi készítette, mikor, melyik szülőfeladatból, és minden egyéb ismert metaadat, például a BPM és a hangnem. Minden fogyasztó az output/ mappához viszonyított útvonalat fogad el, feltöltés helyett. Ennyi az egész átjárhatósági réteg. A fájlok szolgálnak IPC-ként. Nincs adatbázis, nincs sémaregiszter.
Szinte ingyen rengeteget ad. Egy választólista a legutóbbi feladatokat a származási láncukkal együtt mutatja, így a „sávok ← dal ← vázlat” egy pillantással átlátható. Minden eredményhez tartozik egy „Küldés ide” menü, amelynek minden célpontja egyetlen sor egy útválasztási táblában. Egy BroadcastChannel révén az egyik fülön elkészült eredmény jelzi magát a többi fülnek.
Prototípus, és az eszközök közötti átadás még mindig a gyenge pontja.
A legutóbbi fejlesztési kört meghatározó tervezési jegyzet a hibák számbavételével kezdődött: öt, egymással nem kompatibilis hangjegyformátum volt használatban, minden átadás egyirányú volt, a vázlatfüzetből kifelé, és három eszköz zsákutcának bizonyult – a doboldal egyáltalán nem használta a szervert, a generált hanganyag soha nem került a közös mappába, a hangszerelő változatai pedig nem jutottak tovább sehová. Ez a három hiba mára megoldódott. Ami a helyükre került, az nem kész rendszer, hanem egy konvenció, amelyet jelenleg minden komponens betart.
A befejezetlen részek konkrétan: a vázlatfüzetben még mindig külön példány van az időzítő kódból. A dalszerkesztő klipeket szerkeszt, nem hangjegyeket – nincs piano roll nézet. Az audió a lejátszási sebesség változtatásával követi a tempót, ami a hangmagasságot is megváltoztatja; a valódi time-stretchinghez új függőség kellene, és eddig senkinek sem hiányzott annyira, hogy felvegye. Tizenöt dallamsáv fölött a sávok már közös MIDI-csatornán osztoznak, mert egy szintetizátornak tizenhat csatornája van. A harmóniavázat a rendszer szó nélkül harminckét ütemre ismétli vagy vágja. Egyszerre csak egy nehéz feladat futhat, mert egy GPU van és egy zár. Ha a fül háttérbe kerül, a böngésző annyira lefojtja az ütemezőt, hogy a lejátszás elakad.
Mindez nem ledolgozásra váró hibalista. Ezek tudatosan vállalt plafonok, hogy valami működőképes legyen, és mindegyik ott van leírva annál a kódrészletnél, amely előidézi. Lejátszik, generál, az átadás oda-vissza működik, és még nagyon messze van attól, hogy termék legyen.
Semmi nem került belőle ügyfélnek átadott filmbe. Lehet, hogy soha nem is fog. Az AI-jal komponált zene szerepel az árlistán, de az a produkciós pipeline zenei motorjaiból érkezik, ugyanazon a közös renderfelületen keresztül, mint minden más, amit átadok – nem ebből a műhelyből. Amit helyette kaptam: sokkal pontosabb képet arról, hová jutottak a helyben futó hangmodellek, hol véreznek még el, és hogy az „AI-eszközök” mekkora része valójában fájlkezelés. Nagyjából ugyanerre jutottam a képeknél is.
Ha ön is épít ilyesmit esténként, írjon egy sort.