Zynthian
Zynthian: plugin-hostd com a amfitrió de plugins.
Com instal·lar-lo, com fer-lo servir, què canvia a Zynthian i on és. El mètode i totes les taules són a les notes tècniques enllaçades al final.
01
Què és.
Zynthian és una plataforma oberta de sintetitzadors i efectes en una Raspberry Pi. Fa córrer plugins LV2 amb els seus propis motors: mod-host, darrere de MOD-UI, que fa córrer les cadenes d'efectes; i jalv, que fa córrer un plugin per procés. plugin-hostd parla el protocol de mod-host i fa córrer cada plugin, LV2 o CLAP, en un procés worker, de manera que un plugin que falla només s'endú el seu worker, que es torna a posar amb els seus valors. Una cadena sencera pot córrer en un sol worker en lloc d'un procés per plugin i plugin-qualify mesura cada plugin a l'aparell abans, de manera que els menús es fan a partir del que ha trobat.
Amb ell Zynthian té un motor plugin-hostd al costat de jalv per a plugins LV2 i CLAP en cadenes, plugin-hostd com a substitut commutable de mod-host darrere de MOD-UI, menús de plugins ordenats i etiquetats a partir dels registres de qualificació de cada plugin i cadenes els plugins de les quals el dimoni agrupa en tan pocs workers com permeten les seves empremtes.
02
Quant canvia Zynthian.
Res de Zynthian no en depèn. Continua amb jackd: no canvia cap fitxer de configuració de JACK i no hi intervé PipeWire. Tal com s'ofereix a Zynthian, el motor plugin-hostd queda desactivat fins que un usuari l'activa i MOD-UI conserva mod-host fins que un usuari en canvia el motor; tornar enrere és el mateix paràmetre.
Els forks de zynthian-ui i zynthian-sys de FreeMixer el tenen activat: plugin-hostd és el motor de plugins per defecte, en lloc de jalv; i el motor per defecte de MOD-UI, en lloc de mod-host i la sincronització de qualificació està activada. Un plugin que plugin-hostd refusa es queda a jalv, llistat al seu menú, de manera que no desapareix res del que té l'usuari.
Què corre quan ningú no el fa servir: la interfície només engega un dimoni quan una cadena té un plugin de plugin-hostd. El que queda activat és la sincronització de qualificació, dos minuts després d'arrencar amb la prioritat de CPU i de disc més baixa, que se salta cada plugin els fitxers del qual no han canviat i les sincronitzacions de MOD GUI i de complements d'omx-panel. Totes es poden desactivar; la primera sincronització en un aparell amb molts plugins és llarga.
03
Instal·lar-lo.
La imatge
ZynthianOS Vangelis per a la Raspberry Pi 4 i 5, amb els forks de zynthian-ui i zynthian-sys, el repositori apt d'OpenMixer i plugin-hostd, omx-clap-host, omx-plugins, omx-panel i plugin-qualify instal·lats i per defecte. Es construeix a partir de la imatge Vangelis publicada pel projecte original amb els passos d'actualització del mateix fork, tal com descriu el docs/openmixer-image.md del fork; serà una versió del fork de zynthian-sys de FreeMixer, en parts amb els seus resums. Encara no s'ha publicat: mentrestant, instal·leu els paquets en un Vangelis que ja tingueu en marxa, com s'explica a continuació.
La primera arrencada fa el que fa una vegada qualsevol targeta de Zynthian: detecta el kit, torna a generar les claus SSH i el certificat web, crea el punt d'accés Wi-Fi, fa créixer el sistema de fitxers fins a omplir la targeta i reinicia una vegada. Dos minuts després d'arrencar, la sincronització de qualificació comença en segon pla, amb la prioritat més baixa i no retarda l'arrencada; amb el paquet de registres de qualificació instal·lat, només comprova que els fitxers dels plugins són els que descriuen els registres.
En un Vangelis que ja funciona
Un sistema Vangelis que ja funciona no necessita cap imatge nova. Com a root, afegiu el repositori d'OpenMixer i instal·leu-ne els paquets:
curl -fsSLO https://www.openmixer.org/deb/openmixer-release.deb
sudo apt install ./openmixer-release.deb
sudo apt install plugin-hostd omx-clap-host omx-clap-scan omx-panel
openmixer-release porta la clau de signatura i la font apt de la versió de Debian en marxa. No activa cap servei: mod-host, MOD-UI, jalv i els menús es queden com estaven fins que els canvieu.
Activar-lo i desactivar-lo
Tres paràmetres; cadascun es desfà tornant-lo al valor d'abans:
# the plugin engine: in /zynthian/config/zynthian_envars.sh, then restart the UI
ZYNTHIAN_PLUGIN_ENGINE=plugin-hostd
# MOD-UI's backend
set_modhost_backend.sh plugin-hostd
# plugins in series sharing one worker: in /zynthian/config/plugin-hostd.conf
grouping on
04
Fer-lo servir.
Amb el motor plugin-hostd activat, l'entrada d'un plugin al menú acaba en "(PH)". Seleccioneu una cadena, obriu-ne les opcions i feu servir Add Audio-FX processor; les pàgines de controls del plugin segueixen les seves pròpies seccions.
Un grup: plugins en sèrie en un sol worker
Amb l'agrupació activada, una tirada de plugins en sèrie dins d'una cadena comparteix un sol procés worker i un sol client JACK en lloc d'un procés cadascun. Un grup és el que la cadena té en sèrie sense res entremig: un espai en paral·lel, el canal del mesclador o un plugin de jalv l'acaba. Un processador que corre sol té una entrada Grouping a les seves opcions que en diu el motiu.
L'agrupació està desactivada si no l'activeu. Estalvia la major part de la memòria d'un procés per plugin: 24 plugins en una cadena ocupen uns 64 MB, contra uns 110 MB amb mod-host.
Un canal fet de plugins
L'EQ i la dinàmica de cada cadena són efectes normals d'aquella cadena; el mesclador de Zynthian conserva el nivell, el pan i els envíos. O bé afegiu plugins separats (omx keyed-gate, omx eq8, omx comp: trieu cadascun i el seu ordre i eq8 té vuit bandes) o bé un sol plugin, omx strip: guany d'entrada, filtres, una gate, quatre bandes d'EQ i un compressor en estèreo, en una sola càrrega i un sol worker, amb les seves cinc etapes en qualsevol ordre.
A 48 kHz i 512 mostres, omx strip costa uns 5,9 µs per bloc; omx eq8 i omx comp junts uns 11,4 µs, amb vuit bandes d'EQ contra quatre.
Efectes compartits en un Mixbus
Un efecte en un bus en lloc d'un per cadena, alimentat des de cada cadena amb els envíos del mateix Zynthian:
- Afegiu una cadena i trieu Mixbus. A les seves opcions, Add Audio-FX processor: omx reverb i després omx delay, tots dos "(PH)".
- A cada cadena que l'hagi d'alimentar, obriu la pàgina de controls del processador del mesclador i pugeu el nivell d'envío d'aquell Mixbus, abans o després del fader.
Un plugin de plugin-hostd es comporta en un Mixbus com en qualsevol cadena. Un espai té un processador o diversos i si en té diversos són en paral·lel; un worker fa córrer els seus plugins en sèrie en un sol client JACK, de manera que, amb l'agrupació activada:
| Espais de la cadena | Què corre |
|---|---|
| A, B | A i B en un sol worker, un client JACK |
| A, [B, C] | un worker cadascun: B i C són en paral·lel, tres clients |
| A, B, [C, D], E, F | A amb B, un worker cadascun per a C i D, E amb F: quatre clients |
| A, canal del mesclador, B | un worker cadascun: el canal és al camí del senyal |
| A, un plugin de jalv, B | un worker cadascun i el client propi del plugin de jalv |
Els nivells d'envío, abans i després del fader i fixar o moure un Mixbus són cosa del mesclador i del gestor de cadenes de Zynthian: cap no envia res al dimoni. Mesurades als ports de JACK, les cadenes en sèrie, en paral·lel i de Mixbus donen els nivells que toca: guany unitari en sèrie, +6,02 dB per a dos en paral·lel, els -20 dB del canal allà on és.




05
Instruments: veus repartides entre els nuclis.
Per què
Una Pi 5 té quatre nuclis. Un sintetitzador toca moltes veus alhora; i cada bloc d'àudio té una data límit: totes les veus s'han de calcular abans que toqui. Si es calculen una darrere l'altra, fan servir un sol nucli. Aquest nucli decideix quantes notes podeu tocar, per desocupats que estiguin els altres tres.
Alguns sintetitzadors reparteixen les veus en tasques i demanen a l'amfitrió que les executi (l'extensió thread-pool de CLAP). Unes tasques així poden córrer en paral·lel, si l'amfitrió ho permet.
Com funciona
omx-clap-host posa en marxa fils auxiliars: un per cada nucli que el worker del plugin pot fer servir, menys un, perquè el fil d'àudio ocupa l'últim nucli. Cada fil auxiliar queda fixat al seu nucli, corre amb la prioritat de temps real del fil d'àudio i dorm entre bloc i bloc.
Quan el plugin demana les tasques, els fils auxiliars i el fil d'àudio les agafen una a una; i la crida torna quan s'ha acabat l'última. Si no es pot fixar la prioritat, no hi ha fils auxiliars i les tasques corren com abans, per torn.
Qui en té
No tots els plugins. Els fils auxiliars es donen plugin per plugin, mai a tot arreu. Un plugin només en té si la seva qualificació l'ha trobat segur per a temps real (amb els fils auxiliars també vigilats) i més ràpid amb ells. Una tasca que reserva memòria o espera un bloqueig faria que tots els nuclis arribessin tard.
Qualsevol altre plugin corre com abans: les seves tasques una darrere l'altra al fil d'àudio. Un plugin que té fils auxiliars corre en un worker propi, que plugin-hostd posa en marxa amb el pool activat.
Com activar-ho o desactivar-ho
És una opció d'omx-clap-host:
# omx-clap-host: helper threads for the plugins that split their voices into tasks
omx-clap-host --thread-pool=qualified # the default
omx-clap-host --thread-pool=on
omx-clap-host --thread-pool=off
- qualified (per defecte): només tenen fils auxiliars els plugins que la qualificació hi autoritza. plugin-hostd dona a cada worker el valor adequat, així que a Zynthian no cal que l'indiqueu.
- on: tots els plugins que fan servir l'extensió tenen fils auxiliars.
- off: tots els plugins executen les tasques per torn.
Què en resulta
Mesurat en una Raspberry Pi 5 a 48 kHz i 256 mostres, així que el bloc toca en 5333 µs. El plugin és un plugin de prova que reparteix cada bloc en 16 tasques, perquè cap plugin de la Pi demana tasques encara, Surge XT inclòs. El temps és el cost mitjà d'un bloc, amb els fils auxiliars desactivats i activats:
| Veus per tasca | Desactivats (µs) | Activats (µs) | Més ràpid per |
|---|---|---|---|
| 8 | 527.9 | 155.9 | 3.4x |
| 24 | 1583.4 | 418.7 | 3.8x |
| 48 | 3335.5 | 857.9 | 3.9x |
A 512 mostres, la càrrega de 48 veus ocupa 6,6 ms del bloc de 10,7 ms amb els fils auxiliars desactivats i 1,7 ms amb ells activats. Cap bloc va passar de la data límit en cap prova.
És el millor cas: tasques iguals que no comparteixen res. No s'ha mesurat un instrument real amb això, així que no hi ha cap xifra de Surge XT. Surge XT no reparteix les veus en tasques; per a ell els nuclis vénen de fer córrer cada instrument en un worker propi: quatre instàncies amb 16 notes cadascuna van treballar al 14-15 % d'un nucli cadascuna.
06
Les xifres principals.
Mesurat en una Raspberry Pi 5 amb Zynthian, amb una RME Babyface Pro com a interfície d'àudio i JACK amb prioritat de temps real 70 i 3 períodes, el paràmetre del mateix Zynthian. Llegit digitalment al servidor JACK i als seus ports. plugin-hostd 0.18.0 i omx-clap-host 0.29.0 contra mod-host 0.10.9, l'amfitrió de les cadenes d'efectes de Zynthian i de MOD-UI, a més de jalv 1.6.9, que fa córrer un plugin per procés:
- Càrrega DSP a 48 kHz, 16 plugins (omx comp, delay i drive): una cadena de plugin-hostd un 6,75 % a 128 mostres, contra el 9,36 % d'omx-clap-host, el 8,86 % de mod-host i l'11,40 % de jalv; a 256 mostres un 6,38 % contra el 7,75, el 7,38 i el 8,49 %. 0 xruns per a la cadena a cada repetició.
- A 96 kHz la càrrega és més o menys el doble que a 48 kHz a tots els amfitrions i l'ordre es manté: els mateixos 16 plugins a 256 mostres, un 12,64 % en una cadena contra el 15,43 % d'omx-clap-host, el 14,60 % de mod-host (8 xruns) i el 18,16 % de jalv (52 xruns). A 96 kHz tornen els xruns on a 48 kHz no n'hi havia, menys que enlloc a la cadena.
- Memòria: 55 MB per a aquests 16 plugins en una cadena, contra 53 MB d'omx-clap-host, 99 MB de mod-host i 690 MB dels 16 processos de jalv.
- Temps per afegir 16 plugins un per un, amb l'amfitrió en marxa: 80 ms dins d'una cadena de plugin-hostd, contra 364 ms de mod-host, 397 ms d'omx-clap-host i 13,8 s de jalv.
- Instruments: Pianoteq 9 costa entre un 13,4 i un 14,7 % a tots els amfitrions a 48 kHz i 256 mostres, perquè la feina la fan els seus propis fils; ocupa 250 MB amb plugin-hostd, 288 MB amb mod-host i 279 MB amb jalv.
- El límit: a 48 kHz, 64 mostres tenen xruns a tots els amfitrions fins i tot sense cap plugin carregat, de manera que és el límit de l'aparell i no d'un amfitrió. A 96 kHz, 128 mostres corren sense xruns a omx-clap-host, plugin-hostd i mod-host sense cap plugin (jalv no té amfitrió sense plugin); a més, val la pena mantenir el tercer període: amb 2, els conjunts més pesats donen més càrrega a omx-clap-host i a mod-host.
- Qualificació, de l'execució anterior que diu el peu (plugin-qualify 0.18.5): dels 1602 plugins provats a l'aparell, 1079 corren en un worker compartit i 306 en un worker propi. Una execució nova amb plugin-qualify 0.19.0 substituirà aquestes xifres.
Totes les taules i el mètodeEls bancs de proves, fila per fila
Raspberry Pi 5 amb Zynthian, RME Babyface Pro · JACK prioritat 70, 3 períodes · 48 i 96 kHz, 128 i 256 mostres · llegit digitalment al servidor JACK i als ports · plugin-hostd 0.18.0 (protocol 0.3.0), omx-clap-host 0.29.0, omx-plugins 0.18.0, mod-host 0.10.9, jalv 1.6.9 · 5 de novembre del 2026 · qualificació: plugin-qualify 0.18.5, registres omx-qualification-rpi5-zynthian-vangelis 2026110101, 1 de novembre del 2026
07
On és.
Demostrat a l'aparell
- El motor plugin-hostd fa córrer cadenes de Zynthian, LV2 i CLAP colze a colze, amb els menús de plugins fets a partir dels registres de qualificació.
- Les pàgines de controls segueixen les seccions del mateix plugin i porten el nom del que contenen.
- Els instruments i els efectes sonen a través del motor plugin-hostd, llegits digitalment als ports de JACK amb 0 xruns.
- Presets, amb plugin-hostd 0.18.0 i omx-clap-host 0.29.0: omx eq8 (CLAP) i mda Piano (LV2) llisten els seus presets, els carreguen amb els seus valors i en desen un que es torna a carregar; Odin 2 (sense fixacions) i la versió LV2 de Surge XT llisten, carreguen i desen; la versió CLAP de Surge XT llista i carrega els presets de fàbrica.
- L'agrupació a través del motor plugin-hostd de zynthian-ui supera la seva prova: una tirada en sèrie s'agrupa en un sol client i un espai en paral·lel, el canal o un altre client l'acaben.
- Un worker perdut torna: després de matar un worker, el dimoni el torna a posar amb els seus valors i els enllaços que ell mateix havia fet en uns 350 ms.
Publicat, per comprovar a l'aparell
- Cada crida a un plugin desa i comprova els registres que una funció ha de preservar; un plugin que en canvia un passa a un worker propi.
- Una cadena comparteix un sol client JACK per worker i un plugin mono corre dins d'una cadena estèreo.
- Els plugins s'afegeixen directament al worker d'una cadena, que és el que fa que una cadena es construeixi més de pressa que amb mod-host.
Encara obert
- Cadenes fetes des del menú de Zynthian amb l'agrupació activada, mesurades com es van mesurar les cadenes del dimoni.
- Una prova d'escolta a través de la interfície d'àudio: fins ara les xifres es llegeixen digitalment als ports de JACK.
- La versió CLAP de Surge XT: un preset que ha desat encara no es torna a carregar; a més, la seva carpeta de plugins no es pot fixar amb els paràmetres de fixació de Zynthian. Llistar i carregar els presets de cada instrument des del menú de Zynthian.
- L'anada i tornada d'una instantània que conté un instrument de plugin-hostd.
- Cadenes de Mixbus i espais en paral·lel mesurats amb el mesclador del mateix Zynthian al camí, a l'aparell.
El que ve, planificat
- MPE a les cadenes de plugin-hostd: avui Zynthian només prepara la seva zona MPE per a les cadenes de jalv.
- Un grup de barres a omx-panel: una tirada de controls amb el mateix rang, com els tiradors d'un orgue o les bandes d'un equalitzador gràfic, mostrada com una sola fila de barres a cada panell.
- Corbes i mesuradors a cada panell d'omx-panel: exactes per a la dinàmica i l'equalitzador d'omx, modelats a partir del que volen dir els controls per als altres plugins.
08
On són els canvis a Zynthian.
El motor i els canvis del sistema són als forks de zynthian-ui i zynthian-sys de FreeMixer. A zynthian-ui: el motor plugin-hostd i el seu client del protocol 0.3 de plugin-hostd, plugin-hostd per defecte amb un convertidor d'instantànies, menús a partir de la qualificació, cadenes a partir del planificador del dimoni. A zynthian-sys: el repositori d'OpenMixer, plugin-hostd com el mod-host de MOD-UI, MOD GUI generades per omx-panel, OpenMixer a la instal·lació per defecte. Les peticions d'integració acceptades i obertes són a cada fork.
Al projecte original, fins ara només s'ha proposat un canvi: construir l'entorn de MOD-UI amb Python 3.13, a zynthian-sys. La resta encara no s'ha proposat als responsables de Zynthian.
09
Per saber-ne més.
plugin-hostd en una Raspberry Pi 5
/notes/plugin-hostd-on-a-raspberry-pi-5
L'aparell, el mètode i totes les taules: quatre amfitrions a 48 i 96 kHz, 128 i 256 mostres, amb càrrega, temps d'addició, instruments, on va el temps d'una cadena.
Un worker per cadena o un procés per plugin
/notes/one-worker-per-chain-or-one-process-per-plugin
Què hi guanyes agrupant i què costa, l'allotjament CLAP, la qualificació i la compatibilitat amb mod-host.
Instruments en una Pi 5
/notes/instruments-on-a-pi-5
Per què les veus necessiten nuclis, què hi fa l'amfitrió i Surge XT mesurat.
D'un fitxer de plugin a una pàgina
/notes/from-a-plugin-file-to-a-page
Les cinc etapes d'un fitxer de plugin a una fila de menú, unes pàgines de controls i una MOD GUI.
Grups de ports inferits
/notes/why-lv2-plugins-on-zynthian-need-inferred-port-groups
Per què la majoria dels plugins LV2 d'un Zynthian necessiten grups de ports que no declaren i com els obtenen.