From c45b91a5f91144f71e706da56aab9a40c2260197 Mon Sep 17 00:00:00 2001 From: monkey-w1n5t0n Date: Sat, 18 Jul 2026 12:28:16 +0200 Subject: [PATCH] =?UTF-8?q?feat(codegen):=20P5=20=E2=80=94=20TS=20emission?= =?UTF-8?q?=20targets=20manifold/src/modes/generated/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - generate.ts re-activates the TS emitters against manifold (types.ts, per-mode _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) --- codegen/generate.ts | 47 +- codegen/tests/golden_test.ts | 16 +- .../src/modes/generated/breakor_schema.ts | 596 +++++++++++++++++ .../modes/generated/channel_strip_schema.ts | 283 +++++++++ .../src/modes/generated/elysiamorf_schema.ts | 436 +++++++++++++ manifold/src/modes/generated/index.ts | 13 + .../src/modes/generated/memlcelium_schema.ts | 598 ++++++++++++++++++ .../src/modes/generated/paf_synth_schema.ts | 374 +++++++++++ .../modes/generated/slp_workshop_schema.ts | 598 ++++++++++++++++++ .../generated/sound_analysis_midi_schema.ts | 122 ++++ manifold/src/modes/generated/types.ts | 54 ++ .../src/modes/generated/verb_fx_schema.ts | 519 +++++++++++++++ manifold/src/modes/generated/xiasri_schema.ts | 278 ++++++++ 13 files changed, 3920 insertions(+), 14 deletions(-) create mode 100644 manifold/src/modes/generated/breakor_schema.ts create mode 100644 manifold/src/modes/generated/channel_strip_schema.ts create mode 100644 manifold/src/modes/generated/elysiamorf_schema.ts create mode 100644 manifold/src/modes/generated/index.ts create mode 100644 manifold/src/modes/generated/memlcelium_schema.ts create mode 100644 manifold/src/modes/generated/paf_synth_schema.ts create mode 100644 manifold/src/modes/generated/slp_workshop_schema.ts create mode 100644 manifold/src/modes/generated/sound_analysis_midi_schema.ts create mode 100644 manifold/src/modes/generated/types.ts create mode 100644 manifold/src/modes/generated/verb_fx_schema.ts create mode 100644 manifold/src/modes/generated/xiasri_schema.ts diff --git a/codegen/generate.ts b/codegen/generate.ts index 94acc9d..f296bf2 100644 --- a/codegen/generate.ts +++ b/codegen/generate.ts @@ -7,11 +7,12 @@ * * Writes: nisps/modes/generated/_schema.hpp * nisps/modes/generated/schema_types.hpp + * manifold/src/modes/generated/_schema.ts + * manifold/src/modes/generated/types.ts + * manifold/src/modes/generated/index.ts * - * The TS emission target (formerly playground/src/modes/generated/) was - * removed with the playground at P1 of - * docs/specs/plans/one-core-engine-refactor.md; the TS emitters below are - * retained and re-targeted at manifold/src/modes/generated/ in P5. + * (The TS target moved playground → manifold at P5 of + * docs/specs/plans/one-core-engine-refactor.md.) * * Idempotent: regenerating the same schemas yields byte-identical output. * 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 META_SCHEMA_PATH = join(SCHEMAS_DIR, "schema.json"); const CPP_OUT_DIR = join(REPO_ROOT, "nisps", "modes", "generated"); +const TS_OUT_DIR = join(REPO_ROOT, "manifold", "src", "modes", "generated"); // ----- Helpers -------------------------------------------------------------- @@ -375,8 +377,6 @@ function emitModeHpp(schema: ModeSchema, sourceFile: string): string { } // ----- 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 { const constName = `${toPascalCase(schema.mode_id)}Schema`; @@ -533,6 +533,26 @@ function main(): number { errorCount++; 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 }); } if (errorCount > 0) { @@ -548,9 +568,22 @@ function main(): number { 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(` C++ -> ${CPP_OUT_DIR}`); + console.log(` TS -> ${TS_OUT_DIR}`); for (const { schema } of schemas) { console.log( ` - ${schema.mode_id}: ${schema.params.length} params, ` + diff --git a/codegen/tests/golden_test.ts b/codegen/tests/golden_test.ts index 8c07620..7711d95 100644 --- a/codegen/tests/golden_test.ts +++ b/codegen/tests/golden_test.ts @@ -1,17 +1,14 @@ #!/usr/bin/env bun /** * Golden test: re-runs codegen and asserts that the freshly-generated - * paf_synth_schema.hpp is byte-identical to the snapshot in - * codegen/tests/golden/. - * - * (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.) + * paf_synth_schema.{hpp,ts} files are byte-identical to the snapshots in + * codegen/tests/golden/. (The TS target moved playground → manifold at P5 + * of docs/specs/plans/one-core-engine-refactor.md.) * * If you change the codegen template intentionally, regenerate the goldens: * bun run generate.ts * 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"; @@ -35,6 +32,11 @@ const CASES: Case[] = [ generatedPath: join(REPO_ROOT, "nisps", "modes", "generated", "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 { diff --git a/manifold/src/modes/generated/breakor_schema.ts b/manifold/src/modes/generated/breakor_schema.ts new file mode 100644 index 0000000..0bfe8ab --- /dev/null +++ b/manifold/src/modes/generated/breakor_schema.ts @@ -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, + }, +}; diff --git a/manifold/src/modes/generated/channel_strip_schema.ts b/manifold/src/modes/generated/channel_strip_schema.ts new file mode 100644 index 0000000..8bf61c8 --- /dev/null +++ b/manifold/src/modes/generated/channel_strip_schema.ts @@ -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, + }, +}; diff --git a/manifold/src/modes/generated/elysiamorf_schema.ts b/manifold/src/modes/generated/elysiamorf_schema.ts new file mode 100644 index 0000000..b08ec88 --- /dev/null +++ b/manifold/src/modes/generated/elysiamorf_schema.ts @@ -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, + }, +}; diff --git a/manifold/src/modes/generated/index.ts b/manifold/src/modes/generated/index.ts new file mode 100644 index 0000000..d33e40c --- /dev/null +++ b/manifold/src/modes/generated/index.ts @@ -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'; diff --git a/manifold/src/modes/generated/memlcelium_schema.ts b/manifold/src/modes/generated/memlcelium_schema.ts new file mode 100644 index 0000000..2f0f6d9 --- /dev/null +++ b/manifold/src/modes/generated/memlcelium_schema.ts @@ -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, + }, +}; diff --git a/manifold/src/modes/generated/paf_synth_schema.ts b/manifold/src/modes/generated/paf_synth_schema.ts new file mode 100644 index 0000000..6b66bc0 --- /dev/null +++ b/manifold/src/modes/generated/paf_synth_schema.ts @@ -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, + }, +}; diff --git a/manifold/src/modes/generated/slp_workshop_schema.ts b/manifold/src/modes/generated/slp_workshop_schema.ts new file mode 100644 index 0000000..4a74ad1 --- /dev/null +++ b/manifold/src/modes/generated/slp_workshop_schema.ts @@ -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, + }, +}; diff --git a/manifold/src/modes/generated/sound_analysis_midi_schema.ts b/manifold/src/modes/generated/sound_analysis_midi_schema.ts new file mode 100644 index 0000000..67bd6cc --- /dev/null +++ b/manifold/src/modes/generated/sound_analysis_midi_schema.ts @@ -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, + }, +}; diff --git a/manifold/src/modes/generated/types.ts b/manifold/src/modes/generated/types.ts new file mode 100644 index 0000000..1aec060 --- /dev/null +++ b/manifold/src/modes/generated/types.ts @@ -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; +} diff --git a/manifold/src/modes/generated/verb_fx_schema.ts b/manifold/src/modes/generated/verb_fx_schema.ts new file mode 100644 index 0000000..e24a80e --- /dev/null +++ b/manifold/src/modes/generated/verb_fx_schema.ts @@ -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, + }, +}; diff --git a/manifold/src/modes/generated/xiasri_schema.ts b/manifold/src/modes/generated/xiasri_schema.ts new file mode 100644 index 0000000..e1b774a --- /dev/null +++ b/manifold/src/modes/generated/xiasri_schema.ts @@ -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, + }, +};