Stream 9 (part 2/2) — concrete mode TSX components + routing.
Each firmware mode pairs the generated schema with the appropriate
primary input (XYPad for xy_pad schemas, VirtualJoystick for joystick
schemas) and feeds the runtime's processedOutputs into the shared
SliderBank/OutputDisplay/LossPlot layout. The set:
- PAFSynthMode (xy_pad, voice spaces)
- ChannelStripMode (joystick)
- XIASRIMode (joystick — mic-input wiring deferred to stream 10)
- VerbFXMode (joystick, voice spaces)
- MEMLCeliumMode (xy_pad, voice spaces)
- BreakOrMode (xy_pad)
- ElysiamorfMode (xy_pad)
- SoundAnalysisMIDIMode (audio_in fallback to joystick;
mic capture is a stream-10 task — UI scaffold renders today)
- C15Mode (browser-only placeholder; bridge not yet ported)
App.tsx adds a /modes route that renders <ModeSwitcher /> + the active
mode's component via Solid <Dynamic />. modes/index.ts exposes the
registry the switcher consumes.
69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
/**
|
|
* XIASRIMode — audio-reactive verb / pitch effects driven by joystick.
|
|
*
|
|
* Although the firmware variant historically used audio analysis as input,
|
|
* the playground schema declares `primary_input: 'joystick'` and feeds the
|
|
* MLP from joy_x/joy_y/joy_z/joy_w. The audio-reactive flavour is left to
|
|
* stream 10 (mic input wiring).
|
|
*/
|
|
|
|
import { Component } from 'solid-js';
|
|
import { ModeShell } from './ModeShell';
|
|
import { useModeRuntime } from './mode-runtime';
|
|
import { VirtualJoystick } from '../primitives/VirtualJoystick';
|
|
import { OutputDisplay } from '../primitives/OutputDisplay';
|
|
import { SliderBank } from '../primitives/SliderBank';
|
|
import { LossPlot } from '../primitives/LossPlot';
|
|
import { paramsToSliderConfig, outputsToSliderValues } from './mode-helpers';
|
|
import { XiasriSchema } from './generated/xiasri_schema';
|
|
|
|
export const XIASRIMode: Component = () => {
|
|
const schema = XiasriSchema;
|
|
const runtime = useModeRuntime(schema);
|
|
const sliderConfig = paramsToSliderConfig(schema.params);
|
|
const sliderValues = () => outputsToSliderValues(runtime.processedOutputs(), schema.params);
|
|
|
|
return (
|
|
<ModeShell
|
|
schema={schema}
|
|
runtime={runtime}
|
|
drawerTitle="XIASRI params"
|
|
drawerContent={() => (
|
|
<SliderBank
|
|
title="Live verb / pitch params"
|
|
sliders={sliderConfig}
|
|
values={sliderValues}
|
|
onChange={() => {
|
|
/* read-only */
|
|
}}
|
|
/>
|
|
)}
|
|
primaryInput={() => (
|
|
<>
|
|
<VirtualJoystick
|
|
size={260}
|
|
ariaLabel="XIASRI joystick"
|
|
onMove={(x, y) => runtime.setInput(x, y)}
|
|
position={runtime.pipedInput}
|
|
/>
|
|
<span style={{ 'font-size': 'var(--fs-xs)', color: 'var(--fg-mute)' }}>
|
|
Joystick → verb / pitch space. Mic input wiring is a stream-10 task.
|
|
</span>
|
|
</>
|
|
)}
|
|
outputArea={() => (
|
|
<>
|
|
<OutputDisplay
|
|
values={runtime.processedOutputs}
|
|
width={360}
|
|
height={120}
|
|
color="var(--accent-2)"
|
|
/>
|
|
<LossPlot history={runtime.training.lossHistory} width={360} height={70} />
|
|
</>
|
|
)}
|
|
/>
|
|
);
|
|
};
|
|
|
|
export default XIASRIMode;
|