@signalsandsorcery/plugin-sdk 2.34.1 → 2.35.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +831 -74
- package/dist/index.d.ts +831 -74
- package/dist/index.js +2713 -81
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2702 -82
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React$1, { ReactNode, ComponentType, DragEvent, Dispatch, SetStateAction } from 'react';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Plugin SDK Type Definitions
|
|
@@ -86,6 +86,40 @@ interface InstrumentDescriptor {
|
|
|
86
86
|
/** Whether this plugin is currently installed/available */
|
|
87
87
|
missing?: boolean;
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* One FX plugin in a panel bus's chain, as shown to the panel UI. The
|
|
91
|
+
* engine's Volume & Pan master section and level meter are filtered OUT —
|
|
92
|
+
* they are the strip's fader/meter, not user FX chips.
|
|
93
|
+
* @since SDK 2.36.0
|
|
94
|
+
*/
|
|
95
|
+
interface PanelBusFxEntry {
|
|
96
|
+
/**
|
|
97
|
+
* ENGINE chain index — pass this back to remove/bypass/editor calls.
|
|
98
|
+
* Not necessarily contiguous from 0: hidden master-section plugins share
|
|
99
|
+
* the same chain.
|
|
100
|
+
*/
|
|
101
|
+
index: number;
|
|
102
|
+
/** Scanned plugin id (the picker's `InstrumentDescriptor.pluginId`). */
|
|
103
|
+
pluginId: string;
|
|
104
|
+
/** Display name. */
|
|
105
|
+
name: string;
|
|
106
|
+
/** False when bypassed. */
|
|
107
|
+
enabled: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* A panel's mix-bus state for one scene (docs/panel-bus.md §9).
|
|
111
|
+
* @since SDK 2.36.0
|
|
112
|
+
*/
|
|
113
|
+
interface PanelBusState {
|
|
114
|
+
/** False = the panel has no bus in this scene (flat routing). */
|
|
115
|
+
engaged: boolean;
|
|
116
|
+
/** Master fader in dB (0 = unity). */
|
|
117
|
+
volume: number;
|
|
118
|
+
muted: boolean;
|
|
119
|
+
soloed: boolean;
|
|
120
|
+
/** User FX chain, top-to-bottom (master section excluded). */
|
|
121
|
+
fx: PanelBusFxEntry[];
|
|
122
|
+
}
|
|
89
123
|
/** Every generator plugin must implement this interface. */
|
|
90
124
|
interface GeneratorPlugin {
|
|
91
125
|
/** Unique ID, npm-style scope: '@sas/synth-generator', '@user/my-plugin' */
|
|
@@ -565,6 +599,43 @@ interface PluginHost {
|
|
|
565
599
|
* origin/target scenes). Optional — callers MUST null-check. @since SDK 2.26.0
|
|
566
600
|
*/
|
|
567
601
|
getSceneName?(sceneDbId: string): Promise<string | null>;
|
|
602
|
+
/**
|
|
603
|
+
* FX plugins available for the bus picker (scanned, non-instrument).
|
|
604
|
+
* Same descriptor shape as `getAvailableInstruments` by design — the SDK
|
|
605
|
+
* picker components consume one type.
|
|
606
|
+
*/
|
|
607
|
+
getAvailableFx?(): Promise<InstrumentDescriptor[]>;
|
|
608
|
+
/**
|
|
609
|
+
* The panel's bus state for a scene. `{ engaged: false, … }` when the
|
|
610
|
+
* panel has no bus there — reading NEVER creates one. When engaged, this
|
|
611
|
+
* also (re)realizes the bus in the engine (adopt-by-marker; rebuild from
|
|
612
|
+
* the persisted blob only after a `.sasproj` import) and routes any
|
|
613
|
+
* not-yet-routed panel tracks through it, so calling it from `loadTracks`
|
|
614
|
+
* is the panel's whole reload story.
|
|
615
|
+
*/
|
|
616
|
+
getPanelBusState?(sceneId: string): Promise<PanelBusState>;
|
|
617
|
+
/** Master fader in dB (engages the bus on first use). */
|
|
618
|
+
setPanelBusVolume?(sceneId: string, volumeDb: number): Promise<void>;
|
|
619
|
+
/** Bus mute — silences the whole panel (multiplies with per-track mutes). */
|
|
620
|
+
setPanelBusMute?(sceneId: string, muted: boolean): Promise<void>;
|
|
621
|
+
/** Panel solo — composes with track solo via the engine's solo rules. */
|
|
622
|
+
setPanelBusSolo?(sceneId: string, soloed: boolean): Promise<void>;
|
|
623
|
+
/**
|
|
624
|
+
* Add an FX plugin (by scanned pluginId) to the bus chain, engaging the
|
|
625
|
+
* bus if needed. Instruments are rejected engine-side.
|
|
626
|
+
*/
|
|
627
|
+
loadPanelBusFx?(sceneId: string, pluginId: string): Promise<PanelBusFxEntry>;
|
|
628
|
+
/** Remove a bus FX by its `PanelBusFxEntry.index`. */
|
|
629
|
+
removePanelBusFx?(sceneId: string, fxIndex: number): Promise<void>;
|
|
630
|
+
/** Bypass toggle for a bus FX by its `PanelBusFxEntry.index`. */
|
|
631
|
+
setPanelBusFxEnabled?(sceneId: string, fxIndex: number, enabled: boolean): Promise<void>;
|
|
632
|
+
/** Open the native editor window for a bus FX. */
|
|
633
|
+
showPanelBusFxEditor?(sceneId: string, fxIndex: number): Promise<void>;
|
|
634
|
+
/**
|
|
635
|
+
* Disengage the bus: FX chain removed, tracks reparented back under the
|
|
636
|
+
* scene, persisted state deleted. The panel returns to flat routing.
|
|
637
|
+
*/
|
|
638
|
+
disengagePanelBus?(sceneId: string): Promise<void>;
|
|
568
639
|
/** Subscribe to transport state changes. Returns unsubscribe function. */
|
|
569
640
|
onTransportEvent(listener: TransportEventListener): UnsubscribeFn;
|
|
570
641
|
/** Subscribe to deck boundary events. Returns unsubscribe function. */
|
|
@@ -2324,7 +2395,7 @@ interface TrackDrawerProps {
|
|
|
2324
2395
|
/** Optional single-note preview when the user adds a note. */
|
|
2325
2396
|
onAuditionNote?: (pitch: number, velocity: number, durationMs: number) => void;
|
|
2326
2397
|
}
|
|
2327
|
-
declare function TrackDrawer({ activeTab, onTabChange, trackId, fxState, onFxToggle, onFxPresetChange, onFxDryWetChange, fxDisabled, instruments, currentPluginId, isLoading, onSelect, onRefresh, editorStage, onShowEditor, onBackToInstruments, selectedInstrumentName, soundHistory, soundHistoryCursor, onRestoreSound, onToggleFavorite, onImportSound, importSoundLabel, editNotes, onNotesChange, editBars, editBpm, editSnap, onAuditionNote, }: TrackDrawerProps): React.ReactElement;
|
|
2398
|
+
declare function TrackDrawer({ activeTab, onTabChange, trackId, fxState, onFxToggle, onFxPresetChange, onFxDryWetChange, fxDisabled, instruments, currentPluginId, isLoading, onSelect, onRefresh, editorStage, onShowEditor, onBackToInstruments, selectedInstrumentName, soundHistory, soundHistoryCursor, onRestoreSound, onToggleFavorite, onImportSound, importSoundLabel, editNotes, onNotesChange, editBars, editBpm, editSnap, onAuditionNote, }: TrackDrawerProps): React$1.ReactElement;
|
|
2328
2399
|
|
|
2329
2400
|
/**
|
|
2330
2401
|
* useTrackLevels — drives the cosmetic per-track strip meters.
|
|
@@ -2525,7 +2596,7 @@ interface SDKTrackRowProps {
|
|
|
2525
2596
|
* like CrossfadeTrackRow owns a single delete for the whole pair). */
|
|
2526
2597
|
onDelete?: () => void;
|
|
2527
2598
|
/** Custom content replacing the prompt input (e.g., sample info display) */
|
|
2528
|
-
contentSlot?: React.ReactNode;
|
|
2599
|
+
contentSlot?: React$1.ReactNode;
|
|
2529
2600
|
/** Toggle mute */
|
|
2530
2601
|
onMuteToggle: () => void;
|
|
2531
2602
|
/** Toggle solo */
|
|
@@ -2599,7 +2670,7 @@ interface SDKTrackRowProps {
|
|
|
2599
2670
|
* a thin peak meter welds to the bottom of the row. Omit to hide it. */
|
|
2600
2671
|
levels?: TrackLevelsHandle;
|
|
2601
2672
|
}
|
|
2602
|
-
declare function TrackRow({ track, prompt, runtimeState, soloedOut, fxDetailState, drawerOpen, drawerTab, onTabChange, isGenerating, isAuthenticated, error, hasMidi, generationProgress, estimatedGenerationMs, onPromptChange, onGenerate, onShuffle, onCopy, onDelete, contentSlot, onMuteToggle, onSoloToggle, onVolumeChange, onPanChange, onFxToggle, onFxPresetChange, onFxDryWetChange, onToggleFxDrawer, onProgressChange, accentColor, instrumentName, instrumentMissing, onToggleDrawer, availableInstruments, currentInstrumentPluginId, onInstrumentSelect, instrumentsLoading, onRefreshInstruments, editorStage, onShowEditor, onBackToInstruments, soundHistory, soundHistoryCursor, onRestoreSound, onToggleFavorite, onImportSound, importSoundLabel, editNotes, onNotesChange, editBars, editBpm, editSnap, onAuditionNote, drag, levels, }: SDKTrackRowProps): React.ReactElement;
|
|
2673
|
+
declare function TrackRow({ track, prompt, runtimeState, soloedOut, fxDetailState, drawerOpen, drawerTab, onTabChange, isGenerating, isAuthenticated, error, hasMidi, generationProgress, estimatedGenerationMs, onPromptChange, onGenerate, onShuffle, onCopy, onDelete, contentSlot, onMuteToggle, onSoloToggle, onVolumeChange, onPanChange, onFxToggle, onFxPresetChange, onFxDryWetChange, onToggleFxDrawer, onProgressChange, accentColor, instrumentName, instrumentMissing, onToggleDrawer, availableInstruments, currentInstrumentPluginId, onInstrumentSelect, instrumentsLoading, onRefreshInstruments, editorStage, onShowEditor, onBackToInstruments, soundHistory, soundHistoryCursor, onRestoreSound, onToggleFavorite, onImportSound, importSoundLabel, editNotes, onNotesChange, editBars, editBpm, editSnap, onAuditionNote, drag, levels, }: SDKTrackRowProps): React$1.ReactElement;
|
|
2603
2674
|
|
|
2604
2675
|
/**
|
|
2605
2676
|
* Crossfade-pair metadata — family-agnostic types + parsing shared by every
|
|
@@ -2762,7 +2833,7 @@ interface CrossfadeTrackRowProps {
|
|
|
2762
2833
|
/** Left-border accent. Defaults to transition purple. */
|
|
2763
2834
|
accentColor?: string;
|
|
2764
2835
|
}
|
|
2765
|
-
declare function CrossfadeTrackRow({ origin, target, sliderPos, onMuteToggle, onSoloToggle, onVolumeChange, onPanChange, onDelete, onSliderChange, levels, accentColor, }: CrossfadeTrackRowProps): React.ReactElement;
|
|
2836
|
+
declare function CrossfadeTrackRow({ origin, target, sliderPos, onMuteToggle, onSoloToggle, onVolumeChange, onPanChange, onDelete, onSliderChange, levels, accentColor, }: CrossfadeTrackRowProps): React$1.ReactElement;
|
|
2766
2837
|
|
|
2767
2838
|
/**
|
|
2768
2839
|
* Crossfade MIDI inpainting — builds the LLM user-prompt for a bridge that
|
|
@@ -2984,7 +3055,7 @@ interface FadeTrackRowProps {
|
|
|
2984
3055
|
/** Left-border accent. Defaults to transition purple. */
|
|
2985
3056
|
accentColor?: string;
|
|
2986
3057
|
}
|
|
2987
|
-
declare function FadeTrackRow({ layer, direction, gesture, effect, sliderPos, onMuteToggle, onSoloToggle, onVolumeChange, onPanChange, onDelete, onSliderChange, levels, accentColor, }: FadeTrackRowProps): React.ReactElement;
|
|
3058
|
+
declare function FadeTrackRow({ layer, direction, gesture, effect, sliderPos, onMuteToggle, onSoloToggle, onVolumeChange, onPanChange, onDelete, onSliderChange, levels, accentColor, }: FadeTrackRowProps): React$1.ReactElement;
|
|
2988
3059
|
|
|
2989
3060
|
/**
|
|
2990
3061
|
* FadeModal — "add a fade" picker for a transition scene.
|
|
@@ -3039,7 +3110,7 @@ interface FadeModalProps {
|
|
|
3039
3110
|
/** data-testid prefix. */
|
|
3040
3111
|
testIdPrefix?: string;
|
|
3041
3112
|
}
|
|
3042
|
-
declare function FadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, excludeSourceDbIds, onClose, onCreate, testIdPrefix, }: FadeModalProps): React.ReactElement | null;
|
|
3113
|
+
declare function FadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, excludeSourceDbIds, onClose, onCreate, testIdPrefix, }: FadeModalProps): React$1.ReactElement | null;
|
|
3043
3114
|
|
|
3044
3115
|
/**
|
|
3045
3116
|
* ImportTrackModal — "import a track from another scene" picker (SDK component).
|
|
@@ -3097,7 +3168,7 @@ interface ImportTrackModalProps {
|
|
|
3097
3168
|
role?: string;
|
|
3098
3169
|
}) => void | Promise<void>;
|
|
3099
3170
|
}
|
|
3100
|
-
declare function ImportTrackModal({ host, open, onClose, onImported, title, testIdPrefix, mode, onPick, onPortTrack, }: ImportTrackModalProps): React.ReactElement | null;
|
|
3171
|
+
declare function ImportTrackModal({ host, open, onClose, onImported, title, testIdPrefix, mode, onPick, onPortTrack, }: ImportTrackModalProps): React$1.ReactElement | null;
|
|
3101
3172
|
|
|
3102
3173
|
/**
|
|
3103
3174
|
* CrossfadeModal — "add a crossfade track" picker for a transition scene.
|
|
@@ -3153,7 +3224,7 @@ interface CrossfadeModalProps {
|
|
|
3153
3224
|
/** data-testid prefix. */
|
|
3154
3225
|
testIdPrefix?: string;
|
|
3155
3226
|
}
|
|
3156
|
-
declare function CrossfadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, excludeSourceDbIds, onClose, onCreate, testIdPrefix, }: CrossfadeModalProps): React.ReactElement | null;
|
|
3227
|
+
declare function CrossfadeModal({ host, open, fromSceneId, toSceneId, fromSceneName, toSceneName, excludeSourceDbIds, onClose, onCreate, testIdPrefix, }: CrossfadeModalProps): React$1.ReactElement | null;
|
|
3157
3228
|
|
|
3158
3229
|
/**
|
|
3159
3230
|
* TransitionDesigner — the per-panel transition staging board, rendered INLINE as
|
|
@@ -3221,7 +3292,7 @@ interface TransitionDesignerProps {
|
|
|
3221
3292
|
/** data-testid prefix. */
|
|
3222
3293
|
testIdPrefix?: string;
|
|
3223
3294
|
}
|
|
3224
|
-
declare function TransitionDesigner({ host, fromSceneId, toSceneId, transitionSceneId, excludeSourceDbIds, onCreateCrossfade, onCreateFade, onCreateAudioTransition, familyLabel, testIdPrefix, }: TransitionDesignerProps): React.ReactElement;
|
|
3295
|
+
declare function TransitionDesigner({ host, fromSceneId, toSceneId, transitionSceneId, excludeSourceDbIds, onCreateCrossfade, onCreateFade, onCreateAudioTransition, familyLabel, testIdPrefix, }: TransitionDesignerProps): React$1.ReactElement;
|
|
3225
3296
|
|
|
3226
3297
|
/**
|
|
3227
3298
|
* Transition Designer — pure helpers for the per-panel transition staging board.
|
|
@@ -3351,7 +3422,7 @@ interface ConfirmDialogProps {
|
|
|
3351
3422
|
/** Bold heading line. */
|
|
3352
3423
|
title: string;
|
|
3353
3424
|
/** Body copy — a string or richer node. */
|
|
3354
|
-
message: React.ReactNode;
|
|
3425
|
+
message: React$1.ReactNode;
|
|
3355
3426
|
/** Confirm button label (default "Delete"). */
|
|
3356
3427
|
confirmLabel?: string;
|
|
3357
3428
|
/** Cancel button label (default "Cancel"). */
|
|
@@ -3365,7 +3436,7 @@ interface ConfirmDialogProps {
|
|
|
3365
3436
|
/** data-testid prefix so each dialog is addressable in tests. */
|
|
3366
3437
|
testIdPrefix?: string;
|
|
3367
3438
|
}
|
|
3368
|
-
declare function ConfirmDialog({ open, title, message, confirmLabel, cancelLabel, destructive, onConfirm, onCancel, testIdPrefix, }: ConfirmDialogProps): React.ReactElement | null;
|
|
3439
|
+
declare function ConfirmDialog({ open, title, message, confirmLabel, cancelLabel, destructive, onConfirm, onCancel, testIdPrefix, }: ConfirmDialogProps): React$1.ReactElement | null;
|
|
3369
3440
|
|
|
3370
3441
|
/**
|
|
3371
3442
|
* Modal — the SDK's one modal-stacking primitive (portal + z-tier + backdrop).
|
|
@@ -3392,7 +3463,7 @@ interface ModalProps {
|
|
|
3392
3463
|
/** Close handler — fired on Escape and backdrop click. */
|
|
3393
3464
|
onClose: () => void;
|
|
3394
3465
|
/** The dialog box. Give it `onClick={e => e.stopPropagation()}`. */
|
|
3395
|
-
children: React.ReactNode;
|
|
3466
|
+
children: React$1.ReactNode;
|
|
3396
3467
|
/** data-testid prefix; the backdrop is `${testIdPrefix}-overlay`. */
|
|
3397
3468
|
testIdPrefix?: string;
|
|
3398
3469
|
/** Close when the backdrop is clicked (default true). */
|
|
@@ -3400,9 +3471,9 @@ interface ModalProps {
|
|
|
3400
3471
|
/** Close on Escape (default true). */
|
|
3401
3472
|
closeOnEscape?: boolean;
|
|
3402
3473
|
/** Focused when the modal opens (e.g. a Cancel button) so a reflexive Enter is safe. */
|
|
3403
|
-
initialFocusRef?: React.RefObject<HTMLElement>;
|
|
3474
|
+
initialFocusRef?: React$1.RefObject<HTMLElement>;
|
|
3404
3475
|
}
|
|
3405
|
-
declare function Modal({ open, onClose, children, testIdPrefix, closeOnBackdrop, closeOnEscape, initialFocusRef, }: ModalProps): React.ReactElement | null;
|
|
3476
|
+
declare function Modal({ open, onClose, children, testIdPrefix, closeOnBackdrop, closeOnEscape, initialFocusRef, }: ModalProps): React$1.ReactElement | null;
|
|
3406
3477
|
|
|
3407
3478
|
/**
|
|
3408
3479
|
* PianoRollEditor — a compact, DOM-based MIDI note editor for the track drawer.
|
|
@@ -3507,7 +3578,7 @@ interface PianoRollEditorProps {
|
|
|
3507
3578
|
/** Test id for the outer container. Default "sdk-piano-roll". */
|
|
3508
3579
|
testId?: string;
|
|
3509
3580
|
}
|
|
3510
|
-
declare function PianoRollEditor({ notes, onChange, bars, bpm, beatsPerBar, snap, snapOptions, onSnapChange, minPitch, maxPitch, autoFit, onAuditionNote, defaultVelocity, disabled, className, testId, }: PianoRollEditorProps): React.ReactElement;
|
|
3581
|
+
declare function PianoRollEditor({ notes, onChange, bars, bpm, beatsPerBar, snap, snapOptions, onSnapChange, minPitch, maxPitch, autoFit, onAuditionNote, defaultVelocity, disabled, className, testId, }: PianoRollEditorProps): React$1.ReactElement;
|
|
3511
3582
|
|
|
3512
3583
|
/**
|
|
3513
3584
|
* VolumeSlider Component
|
|
@@ -3526,7 +3597,88 @@ interface VolumeSliderProps {
|
|
|
3526
3597
|
/** Additional CSS classes */
|
|
3527
3598
|
className?: string;
|
|
3528
3599
|
}
|
|
3529
|
-
declare const VolumeSlider: React.FC<VolumeSliderProps>;
|
|
3600
|
+
declare const VolumeSlider: React$1.FC<VolumeSliderProps>;
|
|
3601
|
+
|
|
3602
|
+
/**
|
|
3603
|
+
* PanelMasterStrip — the panel's mix-bus master section (docs/panel-bus.md §10).
|
|
3604
|
+
*
|
|
3605
|
+
* One compact strip: BUS label + master fader + M/S + the bus FX chain as
|
|
3606
|
+
* chips (bypass toggle, remove, optional native-editor open) + an "FX +"
|
|
3607
|
+
* picker that reuses the TrackDrawer Pick-tab grid idiom over FX descriptors.
|
|
3608
|
+
*
|
|
3609
|
+
* Fully CONTROLLED and presentational: the panel owns `bus` (from
|
|
3610
|
+
* `host.getPanelBusState`), the picker-open flag, and wires every callback to
|
|
3611
|
+
* the corresponding `host.*PanelBus*` method. A disengaged bus renders the
|
|
3612
|
+
* same strip at neutral values — the first interaction engages it host-side,
|
|
3613
|
+
* so there is no separate "create bus" affordance to learn.
|
|
3614
|
+
*/
|
|
3615
|
+
|
|
3616
|
+
interface PanelMasterStripProps {
|
|
3617
|
+
/** Bus state from `host.getPanelBusState(sceneId)`. */
|
|
3618
|
+
bus: PanelBusState;
|
|
3619
|
+
/** FX descriptors from `host.getAvailableFx()` (lazy-load on picker open). */
|
|
3620
|
+
availableFx?: InstrumentDescriptor[];
|
|
3621
|
+
/** True while `availableFx` is loading. */
|
|
3622
|
+
fxLoading?: boolean;
|
|
3623
|
+
/**
|
|
3624
|
+
* Another panel/track solo is active and this bus is NOT soloed — render
|
|
3625
|
+
* dimmed, mirroring TrackRow's soloed-out treatment. Feed
|
|
3626
|
+
* `anySolo && !bus.soloed` from the panel's `useAnySolo(host)` hook.
|
|
3627
|
+
*/
|
|
3628
|
+
soloedOut?: boolean;
|
|
3629
|
+
/** Disable all controls (e.g. while the panel is generating). */
|
|
3630
|
+
disabled?: boolean;
|
|
3631
|
+
/** Controlled FX-picker visibility. */
|
|
3632
|
+
fxPickerOpen: boolean;
|
|
3633
|
+
onToggleFxPicker: (open: boolean) => void;
|
|
3634
|
+
/** Re-scan / refresh the FX list. */
|
|
3635
|
+
onRefreshFx?: () => void;
|
|
3636
|
+
onVolumeChange: (volumeDb: number) => void;
|
|
3637
|
+
onMuteToggle: () => void;
|
|
3638
|
+
onSoloToggle: () => void;
|
|
3639
|
+
onAddFx: (pluginId: string) => void;
|
|
3640
|
+
onRemoveFx: (fxIndex: number) => void;
|
|
3641
|
+
onToggleFxEnabled: (fxIndex: number, enabled: boolean) => void;
|
|
3642
|
+
/** Optional: open the FX plugin's native editor window. */
|
|
3643
|
+
onShowFxEditor?: (fxIndex: number) => void;
|
|
3644
|
+
}
|
|
3645
|
+
declare function PanelMasterStrip({ bus, availableFx, fxLoading, soloedOut, disabled, fxPickerOpen, onToggleFxPicker, onRefreshFx, onVolumeChange, onMuteToggle, onSoloToggle, onAddFx, onRemoveFx, onToggleFxEnabled, onShowFxEditor, }: PanelMasterStripProps): React$1.ReactElement;
|
|
3646
|
+
|
|
3647
|
+
/**
|
|
3648
|
+
* usePanelBus — panel-side state + handlers for the PanelMasterStrip
|
|
3649
|
+
* (docs/panel-bus.md §11).
|
|
3650
|
+
*
|
|
3651
|
+
* Feature-gated: `supported` is false on hosts without the panel-bus surface
|
|
3652
|
+
* (older app builds), and every consumer should render nothing in that case —
|
|
3653
|
+
* the strip must never appear on a host that can't back it. Reading state
|
|
3654
|
+
* NEVER engages a bus; the first mutation (fader move / FX add) does, host-side.
|
|
3655
|
+
*
|
|
3656
|
+
* Reload story: state re-reads on scene change and after every mutation.
|
|
3657
|
+
* `getPanelBusState` host-side also (re)realizes the bus (adopt-by-marker)
|
|
3658
|
+
* and routes not-yet-routed panel tracks, so calling `reload()` from the
|
|
3659
|
+
* panel's track-reload path keeps everything converged with zero extra wiring.
|
|
3660
|
+
*/
|
|
3661
|
+
|
|
3662
|
+
interface UsePanelBusResult {
|
|
3663
|
+
/** False on pre-2.36 hosts — render no strip. */
|
|
3664
|
+
supported: boolean;
|
|
3665
|
+
/** Null until the first load completes for the current scene. */
|
|
3666
|
+
bus: PanelBusState | null;
|
|
3667
|
+
availableFx: InstrumentDescriptor[];
|
|
3668
|
+
fxLoading: boolean;
|
|
3669
|
+
fxPickerOpen: boolean;
|
|
3670
|
+
setFxPickerOpen: (open: boolean) => void;
|
|
3671
|
+
refreshFx: () => void;
|
|
3672
|
+
reload: () => Promise<void>;
|
|
3673
|
+
onVolumeChange: (volumeDb: number) => void;
|
|
3674
|
+
onMuteToggle: () => void;
|
|
3675
|
+
onSoloToggle: () => void;
|
|
3676
|
+
onAddFx: (pluginId: string) => void;
|
|
3677
|
+
onRemoveFx: (fxIndex: number) => void;
|
|
3678
|
+
onToggleFxEnabled: (fxIndex: number, enabled: boolean) => void;
|
|
3679
|
+
onShowFxEditor: (fxIndex: number) => void;
|
|
3680
|
+
}
|
|
3681
|
+
declare function usePanelBus(host: PluginHost, activeSceneId: string | null): UsePanelBusResult;
|
|
3530
3682
|
|
|
3531
3683
|
/**
|
|
3532
3684
|
* PanSlider Component
|
|
@@ -3546,7 +3698,7 @@ interface PanSliderProps {
|
|
|
3546
3698
|
/** Additional CSS classes */
|
|
3547
3699
|
className?: string;
|
|
3548
3700
|
}
|
|
3549
|
-
declare const PanSlider: React.FC<PanSliderProps>;
|
|
3701
|
+
declare const PanSlider: React$1.FC<PanSliderProps>;
|
|
3550
3702
|
|
|
3551
3703
|
/**
|
|
3552
3704
|
* FxToggleBar Component
|
|
@@ -3565,7 +3717,7 @@ interface FxToggleBarProps {
|
|
|
3565
3717
|
onDryWetChange: (trackId: string, category: FxCategory, value: number) => void;
|
|
3566
3718
|
disabled?: boolean;
|
|
3567
3719
|
}
|
|
3568
|
-
declare const FxToggleBar: React.FC<FxToggleBarProps>;
|
|
3720
|
+
declare const FxToggleBar: React$1.FC<FxToggleBarProps>;
|
|
3569
3721
|
|
|
3570
3722
|
/**
|
|
3571
3723
|
* SorceryProgressBar Component
|
|
@@ -3620,7 +3772,7 @@ declare function calculateTimeBasedTarget(elapsedMs: number, estimatedDurationMs
|
|
|
3620
3772
|
/**
|
|
3621
3773
|
* SorceryProgressBar - A mystical progress bar for uncertain wait times
|
|
3622
3774
|
*/
|
|
3623
|
-
declare function SorceryProgressBar({ isLoading, statusText, completeText, onComplete, heightClass, initialProgress, onProgressChange, estimatedDurationMs, }: SorceryProgressBarProps): React.ReactElement | null;
|
|
3775
|
+
declare function SorceryProgressBar({ isLoading, statusText, completeText, onComplete, heightClass, initialProgress, onProgressChange, estimatedDurationMs, }: SorceryProgressBarProps): React$1.ReactElement | null;
|
|
3624
3776
|
|
|
3625
3777
|
/**
|
|
3626
3778
|
* DownloadPackButton — versioned-pack download trigger (SDK component).
|
|
@@ -3647,7 +3799,7 @@ interface DownloadPackButtonProps {
|
|
|
3647
3799
|
/** Called once after the install completes (status === 'complete'). */
|
|
3648
3800
|
onDownloadComplete?: () => void;
|
|
3649
3801
|
}
|
|
3650
|
-
declare const DownloadPackButton: React.FC<DownloadPackButtonProps>;
|
|
3802
|
+
declare const DownloadPackButton: React$1.FC<DownloadPackButtonProps>;
|
|
3651
3803
|
|
|
3652
3804
|
/**
|
|
3653
3805
|
* SamplePackCTACard — empty-state card a generator panel renders when its
|
|
@@ -3674,7 +3826,7 @@ interface SamplePackCTACardProps {
|
|
|
3674
3826
|
status: SamplePackCTACardStatus;
|
|
3675
3827
|
onDownloadComplete?: () => void;
|
|
3676
3828
|
}
|
|
3677
|
-
declare const SamplePackCTACard: React.FC<SamplePackCTACardProps>;
|
|
3829
|
+
declare const SamplePackCTACard: React$1.FC<SamplePackCTACardProps>;
|
|
3678
3830
|
|
|
3679
3831
|
/**
|
|
3680
3832
|
* WaveformView — small canvas waveform for an audio file on disk.
|
|
@@ -3707,7 +3859,7 @@ interface WaveformViewProps {
|
|
|
3707
3859
|
*/
|
|
3708
3860
|
targetSamples?: number;
|
|
3709
3861
|
}
|
|
3710
|
-
declare const WaveformView: React.FC<WaveformViewProps>;
|
|
3862
|
+
declare const WaveformView: React$1.FC<WaveformViewProps>;
|
|
3711
3863
|
|
|
3712
3864
|
/**
|
|
3713
3865
|
* Shared level-meter component.
|
|
@@ -3753,7 +3905,7 @@ interface LevelMeterProps {
|
|
|
3753
3905
|
/** Inline test id — make multiple instances distinguishable. */
|
|
3754
3906
|
'data-testid'?: string;
|
|
3755
3907
|
}
|
|
3756
|
-
declare const LevelMeter: React.FC<LevelMeterProps>;
|
|
3908
|
+
declare const LevelMeter: React$1.FC<LevelMeterProps>;
|
|
3757
3909
|
|
|
3758
3910
|
/**
|
|
3759
3911
|
* TrackMeterStrip — the thin per-track peak meter welded to the bottom of a
|
|
@@ -3776,7 +3928,7 @@ interface TrackMeterStripProps {
|
|
|
3776
3928
|
/** Optional className for layout tweaks on the wrapper. */
|
|
3777
3929
|
className?: string;
|
|
3778
3930
|
}
|
|
3779
|
-
declare const TrackMeterStrip: React.FC<TrackMeterStripProps>;
|
|
3931
|
+
declare const TrackMeterStrip: React$1.FC<TrackMeterStripProps>;
|
|
3780
3932
|
|
|
3781
3933
|
/**
|
|
3782
3934
|
* ScrollingWaveform — live waveform during recording (Phase 8.10).
|
|
@@ -3807,7 +3959,7 @@ interface ScrollingWaveformProps {
|
|
|
3807
3959
|
/** Highlight color for the wave. */
|
|
3808
3960
|
fillStyle?: string;
|
|
3809
3961
|
}
|
|
3810
|
-
declare const ScrollingWaveform: React.FC<ScrollingWaveformProps>;
|
|
3962
|
+
declare const ScrollingWaveform: React$1.FC<ScrollingWaveformProps>;
|
|
3811
3963
|
|
|
3812
3964
|
/**
|
|
3813
3965
|
* OffsetScrubber — manual sample-offset slider for Lyria-generated audio.
|
|
@@ -3847,7 +3999,7 @@ interface OffsetScrubberProps {
|
|
|
3847
3999
|
/** Disable interaction (e.g., during generation / split). */
|
|
3848
4000
|
disabled?: boolean;
|
|
3849
4001
|
}
|
|
3850
|
-
declare function OffsetScrubber({ cuePoints, offsetSamples, projectBpm, meter, onChange, disabled, }: OffsetScrubberProps): React.ReactElement;
|
|
4002
|
+
declare function OffsetScrubber({ cuePoints, offsetSamples, projectBpm, meter, onChange, disabled, }: OffsetScrubberProps): React$1.ReactElement;
|
|
3851
4003
|
|
|
3852
4004
|
/**
|
|
3853
4005
|
* Shared waveform peaks + canvas drawer.
|
|
@@ -3939,51 +4091,6 @@ interface SynthesizeCuePointsOptions {
|
|
|
3939
4091
|
}
|
|
3940
4092
|
declare function synthesizeCuePoints({ bpm, sampleRate, bars, meter, }: SynthesizeCuePointsOptions): PluginCuePoints;
|
|
3941
4093
|
|
|
3942
|
-
/**
|
|
3943
|
-
* useSceneState — Scene-keyed state hook for plugin developers.
|
|
3944
|
-
*
|
|
3945
|
-
* Works like `useState`, but maintains separate state per scene.
|
|
3946
|
-
* When the user switches scenes, the previous scene's state is preserved
|
|
3947
|
-
* and restored when they switch back.
|
|
3948
|
-
*
|
|
3949
|
-
* Returns `[value, setForCurrentScene, setForScene]`:
|
|
3950
|
-
* - `value` — state for the currently active scene
|
|
3951
|
-
* - `setForCurrentScene(v)` — updates state for whatever scene is active at call time
|
|
3952
|
-
* - `setForScene(sceneId, v)` — updates state for a specific scene (for async callbacks)
|
|
3953
|
-
*
|
|
3954
|
-
* Both setters support the functional updater pattern: `prev => next`.
|
|
3955
|
-
*
|
|
3956
|
-
* **Important:** For object/array `initialValue`, hoist to a module-level constant
|
|
3957
|
-
* to keep the setter callbacks referentially stable:
|
|
3958
|
-
* ```ts
|
|
3959
|
-
* const EMPTY: string[] = [];
|
|
3960
|
-
* const [items, setItems, setItemsForScene] = useSceneState(activeSceneId, EMPTY);
|
|
3961
|
-
* ```
|
|
3962
|
-
*/
|
|
3963
|
-
type SetSceneState<T> = (value: T | ((prev: T) => T)) => void;
|
|
3964
|
-
type SetSceneStateForScene<T> = (sceneId: string, value: T | ((prev: T) => T)) => void;
|
|
3965
|
-
declare function useSceneState<T>(activeSceneId: string | null, initialValue: T): [T, SetSceneState<T>, SetSceneStateForScene<T>];
|
|
3966
|
-
|
|
3967
|
-
/**
|
|
3968
|
-
* useAnySolo — reactively reports whether ANY track in the project is soloed.
|
|
3969
|
-
*
|
|
3970
|
-
* Solo is cross-panel: when the user solos a track in ANY panel, the engine's
|
|
3971
|
-
* effective-mute model silences every non-soloed track. A panel uses this flag
|
|
3972
|
-
* to DIM its own non-soloed rows without lighting their Mute buttons:
|
|
3973
|
-
*
|
|
3974
|
-
* ```tsx
|
|
3975
|
-
* const anySolo = useAnySolo(host);
|
|
3976
|
-
* // ...
|
|
3977
|
-
* <TrackRow soloedOut={anySolo && !track.runtimeState.solo} ... />
|
|
3978
|
-
* ```
|
|
3979
|
-
*
|
|
3980
|
-
* Refreshes on mount and on every track-state change. `onTrackStateChange`
|
|
3981
|
-
* fires for tracks in ALL panels (not just this plugin's), so a solo toggled in
|
|
3982
|
-
* another panel updates this flag too.
|
|
3983
|
-
*/
|
|
3984
|
-
|
|
3985
|
-
declare function useAnySolo(host: Pick<PluginHost, 'isAnySoloActive' | 'onTrackStateChange'>): boolean;
|
|
3986
|
-
|
|
3987
4094
|
/**
|
|
3988
4095
|
* useSoundHistory — generic, per-track "what sounds has this track had?" stack.
|
|
3989
4096
|
*
|
|
@@ -4045,6 +4152,656 @@ interface UseSoundHistoryResult {
|
|
|
4045
4152
|
}
|
|
4046
4153
|
declare function useSoundHistory(applySound: (trackId: string, descriptor: unknown) => Promise<void>, opts?: UseSoundHistoryOptions): UseSoundHistoryResult;
|
|
4047
4154
|
|
|
4155
|
+
/**
|
|
4156
|
+
* Per-track state model shared by every generator panel built on the
|
|
4157
|
+
* panel-core. Verbatim generalization of the synth panel's SynthTrackState
|
|
4158
|
+
* (SynthGeneratorPanel.tsx:67–100) — field names, defaults, and semantics are
|
|
4159
|
+
* frozen by the Phase-0 behavior pin.
|
|
4160
|
+
*
|
|
4161
|
+
* @since SDK 2.35.0
|
|
4162
|
+
*/
|
|
4163
|
+
|
|
4164
|
+
/** Internal track state combining handle + runtime state + prompt. */
|
|
4165
|
+
interface GeneratorTrackState {
|
|
4166
|
+
handle: PluginTrackHandle;
|
|
4167
|
+
prompt: string;
|
|
4168
|
+
role: string;
|
|
4169
|
+
runtimeState: PluginTrackRuntimeState;
|
|
4170
|
+
fxDetailState: TrackFxDetailState;
|
|
4171
|
+
drawerOpen: boolean;
|
|
4172
|
+
drawerTab: DrawerTab;
|
|
4173
|
+
editorStage: boolean;
|
|
4174
|
+
isGenerating: boolean;
|
|
4175
|
+
error: string | null;
|
|
4176
|
+
hasMidi: boolean;
|
|
4177
|
+
generationProgress: number;
|
|
4178
|
+
editNotes: PluginMidiNote[];
|
|
4179
|
+
editBars: number;
|
|
4180
|
+
editBpm: number;
|
|
4181
|
+
instrumentPluginId: string | null;
|
|
4182
|
+
instrumentName: string | null;
|
|
4183
|
+
instrumentMissing: boolean;
|
|
4184
|
+
/**
|
|
4185
|
+
* Per-track shuffle history: sound/preset names already handed back since
|
|
4186
|
+
* the track was created OR since the history was reset (which happens
|
|
4187
|
+
* automatically when the pool is exhausted — the family shuffle adapter
|
|
4188
|
+
* reports "exhausted" and the core wipes the history and retries). Cycle
|
|
4189
|
+
* pattern: cycle through everything before any repeat.
|
|
4190
|
+
*/
|
|
4191
|
+
shuffleHistory: Set<string>;
|
|
4192
|
+
}
|
|
4193
|
+
/**
|
|
4194
|
+
* Fresh track state with the panel defaults (the add-track literal at
|
|
4195
|
+
* SynthGeneratorPanel.tsx:634–654). `overrides` lets loadTracks hydrate
|
|
4196
|
+
* prompt/role/runtime/fx/etc. from fetched state in one construction.
|
|
4197
|
+
*/
|
|
4198
|
+
declare function newTrackState(handle: PluginTrackHandle, overrides?: Partial<Omit<GeneratorTrackState, 'handle'>>): GeneratorTrackState;
|
|
4199
|
+
|
|
4200
|
+
/**
|
|
4201
|
+
* Generic multi-track group seam — the crossfade-pair pattern, family- and
|
|
4202
|
+
* meta-parameterized.
|
|
4203
|
+
*
|
|
4204
|
+
* A "track group" is N normal tracks linked by a shared `groupId` persisted in
|
|
4205
|
+
* scene plugin_data under one key PER MEMBER: `track:<dbId>:<metaKey>`. Groups
|
|
4206
|
+
* are never stored as a group-level record; they are assembled by scanning the
|
|
4207
|
+
* member keys (single source of truth, survives member deletion gracefully).
|
|
4208
|
+
* The panel-core resolves parsed groups against live tracks each render:
|
|
4209
|
+
* complete groups render through a custom group row and their members are
|
|
4210
|
+
* excluded from the normal row list; incomplete groups degrade per the
|
|
4211
|
+
* extension's `isComplete` policy (crossfade: both members required; a bass
|
|
4212
|
+
* voice-group: anchor required).
|
|
4213
|
+
*
|
|
4214
|
+
* This is the seam the crossfade/fade metas established (crossfade-meta.ts);
|
|
4215
|
+
* new group families (e.g. the bass plugin's voice groups) ride it without
|
|
4216
|
+
* panel-core changes.
|
|
4217
|
+
*
|
|
4218
|
+
* @since SDK 2.35.0
|
|
4219
|
+
*/
|
|
4220
|
+
/** One parsed member: the scene-data key's dbId + its narrowed meta value. */
|
|
4221
|
+
interface TrackGroupMember<M> {
|
|
4222
|
+
dbId: string;
|
|
4223
|
+
meta: M;
|
|
4224
|
+
}
|
|
4225
|
+
/** One parsed group (members in `sortMembers` order when provided). */
|
|
4226
|
+
interface TrackGroupMeta<M> {
|
|
4227
|
+
groupId: string;
|
|
4228
|
+
members: TrackGroupMember<M>[];
|
|
4229
|
+
}
|
|
4230
|
+
/** How to scan + narrow one group family out of scene plugin_data. */
|
|
4231
|
+
interface GroupParseSpec<M> {
|
|
4232
|
+
/** Scene-data key suffix: scans `track:<dbId>:<metaKey>`. */
|
|
4233
|
+
metaKey: string;
|
|
4234
|
+
/** Defensive narrow (the `asCrossfadeMeta` pattern) — return null to skip. */
|
|
4235
|
+
asMeta(val: unknown): M | null;
|
|
4236
|
+
/** Extract the shared group id from a member meta. */
|
|
4237
|
+
groupIdOf(meta: M): string;
|
|
4238
|
+
/** Stable member order (e.g. by voiceIndex). Omit = scene-data scan order. */
|
|
4239
|
+
sortMembers?(a: TrackGroupMember<M>, b: TrackGroupMember<M>): number;
|
|
4240
|
+
}
|
|
4241
|
+
/**
|
|
4242
|
+
* Scan all `track:<dbId>:<metaKey>` keys in a scene's plugin_data and assemble
|
|
4243
|
+
* groups. Pure — no I/O; caller passes the already-fetched scene data map.
|
|
4244
|
+
*/
|
|
4245
|
+
declare function parseTrackGroups<M>(sceneData: Record<string, unknown>, spec: GroupParseSpec<M>): TrackGroupMeta<M>[];
|
|
4246
|
+
/** A group resolved against live tracks (only members whose track exists). */
|
|
4247
|
+
interface ResolvedTrackGroup<M, T> {
|
|
4248
|
+
groupId: string;
|
|
4249
|
+
members: Array<{
|
|
4250
|
+
dbId: string;
|
|
4251
|
+
meta: M;
|
|
4252
|
+
track: T;
|
|
4253
|
+
}>;
|
|
4254
|
+
}
|
|
4255
|
+
interface ResolveGroupsOptions<M, T> {
|
|
4256
|
+
/**
|
|
4257
|
+
* Group completeness policy. A group failing this renders as loose normal
|
|
4258
|
+
* rows instead (its members are NOT excluded). Default: every PARSED member
|
|
4259
|
+
* resolved a live track — the crossfade rule (partner deleted ⇒ degrade).
|
|
4260
|
+
*/
|
|
4261
|
+
isComplete?(group: ResolvedTrackGroup<M, T>, parsed: TrackGroupMeta<M>): boolean;
|
|
4262
|
+
}
|
|
4263
|
+
interface ResolvedGroupsResult<M, T> {
|
|
4264
|
+
/** Complete groups, ready for the group row renderer. */
|
|
4265
|
+
resolved: ResolvedTrackGroup<M, T>[];
|
|
4266
|
+
/** dbIds of members of COMPLETE groups — exclude these from normal rows. */
|
|
4267
|
+
memberDbIds: Set<string>;
|
|
4268
|
+
/**
|
|
4269
|
+
* dbIds whose member key exists but whose track is gone (deleted
|
|
4270
|
+
* out-of-band) — candidates for lazy scene-data cleanup.
|
|
4271
|
+
*/
|
|
4272
|
+
staleMemberDbIds: string[];
|
|
4273
|
+
}
|
|
4274
|
+
/**
|
|
4275
|
+
* Resolve parsed groups against live track state. Pure; call from a useMemo
|
|
4276
|
+
* keyed on [tracks, parsedGroups] (fresh array identities per call are
|
|
4277
|
+
* expected — do NOT key effects on the arrays without a string-key guard,
|
|
4278
|
+
* see the drift-resync `lastResyncKeyRef` pattern).
|
|
4279
|
+
*/
|
|
4280
|
+
declare function resolveTrackGroups<M, T>(parsedGroups: TrackGroupMeta<M>[], tracks: readonly T[], getDbId: (track: T) => string, opts?: ResolveGroupsOptions<M, T>): ResolvedGroupsResult<M, T>;
|
|
4281
|
+
|
|
4282
|
+
/**
|
|
4283
|
+
* Small pure helpers shared by every generator panel — moved verbatim out of
|
|
4284
|
+
* the three panel monoliths (synth/drum/instrument each carried a copy of
|
|
4285
|
+
* pluginFxToToggleFx and an LLM note-response parser).
|
|
4286
|
+
*
|
|
4287
|
+
* @since SDK 2.35.0
|
|
4288
|
+
*/
|
|
4289
|
+
|
|
4290
|
+
/**
|
|
4291
|
+
* Build a scene plugin_data key for a track-scoped value. Scene-data keys are
|
|
4292
|
+
* ALWAYS constructed from the stable DB UUID (`handle.dbId`) — never the
|
|
4293
|
+
* engine id, which changes on project reload. This is the ONLY key builder
|
|
4294
|
+
* panels and generation strategies should use.
|
|
4295
|
+
*/
|
|
4296
|
+
declare function trackDataKey(dbId: string, suffix: string): string;
|
|
4297
|
+
/** Convert SDK PluginTrackFxDetailState to the FxToggleBar's expected TrackFxDetailState. */
|
|
4298
|
+
declare function pluginFxToToggleFx(sdkState: PluginTrackFxDetailState): TrackFxDetailState;
|
|
4299
|
+
/** Shape of the parsed flat LLM JSON note response. */
|
|
4300
|
+
interface LLMNoteResponse {
|
|
4301
|
+
notes: PluginMidiNote[];
|
|
4302
|
+
role?: string;
|
|
4303
|
+
}
|
|
4304
|
+
/**
|
|
4305
|
+
* Parse the LLM JSON response and extract valid MIDI notes (flat
|
|
4306
|
+
* `{notes:[...], role?}` schema). Handles markdown code fences; silently
|
|
4307
|
+
* filters invalid notes; returns null when nothing parses.
|
|
4308
|
+
*/
|
|
4309
|
+
declare function parseLLMNoteResponse(content: string): LLMNoteResponse | null;
|
|
4310
|
+
|
|
4311
|
+
/**
|
|
4312
|
+
* GeneratorPanelAdapter — the family-specific contract a generator panel
|
|
4313
|
+
* supplies to the shared panel-core (useGeneratorPanelCore + GeneratorPanelShell).
|
|
4314
|
+
*
|
|
4315
|
+
* The core owns everything the three historical panel monoliths duplicated:
|
|
4316
|
+
* track load/reconcile, event subscriptions, prompt persistence, mixer/FX ops,
|
|
4317
|
+
* drawer + piano-roll wiring, shuffle cycling, transition crossfade/fade
|
|
4318
|
+
* machinery, and the render skeleton. The adapter supplies what genuinely
|
|
4319
|
+
* differs per family: sound serialization, the 🎲 resolver, the generation
|
|
4320
|
+
* pipeline body, create-track options, prompts/parsers, identity strings,
|
|
4321
|
+
* feature flags, and (optionally) custom multi-track group rendering.
|
|
4322
|
+
*
|
|
4323
|
+
* Adapter instances MUST be referentially stable across renders — build them
|
|
4324
|
+
* in a `useMemo(() => createXAdapter(host), [host])`. An unstable adapter
|
|
4325
|
+
* re-creates the core's loadTracks callback every render (the historical
|
|
4326
|
+
* useSoundHistory render-loop failure mode).
|
|
4327
|
+
*
|
|
4328
|
+
* @since SDK 2.35.0
|
|
4329
|
+
*/
|
|
4330
|
+
|
|
4331
|
+
/**
|
|
4332
|
+
* Family identity strings + numeric knobs. All panel test-ids derive from
|
|
4333
|
+
* `familyKey` (`add-<key>-track-button`, `<key>-section`, `<key>-view-toggle`,
|
|
4334
|
+
* `no-scene-placeholder-<key>`, `no-contract-placeholder-<key>`,
|
|
4335
|
+
* `<key>-import`, `<key>-sound-import`, `<key>-transition-designer`) — the
|
|
4336
|
+
* synth panel's historical ids are exactly this derivation with key 'synth'.
|
|
4337
|
+
*/
|
|
4338
|
+
interface PanelIdentity {
|
|
4339
|
+
/** Test-id + focus-selector stem, e.g. 'synth'. */
|
|
4340
|
+
familyKey: string;
|
|
4341
|
+
/** Human label for the TransitionDesigner header, e.g. 'Synths'. */
|
|
4342
|
+
familyLabel: string;
|
|
4343
|
+
/** New-track name prefix, e.g. 'synth' → `synth-<ts>`. */
|
|
4344
|
+
trackNamePrefix: string;
|
|
4345
|
+
/** Console log tag, e.g. 'SynthGeneratorPanel'. */
|
|
4346
|
+
logTag: string;
|
|
4347
|
+
/** Normal row accent, e.g. '#A78BFA'. */
|
|
4348
|
+
accentColor: string;
|
|
4349
|
+
/** Crossfade/fade row accent, e.g. '#9333EA'. */
|
|
4350
|
+
transitionAccentColor: string;
|
|
4351
|
+
/** Bulk placeholder left-border accent, e.g. '#3B82F6'. */
|
|
4352
|
+
placeholderAccentColor: string;
|
|
4353
|
+
/** Per-plugin per-scene track budget (host enforces 16 too). */
|
|
4354
|
+
maxTracks: number;
|
|
4355
|
+
/** Progress-bar pacing for one generation. */
|
|
4356
|
+
estimatedGenerationMs: number;
|
|
4357
|
+
/** Header button label; default 'Add Track'. */
|
|
4358
|
+
addTrackLabel?: string;
|
|
4359
|
+
/** Header button label; default 'Import Track'. */
|
|
4360
|
+
importTrackLabel?: string;
|
|
4361
|
+
/** Export dialog default filename; default 'midi-tracks'. */
|
|
4362
|
+
exportDefaultName?: string;
|
|
4363
|
+
/**
|
|
4364
|
+
* Plugin id treated as the family's built-in default instrument in the Pick
|
|
4365
|
+
* tab (select it ⇒ close drawer instead of entering the editor stage).
|
|
4366
|
+
* Default 'Surge XT'.
|
|
4367
|
+
*/
|
|
4368
|
+
defaultInstrumentPluginId?: string;
|
|
4369
|
+
}
|
|
4370
|
+
/** Which core surfaces this family mounts. */
|
|
4371
|
+
interface PanelFeatureFlags {
|
|
4372
|
+
/** Pick tab + instrument descriptors + editor stage (synth: true). */
|
|
4373
|
+
instrumentPicker: boolean;
|
|
4374
|
+
/** COMPOSING bar + bulk placeholder hybrid phase (synth: true). */
|
|
4375
|
+
bulkComposePlaceholders: boolean;
|
|
4376
|
+
/** "Export Tracks" ZIP button (synth: true). */
|
|
4377
|
+
exportMidi: boolean;
|
|
4378
|
+
/** Transition scene designer + crossfade/fade rows (synth: true). */
|
|
4379
|
+
transitionDesigner: boolean;
|
|
4380
|
+
/** ImportTrackModal + port-track flow + sound-import drawer action (synth: true). */
|
|
4381
|
+
importTracks: boolean;
|
|
4382
|
+
}
|
|
4383
|
+
/** How this family captures / applies / copies a track's SOUND. */
|
|
4384
|
+
interface PanelSoundAdapter {
|
|
4385
|
+
/**
|
|
4386
|
+
* Re-apply an opaque sound-history descriptor (useSoundHistory's applySound).
|
|
4387
|
+
* Synth: `{state, stateType}` through set(Raw)PluginState's dual path.
|
|
4388
|
+
*/
|
|
4389
|
+
applySound(trackId: string, descriptor: unknown): Promise<void>;
|
|
4390
|
+
/**
|
|
4391
|
+
* Snapshot the track's current sound as a history descriptor, or null when
|
|
4392
|
+
* the track has no instrument. The CORE records it into soundHistory.
|
|
4393
|
+
*/
|
|
4394
|
+
captureSoundDescriptor(trackId: string): Promise<{
|
|
4395
|
+
descriptor: unknown;
|
|
4396
|
+
} | null>;
|
|
4397
|
+
/**
|
|
4398
|
+
* Apply a host.getTrackSound snapshot to a track AND persist it as the
|
|
4399
|
+
* track's durable identity (persistTrackPresetState or family equivalent —
|
|
4400
|
+
* REQUIRED or the transition drift-resync never converges). Returns the
|
|
4401
|
+
* applied label. Used by crossfade/fade copy + drift-resync.
|
|
4402
|
+
*/
|
|
4403
|
+
copySnapshot(trackId: string, snap: TrackSoundSnapshot): Promise<string>;
|
|
4404
|
+
/**
|
|
4405
|
+
* Convert a host.getTrackSound snapshot into this family's sound-history
|
|
4406
|
+
* descriptor (synth: `{state, stateType}`). Used by the drawer's sound
|
|
4407
|
+
* import so the imported sound lands in history with the right shape.
|
|
4408
|
+
*/
|
|
4409
|
+
descriptorFromSnapshot(snap: TrackSoundSnapshot): unknown;
|
|
4410
|
+
/** Snapshot kind accepted by the drawer's "Import <noun>" (synth: 'preset'). */
|
|
4411
|
+
acceptedSnapshotKind: 'preset' | 'sample' | 'instrument';
|
|
4412
|
+
/** Sound-history cap (synth: 12 — Surge blobs are large). */
|
|
4413
|
+
historyMax: number;
|
|
4414
|
+
/** Drawer action label, e.g. 'Import Preset'. */
|
|
4415
|
+
importSoundLabel: string;
|
|
4416
|
+
/** Noun for import toasts: 'No <noun> to import' / '<Noun> imported'. */
|
|
4417
|
+
importNoun: string;
|
|
4418
|
+
/** History label for the lazily-seeded pre-shuffle sound, e.g. 'Previous preset'. */
|
|
4419
|
+
previousSoundLabel: string;
|
|
4420
|
+
}
|
|
4421
|
+
/** The 🎲: pick + apply one new sound, honoring the exclusion cycle. */
|
|
4422
|
+
interface PanelShuffleAdapter {
|
|
4423
|
+
/**
|
|
4424
|
+
* Pick + apply a sound not in `excludeNames`. Throw when the pool is
|
|
4425
|
+
* exhausted (`isExhaustedError` must recognize it) — the core wipes the
|
|
4426
|
+
* track's history and retries once with an empty exclusion list.
|
|
4427
|
+
*/
|
|
4428
|
+
shuffle(track: GeneratorTrackState, excludeNames: string[]): Promise<{
|
|
4429
|
+
appliedName: string;
|
|
4430
|
+
}>;
|
|
4431
|
+
/** Distinguish "pool exhausted" (expected; cycle resets) from real failures. */
|
|
4432
|
+
isExhaustedError(err: unknown): boolean;
|
|
4433
|
+
}
|
|
4434
|
+
/**
|
|
4435
|
+
* Capabilities the core hands to the generation strategy (and group
|
|
4436
|
+
* renderers). Built fresh per call — do not cache across renders.
|
|
4437
|
+
*/
|
|
4438
|
+
interface GenerationServices {
|
|
4439
|
+
host: PluginHost;
|
|
4440
|
+
activeSceneId: string | null;
|
|
4441
|
+
/** Live track list snapshot at call time. */
|
|
4442
|
+
tracks: GeneratorTrackState[];
|
|
4443
|
+
/** Patch one track's state (object merge or functional update). */
|
|
4444
|
+
updateTrack(trackId: string, patch: Partial<GeneratorTrackState> | ((t: GeneratorTrackState) => GeneratorTrackState)): void;
|
|
4445
|
+
/** Escape hatch for multi-track updates (reconcile flows). */
|
|
4446
|
+
setTracks: React.Dispatch<React.SetStateAction<GeneratorTrackState[]>>;
|
|
4447
|
+
reloadTracks(incremental?: boolean): Promise<void>;
|
|
4448
|
+
soundHistory: UseSoundHistoryResult;
|
|
4449
|
+
/** Engine id → stable DB UUID (falls back to the input when unknown). */
|
|
4450
|
+
engineToDbId(trackId: string): string;
|
|
4451
|
+
/** The ONLY scene-data key builder (always dbId-based). */
|
|
4452
|
+
trackDataKey(dbId: string, suffix: string): string;
|
|
4453
|
+
/** Latch a track as piano-roll-loaded (post-generation seeding). */
|
|
4454
|
+
markEditLoaded(trackId: string): void;
|
|
4455
|
+
/** Create a family track (adapter options + `<prefix>-<ts><suffix>` name). */
|
|
4456
|
+
createFamilyTrack(nameSuffix?: string): Promise<PluginTrackHandle>;
|
|
4457
|
+
/** Resolved groups for a registered group extension. */
|
|
4458
|
+
resolvedGroups<M>(metaKey: string): ResolvedTrackGroup<M, GeneratorTrackState>[];
|
|
4459
|
+
}
|
|
4460
|
+
/**
|
|
4461
|
+
* One prompt-driven generation turn. The core owns the wrapper: prompt/auth
|
|
4462
|
+
* gates, `isGenerating: true`, and the catch (error patch + 'Generation
|
|
4463
|
+
* failed' toast). The strategy owns the body — synth: LLM → clip on THIS
|
|
4464
|
+
* track → mute → role persist → shufflePreset → success patch; bass: LLM line
|
|
4465
|
+
* → validate/split → reconcile member tracks → per-voice clips + presets →
|
|
4466
|
+
* metas → reload.
|
|
4467
|
+
*/
|
|
4468
|
+
interface PanelGenerationStrategy {
|
|
4469
|
+
generate(track: GeneratorTrackState, services: GenerationServices): Promise<void>;
|
|
4470
|
+
}
|
|
4471
|
+
/** Core per-track handlers, same instances the normal rows use. */
|
|
4472
|
+
interface CoreTrackHandlers {
|
|
4473
|
+
promptChange(trackId: string, prompt: string): void;
|
|
4474
|
+
generate(trackId: string): void;
|
|
4475
|
+
shuffle(trackId: string): void;
|
|
4476
|
+
copy(trackId: string): void;
|
|
4477
|
+
delete(trackId: string): void;
|
|
4478
|
+
muteToggle(trackId: string): void;
|
|
4479
|
+
soloToggle(trackId: string): void;
|
|
4480
|
+
volumeChange(trackId: string, volume: number): void;
|
|
4481
|
+
panChange(trackId: string, pan: number): void;
|
|
4482
|
+
tabChange(trackId: string, tab: DrawerTab): void;
|
|
4483
|
+
toggleDrawer(trackId: string): void;
|
|
4484
|
+
toggleFxDrawer(trackId: string): void;
|
|
4485
|
+
notesChange(trackId: string, notes: PluginMidiNote[]): void;
|
|
4486
|
+
progressChange(trackId: string, pct: number): void;
|
|
4487
|
+
}
|
|
4488
|
+
/** Render-time context handed to a group extension's renderGroup. */
|
|
4489
|
+
interface GroupRenderContext {
|
|
4490
|
+
services: GenerationServices;
|
|
4491
|
+
anySolo: boolean;
|
|
4492
|
+
supportsMeters: boolean;
|
|
4493
|
+
levels?: TrackLevelsHandle;
|
|
4494
|
+
handlers: CoreTrackHandlers;
|
|
4495
|
+
/**
|
|
4496
|
+
* Build the shell's default TrackRow for a member with per-row overrides —
|
|
4497
|
+
* group renderers stack these instead of reimplementing the ~50-prop plumbing.
|
|
4498
|
+
*/
|
|
4499
|
+
renderDefaultTrackRow(track: GeneratorTrackState, overrides?: Partial<SDKTrackRowProps>, drag?: TrackRowDragProps): ReactNode;
|
|
4500
|
+
/** Optimistic group mute (crossfade group-control pattern). */
|
|
4501
|
+
setGroupMute(trackIds: string[], muted: boolean): void;
|
|
4502
|
+
/** Optimistic group solo. */
|
|
4503
|
+
setGroupSolo(trackIds: string[], solo: boolean): void;
|
|
4504
|
+
/**
|
|
4505
|
+
* Delete all member tracks + their `track:<dbId>:<suffix>` scene-data keys
|
|
4506
|
+
* (per cleanupKeySuffixes) + prune local state. Best-effort per member.
|
|
4507
|
+
*/
|
|
4508
|
+
deleteGroup(members: Array<{
|
|
4509
|
+
engineId: string;
|
|
4510
|
+
dbId: string;
|
|
4511
|
+
}>, cleanupKeySuffixes: string[]): Promise<void>;
|
|
4512
|
+
}
|
|
4513
|
+
/**
|
|
4514
|
+
* A family-registered multi-track group row (the crossfade seam,
|
|
4515
|
+
* parameterized). Members of complete groups render through `renderGroup`
|
|
4516
|
+
* and are excluded from the normal row list; incomplete groups degrade to
|
|
4517
|
+
* normal rows per `isComplete`.
|
|
4518
|
+
*/
|
|
4519
|
+
interface PanelGroupExtension<M = unknown> extends GroupParseSpec<M> {
|
|
4520
|
+
/**
|
|
4521
|
+
* Completeness policy (default: every parsed member's track is live).
|
|
4522
|
+
* Bass voice-groups: the anchor member (voiceIndex 0) must be live.
|
|
4523
|
+
*/
|
|
4524
|
+
isComplete?(group: ResolvedTrackGroup<M, GeneratorTrackState>, parsed: TrackGroupMeta<M>): boolean;
|
|
4525
|
+
renderGroup(group: ResolvedTrackGroup<M, GeneratorTrackState>, ctx: GroupRenderContext): ReactNode;
|
|
4526
|
+
}
|
|
4527
|
+
interface GeneratorPanelAdapter<M = unknown> {
|
|
4528
|
+
identity: PanelIdentity;
|
|
4529
|
+
features: PanelFeatureFlags;
|
|
4530
|
+
/** Options for host.createTrack (name is core-built). Synth: `{loadSynth:true, synthName:'Surge XT'}`. */
|
|
4531
|
+
createTrackOptions(): Omit<CreateTrackOptions, 'name'>;
|
|
4532
|
+
/**
|
|
4533
|
+
* Port-flow sound step after the MIDI copy (cross-panel Import Track).
|
|
4534
|
+
* Synth: `host.shufflePreset(handle.id)` non-fatal.
|
|
4535
|
+
*/
|
|
4536
|
+
applyPortedTrackSound(handle: PluginTrackHandle, role?: string): Promise<void>;
|
|
4537
|
+
/** System prompt for the family's LLM calls (incl. core-owned crossfade/fade generation). */
|
|
4538
|
+
buildSystemPrompt(validRoles: readonly string[]): string;
|
|
4539
|
+
/** Parse the family's LLM note responses (crossfade/fade flows). */
|
|
4540
|
+
parseNotesResponse(content: string): LLMNoteResponse | null;
|
|
4541
|
+
sound: PanelSoundAdapter;
|
|
4542
|
+
shuffle: PanelShuffleAdapter;
|
|
4543
|
+
generation: PanelGenerationStrategy;
|
|
4544
|
+
/** Custom multi-track group rows (bass voice groups). */
|
|
4545
|
+
groupExtensions?: PanelGroupExtension<M>[];
|
|
4546
|
+
/** Patch the default TrackRow props per row (drum's sampleName fallback). */
|
|
4547
|
+
mapTrackRowProps?(track: GeneratorTrackState, props: SDKTrackRowProps): SDKTrackRowProps;
|
|
4548
|
+
}
|
|
4549
|
+
/** Panel-local render extension points around the shell's row list. */
|
|
4550
|
+
interface GeneratorPanelSlots {
|
|
4551
|
+
beforeRows?: ReactNode;
|
|
4552
|
+
afterRows?: ReactNode;
|
|
4553
|
+
/** Extra modals (rendered in the normal phase only). */
|
|
4554
|
+
modals?: ReactNode;
|
|
4555
|
+
}
|
|
4556
|
+
|
|
4557
|
+
/**
|
|
4558
|
+
* Transition-scene machinery for panel-core panels — crossfade pair + fade
|
|
4559
|
+
* creation, group controls, sliders, drift re-sync, and fade curve re-apply.
|
|
4560
|
+
* Moved VERBATIM from the synth panel (SynthGeneratorPanel.tsx 715–987,
|
|
4561
|
+
* 1148–1235, 1787–1847) with the family-specific pieces routed through the
|
|
4562
|
+
* GeneratorPanelAdapter (sound copy/persist, system prompt, note parsing,
|
|
4563
|
+
* track naming). Semantics are frozen by the Phase-0 behavior pin.
|
|
4564
|
+
*
|
|
4565
|
+
* Deliberately NOT rewritten onto the generic group seam (group-meta.ts) —
|
|
4566
|
+
* that seam is additive for new families (bass voice groups); migrating
|
|
4567
|
+
* crossfades onto it is a contained follow-up.
|
|
4568
|
+
*
|
|
4569
|
+
* @since SDK 2.35.0
|
|
4570
|
+
*/
|
|
4571
|
+
|
|
4572
|
+
/** A crossfade pair resolved against live track state (both members present). */
|
|
4573
|
+
interface ResolvedCrossfadePair extends CrossfadePairMeta {
|
|
4574
|
+
origin: GeneratorTrackState;
|
|
4575
|
+
target: GeneratorTrackState;
|
|
4576
|
+
}
|
|
4577
|
+
/** A fade (transition orphan) resolved against live track state. */
|
|
4578
|
+
interface ResolvedFade extends FadeEntry {
|
|
4579
|
+
track: GeneratorTrackState;
|
|
4580
|
+
}
|
|
4581
|
+
interface UseTransitionOpsInputs {
|
|
4582
|
+
host: PluginHost;
|
|
4583
|
+
adapter: GeneratorPanelAdapter;
|
|
4584
|
+
activeSceneId: string | null;
|
|
4585
|
+
isConnected: boolean;
|
|
4586
|
+
isAuthenticated: boolean;
|
|
4587
|
+
sceneContext: PluginSceneContext | null | undefined;
|
|
4588
|
+
tracks: GeneratorTrackState[];
|
|
4589
|
+
setTracks: React.Dispatch<React.SetStateAction<GeneratorTrackState[]>>;
|
|
4590
|
+
loadTracks(incremental?: boolean): Promise<void>;
|
|
4591
|
+
setCrossfadePairsMeta: React.Dispatch<React.SetStateAction<CrossfadePairMeta[]>>;
|
|
4592
|
+
setFadesMeta: React.Dispatch<React.SetStateAction<FadeEntry[]>>;
|
|
4593
|
+
resolvedCrossfadePairs: ResolvedCrossfadePair[];
|
|
4594
|
+
resolvedFades: ResolvedFade[];
|
|
4595
|
+
}
|
|
4596
|
+
interface TransitionOps {
|
|
4597
|
+
isCreatingCrossfade: boolean;
|
|
4598
|
+
isCreatingFade: boolean;
|
|
4599
|
+
handleCreateCrossfade(origin: CrossfadeSelection, target: CrossfadeSelection): Promise<void>;
|
|
4600
|
+
handleCreateFade(selection: FadeSelection, direction: FadeDirection, gesture: FadeGesture): Promise<void>;
|
|
4601
|
+
handleCrossfadeMute(pair: ResolvedCrossfadePair): void;
|
|
4602
|
+
handleCrossfadeSolo(pair: ResolvedCrossfadePair): void;
|
|
4603
|
+
handleCrossfadeDelete(pair: ResolvedCrossfadePair): Promise<void>;
|
|
4604
|
+
handleCrossfadeSlider(pair: ResolvedCrossfadePair, pos: number): void;
|
|
4605
|
+
handleFadeDelete(fade: ResolvedFade): Promise<void>;
|
|
4606
|
+
handleFadeSlider(fade: ResolvedFade, pos: number): void;
|
|
4607
|
+
}
|
|
4608
|
+
declare function useTransitionOps({ host, adapter, activeSceneId, isConnected, isAuthenticated, sceneContext, tracks, setTracks, loadTracks, setCrossfadePairsMeta, setFadesMeta, resolvedCrossfadePairs, resolvedFades, }: UseTransitionOpsInputs): TransitionOps;
|
|
4609
|
+
|
|
4610
|
+
/**
|
|
4611
|
+
* useGeneratorPanelCore — the shared state/effects/handlers engine behind
|
|
4612
|
+
* generator panels (synth today; bass next; drum/instrument candidates).
|
|
4613
|
+
*
|
|
4614
|
+
* Verbatim extraction of the synth panel monolith's family-agnostic ~85%
|
|
4615
|
+
* (SynthGeneratorPanel.tsx), parameterized by a GeneratorPanelAdapter. Every
|
|
4616
|
+
* timing (500ms prompt debounce, 500ms agent-mutation coalesce, 300ms notes
|
|
4617
|
+
* save, 350ms add-focus), every scene-data key (`track:<dbId>:…`), every
|
|
4618
|
+
* toast string, and every host-call sequence is frozen by the Phase-0
|
|
4619
|
+
* behavior pin (sas-app/src/__tests__/synth-panel-behavior.test.tsx).
|
|
4620
|
+
*
|
|
4621
|
+
* The returned `core` object is consumed by GeneratorPanelShell (render) and
|
|
4622
|
+
* closed over by family adapters (generation strategies, group renderers).
|
|
4623
|
+
*
|
|
4624
|
+
* @since SDK 2.35.0
|
|
4625
|
+
*/
|
|
4626
|
+
|
|
4627
|
+
interface UseGeneratorPanelCoreOptions {
|
|
4628
|
+
/** The panel's PluginUIProps, passed through whole. */
|
|
4629
|
+
ui: PluginUIProps;
|
|
4630
|
+
/** Family adapter — MUST be referentially stable (useMemo on [host]). */
|
|
4631
|
+
adapter: GeneratorPanelAdapter;
|
|
4632
|
+
}
|
|
4633
|
+
/** Everything GeneratorPanelShell + family extensions consume. */
|
|
4634
|
+
interface GeneratorPanelCore {
|
|
4635
|
+
ui: PluginUIProps;
|
|
4636
|
+
adapter: GeneratorPanelAdapter;
|
|
4637
|
+
tracks: GeneratorTrackState[];
|
|
4638
|
+
setTracks: React$1.Dispatch<React$1.SetStateAction<GeneratorTrackState[]>>;
|
|
4639
|
+
isLoadingTracks: boolean;
|
|
4640
|
+
loadTracks(incremental?: boolean): Promise<void>;
|
|
4641
|
+
engineToDbId(trackId: string): string;
|
|
4642
|
+
supportsMeters: boolean;
|
|
4643
|
+
trackLevels: TrackLevelsHandle;
|
|
4644
|
+
anySolo: boolean;
|
|
4645
|
+
reorder: UseTrackReorderResult;
|
|
4646
|
+
soundHistory: ReturnType<typeof useSoundHistory>;
|
|
4647
|
+
isComposing: boolean;
|
|
4648
|
+
placeholders: BulkAddPlaceholderTrack[];
|
|
4649
|
+
isAddingTrack: boolean;
|
|
4650
|
+
isExportingMidi: boolean;
|
|
4651
|
+
designerView: boolean;
|
|
4652
|
+
canCrossfade: boolean;
|
|
4653
|
+
needsContract: boolean;
|
|
4654
|
+
xfFromId: string | null;
|
|
4655
|
+
xfToId: string | null;
|
|
4656
|
+
importOpen: boolean;
|
|
4657
|
+
setImportOpen(open: boolean): void;
|
|
4658
|
+
soundImportTarget: GeneratorTrackState | null;
|
|
4659
|
+
setSoundImportTarget(t: GeneratorTrackState | null): void;
|
|
4660
|
+
handleSoundImportPick(sel: {
|
|
4661
|
+
sourceTrackDbId: string;
|
|
4662
|
+
trackName: string;
|
|
4663
|
+
sceneName: string;
|
|
4664
|
+
}): Promise<void>;
|
|
4665
|
+
handlePortTrack(sel: {
|
|
4666
|
+
sourceTrackDbId: string;
|
|
4667
|
+
trackName: string;
|
|
4668
|
+
role?: string;
|
|
4669
|
+
}): Promise<void>;
|
|
4670
|
+
transition: TransitionOps;
|
|
4671
|
+
crossfadePairsMeta: CrossfadePairMeta[];
|
|
4672
|
+
fadesMeta: FadeEntry[];
|
|
4673
|
+
resolvedCrossfadePairs: ResolvedCrossfadePair[];
|
|
4674
|
+
crossfadeMemberDbIds: Set<string>;
|
|
4675
|
+
resolvedFades: ResolvedFade[];
|
|
4676
|
+
fadeMemberDbIds: Set<string>;
|
|
4677
|
+
resolvedGenericGroups: Record<string, ResolvedGroupsResult<unknown, GeneratorTrackState>>;
|
|
4678
|
+
genericGroupMemberDbIds: Set<string>;
|
|
4679
|
+
availableInstruments: InstrumentDescriptor[];
|
|
4680
|
+
instrumentsLoading: boolean;
|
|
4681
|
+
handlers: CoreTrackHandlers;
|
|
4682
|
+
handleGenerate(trackId: string): Promise<void>;
|
|
4683
|
+
handleShuffle(trackId: string): Promise<void>;
|
|
4684
|
+
handleAddTrack(): Promise<void>;
|
|
4685
|
+
handleDeleteTrack(trackId: string): Promise<void>;
|
|
4686
|
+
handleExportMidi(): Promise<void>;
|
|
4687
|
+
handlePromptChange(trackId: string, prompt: string): void;
|
|
4688
|
+
handleMuteToggle(trackId: string): void;
|
|
4689
|
+
handleSoloToggle(trackId: string): void;
|
|
4690
|
+
handleVolumeChange(trackId: string, volume: number): void;
|
|
4691
|
+
handlePanChange(trackId: string, pan: number): void;
|
|
4692
|
+
handleTabChange(trackId: string, tab: DrawerTab): void;
|
|
4693
|
+
handleToggleDrawer(trackId: string): void;
|
|
4694
|
+
toggleFxDrawer(trackId: string): void;
|
|
4695
|
+
handleNotesChange(trackId: string, notes: PluginMidiNote[]): void;
|
|
4696
|
+
handleProgressChange(trackId: string, pct: number): void;
|
|
4697
|
+
handleCopy(trackId: string): Promise<void>;
|
|
4698
|
+
handleFxToggle(trackId: string, category: FxCategory, enabled: boolean): void;
|
|
4699
|
+
handleFxPresetChange(trackId: string, category: FxCategory, presetIndex: number): void;
|
|
4700
|
+
handleFxDryWetChange(trackId: string, category: FxCategory, value: number): void;
|
|
4701
|
+
handleInstrumentSelect(trackId: string, pluginId: string): Promise<void>;
|
|
4702
|
+
handleShowEditor(trackId: string): Promise<void>;
|
|
4703
|
+
handleBackToInstruments(trackId: string): void;
|
|
4704
|
+
handleRefreshInstruments(): void;
|
|
4705
|
+
onAuditionNote(trackId: string, pitch: number, velocity: number, ms: number): void;
|
|
4706
|
+
makeServices(): GenerationServices;
|
|
4707
|
+
setGroupMute(trackIds: string[], muted: boolean): void;
|
|
4708
|
+
setGroupSolo(trackIds: string[], solo: boolean): void;
|
|
4709
|
+
deleteGroup(members: Array<{
|
|
4710
|
+
engineId: string;
|
|
4711
|
+
dbId: string;
|
|
4712
|
+
}>, cleanupKeySuffixes: string[]): Promise<void>;
|
|
4713
|
+
}
|
|
4714
|
+
declare function useGeneratorPanelCore({ ui, adapter, }: UseGeneratorPanelCoreOptions): GeneratorPanelCore;
|
|
4715
|
+
|
|
4716
|
+
/**
|
|
4717
|
+
* GeneratorPanelShell — the shared render skeleton for panel-core panels.
|
|
4718
|
+
*
|
|
4719
|
+
* Verbatim extraction of the synth panel's render phases
|
|
4720
|
+
* (SynthGeneratorPanel.tsx:1849–2195): no-scene gate → no-contract gate →
|
|
4721
|
+
* COMPOSING → placeholder hybrid → normal (modals, mounted-but-hidden
|
|
4722
|
+
* TransitionDesigner, crossfade/fade rows, generic group rows, normal rows,
|
|
4723
|
+
* export button). The ~50-prop TrackRow plumbing that the monolith duplicated
|
|
4724
|
+
* across the hybrid + normal phases lives here ONCE (`buildRowProps`), pinned
|
|
4725
|
+
* by the Phase-0 props snapshot.
|
|
4726
|
+
*
|
|
4727
|
+
* @since SDK 2.35.0
|
|
4728
|
+
*/
|
|
4729
|
+
|
|
4730
|
+
interface GeneratorPanelShellProps {
|
|
4731
|
+
core: GeneratorPanelCore;
|
|
4732
|
+
slots?: GeneratorPanelSlots;
|
|
4733
|
+
}
|
|
4734
|
+
declare function GeneratorPanelShell({ core, slots }: GeneratorPanelShellProps): React$1.ReactElement;
|
|
4735
|
+
|
|
4736
|
+
/**
|
|
4737
|
+
* Surge XT sound adapter — the PanelSoundAdapter shared by every family whose
|
|
4738
|
+
* tracks host Surge XT (or a user-picked third-party VST3) as the instrument:
|
|
4739
|
+
* synth and bass today.
|
|
4740
|
+
*
|
|
4741
|
+
* A "sound" is the INSTRUMENT plugin's state: default Surge XT round-trips
|
|
4742
|
+
* through the Tracktion ValueTree (get/setPluginState); third-party
|
|
4743
|
+
* instruments (u-he Diva, Serum, …) need their RAW VST3 state
|
|
4744
|
+
* (get/setRawPluginState), which the ValueTree wrapper does not faithfully
|
|
4745
|
+
* preserve. The instrument is the first non-utility plugin on the track.
|
|
4746
|
+
* Matching only 'Surge' silently broke history for custom-instrument tracks
|
|
4747
|
+
* pre-split — hence the dual path.
|
|
4748
|
+
*
|
|
4749
|
+
* @since SDK 2.35.0
|
|
4750
|
+
*/
|
|
4751
|
+
|
|
4752
|
+
interface SurgeSoundAdapterOverrides {
|
|
4753
|
+
/** Sound-history cap (default 12 — Surge state blobs are large). */
|
|
4754
|
+
historyMax?: number;
|
|
4755
|
+
/** Drawer action label (default 'Import Preset'). */
|
|
4756
|
+
importSoundLabel?: string;
|
|
4757
|
+
}
|
|
4758
|
+
declare function createSurgeSoundAdapter(host: PluginHost, overrides?: SurgeSoundAdapterOverrides): PanelSoundAdapter;
|
|
4759
|
+
|
|
4760
|
+
/**
|
|
4761
|
+
* useSceneState — Scene-keyed state hook for plugin developers.
|
|
4762
|
+
*
|
|
4763
|
+
* Works like `useState`, but maintains separate state per scene.
|
|
4764
|
+
* When the user switches scenes, the previous scene's state is preserved
|
|
4765
|
+
* and restored when they switch back.
|
|
4766
|
+
*
|
|
4767
|
+
* Returns `[value, setForCurrentScene, setForScene]`:
|
|
4768
|
+
* - `value` — state for the currently active scene
|
|
4769
|
+
* - `setForCurrentScene(v)` — updates state for whatever scene is active at call time
|
|
4770
|
+
* - `setForScene(sceneId, v)` — updates state for a specific scene (for async callbacks)
|
|
4771
|
+
*
|
|
4772
|
+
* Both setters support the functional updater pattern: `prev => next`.
|
|
4773
|
+
*
|
|
4774
|
+
* **Important:** For object/array `initialValue`, hoist to a module-level constant
|
|
4775
|
+
* to keep the setter callbacks referentially stable:
|
|
4776
|
+
* ```ts
|
|
4777
|
+
* const EMPTY: string[] = [];
|
|
4778
|
+
* const [items, setItems, setItemsForScene] = useSceneState(activeSceneId, EMPTY);
|
|
4779
|
+
* ```
|
|
4780
|
+
*/
|
|
4781
|
+
type SetSceneState<T> = (value: T | ((prev: T) => T)) => void;
|
|
4782
|
+
type SetSceneStateForScene<T> = (sceneId: string, value: T | ((prev: T) => T)) => void;
|
|
4783
|
+
declare function useSceneState<T>(activeSceneId: string | null, initialValue: T): [T, SetSceneState<T>, SetSceneStateForScene<T>];
|
|
4784
|
+
|
|
4785
|
+
/**
|
|
4786
|
+
* useAnySolo — reactively reports whether ANY track in the project is soloed.
|
|
4787
|
+
*
|
|
4788
|
+
* Solo is cross-panel: when the user solos a track in ANY panel, the engine's
|
|
4789
|
+
* effective-mute model silences every non-soloed track. A panel uses this flag
|
|
4790
|
+
* to DIM its own non-soloed rows without lighting their Mute buttons:
|
|
4791
|
+
*
|
|
4792
|
+
* ```tsx
|
|
4793
|
+
* const anySolo = useAnySolo(host);
|
|
4794
|
+
* // ...
|
|
4795
|
+
* <TrackRow soloedOut={anySolo && !track.runtimeState.solo} ... />
|
|
4796
|
+
* ```
|
|
4797
|
+
*
|
|
4798
|
+
* Refreshes on mount and on every track-state change. `onTrackStateChange`
|
|
4799
|
+
* fires for tracks in ALL panels (not just this plugin's), so a solo toggled in
|
|
4800
|
+
* another panel updates this flag too.
|
|
4801
|
+
*/
|
|
4802
|
+
|
|
4803
|
+
declare function useAnySolo(host: Pick<PluginHost, 'isAnySoloActive' | 'onTrackStateChange'>): boolean;
|
|
4804
|
+
|
|
4048
4805
|
/**
|
|
4049
4806
|
* Plugin SDK Version
|
|
4050
4807
|
*
|
|
@@ -4053,7 +4810,7 @@ declare function useSoundHistory(applySound: (trackId: string, descriptor: unkno
|
|
|
4053
4810
|
* Registry checks semver.gte(PLUGIN_SDK_VERSION, manifest.minHostVersion)
|
|
4054
4811
|
* during activation and marks incompatible plugins accordingly.
|
|
4055
4812
|
*/
|
|
4056
|
-
declare const PLUGIN_SDK_VERSION = "2.
|
|
4813
|
+
declare const PLUGIN_SDK_VERSION = "2.37.0";
|
|
4057
4814
|
|
|
4058
4815
|
/**
|
|
4059
4816
|
* FX Preset Definitions
|
|
@@ -4201,4 +4958,4 @@ interface PickTopKOptions {
|
|
|
4201
4958
|
*/
|
|
4202
4959
|
declare function pickTopKWeighted<T>(scored: ReadonlyArray<ScoredCandidate<T>>, options?: PickTopKOptions): T | null;
|
|
4203
4960
|
|
|
4204
|
-
export { AUDIO_EFFECTS, AUDIO_EFFECT_LABEL, type AudioEffect, type AudioInputDevice, type BulkAddPlaceholderTrack, type ComposeProgressEvent, type ComposeProgressListener, type ComposeSceneOptions, type ComposeSceneResult, ConfirmDialog, type ConfirmDialogProps, type CreateTrackOptions, type CrossfadeInpaintInput, type CrossfadeLayer, type CrossfadeMeta, CrossfadeModal, type CrossfadeModalProps, type CrossfadePairMeta, type CrossfadeSelection, type CrossfadeSlot, CrossfadeTrackRow, type CrossfadeTrackRowProps, type CrossfadeVolumeCurves, DB_MAX, DB_MIN, DEFAULT_FX_CATEGORY_DETAIL, DEFAULT_FX_DRY_WET, DRAG_DEAD_ZONE, type DeckBoundaryEvent, type DeckBoundaryListener, type DesignerRowSlots, DownloadPackButton, type DownloadPackButtonProps, type DownloadPackButtonVariant, type DrawerTab, type DrumKit, EMPTY_FX_DETAIL_STATE, EMPTY_FX_STATE, EQUAL_POWER_GAIN, type ExportMidiBundleOptions, type ExportMidiBundleResult, type ExportedPluginData, FX_CATEGORIES, FX_CHAIN_ORDER, FX_DISPLAY_LABELS, FX_ENGINE_PLUGIN_NAMES, FX_PRESET_CONFIGS, type FadeDirection, type FadeEntry, type FadeGesture, type FadeLayer, type FadeMeta, FadeModal, type FadeModalProps, type FadeSelection, FadeTrackRow, type FadeTrackRowProps, type FxCategory, type FxCategoryDetailState, type FxPreset, type FxPresetConfig, type FxPresetData, type FxPresetDataEntry, FxToggleBar, type FxToggleBarProps, GUTTER_W, type GeneratorPlugin, type GeneratorType, type ImportCandidateScene, type ImportCandidateTrack, ImportTrackModal, type ImportTrackModalProps, type InstrumentDescriptor, TrackDrawer as InstrumentDrawer, type TrackDrawerProps as InstrumentDrawerProps, type InstrumentSampler, type InstrumentZone, type LLMCandidate, type LLMContent, type LLMFunctionDeclaration, type LLMGenerationConfig, type LLMGenerationRequest, type LLMGenerationResult, type LLMPart, type LLMSystemInstruction, type LLMTool, type LLMToolUseRequest, type LLMToolUseResponse, type LLMUsageMetadata, LevelMeter, type LevelMeterProps, type ListAudioFilesOptions, type ListImportableTracksOptions, type MidiClipData, type MidiWriteResult, type MixInterpolation, Modal, type ModalProps, type MusicalContext, OffsetScrubber, type OffsetScrubberProps, PLUGIN_SDK_VERSION, PX_PER_BEAT, PanSlider, type PeakAnalysis, PianoRollEditor, type PianoRollEditorProps, type PickTopKOptions, type PluginAppTool, type PluginAppToolInputSchema, type PluginAppToolResult, type PluginAudioTextureRequest, type PluginAudioTextureResult, type PluginCapabilities, type PluginChordSegment, type PluginChordTiming, type PluginConcurrentTrackInfo, type PluginCuePoints, type PluginDownloadOptions, PluginError, type PluginErrorCode, type PluginFileDialogOptions, type PluginFxCategoryDetailState, type PluginGenerationContext, type PluginHost, type PluginHttpRequestOptions, type PluginHttpResponse, type PluginManifest, type PluginMidiNote, type PluginPresetData, type PluginPresetInfo, type PluginRegistration, type PluginSampleFilter, type PluginSampleImportResult, type PluginSampleInfo, type PluginSampleTrackInfo, type PluginSceneContext, type PluginSceneInfo, type PluginSettingsSchema, type PluginSettingsStore, type PluginSkill, type PluginSkillInputSchema, type PluginStatus, type PluginStemSplitResult, type PluginStemTrackInfo, type PluginSynthInfo, type PluginTrackFxDetailState, type PluginTrackHandle, type PluginTrackInfo, type PluginTrackLevel, type PluginTrackRuntimeState, type PluginTransportState, type PluginTrimWindow, type PluginUIProps, type PostProcessOptions, RESIZE_HANDLE_PX, ROW_HEIGHT, type ReadMidiClip, type ReadMidiResult, type RecordingChunkFinalizedEvent, type RecordingTargetInfo, type SDKTrackRowProps, SLIDER_UNITY, SamplePackCTACard, type SamplePackCTACardProps, type SamplePackCTACardStatus, type SamplePackCardInfo, type SavePluginPresetOptions, type SceneChangeListener, type SceneFamilyTrack, type ScoredCandidate, ScrollingWaveform, type ScrollingWaveformProps, type SettingDefinition, type ShufflePresetResult, SorceryProgressBar, type SoundHistoryEntry, type StemType, type SynthesizeCuePointsOptions, TEXTURAL_ROLES, TRANSITION_DESIGNER_DRAFT_KEY, TrackDrawer, type TrackDrawerProps, type TrackFxDetailState, type TrackFxState, type TrackLevelsHandle, TrackMeterStrip, type TrackMeterStripProps, type TrackMeterView, TrackRow, type TrackRowDragProps, type TrackSoundHistory, type TrackSoundSnapshot, type TrackStateChangeListener, TransitionDesigner, type TransitionDesignerDraft, type TransitionDesignerProps, type TransitionRowType, type TransportEvent, type TransportEventListener, type UnsubscribeFn, type UseSoundHistoryOptions, type UseSoundHistoryResult, type UseTrackReorderOptions, type UseTrackReorderResult, type VolumeAutomationPoint, VolumeSlider, type WaveformPeaks, WaveformView, type WaveformViewProps, analyzeWavPeak, asAudioEffect, asCrossfadeMeta, asFadeMeta, asTransitionDesignerDraft, buildCrossfadeInpaintPrompt, buildCrossfadeVolumeCurves, buildFadeVolumeCurve, buildRowSlots, calculateTimeBasedTarget, cellToPx, centerScrollTop, computePeaks, dbIdsFromKeys, dbToSlider, defaultFadeGesture, drawWaveform, formatConcurrentTracks, hashString, moveItem, normalizeSlots, padPair, padSlots, parseCrossfadePairs, parseFades, pickTopKWeighted, pitchToName, pxToCell, reconcileSlots, resizeNoteDuration, rowKey, rowType, scorePromptMatch, sliderToDb, slotsEqual, soundIdentity, synthesizeCuePoints, tokenizePrompt, transposeNotes, useAnySolo, useSceneState, useSoundHistory, useTrackLevel, useTrackLevels, useTrackMeter, useTrackReorder, useTransportPlaying };
|
|
4961
|
+
export { AUDIO_EFFECTS, AUDIO_EFFECT_LABEL, type AudioEffect, type AudioInputDevice, type BulkAddPlaceholderTrack, type ComposeProgressEvent, type ComposeProgressListener, type ComposeSceneOptions, type ComposeSceneResult, ConfirmDialog, type ConfirmDialogProps, type CoreTrackHandlers, type CreateTrackOptions, type CrossfadeInpaintInput, type CrossfadeLayer, type CrossfadeMeta, CrossfadeModal, type CrossfadeModalProps, type CrossfadePairMeta, type CrossfadeSelection, type CrossfadeSlot, CrossfadeTrackRow, type CrossfadeTrackRowProps, type CrossfadeVolumeCurves, DB_MAX, DB_MIN, DEFAULT_FX_CATEGORY_DETAIL, DEFAULT_FX_DRY_WET, DRAG_DEAD_ZONE, type DeckBoundaryEvent, type DeckBoundaryListener, type DesignerRowSlots, DownloadPackButton, type DownloadPackButtonProps, type DownloadPackButtonVariant, type DrawerTab, type DrumKit, EMPTY_FX_DETAIL_STATE, EMPTY_FX_STATE, EQUAL_POWER_GAIN, type ExportMidiBundleOptions, type ExportMidiBundleResult, type ExportedPluginData, FX_CATEGORIES, FX_CHAIN_ORDER, FX_DISPLAY_LABELS, FX_ENGINE_PLUGIN_NAMES, FX_PRESET_CONFIGS, type FadeDirection, type FadeEntry, type FadeGesture, type FadeLayer, type FadeMeta, FadeModal, type FadeModalProps, type FadeSelection, FadeTrackRow, type FadeTrackRowProps, type FxCategory, type FxCategoryDetailState, type FxPreset, type FxPresetConfig, type FxPresetData, type FxPresetDataEntry, FxToggleBar, type FxToggleBarProps, GUTTER_W, type GenerationServices, type GeneratorPanelAdapter, type GeneratorPanelCore, GeneratorPanelShell, type GeneratorPanelShellProps, type GeneratorPanelSlots, type GeneratorPlugin, type GeneratorTrackState, type GeneratorType, type GroupParseSpec, type GroupRenderContext, type ImportCandidateScene, type ImportCandidateTrack, ImportTrackModal, type ImportTrackModalProps, type InstrumentDescriptor, TrackDrawer as InstrumentDrawer, type TrackDrawerProps as InstrumentDrawerProps, type InstrumentSampler, type InstrumentZone, type LLMCandidate, type LLMContent, type LLMFunctionDeclaration, type LLMGenerationConfig, type LLMGenerationRequest, type LLMGenerationResult, type LLMNoteResponse, type LLMPart, type LLMSystemInstruction, type LLMTool, type LLMToolUseRequest, type LLMToolUseResponse, type LLMUsageMetadata, LevelMeter, type LevelMeterProps, type ListAudioFilesOptions, type ListImportableTracksOptions, type MidiClipData, type MidiWriteResult, type MixInterpolation, Modal, type ModalProps, type MusicalContext, OffsetScrubber, type OffsetScrubberProps, PLUGIN_SDK_VERSION, PX_PER_BEAT, PanSlider, type PanelBusFxEntry, type PanelBusState, type PanelFeatureFlags, type PanelGenerationStrategy, type PanelGroupExtension, type PanelIdentity, PanelMasterStrip, type PanelMasterStripProps, type PanelShuffleAdapter, type PanelSoundAdapter, type PeakAnalysis, PianoRollEditor, type PianoRollEditorProps, type PickTopKOptions, type PluginAppTool, type PluginAppToolInputSchema, type PluginAppToolResult, type PluginAudioTextureRequest, type PluginAudioTextureResult, type PluginCapabilities, type PluginChordSegment, type PluginChordTiming, type PluginConcurrentTrackInfo, type PluginCuePoints, type PluginDownloadOptions, PluginError, type PluginErrorCode, type PluginFileDialogOptions, type PluginFxCategoryDetailState, type PluginGenerationContext, type PluginHost, type PluginHttpRequestOptions, type PluginHttpResponse, type PluginManifest, type PluginMidiNote, type PluginPresetData, type PluginPresetInfo, type PluginRegistration, type PluginSampleFilter, type PluginSampleImportResult, type PluginSampleInfo, type PluginSampleTrackInfo, type PluginSceneContext, type PluginSceneInfo, type PluginSettingsSchema, type PluginSettingsStore, type PluginSkill, type PluginSkillInputSchema, type PluginStatus, type PluginStemSplitResult, type PluginStemTrackInfo, type PluginSynthInfo, type PluginTrackFxDetailState, type PluginTrackHandle, type PluginTrackInfo, type PluginTrackLevel, type PluginTrackRuntimeState, type PluginTransportState, type PluginTrimWindow, type PluginUIProps, type PostProcessOptions, RESIZE_HANDLE_PX, ROW_HEIGHT, type ReadMidiClip, type ReadMidiResult, type RecordingChunkFinalizedEvent, type RecordingTargetInfo, type ResolveGroupsOptions, type ResolvedCrossfadePair, type ResolvedFade, type ResolvedGroupsResult, type ResolvedTrackGroup, type SDKTrackRowProps, SLIDER_UNITY, SamplePackCTACard, type SamplePackCTACardProps, type SamplePackCTACardStatus, type SamplePackCardInfo, type SavePluginPresetOptions, type SceneChangeListener, type SceneFamilyTrack, type ScoredCandidate, ScrollingWaveform, type ScrollingWaveformProps, type SettingDefinition, type ShufflePresetResult, SorceryProgressBar, type SoundHistoryEntry, type StemType, type SurgeSoundAdapterOverrides, type SynthesizeCuePointsOptions, TEXTURAL_ROLES, TRANSITION_DESIGNER_DRAFT_KEY, TrackDrawer, type TrackDrawerProps, type TrackFxDetailState, type TrackFxState, type TrackGroupMember, type TrackGroupMeta, type TrackLevelsHandle, TrackMeterStrip, type TrackMeterStripProps, type TrackMeterView, TrackRow, type TrackRowDragProps, type TrackSoundHistory, type TrackSoundSnapshot, type TrackStateChangeListener, TransitionDesigner, type TransitionDesignerDraft, type TransitionDesignerProps, type TransitionOps, type TransitionRowType, type TransportEvent, type TransportEventListener, type UnsubscribeFn, type UseGeneratorPanelCoreOptions, type UsePanelBusResult, type UseSoundHistoryOptions, type UseSoundHistoryResult, type UseTrackReorderOptions, type UseTrackReorderResult, type UseTransitionOpsInputs, type VolumeAutomationPoint, VolumeSlider, type WaveformPeaks, WaveformView, type WaveformViewProps, analyzeWavPeak, asAudioEffect, asCrossfadeMeta, asFadeMeta, asTransitionDesignerDraft, buildCrossfadeInpaintPrompt, buildCrossfadeVolumeCurves, buildFadeVolumeCurve, buildRowSlots, calculateTimeBasedTarget, cellToPx, centerScrollTop, computePeaks, createSurgeSoundAdapter, dbIdsFromKeys, dbToSlider, defaultFadeGesture, drawWaveform, formatConcurrentTracks, hashString, moveItem, newTrackState, normalizeSlots, padPair, padSlots, parseCrossfadePairs, parseFades, parseLLMNoteResponse, parseTrackGroups, pickTopKWeighted, pitchToName, pluginFxToToggleFx, pxToCell, reconcileSlots, resizeNoteDuration, resolveTrackGroups, rowKey, rowType, scorePromptMatch, sliderToDb, slotsEqual, soundIdentity, synthesizeCuePoints, tokenizePrompt, trackDataKey, transposeNotes, useAnySolo, useGeneratorPanelCore, usePanelBus, useSceneState, useSoundHistory, useTrackLevel, useTrackLevels, useTrackMeter, useTrackReorder, useTransitionOps, useTransportPlaying };
|