feat(codegen): P5 — TS emission targets manifold/src/modes/generated/

- generate.ts re-activates the TS emitters against manifold (types.ts,
  per-mode <id>_schema.ts, index.ts); 9 schemas emitted
- firmware-fit check: exactly 3 hidden layers (fixed 4-layer topology) and
  every dim within (0, 4096] (the browser kMaxDim)
- golden test restores the TS case against the manifold path (byte-
  identical to the retained P1-era snapshot)
This commit is contained in:
monkey-w1n5t0n 2026-07-18 12:28:16 +02:00
parent bd35432797
commit c45b91a5f9
13 changed files with 3920 additions and 14 deletions

View file

@ -7,11 +7,12 @@
* *
* Writes: nisps/modes/generated/<mode_id>_schema.hpp * Writes: nisps/modes/generated/<mode_id>_schema.hpp
* nisps/modes/generated/schema_types.hpp * nisps/modes/generated/schema_types.hpp
* manifold/src/modes/generated/<mode_id>_schema.ts
* manifold/src/modes/generated/types.ts
* manifold/src/modes/generated/index.ts
* *
* The TS emission target (formerly playground/src/modes/generated/) was * (The TS target moved playground manifold at P5 of
* removed with the playground at P1 of * docs/specs/plans/one-core-engine-refactor.md.)
* docs/specs/plans/one-core-engine-refactor.md; the TS emitters below are
* retained and re-targeted at manifold/src/modes/generated/ in P5.
* *
* Idempotent: regenerating the same schemas yields byte-identical output. * Idempotent: regenerating the same schemas yields byte-identical output.
* Exits non-zero on validation failure. * Exits non-zero on validation failure.
@ -66,6 +67,7 @@ const SCHEMAS_DIR = join(REPO_ROOT, "schemas");
const MODES_DIR = join(SCHEMAS_DIR, "modes"); const MODES_DIR = join(SCHEMAS_DIR, "modes");
const META_SCHEMA_PATH = join(SCHEMAS_DIR, "schema.json"); const META_SCHEMA_PATH = join(SCHEMAS_DIR, "schema.json");
const CPP_OUT_DIR = join(REPO_ROOT, "nisps", "modes", "generated"); const CPP_OUT_DIR = join(REPO_ROOT, "nisps", "modes", "generated");
const TS_OUT_DIR = join(REPO_ROOT, "manifold", "src", "modes", "generated");
// ----- Helpers -------------------------------------------------------------- // ----- Helpers --------------------------------------------------------------
@ -375,8 +377,6 @@ function emitModeHpp(schema: ModeSchema, sourceFile: string): string {
} }
// ----- Per-mode TS emission ------------------------------------------------- // ----- Per-mode TS emission -------------------------------------------------
// Currently unused: the playground TS target was removed at P1; these emitters
// return in P5 targeting manifold/src/modes/generated/ (one-core-engine plan).
function emitModeTs(schema: ModeSchema, sourceFile: string): string { function emitModeTs(schema: ModeSchema, sourceFile: string): string {
const constName = `${toPascalCase(schema.mode_id)}Schema`; const constName = `${toPascalCase(schema.mode_id)}Schema`;
@ -533,6 +533,26 @@ function main(): number {
errorCount++; errorCount++;
continue; continue;
} }
// Firmware-fit check (one-core-engine P5): the fixed firmware MLP template
// is exactly 4 layers (3 hidden); the browser's runtime-shaped MLP caps
// every dimension at 4096 (bindings kMaxDim).
if (schema.ml.hidden_layers.length !== 3) {
console.error(
`error: ${f}: ml.hidden_layers must have exactly 3 entries ` +
`(fixed 4-layer topology); got ${schema.ml.hidden_layers.length}`
);
errorCount++;
continue;
}
{
const dims = [schema.ml.input_size, ...schema.ml.hidden_layers, schema.ml.output_size];
const bad = dims.find(d => d <= 0 || d > 4096);
if (bad !== undefined) {
console.error(`error: ${f}: ml dimension ${bad} outside (0, 4096]`);
errorCount++;
continue;
}
}
schemas.push({ source: f, schema }); schemas.push({ source: f, schema });
} }
if (errorCount > 0) { if (errorCount > 0) {
@ -548,9 +568,22 @@ function main(): number {
writeFileSync(out, emitModeHpp(schema, source)); writeFileSync(out, emitModeHpp(schema, source));
} }
// 5. Report // 5. Emit TS outputs
ensureDir(TS_OUT_DIR);
writeFileSync(join(TS_OUT_DIR, "types.ts"), emitSharedTsTypes());
for (const { source, schema } of schemas) {
const out = join(TS_OUT_DIR, `${schema.mode_id}_schema.ts`);
writeFileSync(out, emitModeTs(schema, source));
}
writeFileSync(
join(TS_OUT_DIR, "index.ts"),
emitTsIndex(schemas.map(s => s.schema.mode_id).sort())
);
// 6. Report
console.log(`OK ${schemas.length} mode schema(s) processed.`); console.log(`OK ${schemas.length} mode schema(s) processed.`);
console.log(` C++ -> ${CPP_OUT_DIR}`); console.log(` C++ -> ${CPP_OUT_DIR}`);
console.log(` TS -> ${TS_OUT_DIR}`);
for (const { schema } of schemas) { for (const { schema } of schemas) {
console.log( console.log(
` - ${schema.mode_id}: ${schema.params.length} params, ` + ` - ${schema.mode_id}: ${schema.params.length} params, ` +

View file

@ -1,17 +1,14 @@
#!/usr/bin/env bun #!/usr/bin/env bun
/** /**
* Golden test: re-runs codegen and asserts that the freshly-generated * Golden test: re-runs codegen and asserts that the freshly-generated
* paf_synth_schema.hpp is byte-identical to the snapshot in * paf_synth_schema.{hpp,ts} files are byte-identical to the snapshots in
* codegen/tests/golden/. * codegen/tests/golden/. (The TS target moved playground manifold at P5
* * of docs/specs/plans/one-core-engine-refactor.md.)
* (The TS golden case was removed with the playground target at P1 of
* docs/specs/plans/one-core-engine-refactor.md; it returns in P5 against
* manifold/src/modes/generated/. The golden/paf_synth_schema.ts snapshot is
* kept as the P5 template reference.)
* *
* If you change the codegen template intentionally, regenerate the goldens: * If you change the codegen template intentionally, regenerate the goldens:
* bun run generate.ts * bun run generate.ts
* cp ../nisps/modes/generated/paf_synth_schema.hpp tests/golden/ * cp ../nisps/modes/generated/paf_synth_schema.hpp tests/golden/
* cp ../manifold/src/modes/generated/paf_synth_schema.ts tests/golden/
*/ */
import { readFileSync, existsSync } from "node:fs"; import { readFileSync, existsSync } from "node:fs";
@ -35,6 +32,11 @@ const CASES: Case[] = [
generatedPath: join(REPO_ROOT, "nisps", "modes", "generated", "paf_synth_schema.hpp"), generatedPath: join(REPO_ROOT, "nisps", "modes", "generated", "paf_synth_schema.hpp"),
goldenPath: join(GOLDEN_DIR, "paf_synth_schema.hpp"), goldenPath: join(GOLDEN_DIR, "paf_synth_schema.hpp"),
}, },
{
name: "paf_synth_schema.ts",
generatedPath: join(REPO_ROOT, "manifold", "src", "modes", "generated", "paf_synth_schema.ts"),
goldenPath: join(GOLDEN_DIR, "paf_synth_schema.ts"),
},
]; ];
function diff(name: string, expected: string, actual: string): string { function diff(name: string, expected: string, actual: string): string {

View file

@ -0,0 +1,596 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/breakor.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface BreakorParams {
readonly kick_ratio0: number;
readonly kick_ratio1: number;
readonly kick_ratio2: number;
readonly kick_pmul: number;
readonly kick_poff: number;
readonly kick_amp0: number;
readonly kick_amp1: number;
readonly snare_ratio0: number;
readonly snare_ratio1: number;
readonly snare_ratio2: number;
readonly snare_pmul: number;
readonly snare_poff: number;
readonly snare_amp0: number;
readonly snare_amp1: number;
readonly tom_ratio0: number;
readonly tom_ratio1: number;
readonly tom_ratio2: number;
readonly tom_pmul: number;
readonly tom_poff: number;
readonly tom_amp0: number;
readonly tom_amp1: number;
readonly lowtom_ratio0: number;
readonly lowtom_ratio1: number;
readonly lowtom_ratio2: number;
readonly lowtom_pmul: number;
readonly lowtom_poff: number;
readonly lowtom_amp0: number;
readonly lowtom_amp1: number;
readonly rim_ratio0: number;
readonly rim_ratio1: number;
readonly rim_ratio2: number;
readonly rim_pmul: number;
readonly rim_poff: number;
readonly rim_amp0: number;
readonly rim_amp1: number;
readonly hat_ratio0: number;
readonly hat_ratio1: number;
readonly hat_ratio2: number;
readonly hat_pmul: number;
readonly hat_poff: number;
readonly hat_amp0: number;
readonly hat_amp1: number;
readonly ophat_ratio0: number;
readonly ophat_ratio1: number;
readonly ophat_ratio2: number;
readonly ophat_pmul: number;
readonly ophat_poff: number;
readonly ophat_amp0: number;
readonly ophat_amp1: number;
readonly perc_ratio0: number;
readonly perc_ratio1: number;
readonly perc_ratio2: number;
readonly perc_pmul: number;
readonly perc_poff: number;
readonly perc_amp0: number;
readonly perc_amp1: number;
}
export const BreakorSchema: ModeSchema = {
mode_id: 'breakor',
engine_id: 'breakor',
ml: {
input_channels: [
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 4,
hidden_layers: [
10,
14,
18,
],
output_size: 56,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'kick_ratio0',
label: 'Kick Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'kick',
},
{
name: 'kick_ratio1',
label: 'Kick Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'kick',
},
{
name: 'kick_ratio2',
label: 'Kick Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'kick',
},
{
name: 'kick_pmul',
label: 'Kick Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'kick',
},
{
name: 'kick_poff',
label: 'Kick Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'kick',
},
{
name: 'kick_amp0',
label: 'Kick Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'kick',
},
{
name: 'kick_amp1',
label: 'Kick Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'kick',
},
{
name: 'snare_ratio0',
label: 'Snare Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'snare',
},
{
name: 'snare_ratio1',
label: 'Snare Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'snare',
},
{
name: 'snare_ratio2',
label: 'Snare Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'snare',
},
{
name: 'snare_pmul',
label: 'Snare Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'snare',
},
{
name: 'snare_poff',
label: 'Snare Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'snare',
},
{
name: 'snare_amp0',
label: 'Snare Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'snare',
},
{
name: 'snare_amp1',
label: 'Snare Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'snare',
},
{
name: 'tom_ratio0',
label: 'Tom Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'tom',
},
{
name: 'tom_ratio1',
label: 'Tom Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'tom',
},
{
name: 'tom_ratio2',
label: 'Tom Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'tom',
},
{
name: 'tom_pmul',
label: 'Tom Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'tom',
},
{
name: 'tom_poff',
label: 'Tom Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'tom',
},
{
name: 'tom_amp0',
label: 'Tom Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'tom',
},
{
name: 'tom_amp1',
label: 'Tom Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'tom',
},
{
name: 'lowtom_ratio0',
label: 'LowTom Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'lowtom',
},
{
name: 'lowtom_ratio1',
label: 'LowTom Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'lowtom',
},
{
name: 'lowtom_ratio2',
label: 'LowTom Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'lowtom',
},
{
name: 'lowtom_pmul',
label: 'LowTom Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'lowtom',
},
{
name: 'lowtom_poff',
label: 'LowTom Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'lowtom',
},
{
name: 'lowtom_amp0',
label: 'LowTom Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'lowtom',
},
{
name: 'lowtom_amp1',
label: 'LowTom Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'lowtom',
},
{
name: 'rim_ratio0',
label: 'Rim Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'rim',
},
{
name: 'rim_ratio1',
label: 'Rim Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'rim',
},
{
name: 'rim_ratio2',
label: 'Rim Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'rim',
},
{
name: 'rim_pmul',
label: 'Rim Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'rim',
},
{
name: 'rim_poff',
label: 'Rim Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'rim',
},
{
name: 'rim_amp0',
label: 'Rim Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'rim',
},
{
name: 'rim_amp1',
label: 'Rim Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'rim',
},
{
name: 'hat_ratio0',
label: 'Hat Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'hat',
},
{
name: 'hat_ratio1',
label: 'Hat Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'hat',
},
{
name: 'hat_ratio2',
label: 'Hat Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'hat',
},
{
name: 'hat_pmul',
label: 'Hat Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'hat',
},
{
name: 'hat_poff',
label: 'Hat Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'hat',
},
{
name: 'hat_amp0',
label: 'Hat Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'hat',
},
{
name: 'hat_amp1',
label: 'Hat Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'hat',
},
{
name: 'ophat_ratio0',
label: 'OpenHat Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'openhat',
},
{
name: 'ophat_ratio1',
label: 'OpenHat Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'openhat',
},
{
name: 'ophat_ratio2',
label: 'OpenHat Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'openhat',
},
{
name: 'ophat_pmul',
label: 'OpenHat Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'openhat',
},
{
name: 'ophat_poff',
label: 'OpenHat Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'openhat',
},
{
name: 'ophat_amp0',
label: 'OpenHat Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'openhat',
},
{
name: 'ophat_amp1',
label: 'OpenHat Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'openhat',
},
{
name: 'perc_ratio0',
label: 'Perc Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'perc',
},
{
name: 'perc_ratio1',
label: 'Perc Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'perc',
},
{
name: 'perc_ratio2',
label: 'Perc Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'perc',
},
{
name: 'perc_pmul',
label: 'Perc Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'perc',
},
{
name: 'perc_poff',
label: 'Perc Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'perc',
},
{
name: 'perc_amp0',
label: 'Perc Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'perc',
},
{
name: 'perc_amp1',
label: 'Perc Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'perc',
},
],
voice_spaces: [],
ui: {
primary_input: 'xy_pad',
show_voice_space_selector: false,
show_synth_visualizer: false,
},
};

View file

@ -0,0 +1,283 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/channel_strip.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface ChannelStripParams {
readonly pre_gain: number;
readonly peak0_freq: number;
readonly p02: number;
readonly p03: number;
readonly peak1_freq: number;
readonly peak_q: number;
readonly peak_gain: number;
readonly in_lpf_cutoff: number;
readonly in_hpf_cutoff: number;
readonly p09: number;
readonly comp_threshold: number;
readonly comp_ratio: number;
readonly comp_attack: number;
readonly comp_release: number;
readonly lowshelf_freq: number;
readonly lowshelf_q: number;
readonly lowshelf_gain: number;
readonly highshelf_freq: number;
readonly highshelf_q: number;
readonly highshelf_gain: number;
readonly p20: number;
readonly p21: number;
readonly p22: number;
readonly post_gain: number;
}
export const ChannelStripSchema: ModeSchema = {
mode_id: 'channel_strip',
engine_id: 'channel_strip',
ml: {
input_channels: [
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 4,
hidden_layers: [
10,
10,
14,
],
output_size: 24,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'pre_gain',
label: 'Pre Gain',
min: 0,
max: 1,
default: 0.5,
curve: 'square',
group: 'gain',
},
{
name: 'peak0_freq',
label: 'Peak0 Freq',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'eq',
},
{
name: 'p02',
label: 'Param 02',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'p03',
label: 'Param 03',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'peak1_freq',
label: 'Peak1 Freq',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'eq',
},
{
name: 'peak_q',
label: 'Peak Q',
min: 0,
max: 1,
default: 0.3,
curve: 'linear',
group: 'eq',
},
{
name: 'peak_gain',
label: 'Peak Gain',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'eq',
},
{
name: 'in_lpf_cutoff',
label: 'Input LPF',
min: 0,
max: 1,
default: 0.7,
curve: 'square',
group: 'filters',
},
{
name: 'in_hpf_cutoff',
label: 'Input HPF',
min: 0,
max: 1,
default: 0.2,
curve: 'square',
group: 'filters',
},
{
name: 'p09',
label: 'Param 09',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'comp_threshold',
label: 'Comp Threshold',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'comp',
},
{
name: 'comp_ratio',
label: 'Comp Ratio',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'comp',
},
{
name: 'comp_attack',
label: 'Comp Attack',
min: 0,
max: 1,
default: 0.1,
curve: 'linear',
group: 'comp',
},
{
name: 'comp_release',
label: 'Comp Release',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'comp',
},
{
name: 'lowshelf_freq',
label: 'Lowshelf Freq',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'eq',
},
{
name: 'lowshelf_q',
label: 'Lowshelf Q',
min: 0,
max: 1,
default: 0.3,
curve: 'linear',
group: 'eq',
},
{
name: 'lowshelf_gain',
label: 'Lowshelf Gain',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'eq',
},
{
name: 'highshelf_freq',
label: 'Highshelf Freq',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'eq',
},
{
name: 'highshelf_q',
label: 'Highshelf Q',
min: 0,
max: 1,
default: 0.3,
curve: 'linear',
group: 'eq',
},
{
name: 'highshelf_gain',
label: 'Highshelf Gain',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'eq',
},
{
name: 'p20',
label: 'Param 20',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'p21',
label: 'Param 21',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'p22',
label: 'Param 22',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'post_gain',
label: 'Post Gain',
min: 0,
max: 1,
default: 0.5,
curve: 'square',
group: 'gain',
},
],
voice_spaces: [
'WannabeNeve66',
'SSL 4K G-ist',
'SSL 9K-inda',
'MaleVox',
'FemaleVox',
'Neve 80',
],
ui: {
primary_input: 'joystick',
show_voice_space_selector: true,
show_synth_visualizer: false,
},
};

View file

@ -0,0 +1,436 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/elysiamorf.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface ElysiamorfParams {
readonly fm0_carrier: number;
readonly fm0_mod_freq: number;
readonly fm0_mod_index: number;
readonly fm0_phasor_mul: number;
readonly fm0_phase_off: number;
readonly fm1_carrier: number;
readonly fm1_mod_freq: number;
readonly fm1_mod_index: number;
readonly fm1_phasor_mul: number;
readonly fm1_phase_off: number;
readonly fm2_carrier: number;
readonly fm2_mod_freq: number;
readonly fm2_mod_index: number;
readonly fm2_phasor_mul: number;
readonly fm2_phase_off: number;
readonly fm3_carrier: number;
readonly fm3_mod_freq: number;
readonly fm3_mod_index: number;
readonly fm3_phasor_mul: number;
readonly fm3_phase_off: number;
readonly fm4_carrier: number;
readonly fm4_mod_freq: number;
readonly fm4_mod_index: number;
readonly fm4_phasor_mul: number;
readonly fm4_phase_off: number;
readonly fm5_carrier: number;
readonly fm5_mod_freq: number;
readonly fm5_mod_index: number;
readonly fm5_phasor_mul: number;
readonly fm5_phase_off: number;
readonly fm6_carrier: number;
readonly fm6_mod_freq: number;
readonly fm6_mod_index: number;
readonly fm6_phasor_mul: number;
readonly fm6_phase_off: number;
readonly fm7_carrier: number;
readonly fm7_mod_freq: number;
readonly fm7_mod_index: number;
readonly fm7_phasor_mul: number;
readonly fm7_phase_off: number;
}
export const ElysiamorfSchema: ModeSchema = {
mode_id: 'elysiamorf',
engine_id: 'elysiamorf',
ml: {
input_channels: [
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 4,
hidden_layers: [
10,
14,
18,
],
output_size: 40,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'fm0_carrier',
label: 'FM0 Carrier',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm0',
},
{
name: 'fm0_mod_freq',
label: 'FM0 Mod Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm0',
},
{
name: 'fm0_mod_index',
label: 'FM0 Mod Index',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm0',
},
{
name: 'fm0_phasor_mul',
label: 'FM0 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm0',
},
{
name: 'fm0_phase_off',
label: 'FM0 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm0',
},
{
name: 'fm1_carrier',
label: 'FM1 Carrier',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm1',
},
{
name: 'fm1_mod_freq',
label: 'FM1 Mod Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm1',
},
{
name: 'fm1_mod_index',
label: 'FM1 Mod Index',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm1',
},
{
name: 'fm1_phasor_mul',
label: 'FM1 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm1',
},
{
name: 'fm1_phase_off',
label: 'FM1 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm1',
},
{
name: 'fm2_carrier',
label: 'FM2 Carrier',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm2',
},
{
name: 'fm2_mod_freq',
label: 'FM2 Mod Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm2',
},
{
name: 'fm2_mod_index',
label: 'FM2 Mod Index',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm2',
},
{
name: 'fm2_phasor_mul',
label: 'FM2 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm2',
},
{
name: 'fm2_phase_off',
label: 'FM2 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm2',
},
{
name: 'fm3_carrier',
label: 'FM3 Carrier',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm3',
},
{
name: 'fm3_mod_freq',
label: 'FM3 Mod Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm3',
},
{
name: 'fm3_mod_index',
label: 'FM3 Mod Index',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm3',
},
{
name: 'fm3_phasor_mul',
label: 'FM3 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm3',
},
{
name: 'fm3_phase_off',
label: 'FM3 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm3',
},
{
name: 'fm4_carrier',
label: 'FM4 Carrier',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm4',
},
{
name: 'fm4_mod_freq',
label: 'FM4 Mod Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm4',
},
{
name: 'fm4_mod_index',
label: 'FM4 Mod Index',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm4',
},
{
name: 'fm4_phasor_mul',
label: 'FM4 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm4',
},
{
name: 'fm4_phase_off',
label: 'FM4 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm4',
},
{
name: 'fm5_carrier',
label: 'FM5 Carrier',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm5',
},
{
name: 'fm5_mod_freq',
label: 'FM5 Mod Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm5',
},
{
name: 'fm5_mod_index',
label: 'FM5 Mod Index',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm5',
},
{
name: 'fm5_phasor_mul',
label: 'FM5 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm5',
},
{
name: 'fm5_phase_off',
label: 'FM5 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm5',
},
{
name: 'fm6_carrier',
label: 'FM6 Carrier',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm6',
},
{
name: 'fm6_mod_freq',
label: 'FM6 Mod Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm6',
},
{
name: 'fm6_mod_index',
label: 'FM6 Mod Index',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm6',
},
{
name: 'fm6_phasor_mul',
label: 'FM6 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm6',
},
{
name: 'fm6_phase_off',
label: 'FM6 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm6',
},
{
name: 'fm7_carrier',
label: 'FM7 Carrier',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm7',
},
{
name: 'fm7_mod_freq',
label: 'FM7 Mod Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'fm7',
},
{
name: 'fm7_mod_index',
label: 'FM7 Mod Index',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm7',
},
{
name: 'fm7_phasor_mul',
label: 'FM7 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm7',
},
{
name: 'fm7_phase_off',
label: 'FM7 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'fm7',
},
],
voice_spaces: [],
ui: {
primary_input: 'xy_pad',
show_voice_space_selector: false,
show_synth_visualizer: false,
},
};

View file

@ -0,0 +1,13 @@
// AUTOGENERATED — do not edit. Run `bun run codegen/generate.ts` to regenerate.
// Re-exports every generated mode schema.
export * from './types';
export * from './breakor_schema';
export * from './channel_strip_schema';
export * from './elysiamorf_schema';
export * from './memlcelium_schema';
export * from './paf_synth_schema';
export * from './slp_workshop_schema';
export * from './sound_analysis_midi_schema';
export * from './verb_fx_schema';
export * from './xiasri_schema';

View file

@ -0,0 +1,598 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/memlcelium.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface MemlceliumParams {
readonly seq0_ratio0: number;
readonly seq0_ratio1: number;
readonly seq0_ratio2: number;
readonly seq0_phasor_mul: number;
readonly seq0_phase_off: number;
readonly seq0_amp0: number;
readonly seq0_amp1: number;
readonly seq1_ratio0: number;
readonly seq1_ratio1: number;
readonly seq1_ratio2: number;
readonly seq1_phasor_mul: number;
readonly seq1_phase_off: number;
readonly seq1_amp0: number;
readonly seq1_amp1: number;
readonly v0_base_freq: number;
readonly v0_paf0_cf: number;
readonly v0_paf1_cf: number;
readonly v0_paf2_cf: number;
readonly v0_paf0_bw: number;
readonly v0_paf1_bw: number;
readonly v0_paf2_bw: number;
readonly v0_paf_vib: number;
readonly v0_paf_vfr: number;
readonly v0_paf0_shift: number;
readonly v0_paf1_shift: number;
readonly v0_paf2_shift: number;
readonly v0_amp_attack: number;
readonly v0_amp_decay: number;
readonly v0_amp_sustain: number;
readonly v0_amp_release: number;
readonly v0_pitch_attack: number;
readonly v0_pitch_decay: number;
readonly v0_pitch_emph: number;
readonly v0_shape_gain: number;
readonly v0_shape_asym: number;
readonly v0_shape_mix: number;
readonly v0_rm_gain: number;
readonly v1_base_freq: number;
readonly v1_detune1: number;
readonly v1_detune2: number;
readonly v1_paf0_cf: number;
readonly v1_paf1_cf: number;
readonly v1_paf2_cf: number;
readonly v1_paf0_bw: number;
readonly v1_paf1_bw: number;
readonly v1_paf2_bw: number;
readonly v1_paf0_shift: number;
readonly v1_paf1_shift: number;
readonly v1_paf2_shift: number;
readonly v1_amp_attack: number;
readonly v1_amp_decay: number;
readonly v1_amp_sustain: number;
readonly v1_amp_release: number;
readonly v1_pitch_attack: number;
readonly v1_pitch_decay: number;
readonly v1_pitch_emph: number;
}
export const MemlceliumSchema: ModeSchema = {
mode_id: 'memlcelium',
engine_id: 'memlcelium',
ml: {
input_channels: [
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 4,
hidden_layers: [
10,
14,
18,
],
output_size: 56,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'seq0_ratio0',
label: 'Seq0 Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_ratio1',
label: 'Seq0 Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_ratio2',
label: 'Seq0 Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_phasor_mul',
label: 'Seq0 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_phase_off',
label: 'Seq0 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_amp0',
label: 'Seq0 Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_amp1',
label: 'Seq0 Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_ratio0',
label: 'Seq1 Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_ratio1',
label: 'Seq1 Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_ratio2',
label: 'Seq1 Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_phasor_mul',
label: 'Seq1 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_phase_off',
label: 'Seq1 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_amp0',
label: 'Seq1 Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_amp1',
label: 'Seq1 Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'v0_base_freq',
label: 'V0 Base Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf0_cf',
label: 'V0 PAF0 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf1_cf',
label: 'V0 PAF1 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf2_cf',
label: 'V0 PAF2 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf0_bw',
label: 'V0 PAF0 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf1_bw',
label: 'V0 PAF1 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf2_bw',
label: 'V0 PAF2 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf_vib',
label: 'V0 PAF Vib',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'v0_synth',
},
{
name: 'v0_paf_vfr',
label: 'V0 PAF Vib Rate',
min: 0,
max: 1,
default: 0.5,
curve: 'square',
group: 'v0_synth',
},
{
name: 'v0_paf0_shift',
label: 'V0 PAF0 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf1_shift',
label: 'V0 PAF1 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf2_shift',
label: 'V0 PAF2 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_amp_attack',
label: 'V0 Amp Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_env',
},
{
name: 'v0_amp_decay',
label: 'V0 Amp Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v0_env',
},
{
name: 'v0_amp_sustain',
label: 'V0 Amp Sustain',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_env',
},
{
name: 'v0_amp_release',
label: 'V0 Amp Release',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v0_env',
},
{
name: 'v0_pitch_attack',
label: 'V0 Pitch Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_env',
},
{
name: 'v0_pitch_decay',
label: 'V0 Pitch Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v0_env',
},
{
name: 'v0_pitch_emph',
label: 'V0 Pitch Emph',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_env',
},
{
name: 'v0_shape_gain',
label: 'V0 Shape Gain',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_shape_asym',
label: 'V0 Shape Asym',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_shape_mix',
label: 'V0 Shape Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_rm_gain',
label: 'V0 RingMod Gain',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v1_base_freq',
label: 'V1 Base Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_detune1',
label: 'V1 Detune 1',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_detune2',
label: 'V1 Detune 2',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf0_cf',
label: 'V1 PAF0 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf1_cf',
label: 'V1 PAF1 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf2_cf',
label: 'V1 PAF2 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf0_bw',
label: 'V1 PAF0 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf1_bw',
label: 'V1 PAF1 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf2_bw',
label: 'V1 PAF2 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf0_shift',
label: 'V1 PAF0 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf1_shift',
label: 'V1 PAF1 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf2_shift',
label: 'V1 PAF2 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_amp_attack',
label: 'V1 Amp Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_env',
},
{
name: 'v1_amp_decay',
label: 'V1 Amp Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v1_env',
},
{
name: 'v1_amp_sustain',
label: 'V1 Amp Sustain',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_env',
},
{
name: 'v1_amp_release',
label: 'V1 Amp Release',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v1_env',
},
{
name: 'v1_pitch_attack',
label: 'V1 Pitch Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_env',
},
{
name: 'v1_pitch_decay',
label: 'V1 Pitch Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v1_env',
},
{
name: 'v1_pitch_emph',
label: 'V1 Pitch Emph',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_env',
},
],
voice_spaces: [
'Direct',
],
ui: {
primary_input: 'xy_pad',
show_voice_space_selector: false,
show_synth_visualizer: true,
},
};

View file

@ -0,0 +1,374 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/paf_synth.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface PafSynthParams {
readonly p00: number;
readonly p01: number;
readonly paf0_cf: number;
readonly paf1_cf: number;
readonly p04: number;
readonly paf0_bw: number;
readonly paf1_bw: number;
readonly p07: number;
readonly paf0_vib: number;
readonly paf1_vib: number;
readonly p10: number;
readonly paf0_vfr: number;
readonly paf1_vfr: number;
readonly p13: number;
readonly paf0_shift: number;
readonly paf1_shift: number;
readonly p16: number;
readonly dl1mix: number;
readonly p18: number;
readonly dlfb: number;
readonly env_decay: number;
readonly p21: number;
readonly p22: number;
readonly p23: number;
readonly p24: number;
readonly p25: number;
readonly shape_gain: number;
readonly shape_asym: number;
readonly shape_mix: number;
readonly rm_gain: number;
readonly env_attack: number;
readonly env_sustain: number;
readonly env_release: number;
}
export const PafSynthSchema: ModeSchema = {
mode_id: 'paf_synth',
engine_id: 'paf_synth',
ml: {
input_channels: [
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 4,
hidden_layers: [
10,
10,
14,
],
output_size: 33,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'p00',
label: 'Param 00',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'p01',
label: 'Param 01',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'paf0_cf',
label: 'PAF0 Center Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'operators',
},
{
name: 'paf1_cf',
label: 'PAF1 Center Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'operators',
},
{
name: 'p04',
label: 'Param 04',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'paf0_bw',
label: 'PAF0 Bandwidth',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'operators',
},
{
name: 'paf1_bw',
label: 'PAF1 Bandwidth',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'operators',
},
{
name: 'p07',
label: 'Param 07',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'paf0_vib',
label: 'PAF0 Vibrato Depth',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'modulation',
},
{
name: 'paf1_vib',
label: 'PAF1 Vibrato Depth',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'modulation',
},
{
name: 'p10',
label: 'Param 10',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'paf0_vfr',
label: 'PAF0 Vibrato Rate',
min: 0,
max: 1,
default: 0.5,
curve: 'square',
group: 'modulation',
},
{
name: 'paf1_vfr',
label: 'PAF1 Vibrato Rate',
min: 0,
max: 1,
default: 0.5,
curve: 'square',
group: 'modulation',
},
{
name: 'p13',
label: 'Param 13',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'paf0_shift',
label: 'PAF0 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'operators',
},
{
name: 'paf1_shift',
label: 'PAF1 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'operators',
},
{
name: 'p16',
label: 'Param 16',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'dl1mix',
label: 'Delay Mix',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'delay',
},
{
name: 'p18',
label: 'Param 18',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'dlfb',
label: 'Delay Feedback',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'delay',
},
{
name: 'env_decay',
label: 'Env Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'envelope',
},
{
name: 'p21',
label: 'Param 21',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'p22',
label: 'Param 22',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'p23',
label: 'Param 23',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'p24',
label: 'Param 24',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'p25',
label: 'Param 25',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'shape_gain',
label: 'Sine Shape Gain',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'shaper',
},
{
name: 'shape_asym',
label: 'Sine Shape Asym',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'shaper',
},
{
name: 'shape_mix',
label: 'Sine Shape Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'shaper',
},
{
name: 'rm_gain',
label: 'Ring Mod Gain',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'shaper',
},
{
name: 'env_attack',
label: 'Env Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'envelope',
},
{
name: 'env_sustain',
label: 'Env Sustain',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'envelope',
},
{
name: 'env_release',
label: 'Env Release',
min: 0,
max: 1,
default: 0.3,
curve: 'linear',
group: 'envelope',
},
],
voice_spaces: [
'Ellipticacacia',
'Rowantares',
'Neemeda',
'Aquillow',
'Magnetarch',
'Elderstar',
'Ipeleiades',
],
ui: {
primary_input: 'xy_pad',
show_voice_space_selector: true,
show_synth_visualizer: true,
},
};

View file

@ -0,0 +1,598 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/slp_workshop.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface SlpWorkshopParams {
readonly seq0_ratio0: number;
readonly seq0_ratio1: number;
readonly seq0_ratio2: number;
readonly seq0_phasor_mul: number;
readonly seq0_phase_off: number;
readonly seq0_amp0: number;
readonly seq0_amp1: number;
readonly seq1_ratio0: number;
readonly seq1_ratio1: number;
readonly seq1_ratio2: number;
readonly seq1_phasor_mul: number;
readonly seq1_phase_off: number;
readonly seq1_amp0: number;
readonly seq1_amp1: number;
readonly v0_base_freq: number;
readonly v0_paf0_cf: number;
readonly v0_paf1_cf: number;
readonly v0_paf2_cf: number;
readonly v0_paf0_bw: number;
readonly v0_paf1_bw: number;
readonly v0_paf2_bw: number;
readonly v0_paf_vib: number;
readonly v0_paf_vfr: number;
readonly v0_paf0_shift: number;
readonly v0_paf1_shift: number;
readonly v0_paf2_shift: number;
readonly v0_amp_attack: number;
readonly v0_amp_decay: number;
readonly v0_amp_sustain: number;
readonly v0_amp_release: number;
readonly v0_pitch_attack: number;
readonly v0_pitch_decay: number;
readonly v0_pitch_emph: number;
readonly v0_shape_gain: number;
readonly v0_shape_asym: number;
readonly v0_shape_mix: number;
readonly v0_rm_gain: number;
readonly v1_base_freq: number;
readonly v1_detune1: number;
readonly v1_detune2: number;
readonly v1_paf0_cf: number;
readonly v1_paf1_cf: number;
readonly v1_paf2_cf: number;
readonly v1_paf0_bw: number;
readonly v1_paf1_bw: number;
readonly v1_paf2_bw: number;
readonly v1_paf0_shift: number;
readonly v1_paf1_shift: number;
readonly v1_paf2_shift: number;
readonly v1_amp_attack: number;
readonly v1_amp_decay: number;
readonly v1_amp_sustain: number;
readonly v1_amp_release: number;
readonly v1_pitch_attack: number;
readonly v1_pitch_decay: number;
readonly v1_pitch_emph: number;
}
export const SlpWorkshopSchema: ModeSchema = {
mode_id: 'slp_workshop',
engine_id: 'memlcelium',
ml: {
input_channels: [
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 4,
hidden_layers: [
10,
14,
18,
],
output_size: 56,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'seq0_ratio0',
label: 'Seq0 Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_ratio1',
label: 'Seq0 Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_ratio2',
label: 'Seq0 Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_phasor_mul',
label: 'Seq0 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_phase_off',
label: 'Seq0 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_amp0',
label: 'Seq0 Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq0_amp1',
label: 'Seq0 Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_ratio0',
label: 'Seq1 Ratio 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_ratio1',
label: 'Seq1 Ratio 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_ratio2',
label: 'Seq1 Ratio 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_phasor_mul',
label: 'Seq1 Phasor Mul',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_phase_off',
label: 'Seq1 Phase Off',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_amp0',
label: 'Seq1 Amp 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'seq1_amp1',
label: 'Seq1 Amp 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'sequencer',
},
{
name: 'v0_base_freq',
label: 'V0 Base Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf0_cf',
label: 'V0 PAF0 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf1_cf',
label: 'V0 PAF1 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf2_cf',
label: 'V0 PAF2 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf0_bw',
label: 'V0 PAF0 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf1_bw',
label: 'V0 PAF1 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf2_bw',
label: 'V0 PAF2 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf_vib',
label: 'V0 PAF Vib',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'v0_synth',
},
{
name: 'v0_paf_vfr',
label: 'V0 PAF Vib Rate',
min: 0,
max: 1,
default: 0.5,
curve: 'square',
group: 'v0_synth',
},
{
name: 'v0_paf0_shift',
label: 'V0 PAF0 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf1_shift',
label: 'V0 PAF1 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_paf2_shift',
label: 'V0 PAF2 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_amp_attack',
label: 'V0 Amp Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_env',
},
{
name: 'v0_amp_decay',
label: 'V0 Amp Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v0_env',
},
{
name: 'v0_amp_sustain',
label: 'V0 Amp Sustain',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v0_env',
},
{
name: 'v0_amp_release',
label: 'V0 Amp Release',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v0_env',
},
{
name: 'v0_pitch_attack',
label: 'V0 Pitch Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_env',
},
{
name: 'v0_pitch_decay',
label: 'V0 Pitch Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v0_env',
},
{
name: 'v0_pitch_emph',
label: 'V0 Pitch Emph',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_env',
},
{
name: 'v0_shape_gain',
label: 'V0 Shape Gain',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_shape_asym',
label: 'V0 Shape Asym',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_shape_mix',
label: 'V0 Shape Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v0_rm_gain',
label: 'V0 RingMod Gain',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v0_synth',
},
{
name: 'v1_base_freq',
label: 'V1 Base Freq',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_detune1',
label: 'V1 Detune 1',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_detune2',
label: 'V1 Detune 2',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf0_cf',
label: 'V1 PAF0 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf1_cf',
label: 'V1 PAF1 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf2_cf',
label: 'V1 PAF2 CF',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf0_bw',
label: 'V1 PAF0 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf1_bw',
label: 'V1 PAF1 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf2_bw',
label: 'V1 PAF2 BW',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf0_shift',
label: 'V1 PAF0 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf1_shift',
label: 'V1 PAF1 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_paf2_shift',
label: 'V1 PAF2 Shift',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_synth',
},
{
name: 'v1_amp_attack',
label: 'V1 Amp Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_env',
},
{
name: 'v1_amp_decay',
label: 'V1 Amp Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v1_env',
},
{
name: 'v1_amp_sustain',
label: 'V1 Amp Sustain',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'v1_env',
},
{
name: 'v1_amp_release',
label: 'V1 Amp Release',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v1_env',
},
{
name: 'v1_pitch_attack',
label: 'V1 Pitch Attack',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_env',
},
{
name: 'v1_pitch_decay',
label: 'V1 Pitch Decay',
min: 0,
max: 1,
default: 0.3,
curve: 'square',
group: 'v1_env',
},
{
name: 'v1_pitch_emph',
label: 'V1 Pitch Emph',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'v1_env',
},
],
voice_spaces: [
'Direct',
],
ui: {
primary_input: 'xy_pad',
show_voice_space_selector: false,
show_synth_visualizer: true,
},
};

View file

@ -0,0 +1,122 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/sound_analysis_midi.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface SoundAnalysisMidiParams {
readonly midi_cc0: number;
readonly midi_cc1: number;
readonly midi_cc2: number;
readonly midi_cc3: number;
readonly midi_cc4: number;
readonly midi_cc5: number;
readonly midi_cc6: number;
readonly midi_cc7: number;
}
export const SoundAnalysisMidiSchema: ModeSchema = {
mode_id: 'sound_analysis_midi',
engine_id: 'thru',
ml: {
input_channels: [
'audio_pitch',
'audio_aperiodicity',
'audio_energy',
'audio_attack',
'audio_brightness',
'audio_energy_crude',
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 10,
hidden_layers: [
10,
10,
14,
],
output_size: 8,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'midi_cc0',
label: 'MIDI CC 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'midi',
},
{
name: 'midi_cc1',
label: 'MIDI CC 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'midi',
},
{
name: 'midi_cc2',
label: 'MIDI CC 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'midi',
},
{
name: 'midi_cc3',
label: 'MIDI CC 3',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'midi',
},
{
name: 'midi_cc4',
label: 'MIDI CC 4',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'midi',
},
{
name: 'midi_cc5',
label: 'MIDI CC 5',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'midi',
},
{
name: 'midi_cc6',
label: 'MIDI CC 6',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'midi',
},
{
name: 'midi_cc7',
label: 'MIDI CC 7',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'midi',
},
],
voice_spaces: [],
ui: {
primary_input: 'audio_in',
show_voice_space_selector: false,
show_synth_visualizer: false,
},
};

View file

@ -0,0 +1,54 @@
// AUTOGENERATED — do not edit. Run `bun run codegen/generate.ts` to regenerate.
// Shared TypeScript types for generated mode schemas.
export type Curve =
| 'linear'
| 'exp'
| 'log'
| 'square'
| 'sqrt'
| 'sigmoid'
| 'cubic';
export type PrimaryInput =
| 'xy_pad'
| 'joystick'
| 'sliders'
| 'audio_in'
| 'midi_in'
| 'none';
export interface Param {
readonly name: string;
readonly label: string;
readonly min: number;
readonly max: number;
readonly default: number;
readonly curve: Curve;
readonly group: string;
}
export interface MLConfig {
readonly input_channels: readonly string[];
readonly input_size: number;
readonly hidden_layers: readonly number[];
readonly output_size: number;
readonly default_spread: number;
readonly default_learning_rate: number;
readonly default_max_iterations: number;
}
export interface UIConfig {
readonly primary_input: PrimaryInput;
readonly show_voice_space_selector: boolean;
readonly show_synth_visualizer: boolean;
}
export interface ModeSchema {
readonly mode_id: string;
readonly engine_id: string;
readonly ml: MLConfig;
readonly params: readonly Param[];
readonly voice_spaces: readonly string[];
readonly ui: UIConfig;
}

View file

@ -0,0 +1,519 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/verb_fx.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface VerbFxParams {
readonly fb_delay_xfade: number;
readonly lp0_fb: number;
readonly lp0_cutoff: number;
readonly lp1_fb: number;
readonly lp1_cutoff: number;
readonly lp2_fb: number;
readonly lp2_cutoff: number;
readonly lp3_fb: number;
readonly lp3_cutoff: number;
readonly lp4_fb: number;
readonly lp4_cutoff: number;
readonly lp5_fb: number;
readonly lp5_cutoff: number;
readonly lp6_fb: number;
readonly lp6_cutoff: number;
readonly lp7_fb: number;
readonly lp7_cutoff: number;
readonly allp0_fb: number;
readonly allp1_fb: number;
readonly allp2_fb: number;
readonly allp3_fb: number;
readonly fbank_f0: number;
readonly fbank_f1: number;
readonly fbank_f2: number;
readonly fbank_f3: number;
readonly fbank_f4: number;
readonly fbank_f5: number;
readonly fbank_f6: number;
readonly fbank_f7: number;
readonly fbank_res0: number;
readonly fbank_res1: number;
readonly fbank_res2: number;
readonly fbank_res3: number;
readonly fbank_res4: number;
readonly fbank_res5: number;
readonly fbank_res6: number;
readonly fbank_res7: number;
readonly delay0_time: number;
readonly delay0_fb: number;
readonly delay1_time: number;
readonly delay1_fb: number;
readonly delay2_time: number;
readonly delay2_fb: number;
readonly verb_vs_delay: number;
readonly delay_to_verb: number;
readonly delay_morph: number;
readonly delay_blend: number;
}
export const VerbFxSchema: ModeSchema = {
mode_id: 'verb_fx',
engine_id: 'verb_fx',
ml: {
input_channels: [
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 4,
hidden_layers: [
10,
14,
18,
],
output_size: 47,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'fb_delay_xfade',
label: 'Bank/Delay XFade',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'routing',
},
{
name: 'lp0_fb',
label: 'LP Comb 0 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp0_cutoff',
label: 'LP Comb 0 Cutoff',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp1_fb',
label: 'LP Comb 1 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp1_cutoff',
label: 'LP Comb 1 Cutoff',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp2_fb',
label: 'LP Comb 2 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp2_cutoff',
label: 'LP Comb 2 Cutoff',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp3_fb',
label: 'LP Comb 3 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp3_cutoff',
label: 'LP Comb 3 Cutoff',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp4_fb',
label: 'LP Comb 4 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp4_cutoff',
label: 'LP Comb 4 Cutoff',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp5_fb',
label: 'LP Comb 5 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp5_cutoff',
label: 'LP Comb 5 Cutoff',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp6_fb',
label: 'LP Comb 6 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp6_cutoff',
label: 'LP Comb 6 Cutoff',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp7_fb',
label: 'LP Comb 7 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'lp7_cutoff',
label: 'LP Comb 7 Cutoff',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'allp0_fb',
label: 'Allpass 0 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'allp1_fb',
label: 'Allpass 1 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'allp2_fb',
label: 'Allpass 2 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'allp3_fb',
label: 'Allpass 3 FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'verb',
},
{
name: 'fbank_f0',
label: 'Filterbank Freq 0',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_f1',
label: 'Filterbank Freq 1',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_f2',
label: 'Filterbank Freq 2',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_f3',
label: 'Filterbank Freq 3',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_f4',
label: 'Filterbank Freq 4',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_f5',
label: 'Filterbank Freq 5',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_f6',
label: 'Filterbank Freq 6',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_f7',
label: 'Filterbank Freq 7',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_res0',
label: 'Filterbank Res 0',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_res1',
label: 'Filterbank Res 1',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_res2',
label: 'Filterbank Res 2',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_res3',
label: 'Filterbank Res 3',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_res4',
label: 'Filterbank Res 4',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_res5',
label: 'Filterbank Res 5',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_res6',
label: 'Filterbank Res 6',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'filterbank',
},
{
name: 'fbank_res7',
label: 'Filterbank Res 7',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'filterbank',
},
{
name: 'delay0_time',
label: 'Long Delay Time',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'delays',
},
{
name: 'delay0_fb',
label: 'Long Delay FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'delays',
},
{
name: 'delay1_time',
label: 'Med Delay Time',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'delays',
},
{
name: 'delay1_fb',
label: 'Med Delay FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'delays',
},
{
name: 'delay2_time',
label: 'Short Delay Time',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'delays',
},
{
name: 'delay2_fb',
label: 'Short Delay FB',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'delays',
},
{
name: 'verb_vs_delay',
label: 'Verb vs Delay',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'routing',
},
{
name: 'delay_to_verb',
label: 'Delay→Verb Send',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'routing',
},
{
name: 'delay_morph',
label: 'Delay Morph',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'delays',
},
{
name: 'delay_blend',
label: 'Delay Blend',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'delays',
},
],
voice_spaces: [
'Default',
'Resonant',
'Soft',
'Cathedral',
'Shimmer',
'Chamber',
'Metallic',
'Granular',
'Diffuse',
'Dark',
'Bright',
'Harmonic',
],
ui: {
primary_input: 'joystick',
show_voice_space_selector: true,
show_synth_visualizer: false,
},
};

View file

@ -0,0 +1,278 @@
// AUTOGENERATED — do not edit. Source: schemas/modes/xiasri.json. Run `bun run codegen/generate.ts` to regenerate.
import type { ModeSchema } from './types';
export interface XiasriParams {
readonly dl1_mix: number;
readonly dl2_mix: number;
readonly dl3_mix: number;
readonly p03: number;
readonly allp1_fb: number;
readonly allp2_fb: number;
readonly comb1_fb: number;
readonly comb2_fb: number;
readonly dl1_fb: number;
readonly dl2_fb: number;
readonly dl3_fb: number;
readonly wetdry_mix: number;
readonly pitch_transp: number;
readonly pitch_mix: number;
readonly allp3_fb: number;
readonly allp4_fb: number;
readonly allp5_fb: number;
readonly allp6_fb: number;
readonly allp3_mix: number;
readonly allp4_mix: number;
readonly allp5_mix: number;
readonly allp6_mix: number;
readonly dl4_mix: number;
readonly dl4_fb: number;
}
export const XiasriSchema: ModeSchema = {
mode_id: 'xiasri',
engine_id: 'xiasri',
ml: {
input_channels: [
'joy_x',
'joy_y',
'joy_z',
'joy_w',
],
input_size: 4,
hidden_layers: [
10,
10,
14,
],
output_size: 24,
default_spread: 0.6,
default_learning_rate: 1,
default_max_iterations: 1000,
},
params: [
{
name: 'dl1_mix',
label: 'Delay 1 Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'delays',
},
{
name: 'dl2_mix',
label: 'Delay 2 Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'delays',
},
{
name: 'dl3_mix',
label: 'Delay 3 Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'delays',
},
{
name: 'p03',
label: 'Param 03',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'general',
},
{
name: 'allp1_fb',
label: 'Allpass 1 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'allp2_fb',
label: 'Allpass 2 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'comb1_fb',
label: 'Comb 1 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'comb2_fb',
label: 'Comb 2 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'dl1_fb',
label: 'Delay 1 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'delays',
},
{
name: 'dl2_fb',
label: 'Delay 2 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'delays',
},
{
name: 'dl3_fb',
label: 'Delay 3 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'delays',
},
{
name: 'wetdry_mix',
label: 'Wet/Dry Mix',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'mix',
},
{
name: 'pitch_transp',
label: 'Pitch Transpose',
min: 0,
max: 1,
default: 0.5,
curve: 'linear',
group: 'pitch',
},
{
name: 'pitch_mix',
label: 'Pitch Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'pitch',
},
{
name: 'allp3_fb',
label: 'Allpass 3 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'allp4_fb',
label: 'Allpass 4 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'allp5_fb',
label: 'Allpass 5 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'allp6_fb',
label: 'Allpass 6 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'allp3_mix',
label: 'Allpass 3 Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'allp4_mix',
label: 'Allpass 4 Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'allp5_mix',
label: 'Allpass 5 Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'allp6_mix',
label: 'Allpass 6 Mix',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'verb',
},
{
name: 'dl4_mix',
label: 'Delay 4 Mix',
min: 0,
max: 1,
default: 0,
curve: 'square',
group: 'delays',
},
{
name: 'dl4_fb',
label: 'Delay 4 Feedback',
min: 0,
max: 1,
default: 0,
curve: 'linear',
group: 'delays',
},
],
voice_spaces: [
'Direct',
],
ui: {
primary_input: 'joystick',
show_voice_space_selector: false,
show_synth_visualizer: false,
},
};