@signalsandsorcery/plugin-sdk 2.36.2 → 2.40.1

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.ts CHANGED
@@ -120,6 +120,38 @@ interface PanelBusState {
120
120
  /** User FX chain, top-to-bottom (master section excluded). */
121
121
  fx: PanelBusFxEntry[];
122
122
  }
123
+ /**
124
+ * One plugin a track freeze depends on (missing-deps reporting on the
125
+ * drawer's Freeze tab). @since SDK 2.46.0
126
+ */
127
+ interface FreezeDep {
128
+ /** Stable scan identity when known; null on legacy external-FX entries. */
129
+ identifier: string | null;
130
+ name: string;
131
+ kind: 'instrument' | 'fx';
132
+ }
133
+ /**
134
+ * A track's freeze state — the drawer Freeze tab's model. Frozen = the
135
+ * track plays a FADER-NEUTRAL stem while its sound chain is disabled;
136
+ * volume/pan/mute/solo stay live, and mixing never marks a freeze stale.
137
+ * @since SDK 2.46.0
138
+ */
139
+ interface TrackFreezeState {
140
+ frozen: boolean;
141
+ /** Only meaningful when frozen: sound inputs changed since the stem rendered. */
142
+ stale: boolean;
143
+ /** Which inputs changed ('midi' | 'preset' | 'instrument' | 'external-fx' | 'role'). */
144
+ staleReasons: string[];
145
+ /** PROVEN-missing plugins (blocks unfreeze; never populated on rumor). */
146
+ missingDeps: FreezeDep[];
147
+ /** Every plugin the active freeze recorded (empty when live). */
148
+ deps: FreezeDep[];
149
+ freezeId?: string;
150
+ frozenAt?: string;
151
+ wavPath?: string;
152
+ /** A fresh inactive freeze exists — re-freezing is instant. */
153
+ latentFreshFreeze: boolean;
154
+ }
123
155
  /**
124
156
  * One third-party (VST3/AU) FX insert on a TRACK's plugin chain, as shown to
125
157
  * the panel UI. The track's instrument, the built-in FX-toggle plugins
@@ -750,6 +782,20 @@ interface PluginHost {
750
782
  * @since SDK 2.41.0
751
783
  */
752
784
  copyTrackFxFrom?(destTrackId: string, sourceTrackDbId: string): Promise<TrackFxCopyResult>;
785
+ /** The track's freeze state (frozen / stale + reasons / missing plugins). */
786
+ getTrackFreezeState?(trackId: string): Promise<TrackFreezeState>;
787
+ /**
788
+ * Freeze the track (renders take seconds — resolve = frozen). Idempotent
789
+ * while fresh; re-freezing a stale track re-renders. Refused for
790
+ * sample/audio tracks and transition scenes (message explains why).
791
+ */
792
+ freezeTrack?(trackId: string): Promise<TrackFreezeState>;
793
+ /**
794
+ * Unfreeze: stem out, plugin chain (incl. per-FX bypass flags) restored;
795
+ * the stem is kept for instant re-freeze. Refuses while the track's
796
+ * plugins are provably missing — the message names them and the remedy.
797
+ */
798
+ unfreezeTrack?(trackId: string): Promise<TrackFreezeState>;
753
799
  /** Subscribe to transport state changes. Returns unsubscribe function. */
754
800
  onTransportEvent(listener: TransportEventListener): UnsubscribeFn;
755
801
  /** Subscribe to deck boundary events. Returns unsubscribe function. */
@@ -2531,6 +2577,29 @@ interface FxPresetDataEntry {
2531
2577
  /** Persisted FX data format (stored as JSON in database) */
2532
2578
  type FxPresetData = Partial<Record<FxCategory, FxPresetDataEntry>>;
2533
2579
 
2580
+ /**
2581
+ * useTrackFreeze — one track's freeze state + actions (@since SDK 2.47.0).
2582
+ *
2583
+ * Owned by TrackRow (always mounted) so the ❄ row badge and the drawer's
2584
+ * Freeze tab share ONE state — the drawer unmounts when closed, so state
2585
+ * lifted here survives open/close. Capability-gated: pass any host; when it
2586
+ * lacks `getTrackFreezeState` the hook is inert (`enabled: false`, no
2587
+ * fetches) and nothing renders.
2588
+ */
2589
+
2590
+ interface UseTrackFreezeResult {
2591
+ /** Host supports the freeze surface (feature detection). */
2592
+ enabled: boolean;
2593
+ /** null until the first read resolves (or when reads fail / hook disabled). */
2594
+ state: TrackFreezeState | null;
2595
+ busy: 'freeze' | 'unfreeze' | null;
2596
+ error: string | null;
2597
+ refresh: () => Promise<void>;
2598
+ freeze: () => Promise<void>;
2599
+ unfreeze: () => Promise<void>;
2600
+ }
2601
+ declare function useTrackFreeze(host: PluginHost | undefined, trackId: string): UseTrackFreezeResult;
2602
+
2534
2603
  /**
2535
2604
  * TrackDrawer — the unified per-track drawer body.
2536
2605
  *
@@ -2552,7 +2621,7 @@ type FxPresetData = Partial<Record<FxCategory, FxPresetDataEntry>>;
2552
2621
  */
2553
2622
 
2554
2623
  /** The contextual tabs a track drawer can show, in display order. */
2555
- type DrawerTab = 'fx' | 'pick' | 'history' | 'import' | 'edit';
2624
+ type DrawerTab = 'fx' | 'pick' | 'history' | 'import' | 'edit' | 'freeze';
2556
2625
  interface TrackDrawerProps {
2557
2626
  /** Which tab is active (controlled by the host TrackRow). */
2558
2627
  activeTab: DrawerTab;
@@ -2573,6 +2642,12 @@ interface TrackDrawerProps {
2573
2642
  * FX tab.
2574
2643
  */
2575
2644
  externalFxHost?: PluginHost;
2645
+ /**
2646
+ * Lifted freeze state (@since SDK 2.47.0) — TrackRow owns useTrackFreeze
2647
+ * so its ❄ badge and this drawer share one state. When omitted, the drawer
2648
+ * runs its own hook off `externalFxHost` (direct-use backward compat).
2649
+ */
2650
+ freeze?: UseTrackFreezeResult;
2576
2651
  /** Available instrument plugins from engine scan. */
2577
2652
  instruments?: InstrumentDescriptor[];
2578
2653
  /** Currently loaded instrument plugin ID (null = default Surge XT). */
@@ -2601,6 +2676,12 @@ interface TrackDrawerProps {
2601
2676
  onImportSound?: () => void;
2602
2677
  /** Button label, e.g. "Import Sample" (drums/instruments) or "Import Preset" (synths). */
2603
2678
  importSoundLabel?: string;
2679
+ /**
2680
+ * Linked-group hint (@since SDK 2.48.0): shown in the drawer header on
2681
+ * every tab, e.g. "🔗 Sound changes apply to all 4 parts". Undefined
2682
+ * renders nothing (all single-track panels).
2683
+ */
2684
+ linkedSoundHint?: string;
2604
2685
  /** Current MIDI notes for the piano-roll editor. */
2605
2686
  editNotes?: readonly PluginMidiNote[];
2606
2687
  /** Persist edited notes; PRESENCE of this callback enables the Edit tab. */
@@ -2614,7 +2695,7 @@ interface TrackDrawerProps {
2614
2695
  /** Optional single-note preview when the user adds a note. */
2615
2696
  onAuditionNote?: (pitch: number, velocity: number, durationMs: number) => void;
2616
2697
  }
2617
- declare function TrackDrawer({ activeTab, onTabChange, trackId, fxState, onFxToggle, onFxPresetChange, onFxDryWetChange, fxDisabled, externalFxHost, 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;
2698
+ declare function TrackDrawer({ activeTab, onTabChange, trackId, fxState, onFxToggle, onFxPresetChange, onFxDryWetChange, fxDisabled, externalFxHost, freeze, instruments, currentPluginId, isLoading, onSelect, onRefresh, editorStage, onShowEditor, onBackToInstruments, selectedInstrumentName, soundHistory, soundHistoryCursor, onRestoreSound, onToggleFavorite, onImportSound, importSoundLabel, linkedSoundHint, editNotes, onNotesChange, editBars, editBpm, editSnap, onAuditionNote, }: TrackDrawerProps): React$1.ReactElement;
2618
2699
 
2619
2700
  /**
2620
2701
  * useTrackLevels — drives the cosmetic per-track strip meters.
@@ -2874,6 +2955,12 @@ interface SDKTrackRowProps {
2874
2955
  onImportSound?: () => void;
2875
2956
  /** Sound-import button label ("Import Sample" / "Import Preset"). */
2876
2957
  importSoundLabel?: string;
2958
+ /**
2959
+ * Linked-group hint (@since SDK 2.48.0): when set, the drawer shows this
2960
+ * info line on every tab and the Shuffle button gains a small 🔗 marker +
2961
+ * a title suffix. Undefined (all single-track panels) renders nothing.
2962
+ */
2963
+ linkedSoundHint?: string;
2877
2964
  /** Current MIDI notes for the piano-roll editor (the 'edit' tab). */
2878
2965
  editNotes?: readonly PluginMidiNote[];
2879
2966
  /** Persist edited notes; PRESENCE of this callback enables the Edit tab. */
@@ -2893,7 +2980,7 @@ interface SDKTrackRowProps {
2893
2980
  * a thin peak meter welds to the bottom of the row. Omit to hide it. */
2894
2981
  levels?: TrackLevelsHandle;
2895
2982
  }
2896
- 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, externalFxHost, 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;
2983
+ 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, externalFxHost, onToggleFxDrawer, onProgressChange, accentColor, instrumentName, instrumentMissing, onToggleDrawer, availableInstruments, currentInstrumentPluginId, onInstrumentSelect, instrumentsLoading, onRefreshInstruments, editorStage, onShowEditor, onBackToInstruments, soundHistory, soundHistoryCursor, onRestoreSound, onToggleFavorite, onImportSound, importSoundLabel, linkedSoundHint, editNotes, onNotesChange, editBars, editBpm, editSnap, onAuditionNote, drag, levels, }: SDKTrackRowProps): React$1.ReactElement;
2897
2984
 
2898
2985
  /**
2899
2986
  * Crossfade-pair metadata — family-agnostic types + parsing shared by every
@@ -3763,6 +3850,29 @@ interface ConfirmDialogProps {
3763
3850
  }
3764
3851
  declare function ConfirmDialog({ open, title, message, confirmLabel, cancelLabel, destructive, onConfirm, onCancel, testIdPrefix, }: ConfirmDialogProps): React$1.ReactElement | null;
3765
3852
 
3853
+ /**
3854
+ * GroupCollapseChevron — the shared collapse/expand toggle for voice-group
3855
+ * header bars (ensemble / arp / bass / pad). One component so all four
3856
+ * headers look identical and plugins don't need their own lucide dep; the
3857
+ * state itself is owned by the shell's CollapsibleGroup wrapper and arrives
3858
+ * via GroupRenderContext (`ctx.collapsed` / `ctx.onToggleCollapse`).
3859
+ *
3860
+ * Renders nothing when `onToggle` is absent (pre-2.48 hosts / bare render
3861
+ * contexts), so plugins can mount it unconditionally.
3862
+ *
3863
+ * @since SDK 2.48.0
3864
+ */
3865
+
3866
+ interface GroupCollapseChevronProps {
3867
+ /** Whether the group's member rows are hidden. */
3868
+ collapsed?: boolean;
3869
+ /** Toggle handler (GroupRenderContext.onToggleCollapse). Absent ⇒ renders nothing. */
3870
+ onToggle?: () => void;
3871
+ /** Noun for the tooltip, e.g. "ensemble" → "Collapse ensemble". Default "group". */
3872
+ what?: string;
3873
+ }
3874
+ declare function GroupCollapseChevron({ collapsed, onToggle, what, }: GroupCollapseChevronProps): React$1.ReactElement | null;
3875
+
3766
3876
  /**
3767
3877
  * Modal — the SDK's one modal-stacking primitive (portal + z-tier + backdrop).
3768
3878
  *
@@ -4088,6 +4198,28 @@ interface UseTrackExternalFxResult {
4088
4198
  }
4089
4199
  declare function useTrackExternalFx(host: PluginHost, trackId: string): UseTrackExternalFxResult;
4090
4200
 
4201
+ /**
4202
+ * TrackFreezeSection — the drawer's Freeze tab body (@since SDK 2.46.0).
4203
+ *
4204
+ * Presentational: TrackDrawer owns the freeze state (it also needs it to
4205
+ * lock the sound-editing tabs while frozen) and passes it down with the two
4206
+ * actions. Freezing renders the track's sound chain to a FADER-NEUTRAL stem
4207
+ * on the same track and disables the plugins — volume, pan, mute and solo
4208
+ * stay fully live, so freezing never changes the mix. Unfreezing restores
4209
+ * the chain (including per-FX bypass flags) and keeps the stem for instant
4210
+ * re-freeze.
4211
+ */
4212
+
4213
+ interface TrackFreezeSectionProps {
4214
+ /** null = state not loaded yet (host fetch in flight or failed). */
4215
+ state: TrackFreezeState | null;
4216
+ busy: 'freeze' | 'unfreeze' | null;
4217
+ error: string | null;
4218
+ onFreeze: () => void;
4219
+ onUnfreeze: () => void;
4220
+ }
4221
+ declare function TrackFreezeSection({ state, busy, error, onFreeze, onUnfreeze, }: TrackFreezeSectionProps): React$1.ReactElement;
4222
+
4091
4223
  /**
4092
4224
  * PanSlider Component
4093
4225
  *
@@ -4835,6 +4967,30 @@ interface PanelSoundAdapter {
4835
4967
  importNoun: string;
4836
4968
  /** History label for the lazily-seeded pre-shuffle sound, e.g. 'Previous preset'. */
4837
4969
  previousSoundLabel: string;
4970
+ /**
4971
+ * Linked-sound groups (@since SDK 2.48.0): the sibling tracks a sound
4972
+ * change on `track` should also apply to, or null/[] when the track is not
4973
+ * in a linked group (or the group's link toggle is OFF). Return ALL linked
4974
+ * members — the core filters: the source track is always dropped, and
4975
+ * preset-level broadcasts (shuffle / history-restore / sound-import) skip
4976
+ * siblings whose instrument differs from the source's (a Surge blob must
4977
+ * not land on Kontakt). Pick-tab instrument swaps broadcast to every
4978
+ * sibling unfiltered — that is what converges a mixed group.
4979
+ */
4980
+ broadcastTargets?(track: GeneratorTrackState, services: GenerationServices): Promise<Array<{
4981
+ engineId: string;
4982
+ dbId: string;
4983
+ label?: string;
4984
+ }> | null>;
4985
+ /**
4986
+ * Persist a descriptor as the track's DURABLE sound identity WITHOUT
4987
+ * re-applying it (the descriptor-space half of copySnapshot). The linked
4988
+ * broadcast calls it per target — and on the source after restore/import,
4989
+ * which apply live-only — so getTrackSound / transitions / agent tools
4990
+ * read the truth. Best-effort; families without a durable store omit it.
4991
+ * @since SDK 2.48.0
4992
+ */
4993
+ persistDescriptor?(trackId: string, descriptor: unknown, label: string): Promise<void>;
4838
4994
  }
4839
4995
  /** The 🎲: pick + apply one new sound, honoring the exclusion cycle. */
4840
4996
  interface PanelShuffleAdapter {
@@ -4874,6 +5030,12 @@ interface GenerationServices {
4874
5030
  createFamilyTrack(nameSuffix?: string): Promise<PluginTrackHandle>;
4875
5031
  /** Resolved groups for a registered group extension. */
4876
5032
  resolvedGroups<M>(metaKey: string): ResolvedTrackGroup<M, GeneratorTrackState>[];
5033
+ /**
5034
+ * The family sound adapter. Always present when built by the core's
5035
+ * makeServices; optional only for pre-2.48 hand-built test services.
5036
+ * @since SDK 2.48.0
5037
+ */
5038
+ sound?: PanelSoundAdapter;
4877
5039
  }
4878
5040
  /**
4879
5041
  * One prompt-driven generation turn. The core owns the wrapper: prompt/auth
@@ -4927,6 +5089,15 @@ interface GroupRenderContext {
4927
5089
  engineId: string;
4928
5090
  dbId: string;
4929
5091
  }>, cleanupKeySuffixes: string[]): Promise<void>;
5092
+ /**
5093
+ * Whether this group is visually collapsed (@since SDK 2.48.0). The shell
5094
+ * owns the state and persists it per group in scene-data
5095
+ * (`track:<groupId>:groupUi`); renderGroup wraps its member rows in
5096
+ * `{!ctx.collapsed && …}` and renders a GroupCollapseChevron in its header.
5097
+ */
5098
+ collapsed?: boolean;
5099
+ /** Toggle this group's collapsed state (persisted). @since SDK 2.48.0 */
5100
+ onToggleCollapse?: () => void;
4930
5101
  }
4931
5102
  /**
4932
5103
  * A family-registered multi-track group row (the crossfade seam,
@@ -5206,6 +5377,12 @@ interface GeneratorPanelCore {
5206
5377
  handlers: CoreTrackHandlers;
5207
5378
  handleGenerate(trackId: string): Promise<void>;
5208
5379
  handleShuffle(trackId: string): Promise<void>;
5380
+ /**
5381
+ * History-tab restore + linked-group broadcast (@since SDK 2.48.0) — the
5382
+ * shell wires this as every row's onRestoreSound. Identical to
5383
+ * soundHistory.restoreTo for panels without broadcastTargets.
5384
+ */
5385
+ handleRestoreSound(trackId: string, index: number): Promise<void>;
5209
5386
  handleAddTrack(): Promise<void>;
5210
5387
  handleDeleteTrack(trackId: string): Promise<void>;
5211
5388
  handleExportMidi(): Promise<void>;
@@ -5283,22 +5460,127 @@ interface SurgeSoundAdapterOverrides {
5283
5460
  declare function createSurgeSoundAdapter(host: PluginHost, overrides?: SurgeSoundAdapterOverrides): PanelSoundAdapter;
5284
5461
 
5285
5462
  /**
5286
- * ensemble-core: voice specifications the register + complexity hierarchy
5287
- * as DATA. The first live per-voice register map in the platform (the only
5288
- * prior per-role [low,high] table, MusicTheory.getSuggestedRegister, was
5289
- * dead code).
5463
+ * ensemble-core: style packs. A style = which SOFT rules are violations +
5464
+ * a prompt paragraph steering the joint composition. Hard rules (register,
5465
+ * per-voice monophony, density caps, root-only anchors) apply to every
5466
+ * style — see enforce-voice.ts. Explicitly NOT just baroque: parallels are
5467
+ * a defect in `counterpoint`, the whole point of `interlock`, and the very
5468
+ * mechanism of the horn-section styles (`stabs` / `riffs` / `unison`),
5469
+ * which additionally INVERT the coordination rule — togetherness is
5470
+ * required, not forbidden (`maxOnsetIndependence`).
5290
5471
  *
5291
- * The shape encodes the product intent: the TOP voice is the highest-pitched
5292
- * and most complex line; complexity decreases with register; the bottom
5293
- * voice is a sparse anchor (root pitch classes only when `rootOnly`).
5472
+ * Which styles are offered under which parent instrumentation lives in
5473
+ * instrumentation.ts (STYLES_FOR_INSTRUMENTATION).
5474
+ *
5475
+ * @since SDK 2.42.0 (horn-section styles @since 2.39.0 — see instrumentation.ts)
5476
+ */
5477
+ type EnsembleStyle = 'counterpoint' | 'chorale' | 'interlock' | 'stabs' | 'riffs' | 'unison';
5478
+ /**
5479
+ * The WOVEN (strings/winds) trio. Kept under the historical name because
5480
+ * pre-instrumentation stored configs and consumers validate against it;
5481
+ * per-mode lists live in instrumentation.ts.
5482
+ */
5483
+ declare const ENSEMBLE_STYLES: readonly EnsembleStyle[];
5484
+ interface EnsembleStyleRules {
5485
+ /** Consecutive perfect 5ths/octaves between adjacent voices are violations. */
5486
+ forbidParallelPerfects: boolean;
5487
+ /** A nominally-upper voice sounding below its neighbor is a violation. */
5488
+ forbidVoiceCrossing: boolean;
5489
+ /**
5490
+ * Minimum fraction of an upper voice's onsets that must NOT coincide with
5491
+ * its lower neighbor (0 = homorhythm fine, 1 = fully independent).
5492
+ */
5493
+ minOnsetIndependence: number;
5494
+ /**
5495
+ * Section styles only: the CEILING on that same fraction — a pair whose
5496
+ * upper voice attacks apart from its lower neighbor more than this is a
5497
+ * violation (the section must hit together). Absent = no ceiling.
5498
+ */
5499
+ maxOnsetIndependence?: number;
5500
+ /**
5501
+ * Mechanical per-note duration ceiling in beats, enforced by
5502
+ * enforceVoice (stab styles — a punch must not become a pad). Absent =
5503
+ * no cap.
5504
+ */
5505
+ maxNoteDurationBeats?: number;
5506
+ /** Prompt paragraph injected into the system prompt for this style. */
5507
+ promptParagraph: string;
5508
+ }
5509
+ /**
5510
+ * Section-style togetherness ceilings + the stab length, exported in the
5511
+ * bass-plugin tradition — tune by ear, not by refactor. Independence is the
5512
+ * fraction of an upper voice's onsets its lower neighbor does NOT share:
5513
+ * 0.25 tolerates a stray pickup note per phrase, 0.15 demands lockstep.
5514
+ */
5515
+ declare const STAB_MAX_ONSET_INDEPENDENCE = 0.25;
5516
+ declare const RIFF_MAX_ONSET_INDEPENDENCE = 0.3;
5517
+ declare const UNISON_MAX_ONSET_INDEPENDENCE = 0.15;
5518
+ /** A stab longer than a quarter note is a pad — mechanically trimmed. */
5519
+ declare const STAB_MAX_NOTE_DURATION_BEATS = 1;
5520
+ declare const STYLE_RULES: Record<EnsembleStyle, EnsembleStyleRules>;
5521
+
5522
+ /**
5523
+ * ensemble-core: the INSTRUMENTATION axis — which family of ensemble the
5524
+ * voices model. The parent selection gates the style list (a funk horn
5525
+ * section has no 'chorale'; a string ensemble has no 'stabs') and picks the
5526
+ * voice-spec table (registers, roles, rhythm palettes — see voice-spec.ts).
5527
+ *
5528
+ * Sound coupling stays category-level ONLY: specs stamp the generally
5529
+ * correct role ('strings' / 'brass' / 'winds') and registers use REAL
5530
+ * instrument ranges — users routinely swap the placeholder Surge XT patch
5531
+ * for a sampled library (Kontakt, Omnisphere), so the written MIDI must sit
5532
+ * where real sections play, not where any particular synth patch flatters.
5533
+ *
5534
+ * @since SDK 2.39.0
5535
+ */
5536
+
5537
+ type EnsembleInstrumentation = 'strings' | 'horns' | 'winds';
5538
+ declare const ENSEMBLE_INSTRUMENTATIONS: readonly EnsembleInstrumentation[];
5539
+ /**
5540
+ * Styles selectable under each parent instrumentation. Strings and winds
5541
+ * share the WOVEN trio (independent/held-line writing); horns get the
5542
+ * SECTION trio (rhythmic-unison funk writing) — the two families obey
5543
+ * opposite coordination rules (see ensemble-prompt.ts).
5544
+ */
5545
+ declare const STYLES_FOR_INSTRUMENTATION: Record<EnsembleInstrumentation, readonly EnsembleStyle[]>;
5546
+ declare const DEFAULT_STYLE_FOR_INSTRUMENTATION: Record<EnsembleInstrumentation, EnsembleStyle>;
5547
+ /** Clamp an arbitrary stored/hinted value into the closed instrumentation domain. */
5548
+ declare function normalizeInstrumentation(raw: unknown): EnsembleInstrumentation;
5549
+ /**
5550
+ * Clamp a stored/hinted style into the instrumentation's own list — a group
5551
+ * switched from Strings to Horns with 'counterpoint' still stored lands on
5552
+ * the horn default instead of a style the mode can't honor.
5553
+ */
5554
+ declare function styleForInstrumentation(instrumentation: EnsembleInstrumentation, rawStyle: string | undefined | null): EnsembleStyle;
5555
+
5556
+ /**
5557
+ * ensemble-core: voice specifications — the register + complexity hierarchy
5558
+ * as DATA, one table set per INSTRUMENTATION (see instrumentation.ts). The
5559
+ * first live per-voice register map in the platform (the only prior
5560
+ * per-role [low,high] table, MusicTheory.getSuggestedRegister, was dead
5561
+ * code).
5562
+ *
5563
+ * The WOVEN families (strings, winds) encode the original product intent:
5564
+ * the TOP voice is the highest-pitched and most complex line; complexity
5565
+ * decreases with register; the bottom voice is a sparse anchor. The
5566
+ * SECTION family (horns) deliberately breaks that pyramid: every player
5567
+ * shares the lead's rhythm, so caps are EQUAL and generous — density
5568
+ * thinning is a runaway guard there, never a shaping tool (unequal caps
5569
+ * would punch holes in unison hits).
5570
+ *
5571
+ * Horn/wind registers are REAL instrument ranges in concert pitch
5572
+ * (comfortable working tessitura, not extremes) — the Surge XT patch is a
5573
+ * placeholder and users re-target sampled libraries, so the MIDI must sit
5574
+ * where actual sections play.
5294
5575
  *
5295
5576
  * All thresholds are exported constants in the bass-plugin tradition —
5296
5577
  * tune by ear, not by refactor. Roles are plain strings validated by the
5297
5578
  * host at stamp time (`host.getValidRoles()`); the SDK deliberately ships
5298
5579
  * no role list.
5299
5580
  *
5300
- * @since SDK 2.42.0
5581
+ * @since SDK 2.42.0 (horns/winds tables @since 2.39.0)
5301
5582
  */
5583
+
5302
5584
  interface EnsembleVoiceSpec {
5303
5585
  /** 0 = top voice; increases downward. */
5304
5586
  voiceIndex: number;
@@ -5324,16 +5606,19 @@ interface EnsembleVoiceSpec {
5324
5606
  */
5325
5607
  monoPreference: 'high' | 'low';
5326
5608
  }
5609
+ /** Equal per-voice cap for horn tables — a runaway guard, not a shaper. */
5610
+ declare const HORN_MAX_NOTES_PER_BAR = 12;
5327
5611
  /** Supported ensemble sizes. */
5328
5612
  declare const ENSEMBLE_MIN_VOICES = 2;
5329
5613
  declare const ENSEMBLE_MAX_VOICES = 6;
5330
5614
  /**
5331
- * Default voice specs for an N-voice ensemble, top voice first. Clamps N to
5332
- * the supported range. Returned objects are fresh copies callers may
5333
- * override fields (e.g. style packs narrowing registers) without touching
5334
- * the tables.
5615
+ * Default voice specs for an N-voice ensemble of the given instrumentation,
5616
+ * top voice first. Clamps N to the supported range; instrumentation
5617
+ * defaults to 'strings' (the pre-instrumentation behavior, unchanged).
5618
+ * Returned objects are fresh copies — callers may override fields (e.g.
5619
+ * style packs narrowing registers) without touching the tables.
5335
5620
  */
5336
- declare function defaultVoiceSpecs(voiceCount: number): EnsembleVoiceSpec[];
5621
+ declare function defaultVoiceSpecs(voiceCount: number, instrumentation?: EnsembleInstrumentation): EnsembleVoiceSpec[];
5337
5622
 
5338
5623
  /**
5339
5624
  * ensemble-core: HARD per-voice enforcement — the mechanical layer between
@@ -5379,6 +5664,12 @@ interface EnforceVoiceOptions {
5379
5664
  scalePcs?: ReadonlySet<number>;
5380
5665
  /** Chord-tone pitch classes for a bar — exemptions for the scale snap. */
5381
5666
  chordPcsAtBar?: (bar: number) => ReadonlySet<number> | null;
5667
+ /**
5668
+ * Style-level per-note duration ceiling in beats (stab styles — see
5669
+ * STYLE_RULES[*].maxNoteDurationBeats). A punch must not become a pad;
5670
+ * longer notes are trimmed, never dropped.
5671
+ */
5672
+ maxNoteDurationBeats?: number;
5382
5673
  }
5383
5674
  interface EnforceVoiceResult {
5384
5675
  notes: EnsembleNote[];
@@ -5444,34 +5735,10 @@ declare function describeViolations(analysis: EnsembleAnalysis, rules: {
5444
5735
  forbidParallelPerfects: boolean;
5445
5736
  forbidVoiceCrossing: boolean;
5446
5737
  minOnsetIndependence: number;
5738
+ /** Section styles: independence ABOVE this is the violation (see styles.ts). */
5739
+ maxOnsetIndependence?: number;
5447
5740
  }): string[];
5448
5741
 
5449
- /**
5450
- * ensemble-core: style packs. A style = which SOFT rules are violations +
5451
- * a prompt paragraph steering the joint composition. Hard rules (register,
5452
- * per-voice monophony, density caps, root-only anchors) apply to every
5453
- * style — see enforce-voice.ts. Explicitly NOT just baroque: parallels are
5454
- * a defect in `counterpoint` and the whole point of `interlock`.
5455
- *
5456
- * @since SDK 2.42.0
5457
- */
5458
- type EnsembleStyle = 'counterpoint' | 'chorale' | 'interlock';
5459
- declare const ENSEMBLE_STYLES: readonly EnsembleStyle[];
5460
- interface EnsembleStyleRules {
5461
- /** Consecutive perfect 5ths/octaves between adjacent voices are violations. */
5462
- forbidParallelPerfects: boolean;
5463
- /** A nominally-upper voice sounding below its neighbor is a violation. */
5464
- forbidVoiceCrossing: boolean;
5465
- /**
5466
- * Minimum fraction of an upper voice's onsets that must NOT coincide with
5467
- * its lower neighbor (0 = homorhythm fine, 1 = fully independent).
5468
- */
5469
- minOnsetIndependence: number;
5470
- /** Prompt paragraph injected into the system prompt for this style. */
5471
- promptParagraph: string;
5472
- }
5473
- declare const STYLE_RULES: Record<EnsembleStyle, EnsembleStyleRules>;
5474
-
5475
5742
  /**
5476
5743
  * ensemble-core: the `submit_ensemble` function-calling contract — how the
5477
5744
  * ONE joint LLM call returns all voices as structured JSON. Built for
@@ -5507,21 +5774,30 @@ declare function parseEnsembleArgs(args: unknown, voiceCount: number): ParsedEns
5507
5774
 
5508
5775
  /**
5509
5776
  * ensemble-core: the joint-composition system prompt. ONE call composes ALL
5510
- * voices together — the coordination (imitation, staggered entrances,
5511
- * contrary motion) has to be planned across voices, which is exactly what
5512
- * per-track generation can never do. Mirrors the bass plugin's prompt
5513
- * discipline: numbered load-bearing rules, register/density contracts
5514
- * stated per voice, sound selection nowhere in sight (that stays
5777
+ * voices together — the coordination has to be planned across voices, which
5778
+ * is exactly what per-track generation can never do. Mirrors the bass
5779
+ * plugin's prompt discipline: numbered load-bearing rules, register/density
5780
+ * contracts stated per voice, sound selection nowhere in sight (that stays
5515
5781
  * mechanical, host-side).
5516
5782
  *
5783
+ * The numbered rules are INSTRUMENTATION-dependent — the two families obey
5784
+ * opposite coordination physics:
5785
+ *
5786
+ * WOVEN (strings, winds): independent lines that converse — imitation,
5787
+ * contrary motion, staggered entrances, avoid attacking together.
5788
+ *
5789
+ * SECTION (horns): one instrument with many bells — every voice attacks
5790
+ * WITH the lead, voiced under it, short and syncopated, biased hard
5791
+ * toward dance/funk (James Brown stabs, rhythmic punches).
5792
+ *
5517
5793
  * The musical context (key/BPM/chords/contract) arrives via the host's
5518
- * generateWithLLM(Tools) auto-prefix — this prompt states the ENSEMBLE
5794
+ * generateWithLLM(Tools) auto-prefix — this prompt states the ensemble
5519
5795
  * rules and the per-voice contracts only.
5520
5796
  *
5521
- * @since SDK 2.42.0
5797
+ * @since SDK 2.42.0 (section rules @since 2.39.0)
5522
5798
  */
5523
5799
 
5524
- declare function buildEnsembleSystemPrompt(specs: readonly EnsembleVoiceSpec[], style: EnsembleStyle): string;
5800
+ declare function buildEnsembleSystemPrompt(specs: readonly EnsembleVoiceSpec[], style: EnsembleStyle, instrumentation?: EnsembleInstrumentation): string;
5525
5801
  /**
5526
5802
  * Build the retry user-message suffix from soft-rule violations — one
5527
5803
  * guided second attempt, quota-conscious (callers should not loop).
@@ -5581,7 +5857,7 @@ declare function useAnySolo(host: Pick<PluginHost, 'isAnySoloActive' | 'onTrackS
5581
5857
  * Registry checks semver.gte(PLUGIN_SDK_VERSION, manifest.minHostVersion)
5582
5858
  * during activation and marks incompatible plugins accordingly.
5583
5859
  */
5584
- declare const PLUGIN_SDK_VERSION = "2.45.0";
5860
+ declare const PLUGIN_SDK_VERSION = "2.46.0";
5585
5861
 
5586
5862
  /**
5587
5863
  * FX Preset Definitions
@@ -5740,4 +6016,4 @@ interface PickTopKOptions {
5740
6016
  */
5741
6017
  declare function pickTopKWeighted<T>(scored: ReadonlyArray<ScoredCandidate<T>>, options?: PickTopKOptions): T | null;
5742
6018
 
5743
- export { AUDIO_EFFECTS, AUDIO_EFFECT_LABEL, type AdjacentPairAnalysis, 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, ENSEMBLE_MAX_VOICES, ENSEMBLE_MIN_VOICES, ENSEMBLE_STYLES, EQUAL_POWER_GAIN, type EnforceVoiceOptions, type EnforceVoiceResult, type EnsembleAnalysis, type EnsembleNote, type EnsembleStyle, type EnsembleStyleRules, type EnsembleVoiceSpec, 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 GroupFadeEntry, type GroupFadeEntryOf, type GroupFadeMemberLayer, GroupFadeTrackRow, type GroupFadeTrackRowProps, 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, MIN_NOTE_DURATION_BEATS, type MidiClipData, type MidiWriteResult, type MixInterpolation, Modal, type ModalProps, type MotionKind, type MusicalContext, OffsetScrubber, type OffsetScrubberProps, PLUGIN_SDK_VERSION, PX_PER_BEAT, PanSlider, type PanelBusFxEntry, type PanelBusLevels, type PanelBusState, type PanelFeatureFlags, type PanelGenerationStrategy, type PanelGroupExtension, type PanelIdentity, PanelMasterStrip, type PanelMasterStripProps, type PanelShuffleAdapter, type PanelSoundAdapter, type PanelTransitionGroupAdapter, type ParsedEnsemble, 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 PluginGenerationContextOptions, 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 ResolvedGroupFade, type ResolvedGroupsResult, type ResolvedTrackGroup, type SDKTrackRowProps, SLIDER_UNITY, STYLE_RULES, SUBMIT_ENSEMBLE_TOOL_NAME, SamplePackCTACard, type SamplePackCTACardProps, type SamplePackCTACardStatus, type SamplePackCardInfo, type SavePluginPresetOptions, type SceneChangeListener, type SceneFamilyTrack, type SceneTrackSummary, type ScoredCandidate, ScrollingWaveform, type ScrollingWaveformProps, type SettingDefinition, type ShufflePresetOptions, type ShufflePresetResult, SorceryProgressBar, type SoundHistoryEntry, type StemType, type SurgeSoundAdapterOverrides, type SurgeXtStatus, type SynthesizeCuePointsOptions, TEXTURAL_ROLES, TRANSITION_DESIGNER_DRAFT_KEY, type TrackCreatedContext, TrackDrawer, type TrackDrawerProps, type TrackExternalFxEntry, TrackExternalFxSection, type TrackExternalFxSectionProps, 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 UseTrackExternalFxResult, type UseTrackReorderOptions, type UseTrackReorderResult, type UseTransitionOpsInputs, type VerbatimFadeMember, type VolumeAutomationPoint, VolumeSlider, type WaveformPeaks, WaveformView, type WaveformViewProps, analyzeEnsemble, analyzeWavPeak, asAudioEffect, asCrossfadeMeta, asFadeMeta, asTransitionDesignerDraft, buildCrossfadeInpaintPrompt, buildCrossfadeVolumeCurves, buildEnsembleSystemPrompt, buildFadeVolumeCurve, buildRowSlots, buildSubmitEnsembleParameters, buildViolationRetrySuffix, calculateTimeBasedTarget, cellToPx, centerScrollTop, computePeaks, createSurgeSoundAdapter, dbIdsFromKeys, dbToSlider, defaultFadeGesture, defaultVoiceSpecs, describeViolations, drawWaveform, effectivePxPerBeat, enforceVoice, foldPitchToRegister, formatConcurrentTracks, hashString, moveItem, nearestPitchWithPc, newTrackState, normalizeSlots, padPair, padSlots, parseCrossfadePairs, parseEnsembleArgs, parseFades, parseLLMNoteResponse, parseTrackGroups, pickTopKWeighted, pitchToName, pluginFxToToggleFx, promptEnterToGenerate, pxToCell, reconcileSlots, resizeNoteDuration, resolveTrackGroups, rowKey, rowType, scorePromptMatch, sliderToDb, slotsEqual, soundIdentity, splitFadeEntries, synthesizeCuePoints, tokenizePrompt, trackDataKey, transposeNotes, useAnySolo, useGeneratorPanelCore, usePanelBus, useSceneState, useSoundHistory, useTrackExternalFx, useTrackLevel, useTrackLevels, useTrackMeter, useTrackReorder, useTransitionOps, useTransportPlaying };
6019
+ export { AUDIO_EFFECTS, AUDIO_EFFECT_LABEL, type AdjacentPairAnalysis, 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, DEFAULT_STYLE_FOR_INSTRUMENTATION, 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, ENSEMBLE_INSTRUMENTATIONS, ENSEMBLE_MAX_VOICES, ENSEMBLE_MIN_VOICES, ENSEMBLE_STYLES, EQUAL_POWER_GAIN, type EnforceVoiceOptions, type EnforceVoiceResult, type EnsembleAnalysis, type EnsembleInstrumentation, type EnsembleNote, type EnsembleStyle, type EnsembleStyleRules, type EnsembleVoiceSpec, 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 FreezeDep, 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, GroupCollapseChevron, type GroupCollapseChevronProps, type GroupFadeEntry, type GroupFadeEntryOf, type GroupFadeMemberLayer, GroupFadeTrackRow, type GroupFadeTrackRowProps, type GroupParseSpec, type GroupRenderContext, HORN_MAX_NOTES_PER_BAR, 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, MIN_NOTE_DURATION_BEATS, type MidiClipData, type MidiWriteResult, type MixInterpolation, Modal, type ModalProps, type MotionKind, type MusicalContext, OffsetScrubber, type OffsetScrubberProps, PLUGIN_SDK_VERSION, PX_PER_BEAT, PanSlider, type PanelBusFxEntry, type PanelBusLevels, type PanelBusState, type PanelFeatureFlags, type PanelGenerationStrategy, type PanelGroupExtension, type PanelIdentity, PanelMasterStrip, type PanelMasterStripProps, type PanelShuffleAdapter, type PanelSoundAdapter, type PanelTransitionGroupAdapter, type ParsedEnsemble, 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 PluginGenerationContextOptions, 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, RIFF_MAX_ONSET_INDEPENDENCE, ROW_HEIGHT, type ReadMidiClip, type ReadMidiResult, type RecordingChunkFinalizedEvent, type RecordingTargetInfo, type ResolveGroupsOptions, type ResolvedCrossfadePair, type ResolvedFade, type ResolvedGroupFade, type ResolvedGroupsResult, type ResolvedTrackGroup, type SDKTrackRowProps, SLIDER_UNITY, STAB_MAX_NOTE_DURATION_BEATS, STAB_MAX_ONSET_INDEPENDENCE, STYLES_FOR_INSTRUMENTATION, STYLE_RULES, SUBMIT_ENSEMBLE_TOOL_NAME, SamplePackCTACard, type SamplePackCTACardProps, type SamplePackCTACardStatus, type SamplePackCardInfo, type SavePluginPresetOptions, type SceneChangeListener, type SceneFamilyTrack, type SceneTrackSummary, type ScoredCandidate, ScrollingWaveform, type ScrollingWaveformProps, type SettingDefinition, type ShufflePresetOptions, type ShufflePresetResult, SorceryProgressBar, type SoundHistoryEntry, type StemType, type SurgeSoundAdapterOverrides, type SurgeXtStatus, type SynthesizeCuePointsOptions, TEXTURAL_ROLES, TRANSITION_DESIGNER_DRAFT_KEY, type TrackCreatedContext, TrackDrawer, type TrackDrawerProps, type TrackExternalFxEntry, TrackExternalFxSection, type TrackExternalFxSectionProps, TrackFreezeSection, type TrackFreezeSectionProps, type TrackFreezeState, 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, UNISON_MAX_ONSET_INDEPENDENCE, type UnsubscribeFn, type UseGeneratorPanelCoreOptions, type UsePanelBusResult, type UseSoundHistoryOptions, type UseSoundHistoryResult, type UseTrackExternalFxResult, type UseTrackFreezeResult, type UseTrackReorderOptions, type UseTrackReorderResult, type UseTransitionOpsInputs, type VerbatimFadeMember, type VolumeAutomationPoint, VolumeSlider, type WaveformPeaks, WaveformView, type WaveformViewProps, analyzeEnsemble, analyzeWavPeak, asAudioEffect, asCrossfadeMeta, asFadeMeta, asTransitionDesignerDraft, buildCrossfadeInpaintPrompt, buildCrossfadeVolumeCurves, buildEnsembleSystemPrompt, buildFadeVolumeCurve, buildRowSlots, buildSubmitEnsembleParameters, buildViolationRetrySuffix, calculateTimeBasedTarget, cellToPx, centerScrollTop, computePeaks, createSurgeSoundAdapter, dbIdsFromKeys, dbToSlider, defaultFadeGesture, defaultVoiceSpecs, describeViolations, drawWaveform, effectivePxPerBeat, enforceVoice, foldPitchToRegister, formatConcurrentTracks, hashString, moveItem, nearestPitchWithPc, newTrackState, normalizeInstrumentation, normalizeSlots, padPair, padSlots, parseCrossfadePairs, parseEnsembleArgs, parseFades, parseLLMNoteResponse, parseTrackGroups, pickTopKWeighted, pitchToName, pluginFxToToggleFx, promptEnterToGenerate, pxToCell, reconcileSlots, resizeNoteDuration, resolveTrackGroups, rowKey, rowType, scorePromptMatch, sliderToDb, slotsEqual, soundIdentity, splitFadeEntries, styleForInstrumentation, synthesizeCuePoints, tokenizePrompt, trackDataKey, transposeNotes, useAnySolo, useGeneratorPanelCore, usePanelBus, useSceneState, useSoundHistory, useTrackExternalFx, useTrackFreeze, useTrackLevel, useTrackLevels, useTrackMeter, useTrackReorder, useTransitionOps, useTransportPlaying };