FreqRoom

Technical Details — how the audio processing, filter math, and training system work

01Features

Training

  • Eight training modes — Boosts, Cuts, Mixed, Shelves, Pass Filters, Sweep, How Much?, and Match EQ — peaks, dips, shelves, filter cutoffs, free-form location, gain amounts, and dialling in a whole bell. More
  • Explore — A free-play EQ: drag a bell, shelf, or pass filter on the graph and hear it live, with a guide to what each region sounds like. More
  • Adaptive difficulty — Each mode has its own level: 3 correct in a row levels up, 2 wrong levels down. More
  • Gain and Q controls — Boost/cut amount (1–18 dB) and bell width (Q 0.5–8), applied live, even mid-trial. More
  • Instant A/B comparison — EQ and Flat switch without a click or restart, so both continue from the same point. More
  • Frequency response graph — Every candidate curve is drawn during a trial and the hidden one is revealed after you answer; buttons sit under their curves. EQ regions are shaded and named, and a cursor readout shows the frequency, note, and region under the mouse. More
  • Live spectrum — A faint real-time spectrum of what's playing behind the curves. During a trial it only shows the Flat signal (or Match EQ's Yours) until you answer, so it can't give the EQ away. More
  • Sweep scoring — Drag on the graph to the frequency you hear; scored by octave error with a tolerance that tightens by level, and near misses earn partial points. More
  • Answer labels — A verdict and points, then the answer with its note, filter type, or (in Sweep and Match EQ) your error, and its EQ region. More
  • Auto-play EQ — Optionally starts each trial playing the EQ straight away.
  • Focus weak bands — Optionally drills the octaves you miss most often. More

Audio

  • Generated sources — Pink noise (recommended), white noise, and synthesized drum and band loops, all generated in the browser. More
  • Your own music — Upload MP3, WAV, FLAC, OGG, or anything else your browser can play. More
  • File details — The file's format, original sample rate, bit depth, channels, average bitrate, and length. More
  • Position and loop — Seek within an uploaded track and loop an A/B section. More
  • Volume and limiter — Master volume, and a limiter so large boosts never clip. More

Progress

  • Scores — Points weighted by difficulty, accuracy, streaks, your last 10 answers, and a per-mode breakdown, for the session or all time. More
  • Weak-spot strip — Accuracy per octave, shown under the graph. More
  • Saved between visits — Levels, settings, and stats are kept in your browser. More
  • Resets — Reset the sliders to defaults, reset your progress, or clear all saved data. More

Everything else

  • Keyboard shortcuts — 1–9/0 pick bands, ← → step, ↑ ↓ switch boost/cut in Mixed and Shelves, Space toggles EQ/Flat, Enter checks or advances.
  • Share links — Copy a link that recreates a challenge: mode, level, gain, Q, generated source, and for Sweep its boost/dip direction. More
  • Light and dark themes — System (the default) follows your device; you can also pick Light or Dark, and your choice is remembered.
  • Installable and offline — Install it as an app and keep training without a connection. More
  • Private — No account, no server: your audio and data never leave your browser. More

02Why EQ Ear Training Works

Hearing is trained through repeated exposure with immediate feedback. EQ ear training presents a controlled, repeatable stimulus — the same source with and without a filter — and asks the listener to identify what changed. Over time the brain learns to associate the timbral character of a peak, dip, shelf, or roll-off with a frequency region, and that skill transfers to real mixing.

The A/B toggle (EQ vs. Flat) is the core mechanic. Switching between the filtered and unfiltered signal lets the auditory system isolate the change; without the flat reference there is no perceptual anchor. FreqRoom switches between the two without restarting playback (see Signal Chain), so both sides of the comparison continue from the same point in the audio.

03Training Modes

Every mode hides one filter and asks you to identify it. They differ in the filter type, what you answer, and how difficulty scales:

In the mode picker, modes that differ only in direction or filter type share a card with a row of keys along its bottom: Bands (Boosts, Cuts, Mixed) and Filters (Shelves, Pass Filters). Sweep's card has Boost and Dip keys that set its direction. How Much?, Match EQ, and Explore have a card each.

ModeHidden filterYou answerCandidates spanLevels
Boostspeaking, +gainband20 Hz – 20 kHz2–15 bands
Cutspeaking, −gainband20 Hz – 20 kHz2–15 bands
Mixedpeaking, ±gainband and direction20 Hz – 20 kHz2–15 bands
Shelveslow/high shelf, ±gaincorner and direction60 Hz – 10 kHz2–8 corners
Pass Filtershigh-pass or low-passcutoff frequencyHP 40 Hz – 1 kHz, LP 1 – 16 kHz2–8 cutoffs
Sweeppeaking, ±gainany frequency, by dragging40 Hz – 16 kHz1–5 (tolerance)
How Much?peaking at a marked frequencyits gain60 Hz – 12 kHz1–6 (2–12 gain choices)
Match EQpeaking, ±3–12 dBfrequency and gain, by dragging your own bell40 Hz – 16 kHz, ±12 dB1–5 (tolerance)

In Shelves, corners below 1 kHz are low shelves and corners above are high shelves; the direction (boost or cut) is random, and you answer it with the corner using the boost and cut rows. In Pass Filters the Gain slider has no effect.

How Much? turns the question around: the bell's frequency is marked on the graph and you pick its gain from a row of dB keys. The choices per level are:

Level123456
Choices (dB)+3 +9+3 +6 +9+3 … +12, step 3+2 … +12, step 2±3 … ±12, step 3±2 … ±12, step 2

Match EQ hides a bell anywhere from 40 Hz to 16 kHz with a gain of ±3 to ±12 dB (in 1.5 dB steps). You drag your own bell on the graph — left and right for frequency, up and down for gain — and compare Target (the hidden bell), Yours, and Flat; both bells use the Q fader. Your guess counts when it is within the level's tolerance on both axes:

Level12345
Frequency±1 oct±⅔ oct±½ oct±⅓ oct±⅙ oct
Gain±4 dB±3 dB±2.5 dB±2 dB±1.5 dB

In both, the hidden bell carries its own gain, so the Gain slider has no effect.

Explore sits after the eight modes and isn't scored. You drag one filter across the graph — left and right set the frequency, up and down the gain (±18 dB) — and pick its type: bell, low or high shelf, high-pass, or low-pass. The bell uses the Q fader. The engine retunes the filter live while EQ plays, and a guide under the graph names the region, the nearest note, and what a boost or cut there tends to sound like (for example, boxy for a low-mid boost, dull for a treble cut). Nothing is recorded to your progress.

04Band Placement

Pitch perception is roughly logarithmic: each octave doubles the frequency, and octaves feel similar in size. Candidate frequencies are therefore spaced evenly on a logarithmic axis. At level n the mode's span [lo, hi] is divided into n equal slices in log space, with one candidate at the geometric centre of each:

f_i = lo × (hi / lo) ^ ((i + 0.5) / n) i = 0, 1, …, n − 1

The geometric centre of a slice [a, b] is √(a·b), its midpoint in log space, so candidates sit an equal number of octaves apart and are rounded to the nearest hertz. For the full 20 Hz – 20 kHz span (10 octaves), level 2 places candidates 5 octaves apart and level 15 places them 2/3 of an octave apart.

Because the spacing is even on the graph's log axis, the answer buttons are laid out as n equal columns inset to the plot area, so each button sits directly under its curve.

05The Peaking EQ Filter

Boosts, Cuts, Mixed, and Sweep use a peaking EQ — a symmetric bell centred on a frequency, the most common filter in any DAW — implemented with the Web Audio API's BiquadFilterNode set to type: "peaking".

Gain (1–18 dB)

Sets the height of the bell. Decibels are logarithmic: +6 dB doubles the amplitude at the centre frequency, +12 dB is about 4×, and +18 dB about 8×; −6 dB halves it. Perceived loudness grows more slowly than amplitude, so a boost sounds less dramatic than those ratios suggest. Beginners should start at 12 dB or more and lower the gain as their ears improve.

Q (0.5–8)

Q sets the width of the bell. For a peaking filter, the bandwidth in octaves between the half-gain points (where the boost in dB is half its peak) is approximately:

BW ≈ (2 / ln 2) · asinh( 1 / (2Q) )
Q0.511.422.94.38
Bandwidth2.5 oct1.4 oct1 oct0.7 oct½ oct⅓ oct0.18 oct

Broad bells (low Q) change more of the spectrum and are easier to hear; narrow ones (high Q) are much harder. The default of 1.4 is about one octave wide.

Coefficients

The biquad coefficients follow Robert Bristow-Johnson's Audio EQ Cookbook, which the Web Audio specification adopts:

A = 10^(gain / 40) ω₀ = 2π · f₀ / fs α = sin(ω₀) / (2Q) b0 = 1 + α·A b1 = −2·cos(ω₀) b2 = 1 − α·A a0 = 1 + α/A a1 = −2·cos(ω₀) a2 = 1 − α/A

Here f₀ is the centre frequency and fs is the AudioContext's sample rate — usually 44.1 or 48 kHz, set by the output device.

06Shelf and Pass Filters

Shelves

lowshelf and highshelf filters lift or lower everything below or above a corner frequency. Web Audio ignores Q for shelves and fixes the slope at S = 1, the steepest slope without overshoot; at the corner the gain is exactly half the shelf gain in dB. With A and ω₀ as above:

α = sin(ω₀)/2 · √2 (S = 1) low shelf b0 = A·((A+1) − (A−1)·cos ω₀ + 2√A·α) b1 = 2A·((A−1) − (A+1)·cos ω₀) b2 = A·((A+1) − (A−1)·cos ω₀ − 2√A·α) a0 = (A+1) + (A−1)·cos ω₀ + 2√A·α a1 = −2·((A−1) + (A+1)·cos ω₀) a2 = (A+1) + (A−1)·cos ω₀ − 2√A·α high shelf b0 = A·((A+1) + (A−1)·cos ω₀ + 2√A·α) b1 = −2A·((A−1) + (A+1)·cos ω₀) b2 = A·((A+1) + (A−1)·cos ω₀ − 2√A·α) a0 = (A+1) − (A−1)·cos ω₀ + 2√A·α a1 = 2·((A−1) − (A+1)·cos ω₀) a2 = (A+1) − (A−1)·cos ω₀ − 2√A·α

High-pass and low-pass

For highpass and lowpass, Web Audio reads Q in decibels of resonance rather than as a plain ratio. FreqRoom uses Q = −3.01 dB, which is a Butterworth response (linear Q = 1/√2 ≈ 0.707): maximally flat in the passband, −3 dB at the cutoff, then rolling off at 12 dB per octave.

α = sin(ω₀) / (2 · 10^(Q/20)) low-pass b0 = (1 − cos ω₀)/2 b1 = 1 − cos ω₀ b2 = (1 − cos ω₀)/2 high-pass b0 = (1 + cos ω₀)/2 b1 = −(1 + cos ω₀) b2 = (1 + cos ω₀)/2 both a0 = 1 + α a1 = −2·cos ω₀ a2 = 1 − α

07Sweep Scoring

Sweep mode has no band buttons: you pick the direction (a boost or a dip) with the Boost and Dip keys on its card, then drag a marker across the graph to where you hear it (← and → nudge it by a semitone, 1/12 octave). The hidden frequency is drawn from 72 log-spaced points between 40 Hz and 16 kHz. Your answer is scored by its distance from the true frequency in octaves:

error = | log₂( guess / actual ) | (octaves)

A guess counts as correct when the error is within the level's tolerance, which tightens as you level up:

Level12345
Tolerance±1 oct±⅔ oct±½ oct±⅓ oct±⅙ oct

±⅙ octave is two semitones either side. After answering, the graph draws the true curve and a bracket from your marker to it, labelled with the error.

Points (see Points and Scoring) give partial credit: full points within the tolerance, fading linearly to zero at three times it. The level still only moves on the pass/fail result.

08The Frequency Response Graph

The graph evaluates each biquad's transfer function H(z) on the unit circle (z = ejω), giving the steady-state gain in dB at each frequency. With normalised coefficients (each divided by a0):

ω = 2π · f / fs Nr = b0 + b1·cos ω + b2·cos 2ω Ni = −(b1·sin ω + b2·sin 2ω) Dr = 1 + a1·cos ω + a2·cos 2ω Di = −(a1·sin ω + a2·sin 2ω) |H(f)| in dB = 10 · log₁₀( (Nr² + Ni²) / (Dr² + Di²) )

Curves are sampled at 301 log-spaced points from 20 Hz to 20 kHz. The graph uses the exact descriptor that is sent to the audio engine, and matches BiquadFilterNode.getFrequencyResponse for every filter type, so what you see is what you hear.

During a trial every candidate is drawn in grey — both directions in Mixed and Shelves — and after you answer, the hidden filter is revealed in colour: amber for boosts, blue for cuts and pass filters. The dB axis is ±12 dB and widens in 6 dB steps (to ±18 dB) when the gain exceeds 12 dB, so curves are never clipped. The revealed curve rises out of the 0 dB line.

The plot is divided into the seven EQ regions used in the answer labels (see Note and Region Labels), with alternate regions faintly shaded and named along the bottom. With a mouse, a hairline follows the pointer and the top-left readout shows the frequency, nearest note, and region under it (and the gain, where dragging sets one).

Live spectrum

Behind the curves, a soft live spectrum shows what's playing. An AnalyserNode sits inline after the EQ/Flat mix (FFT size 16384, about 3 Hz per bin at 48 kHz, smoothing 0.8). Each of 160 log-spaced points averages the bins' power over a third of an octave, with every bin weighted by f / 1 kHz — a +3 dB/octave tilt, so pink noise reads flat and an EQ change stands out as a bump. Points are eased from frame to frame in power (averaging in dB would read low where there are few bins), and the display is centred on the average level from 100 Hz to 10 kHz. Real material varies far more than an EQ does, so the spectrum is drawn at about three-quarters of the curves' scale and rounds off towards the plot's edges (a tanh soft limit) instead of flat-topping.

Because the spectrum would show where a hidden EQ is, during a trial it only shows while Flat plays — your source with no EQ — or Match EQ's Yours (your own bell), and only after that has played for half a second, since the analyser's 0.34-second window still holds the hidden EQ's sound just after switching. Once you answer it shows for EQ too, so you can watch the change. In Explore it's always on. The spectrum button (the bars icon beside Back and Share, once a mode is open) turns it off.

09Adaptive Difficulty

Each mode keeps its own level, which sets the number of candidates (or, in Sweep and Match EQ, the tolerance). Levels change on consecutive-answer streaks:

3 correct in a row → level up (more candidates, or a tighter tolerance)
2 wrong in a row → level down

A single wrong answer resets the correct streak but doesn't drop the level, so one slip isn't punished. The asymmetry (3 to advance, 2 to drop) keeps you working close to your limit. Peak modes run from 2 to 15 bands, Shelves and Pass Filters from 2 to 8 (closer corners or cutoffs become impractical to tell apart), Sweep and Match EQ from level 1 to 5, and How Much? from 1 to 6.

10Points and Scoring

Accuracy alone can't compare trials: picking 1 of 2 bands is a coin toss, picking 1 of 15 is not. So each correct answer earns points for how many answers were possible — 10 points per bit, where a bit is one doubling of the choices:

points = round( 10 · log₂( choices ) × credit )

Choices is the band count, doubled in Mixed and Shelves (each band has a boost and a cut row), or the number of dB keys in How Much?. For Sweep it is how many tolerance-wide windows fit across its 40 Hz–16 kHz range (about 8.6 octaves ÷ 2 × tolerance); Match EQ multiplies that by the windows across its ±12 dB gain range (24 dB ÷ 2 × gain tolerance). Credit is 1 for a correct answer and 0 for a wrong one; Sweep's fades from 1 at the tolerance to 0 at three times it, and Match EQ takes the weaker of its frequency and gain credits, each faded the same way. Points are scored at the level the trial was played at, before any level change.

Trial2 bands4 bands8 bands15 bandsMixed, 15Sweep 1Sweep 5How Much? 6Match 1Match 5
Points10203039492147363777

The score panel shows the points total, accuracy, the current and best streak of correct answers, lamps for the last 10 answers, and a row per mode played: current and best level, correct count, points, and Sweep's and Match EQ's average error (octaves, and dB for Match EQ). Session covers this visit; Lifetime is saved with your progress. Scores saved before points existed keep their totals and start earning points from the next answer.

11Progress and Focus Practice

Every answer is recorded against the hidden frequency's octave bucket. There are ten buckets centred on the standard octave bands (31.5, 63, 125, 250, 500 Hz, 1, 2, 4, 8, 16 kHz); a frequency belongs to the nearest one:

bucket = clamp( round( log₂(f / 31.5) ), 0, 9 )

Stats are kept separately for peak (Boosts, Cuts, Mixed), shelf, pass, Sweep, How Much?, and Match EQ modes. The strip under the graph's frequency axis shows accuracy per bucket — red below 50%, amber below 80%, green above — once a bucket has at least 3 answers; hovering a segment shows the exact count.

With Focus weak bands on, the hidden frequency is chosen with a weight per candidate instead of uniformly:

weight = (1 − accuracy) + 0.15 accuracy = 0.5 until a bucket has 3+ answers

A band you always miss is therefore about 7.7× as likely as one you always get right (1.15 vs. 0.15), while untried regions still come up regularly.

12Noise and Synthesized Loops

Pink noise has a 1/f power spectrum: power per hertz falls by 3 dB per octave, so every octave carries equal total power. Because hearing resolves frequency on a roughly logarithmic scale, this makes every region about equally prominent, which is why pink noise is the standard signal for acoustic measurement and the recommended source here.

White noise has equal power per hertz. Each octave spans twice as many hertz as the one below it, so each octave carries 3 dB more power — which is why white noise sounds bright and hissy.

FreqRoom generates pink noise with Paul Kellet's refined filter: white noise is fed through a bank of first-order low-pass filters whose outputs are summed to approximate the −3 dB/octave slope to within about ±0.05 dB across the audio band.

b0 = 0.99886·b0 + w·0.0555179 b1 = 0.99332·b1 + w·0.0750759 b2 = 0.96900·b2 + w·0.1538520 b3 = 0.86650·b3 + w·0.3104856 b4 = 0.55000·b4 + w·0.5329522 b5 = −0.7616·b5 − w·0.0168980 output = (b0 + b1 + b2 + b3 + b4 + b5 + b6 + w·0.5362) × 0.11 b6 = w·0.115926

Here w is a uniform random sample in [−1, 1]. The b5 term, with its negative coefficient, and the one-sample-delayed b6 term correct the response at the top of the spectrum; the 0.11 factor sets the level (peaks around 0.9), and output is clamped to ±1. White noise is uniform random samples scaled by 0.45. Both are generated as 30-second stereo buffers with independent channels and loop seamlessly.

Noise is ideal for learning, but music is what you'll EQ. The Drum Loop and Band Loop are synthesized in plain JavaScript on demand, so no audio files ship with the app. Each is 8 bars at 100 BPM (19.2 s), stereo, with light swing:

  • Kick: a sine whose pitch drops from 130 to 45 Hz, plus a 4 ms noise click.
  • Snare: first-difference (brightened) noise over a 190 Hz tone body.
  • Hats: second-difference noise, hiss mostly above 6 kHz; the last 8th of each bar opens.
  • Bass (Band Loop): a sawtooth through a 500 Hz one-pole low-pass, in 8ths on the chord roots.
  • Pad (Band Loop): C–Am–F–G triads, each note two sawtooths detuned ±7 cents and panned apart, through two 2.2 kHz one-poles with a slow attack.

Every note is written at its start position modulo the loop length, so tails that run past the end wrap to the start and the loop point is seamless. A seeded random generator makes each render identical. Both loops are scaled toward an RMS of 0.16, close to the pink noise, with peaks held under 0.95.

13Uploaded Audio

Uploaded files are decoded with decodeAudioData, which resamples them to the AudioContext's rate. The original format details are therefore read from the file header instead:

FormatWhere the details come from
WAVfmt chunk: channels, sample rate, bit depth (including 32-bit float and WAVE_FORMAT_EXTENSIBLE)
FLACSTREAMINFO block: bit-packed sample rate, channels, and bit depth
MP3first MPEG frame header after any ID3v2 tag: MPEG version, sample rate, channel mode
Ogg Vorbis / Opusidentification header in the first page (Opus reports its original input rate)
M4A / otherformat name only

The bitrate shown is the average over the whole file — size × 8 ÷ duration — which is the meaningful figure for variable-bitrate files. Set A and Set B loop a section via the source node's loopStart/loopEnd; playback wraps inside the region, and seeking outside it jumps back to its start.

14Web Audio Signal Chain

All audio processing runs in the browser with the Web Audio API — no server and no audio libraries. The node graph is built once and reused:

AudioBufferSourceNode loops the buffer or A/B region │ voice GainNode fades on start, stop, seek │ input GainNode ├─────────────────────┐ │ │ flat GainNode BiquadFilterNode │ │ │ EQ GainNode │ │ ├─────────────────────┘ │ AnalyserNode live spectrum (passes audio through) │ master GainNode volume │ DynamicsCompressorNode limiter │ AudioContext.destination

Switching between EQ and Flat crossfades the two parallel paths with setTargetAtTime (time constant 5 ms, settled in about 25 ms) rather than restarting playback, so A/B comparison is click-free and never loses its place. Gain and Q changes ramp the filter parameters in place, and volume ramps the master gain. Stopping or seeking fades the current source's own voice gain out over 50 ms, so a seek crossfades between the old and new positions.

Large boosts on dense material can exceed full scale, and digital clipping would add distortion that gives the answer away. The compressor acts as a limiter: threshold −1 dBFS, ratio 20:1, 0 dB knee, 1 ms attack, 100 ms release. The noise sources at normal volume stay below the threshold unless boosted, and the EQ and Flat paths share the same limiter, so the comparison stays fair.

15Note and Region Labels

After each answer the trainer's header shows a Correct or Incorrect verdict and the points earned (Sweep and Match EQ near misses earn some even when incorrect). The line below spells out the answer in three parts: the answer itself, then what it was or how far off you were, then its EQ region:

ModeAnswerThen
Boosts, Cuts, Mixedfrequencynearest note
Shelves, Pass Filtersfrequencyfilter type (e.g. low shelf cut, high-pass)
Sweepfrequencyyour error in octaves
How Much?gainits frequency
Match EQfrequency and gainyour error in octaves and dB

Note name

The nearest MIDI note uses A4 = 440 Hz (MIDI note 69) as the reference:

MIDI = round( 69 + 12 · log₂(f / 440) ) note = NOTE_NAMES[ MIDI mod 12 ] C C# D D# E F F# G G# A A# B octave = floor(MIDI / 12) − 1

EQ region

< 80 Hz Sub Bass 80–250 Hz Bass 250–500 Hz Low Mid 0.5–2 kHz Midrange 2–4 kHz Upper Mid 4–8 kHz Presence > 8 kHz Brilliance

16Privacy, Storage, and Offline Use

FreqRoom has no server and sends nothing anywhere. Uploaded files are read locally in the browser. Your settings (theme, volume, gain, Q, switches, spectrum on/off) and progress (level per mode, lifetime score, per-octave stats) are saved in the browser's localStorage under a freqroom: prefix. Reset progress clears the progress only; Clear saved data removes every freqroom: entry. If storage is unavailable (for example in some private-browsing modes), the app works with defaults.

Share links carry only the challenge settings in the URL (mode, level, gain, Q, generated source, plus the boost/dip direction for Sweep). A service worker caches the app so it can be installed and used offline: pages load from the network when available, falling back to the cached copy, and other files load from the cache and refresh in the background.

17Learn More

Guides, tools, and deeper reading on EQ, hearing, and audio. All external links open in a new tab.

EQ and listening

EQ Guide for IEMs

A practical guide to equalizers for audio playback, from beginner to experienced: filter types, gain, Q, and how to shape a sound.

The Audio Spectrum — Teach Me Audio

The frequency ranges from sub-bass to brilliance, what lives in each, and how they sound when boosted or cut.

How to Listen — Harman International

Harman's critical-listening training program, which inspired FreqRoom.

More ear training

SoundGym

Audio ear-training games and courses covering EQ, compression, and more.

Quiztones

Frequency ear-training app for learning to recognise bands by ear.

Audio Imaging Test Lab

Tests how well you and your headphones or speakers place sounds in the stereo image.

Sound and signals

Let's Learn About Waveforms — The Pudding

An interactive introduction to sound waves, frequency, amplitude, and harmonics.

Seeing Circles, Sines, and Signals — Jack Schaedler

A visual, interactive primer on digital signal processing: sampling, aliasing, and the Fourier transform.

Q and Bandwidth Calculator — Sengpielaudio

Convert between Q, bandwidth in octaves, and cutoff frequencies; the site has many more audio calculators.

Introduction to Digital Filters — Julius O. Smith III

A free, rigorous online book from Stanford CCRMA on how digital filters like biquads work.


Sources

Audio EQ Cookbook — Robert Bristow-Johnson

Canonical derivation of the biquad coefficients for peaking, shelf, and pass filters, and the Q-to-bandwidth relation.

Web Audio API Specification — BiquadFilterNode (W3C)

Exact filter formulas the browser implements, including the fixed shelf slope and Q in dB for low-pass and high-pass.

Generation of Pink Noise — Phil Burk / Paul Kellet

Source of the refined pink-noise filter coefficients (Kellet), alongside the Voss-McCartney algorithm.

How to Listen — Harman International

Original inspiration for the EQ ear-training approach and A/B comparison method.

Web Audio API — MDN Web Docs

Practical reference for AudioContext, audio-node graphs, and parameter automation.

How FreqRoom Works

Volume warning — EQ boosts can be significantly louder than the flat reference. Set your volume to a comfortable level before starting, and avoid listening at high volumes for extended periods.

1 · Choose a source

Pick Noise → Pink to start — its equal energy per octave makes every frequency band equally audible, which is ideal for ear training. White has a brighter, high-frequency bias. Music Loop switches between built-in Drums and a full Band, a step up from noise. Upload your own audio (MP3, WAV, FLAC, OGG) once you want to practice on real music — that's where the training counts. Set A and Set B under the Position fader loop one section of a file.

2 · Pick a test mode

Explore — no quiz: drag an EQ curve on the graph and hear what each region sounds like. A good place to start.
Boosts — one frequency band is boosted; identify which one.
Cuts — one band is cut; identify which one.
Mixed — a band is either boosted or cut; identify the frequency and the direction.
Shelves — a low or high shelf lifts or lowers everything past a corner frequency; find the corner and whether it boosts or cuts. Corners below 1 kHz are low shelves, above are high shelves.
Pass Filters — a high-pass or low-pass filter removes lows or highs; find the cutoff. The Gain slider doesn't apply here.
Sweep — pick Boost or Dip on its card, then click or drag on the graph to where you hear it (← → nudge by a semitone). You're scored on how many octaves off you are; the allowed error shrinks from 1 octave at level 1 to ⅙ octave at level 5.
How Much? — the frequency is marked; pick how many dB it was boosted or cut. Higher levels offer closer steps, then cuts as well.
Match EQ — drag your own bell until it sounds like the hidden one, comparing Target, Yours, and Flat. Frequency and gain both have to be close.

3 · Adjust the filter

Gain (1–18 dB) sets how far the filter boosts or cuts — start at 12 dB or more and lower it as your ears improve. Q sets the bell's width in the peaking modes: low Q is broad and easier, high Q is narrow and harder. Shelves ignore Q; Pass Filters ignore both.

4 · Compare EQ vs. flat

Each trial hides one filter. Toggle between EQ and Flat as often as you like — the difference is what you're training to hear. There's no time limit, and after you answer the graph reveals the hidden curve.

5 · Adaptive difficulty

Your level sets how many candidates you choose from (up to 15 bands, or 8 in Shelves and Pass Filters); in Sweep it sets how close your guess must be. Each mode keeps its own level.

3 correct in a row → level up
2 wrong in a row → level down

6 · Keyboard

1–9 and 0 pick bands 1–10, ← → step between bands, and in Mixed and Shelves ↑ ↓ switch between the boost and cut rows. Space toggles EQ/Flat (even after answering, so you can re-listen to the reveal) and Enter checks your answer or starts the next trial. With Auto-play EQ on, each new trial starts playing straight away.

7 · Tips

Use headphones or studio monitors — laptop speakers compress the frequency response and defeat the purpose. In Mixed mode, listen for the hollow, recessed character of a cut vs. the forward, present quality of a boost. If you're struggling, drop back to Boosts-only and rebuild from a lower level. To set someone a challenge, press Share in the trainer: it copies a link that opens FreqRoom with the same mode, level, gain, Q, and noise source.