/**
 * One knob over several, for the five effects that cannot honestly have one
 * real parameter nominated as the control that matters.
 *
 * A compressor has seven controls and an author wants one. The rest of the rack
 * opens on a single real parameter — a filter's frequency, a delay's mix — but
 * these five have no such parameter: threshold means nothing without ratio,
 * ratio means nothing without make-up gain, and picking any one of them as the
 * face of the module would be a knob that lies about what it sets.
 *
 * So they get a derived one, exactly as the carve already does: `carveProfile`
 * turns a single 0..1 into six numbers, and these do the same for the rest of
 * the rack. `EFFECT_COPY[id].primary` is `"strength"` for precisely these five,
 * which is what says a module wants this treatment.
 *
 * Continuous rather than the three-point tables the design proposed. A table
 * makes gentle/middle/strong three settings an author picks between, and the
 * thing being modelled is not three settings — it is one axis, and the carve's
 * knob has proved that reads. The proposal's figures survive as the anchors:
 * each curve passes through them at 0, 0.5 and 1.
 *
 * Every number below is expressed in the parameter's own registry unit and then
 * clamped by `normalizeAudioFxParams` on the way into the chain, so a profile
 * cannot ship a value the effect would refuse.
 */
import { type HfAudioFxParamValues } from "./audioFx.js";
export interface HfAudioFxProfile {
    /** What the one knob is called. Never the DSP name of anything it drives. */
    label: string;
    /** What the two ends sound like — the question an author actually has. */
    ends: {
        low: string;
        high: string;
    };
    /** The parameters it sets. Everything else keeps the effect's own default. */
    derives: readonly string[];
    /** The mechanism values at a given strength. */
    at(strength: number): HfAudioFxParamValues;
}
export declare const HF_AUDIO_FX_PROFILES: Record<string, HfAudioFxProfile>;
export declare function getAudioFxProfile(type: string): HfAudioFxProfile | undefined;
/**
 * The parameters a profile sets at this strength, merged over what is there.
 *
 * Merged rather than replacing: a profile names only the parameters it derives,
 * and the rest — a compressor's knee, a saturation's curve type — are the
 * author's to set under Details and must survive the knob moving.
 */
export declare function applyAudioFxProfile(type: string, strength: number, params: HfAudioFxParamValues): HfAudioFxParamValues;
/**
 * The strength a set of parameters reads as, by inverting the profile's own
 * curve on its most characteristic parameter.
 *
 * A chain stores mechanism values, not the knob — the same contract
 * `normalizeCarveSettings` has, and for the same reason: the mechanism is what
 * renders, so it is what must be authoritative. Reading the knob back means one
 * parameter has to be nominated as the one that says most about intent.
 *
 * A hand-edited chain therefore lands the knob at the nearest strength that
 * would have produced its most telling value, which is the honest answer — the
 * alternative is a knob parked at a default while the effect is set to
 * something else entirely.
 */
export declare function audioFxProfileStrength(type: string, params: HfAudioFxParamValues): number;
//# sourceMappingURL=audioFxProfiles.d.ts.map