{
  "slug": "spectral-eq-match",
  "name": "gizza-ai/spectral-eq-match",
  "version": "0.1.0",
  "title": "Spectral EQ Match — Match a Reference Curve and Get the Filter Chain — gizza.ai",
  "description": "Paste your track's band levels plus a reference or target curve to derive corrective EQ gains, a ready-to-paste ffmpeg filter chain and the loudness offset in dB.",
  "tags": [
    "eq match",
    "spectral eq match",
    "reference eq curve",
    "match eq to reference track",
    "corrective eq calculator",
    "ffmpeg equalizer chain",
    "firequalizer",
    "loudness offset",
    "tonal balance",
    "rta band levels"
  ],
  "category": "audio",
  "urls": {
    "page": "https://gizza.ai/tools/spectral-eq-match/",
    "markdown": "https://gizza.ai/tools/spectral-eq-match/index.md",
    "descriptor": "https://gizza.ai/tools/spectral-eq-match/tool.json",
    "deep_link_example": "https://gizza.ai/tools/spectral-eq-match/?track=63%20-12%0A250%20-8%0A1k%20-6%0A4k%20-10%0A12k%20-18&reference=63%20-10%0A250%20-8%0A1k%20-6%0A4k%20-8%0A12k%20-14&target_curve=pink&amount=100&max_gain_db=6&smoothing=1&q=1&tone_only=true&track_lufs=-9.5&target_lufs=-14&output=report"
  },
  "cli": "gizza tool spectral-eq-match \"63 -12\n250 -8\n1k -6\n4k -10\n12k -18\"",
  "tool": {
    "description": "Derive a corrective EQ from a measured/target spectrum pair. Paste your track's per-band levels (from any spectrum analyser or RTA) plus either a reference track's band levels or a built-in target curve (flat, pink, bright, warm, speech), and the tool returns the per-band corrective gains, a ready-to-paste ffmpeg equalizer or firequalizer filter chain, and the loudness offset in dB between the two integrated-loudness figures. Use amount to scale the move, max_gain_db to limit boosts and cuts, smoothing to favour broad tonal balance over narrow resonances, q to set the band bandwidth, and tone_only to separate tone matching from level matching.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "amount": {
          "default": 100,
          "description": "Percentage of the derived correction to apply, 0-100. 100 matches the target fully; 50 applies half the move, which is usually the safer starting point on music.",
          "maximum": 100,
          "minimum": 0,
          "type": "number"
        },
        "max_gain_db": {
          "default": 6,
          "description": "Symmetric boost/cut limit in dB, 0-24. Every corrective gain is clamped to +/- this value so a badly measured or out-of-range band cannot ask for an extreme filter. Default 6 dB.",
          "maximum": 24,
          "minimum": 0,
          "type": "number"
        },
        "output": {
          "default": "report",
          "description": "'report' (default) prints the per-band table with track, target, raw difference, smoothed difference and final gain, plus the loudness offset and the ffmpeg command. 'ffmpeg' returns just the ready-to-paste command using peaking equalizer stages, 'firequalizer' the single-stage firequalizer form, and 'csv' a machine-readable per-band table.",
          "enum": [
            "report",
            "ffmpeg",
            "firequalizer",
            "csv"
          ],
          "type": "string"
        },
        "q": {
          "default": 1,
          "description": "Q (bandwidth) of every peaking 'equalizer' stage in the generated ffmpeg chain, 0.1-10. Roughly 1.4 for third-octave bands, 1.0 for octave bands; lower Q is broader. Ignored by the firequalizer output, which interpolates a continuous curve.",
          "maximum": 10,
          "minimum": 0.1,
          "type": "number"
        },
        "reference": {
          "description": "The reference track's per-band levels in the same format. Used only when target_curve is 'reference'. The reference is interpolated over log frequency onto your track's band frequencies, so the two lists do not need the same band count.",
          "type": "string"
        },
        "smoothing": {
          "default": 1,
          "description": "Neighbouring-band averaging radius, 0-4. 0 follows the measurement exactly (narrow resonances included); 1-2 favours broad tonal balance; 4 gives a very gentle tilt-style correction.",
          "maximum": 4,
          "minimum": 0,
          "type": "integer"
        },
        "target_curve": {
          "default": "pink",
          "description": "What to match against. 'reference' uses the pasted reference levels. The built-in curves are relative to 0 dB at 1 kHz: 'flat' = 0 dB everywhere, 'pink' = -3 dB/octave (equal energy per octave, and the default so a track-only run succeeds), 'bright' = -2 dB/octave, 'warm' = -4 dB/octave, 'speech' = pink tilt with a rolloff below 150 Hz, a +3 dB presence lift at 3 kHz and an air cut above 10 kHz.",
          "enum": [
            "reference",
            "flat",
            "pink",
            "bright",
            "warm",
            "speech"
          ],
          "type": "string"
        },
        "target_lufs": {
          "default": 0,
          "description": "The loudness you want to land on in LUFS, e.g. -14. Leave at 0 to skip the loudness offset. The reported offset is target_lufs minus track_lufs.",
          "maximum": 0,
          "minimum": -70,
          "type": "number"
        },
        "tone_only": {
          "default": true,
          "description": "When true (default), the average level difference between the two curves is removed before matching, so the EQ corrects TONE only and level is handled by the loudness offset. Set false to bake the broadband level difference into the band gains.",
          "type": "boolean"
        },
        "track": {
          "description": "Your track's measured per-band levels as frequency/level pairs, e.g. '63 -12, 250 -8, 1k -6, 4k -10, 12k -18' or one pair per line. Frequencies are Hz (a 'k' suffix means kHz), levels are dB on any consistent scale. Pairs may be separated by newlines, commas, semicolons, colons, equals signs or spaces. 2-64 bands.",
          "type": "string"
        },
        "track_lufs": {
          "default": 0,
          "description": "Your track's integrated loudness in LUFS, e.g. -9.5. Leave at 0 to skip the loudness offset. Used with target_lufs to compute the dB offset and the trailing 'volume' stage.",
          "maximum": 0,
          "minimum": -70,
          "type": "number"
        }
      },
      "required": [
        "track"
      ],
      "type": "object"
    }
  }
}