/**
 * Named starting points for the FX rack.
 *
 * Voice carve turned a pile of effects into one understandable feature. These
 * do the same for the cases an analysis cannot decide: a preset is a chain
 * somebody already tuned, applied in one click and editable immediately
 * afterwards.
 *
 * A preset is DATA, deliberately. Applying one writes ordinary nodes into
 * `data-fx-chain` — the same nodes hand-building would produce — so there is no
 * second code path to keep in agreement with the rack, nothing new in the
 * render, and no failure mode the chain does not already have. The author can
 * see everything that was written on their behalf and change any of it.
 *
 * Only the parameters a preset actually means are listed; `normalizeAudioFxParams`
 * fills the rest from the effect's own defaults. That keeps each entry readable
 * as an intent rather than a dump of every knob.
 *
 * Node ORDER is load-bearing — the chain is serial, so a limiter first and a
 * limiter last are different sounds. Every preset below runs
 * subtractive filtering → dynamics → tone → character → limiter, the order
 * `skills/hyperframes-audio` already teaches.
 */
import { type HfAudioFxChain, type HfAudioFxNode, type HfAudioFxParamValues } from "./audioFx.js";
/**
 * Which shelf of the menu a preset sits on.
 *
 * Deliberately NOT the effect registry's own `group` (filter/dynamics/…): that
 * groups by what an effect *is*, and an author picking a preset is shopping for
 * what they *want*. "Telephone" is filters and saturation; nobody looks for it
 * under either.
 */
export type HfAudioFxPresetFamily = "voice" | "repair" | "character" | "space";
export interface HfAudioFxPresetNode {
    /** Effect id from HF_AUDIO_FX. */
    type: string;
    /**
     * What the rack calls this node — the JOB it is doing, not its filter type.
     *
     * A peaking filter is "Shape One Range" wherever it appears, so a chain that
     * cuts mud and then lifts clarity shows the same words twice and an author
     * cannot follow it. Naming each node for its job is what lets a preset read
     * as a list of things that were done.
     */
    label?: string;
    /** Only what this preset means to set; the rest come from the effect's defaults. */
    params?: HfAudioFxParamValues;
}
export interface HfAudioFxPreset {
    id: string;
    label: string;
    family: HfAudioFxPresetFamily;
    /** One line, in the author's language — what it does, not which effects it uses. */
    description: string;
    nodes: readonly HfAudioFxPresetNode[];
}
export declare const HF_AUDIO_FX_PRESETS: readonly HfAudioFxPreset[];
export declare const HF_AUDIO_FX_PRESET_IDS: readonly string[];
export declare function getAudioFxPreset(id: string): HfAudioFxPreset | undefined;
/** Menu order: the shelves, in the order the panel lists them. */
export declare const HF_AUDIO_FX_PRESET_FAMILIES: readonly HfAudioFxPresetFamily[];
export declare function audioFxPresetsByFamily(family: HfAudioFxPresetFamily): HfAudioFxPreset[];
/**
 * Realise a preset as nodes ready to splice into `chain`.
 *
 * Ids are minted against the chain the nodes are joining, not against the
 * preset, so applying the same preset twice cannot collide — and every node
 * gets one, because an automation lane addresses its effect by id and a node
 * without one can never be automated.
 *
 * Params are normalised here rather than at apply time: a preset that names a
 * value the effect would clamp should land in the file as the value that will
 * actually be rendered, so the rack never shows a number the graph is not using.
 */
export declare function audioFxPresetNodes(preset: HfAudioFxPreset, chain: HfAudioFxChain): HfAudioFxNode[];
/**
 * The chain after applying a preset.
 *
 * Appends by default: stacking Telephone onto an already-cleaned voice is a
 * real thing to want, and replacing silently would throw away work. Re-applying
 * a preset that is already present replaces ITS OWN nodes in place instead of
 * adding a second copy — which is what `fromPreset` is for, and mirrors how the
 * carve replaces its own bands rather than stacking new ones on hand-added
 * effects.
 */
export declare function applyAudioFxPreset(chain: HfAudioFxChain, preset: HfAudioFxPreset, options?: {
    replaceChain?: boolean;
}): HfAudioFxChain;
/** Every preset whose nodes are still present, for the rack's group braces. */
export declare function activeAudioFxPresetIds(chain: HfAudioFxChain): string[];
//# sourceMappingURL=audioFxPresets.d.ts.map