[{"data":1,"prerenderedAt":24},["ShallowReactive",2],{"project-omx-contract-":3},{"page":4,"others":23},{"slug":5,"src":6,"title":7,"source":8,"toc":9,"html":22},"","README.md","omx-contract","https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002FREADME.md",[10,13,16,19],{"id":11,"title":12},"install","Install",{"id":14,"title":15},"use","Use",{"id":17,"title":18},"building","Building",{"id":20,"title":21},"license","License","\u003Ch1 id=\"omx-contract\">omx-contract\u003C\u002Fh1>\n\u003Cp>The FreeMixer declarations as data: what a value may be (a travel, a default, a kernel constant, a list),\nwritten once as JSON, checked by a JSON Schema and rendered into the languages that read it. The mixer\nengine, the DSP library and the plugins all take their ranges, defaults and constants from the same\ndefinitions, so a knob means the same thing on the console, in a plugin and in a test.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>One declaration per value, validated against a closed schema. This package holds the schema, the one tool,\nand the facts no single package owns (\u003Ccode>data\u002F\u003C\u002Fcode>: the sample rates, the readout rate, the parameter scales, the measurement, resource and machine-class words, and the whole LV2 and CLAP vocabulary mapped, laid out by \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Fdata-layout.md\">docs\u002Fdata-layout.md\u003C\u002Fa>); a package that implements a definition ships its own file into the\ncontract directory (\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Fcontract-dir.md\">docs\u002Fcontract-dir.md\u003C\u002Fa>): omx-dsp its kernels and design constants,\nomx-clap-core its hosting limits.\u003C\u002Fli>\n\u003Cli>Renders for C (a header), TypeScript and resolved JSON, each held equal to the data by CI.\u003C\u002Fli>\n\u003Cli>Semantic versioning enforced by a check: a change that narrows a declaration needs a major bump, one that adds\nor widens needs a minor (\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Fkernel-files.md#what-semver-judges\">what the check judges\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"install\">Install\u003C\u002Fh2>\n\u003Cp>Fedora 44:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>sudo dnf install https:\u002F\u002Fwww.openmixer.org\u002Frpm\u002Fopenmixer-release.noarch.rpm\nsudo dnf install omx-contract-devel\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Debian bookworm and trixie (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 libomx-contract-dev\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The development package pulls in omx-contract-data, the files a program reads at run time (the contract directory,\nthe schema and the resolved json); a program that only reads them at run time requires omx-contract-data alone.\u003C\u002Fp>\n\u003Cp>JavaScript and TypeScript projects (the \u003Ccode>ts\u003C\u002Fcode> render is the main export, the CLI is \u003Ccode>omx-contract\u003C\u002Fcode>):\u003C\u002Fp>\n\u003Cpre>\u003Ccode>npm install @openmixer\u002Fomx-contract\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Every GitHub release also carries the \u003Ccode>npm pack\u003C\u002Fcode> tarball, the RPMs and the debs.\u003C\u002Fp>\n\u003Ch2 id=\"use\">Use\u003C\u002Fh2>\n\u003Cp>Include the C header and read the constants by name:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-c\">#include &lt;omxcontract\u002Fomx_contract_limits.h&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre>\u003Ccode>pkg-config --cflags omx-contract\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Pin one version and build against its renders instead of keeping a copy: the installed package at exactly\nthat version (\u003Ccode>pkg-config --exact-version=2.20.0 omx-contract\u003C\u002Fcode>), else the npm tarball, unpacked, and\n\u003Ccode>omx-contract render --target c --out build\u002Fomx-contract\u002Finclude\u003C\u002Fcode>. A kernel's controls and readouts, in their\norder, are in the json render of the contract directory (\u003Ccode>omx-contract render --target json --installed\u003C\u002Fcode>); how a declaration is written is in\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Fkernel-files.md\">docs\u002Fkernel-files.md\u003C\u002Fa>, and what a readout is in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Freadouts.md\">docs\u002Freadouts.md\u003C\u002Fa>. The hosting limits, the refusal codes and the \u003Ccode>clap_host_limits.h\u003C\u002Fcode> rendered from them are in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Fhosting.md\">docs\u002Fhosting.md\u003C\u002Fa>. How an owner's own header is spelled by a \u003Ccode>render\u003C\u002Fcode> word in its file is in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Frender.md\">docs\u002Frender.md\u003C\u002Fa>. The curve kinds a panel draws, the axes each is drawn on, and the frequency grid an EQ curve is sampled on are in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Fcurves.md\">docs\u002Fcurves.md\u003C\u002Fa>. How a package installs its own definitions into the contract directory, and how a reader reads them, is in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Fcontract-dir.md\">docs\u002Fcontract-dir.md\u003C\u002Fa>. How a plugin, ours or anyone's, is described in the same words (controls, ports, instruments, what it needs from a host) is in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002Fdocs\u002Fdescriptors.md\">docs\u002Fdescriptors.md\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"building\">Building\u003C\u002Fh2>\n\u003Cp>See \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-contract\u002Fblob\u002Fc241fd47a68d4de548a1cd415f967b211da6475e\u002FBUILDING.md\">BUILDING.md\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"license\">License\u003C\u002Fh2>\n\u003Cp>GPL-3.0-or-later. JSON cannot carry an SPDX comment; every data file is covered by \u003Ccode>LICENSE\u003C\u002Fcode>.\u003C\u002Fp>\n",[],1793954996555]