memlnaut-nisps/codegen/tests/golden/paf_synth_schema.ts
w1n5t0n 129e28b207 Add codegen tool: schemas -> C++ headers + TS modules
bun-runnable TypeScript script (codegen/generate.ts) that:
- Validates each schemas/modes/*.json against the meta-schema via
  ajv (Draft 2020-12).
- Cross-checks params.length == ml.output_size and
  ml.input_channels.length == ml.input_size.
- Emits constexpr C++ data into nisps/modes/generated/ (one
  schema_types.hpp + one <mode_id>_schema.hpp per mode). Uses
  std::string_view + std::array; no std::vector, no heap, .f
  suffixed float literals (perf contract §3.3).
- Emits TS modules into playground/src/modes/generated/ (one
  types.ts + one <mode_id>_schema.ts + index.ts barrel).
- Idempotent: re-running yields byte-identical output.
- Exits non-zero on schema validation failure.

Reference templates live in codegen/templates/ (not consumed at
codegen time -- for human reviewers).

Golden test (codegen/tests/golden_test.ts) snapshots
paf_synth_schema.{hpp,ts} and verifies regeneration matches the
golden + that a second run is idempotent.

Until stream 1 lands nisps/core/math.hpp, schema_types.hpp ships
its own minimal Curve enum with a TODO marker pointing at the
eventual include.
2026-04-29 15:29:08 +03:00

374 lines
6.8 KiB
TypeScript

// 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,
},
};