[{"data":1,"prerenderedAt":42},["ShallowReactive",2],{"project-omx-panel-":3},{"page":4,"others":20},{"slug":5,"src":6,"title":7,"source":8,"toc":9,"html":19},"","README.md","omx-panel","https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-panel\u002Fblob\u002Fedaf4f48de7e57496ead1b949f754b7e111867e3\u002FREADME.md",[10,13,16],{"id":11,"title":12},"what-is-here","What is here",{"id":14,"title":15},"install","Install",{"id":17,"title":18},"for-a-plugin-author","For a plugin author","\u003Ch1 id=\"omx-panel\">omx-panel\u003C\u002Fh1>\n\u003Cp>Panels for audio plugins, generated from what the plugin declares. Give any LV2 or CLAP plugin a panel\nwithout drawing one: a MOD GUI for MOD and Zynthian, pages for a controller, a layout for a host, all from\nthe plugin's own declaration, in the omx look, vintage or modern.\u003C\u002Fp>\n\u003Ch2 id=\"what-is-here\">What is here\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>The layout: \u003Ccode>tools\u002Fpanel-description.mjs\u003C\u002Fcode> lays out a panel from a plugin's descriptor (sections, controls, roles,\nthe family, the pages of eight a controller shows), under the plugin's declared panel when it has one\n(\u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Fpanel-layout\">docs\u002Fpanel-layout.md\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The MOD GUI generator: \u003Ccode>omx-panel modgui\u003C\u002Fcode> writes a plugin's MOD GUI from its descriptor, its images rasterised\nbyte for byte, in the omx look (\u003Ccode>tools\u002Flook\u002Ftokens.css\u003C\u002Fcode>) (\u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Fmodgui\">docs\u002Fmodgui.md\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The sync: \u003Ccode>omx-modgui-sync\u003C\u002Fcode> gives a generated MOD GUI to every installed LV2 plugin that ships none, into\n\u003Ccode>\u002Fusr\u002Flocal\u002Flib\u002Flv2\u003C\u002Fcode> (\u003Ccode>~\u002F.lv2\u003C\u002Fcode> for a user), one bundle per plugin, never touching a bundle that is not its own.\nThe systemd unit is installed, not enabled: \u003Ccode>systemctl enable omx-modgui-sync\u003C\u002Fcode> makes it run after each\n\u003Ccode>plugin-qualify-sync\u003C\u002Fcode> (a drop-in on that unit queues it when a scan finishes, only if enabled). \u003Ccode>omx-modgui-sync --check\u003C\u002Fcode> says whether MOD-UI reads the folder. A plugin that cannot get a GUI never\nfails the run; \u003Ccode>omx-modgui-sync(1)\u003C\u002Fcode> has the directories, the exit status and the summary.\u003C\u002Fli>\n\u003Cli>The group inference: \u003Ccode>tools\u002Fgroup-infer.mjs\u003C\u002Fcode> finds the port groups an LV2 plugin lacks from what it states (its own\npartial groups, designations, name and symbol prefixes, units, index runs, its MOD GUI), or says it cannot with\nconfidence and leaves the plugin as it is (\u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Fgroup-inference\">docs\u002Fgroup-inference.md\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The complement: \u003Ccode>omx-complement-sync\u003C\u002Fcode> (\u003Ccode>omx-panel complement\u003C\u002Fcode>) carries those groups to lilv, for jalv on the Zynthian\ntouchscreen: for an installed bundle with a plugin to group it writes, beside omx-modgui-sync's GUIs, a bundle that\nrestates the installed TTL, adds the groups and raises \u003Ccode>lv2:microVersion\u003C\u002Fcode> by one, so lilv loads it in place of the\ninstalled one. The installed files are never touched; a marker makes a second run write nothing, a run removes the\nbundles of its own no longer wanted (the installed bundle gone, changed or needing no groups now), and deleting the\nbundle restores the plugin as installed (\u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Flv2-complement\">docs\u002Flv2-complement.md\u003C\u002Fa>, \u003Ccode>omx-complement-sync(1)\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>The skin package: its schema, \u003Ccode>omx-panel validate\u003C\u002Fcode>, and its facts as a module (\u003Ccode>src\u002Fskin-package.ts\u003C\u002Fcode>: the\ndirectory name, the override and how it applies, the licence allow-list, the refusal codes)\n(\u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Fskin-package\">docs\u002Fskin-package.md\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The importer: \u003Ccode>omx-panel import\u003C\u002Fcode> turns a MOD GUI bundle into a skin package.\u003C\u002Fli>\n\u003Cli>The widgets a panel names (\u003Ccode>schema\u002Fpanel.schema.json\u003C\u002Fcode>): knob, fader, switch, selector.\u003C\u002Fli>\n\u003Cli>A worked example: a third-party LV2 plugin (ZamComp) and CLAP plugin (LSP Limiter Mono) from the scan to a\ngenerated panel, and where Zynthian reads the LV2 one (\u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Fworked-example\">docs\u002Fworked-example.md\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"install\">Install\u003C\u002Fh2>\n\u003Cp>\u003Ccode>omx-panel\u003C\u002Fcode> comes as an RPM and a DEB, each carrying the tools, the schema and the skins directory, and as\n\u003Ccode>@openmixer\u002Fomx-panel\u003C\u002Fcode> on npm (\u003Ccode>npm install @openmixer\u002Fomx-panel\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>Fedora 44, x86_64 or aarch64:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>sudo dnf install https:\u002F\u002Fwww.openmixer.org\u002Frpm\u002Fopenmixer-release.noarch.rpm\nsudo dnf install omx-panel\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Debian bookworm and trixie, amd64 or arm64 (also Raspberry Pi OS and Zynthian):\u003C\u002Fp>\n\u003Cpre>\u003Ccode>curl -fsSLO https:\u002F\u002Fwww.openmixer.org\u002Fdeb\u002Fopenmixer-release.deb &amp;&amp; sudo apt install .\u002Fopenmixer-release.deb\nsudo apt install omx-panel\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>To build from source, see \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-panel\u002Fblob\u002Fedaf4f48de7e57496ead1b949f754b7e111867e3\u002FBUILDING.md\">BUILDING.md\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"for-a-plugin-author\">For a plugin author\u003C\u002Fh2>\n\u003Cp>A skin package is a directory named after the plugin, holding a \u003Ccode>skin.json\u003C\u002Fcode> that says how the plugin's panel is\ndrawn: its sections, labels and displays, the art it brings, and the licence of everything in it. The plugin's\nown description keeps every range, unit and scale; the skin refers to controls by id. The format is described\nin \u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Fskin-package\">docs\u002Fskin-package.md\u003C\u002Fa>; \u003Ccode>omx-panel validate\u003C\u002Fcode> checks a package before it is installed.\u003C\u002Fp>\n\u003Cp>A plugin with no MOD GUI gets one from its descriptor: \u003Ccode>omx-panel modgui --descriptor &lt;file&gt; --out &lt;bundle.lv2&gt;\u003C\u002Fcode>\nwrites \u003Ccode>modgui.ttl\u003C\u002Fcode> and \u003Ccode>modgui\u002F\u003C\u002Fcode> into the bundle, every control drawn with its own travel and default.\n\u003Ccode>omx-panel descriptors --installed\u003C\u002Fcode> lists the installed descriptor files, one path per line.\u003C\u002Fp>\n\u003Cp>A plugin that already ships a MOD GUI does not start from nothing: the importer reads the bundle's \u003Ccode>modgui.ttl\u003C\u002Fcode> and the plugin's licence and writes a skin package from them, one\nsection in port order, the labels from the port names and the screenshot as the backdrop. A bundle whose licence\nis missing or not on the allow-list is refused with a named code and nothing is written.\u003C\u002Fp>\n\u003Cp>Licence: GPL-3.0-or-later (\u003Ccode>LICENSE\u003C\u002Fcode>).\u003C\u002Fp>\n",[21,24,27,30,33,36,39],{"slug":22,"title":23},"compare","Compare A\u002FB\u002FC\u002FD and undo",{"slug":25,"title":26},"group-inference","Port-group inference for LV2 plugins",{"slug":28,"title":29},"lv2-complement","The LV2 complement: a replacing bundle with the inferred port groups",{"slug":31,"title":32},"modgui","The MOD GUI generator",{"slug":34,"title":35},"panel-layout","Panel layout from a descriptor",{"slug":37,"title":38},"skin-package","The skin package",{"slug":40,"title":41},"worked-example","Worked example: a third-party LV2 and CLAP plugin to a generated panel, adapted to Zynthian",1793954996013]