/**
 * A multi-band EQ, as a composite over effects that already ship.
 *
 * Bass, middle and treble is the most widely understood audio control there is
 * — everyone has used one — which makes it the right answer for an author who
 * would never reach for a parametric filter. It also removes a real failure:
 * without it, a chain shaping two ranges holds two peaking filters that look
 * identical in the rack.
 *
 * Built the way the carve is: one module owning several tagged nodes, rather
 * than a new effect type. Three bands ARE a low shelf, a peaking and a high
 * shelf, so there is nothing new in the graph, nothing new in the render, and
 * an author who opens the details finds exactly the filters they could have
 * added by hand.
 *
 * That is also forced by the registry: parameters are a flat key/value record,
 * so an `eq` effect *type* carrying N bands would need array-shaped params it
 * has no way to express.
 */
import { type HfAudioFxChain, type HfAudioFxNode } from "./audioFx.js";
/** A band is one node. `name` is what the fader is labelled, and its handle. */
export interface HfAudioEqBand {
    name: string;
    /** Corner for a shelf, centre for a peak. */
    frequency: number;
    /** The only value a fader moves. Everything else is fixed when the band is made. */
    gain: number;
    q?: number;
    kind: "lowshelf" | "peaking" | "highshelf";
}
/**
 * How far a fader travels. The registry allows ±40 dB on these filters, which
 * is a repair tool's range — a tone control that can bury a track under 40 dB
 * of bass is not a tone control. ±12 is the span a hi-fi offers, and it is
 * enough to fix a voice.
 */
export declare const HF_AUDIO_EQ_RANGE_DB = 12;
/** Bass, middle, treble — the set nobody needs taught. */
export declare const HF_AUDIO_EQ_3: readonly HfAudioEqBand[];
/**
 * Five bands, named from the shared vocabulary the rest of the rack uses — so
 * reaching for the EQ is also how an author learns the words.
 */
export declare const HF_AUDIO_EQ_5: readonly HfAudioEqBand[];
/** Realise bands as ordinary nodes, tagged so the module can find them again. */
export declare function audioEqNodes(bands: readonly HfAudioEqBand[], eqId: string, chain: HfAudioFxChain): HfAudioFxNode[];
/** Add an EQ to a chain. Returns the chain and the id the module addresses it by. */
export declare function addAudioEq(chain: HfAudioFxChain, bands?: readonly HfAudioEqBand[]): {
    chain: HfAudioFxChain;
    eqId: string;
};
/** Every EQ in a chain, in the order their first band appears. */
export declare function audioEqIds(chain: HfAudioFxChain): string[];
/**
 * Read one EQ's bands back out of the chain.
 *
 * The nodes are the truth, not a cached band list: an author can open the
 * details and move a frequency by hand, and the faders have to reflect that
 * rather than silently overwrite it on the next drag.
 */
export declare function readAudioEqBands(chain: HfAudioFxChain, eqId: string): HfAudioEqBand[];
/** Move one fader. Everything else about the band is left alone. */
export declare function setAudioEqBandGain(chain: HfAudioFxChain, eqId: string, bandName: string, gain: number): HfAudioFxChain;
/** Remove a whole EQ, bands and all. */
export declare function removeAudioEq(chain: HfAudioFxChain, eqId: string): HfAudioFxChain;
/**
 * What the module says when it is closed.
 *
 * Named for the bands that were actually moved, so a rack of collapsed modules
 * still reads as a sentence — and an untouched EQ says so rather than listing
 * three zeroes.
 */
export declare function audioEqSummary(bands: readonly HfAudioEqBand[]): string;
export declare const HF_AUDIO_EQ_CHAIN_VERSION = 1;
//# sourceMappingURL=audioFxEq.d.ts.map