Skip to content

Automation and Metering ​

A static mix is rarely the best mix, and ears alone are not enough to trust one. Automation lets controls move over time; metering lets you watch the result with your eyes as well as your ears. This page grounds both in libsonare's automation and meter processors; for the basics see Mixing Basics.

Automation: a mix that breathes ​

Automation records how a control changes over time — push the vocal up half a dB in the chorus, fade a synth out over four bars, open a filter on a riser. Each control follows a curve between the points you set, and the curve shape changes the feel:

CurveMotion
LinearA straight ramp between points
ExponentialInterpolates on a log scale, so a frequency or linear-gain sweep sounds even. A fader lane is already in dB, where linear is the even-sounding fade; see Mixing Engine
S-curveEased at both ends — smooth, musical transitions
HoldJumps instantly and stays until the next point

Automation can target faders, pans, sends, and insert parameters, so the whole strip — not just level — can move.

Engine automation vs. typed project lanes ​

The automation described above is engine-level: its AutomationTarget points at a fader, pan, send, or insert parameter inside a live RealtimeEngine mix and plays back in real time. A project-level automation lane is a different, persisted structure — Project.addAutomationLane(trackId, desc) stores a ProjectAutomationLaneDesc of breakpoints and an optional targetKind (ProjectAutomationTargetKind = 'opaque' | 'track-fader-db' | 'track-pan'). Omitting targetKind keeps the legacy 'opaque' route, which drives a host-defined parameter id with no built-in meaning. A typed lane ('track-fader-db' or 'track-pan') behaves differently: installed through the C ABI's sonare_project_add_automation_lane_ex, it resolves into the engine's reserved parameter namespace when the project is installed. The payoff is that an offline bounce applies the lane through the track mixer automatically, so the host never has to know which raw parameter id a fader or pan happens to occupy.

Metering: trusting your eyes too ​

Rooms lie and ears tire, so a mix is also judged on meters:

  • Peak / true peak — the highest level. A plain sample meter only reads the stored samples, but the waveform reconstructed between them can rise higher; true peak catches those between-sample overs a plain meter misses.
  • RMS / LUFS — average level and perceived loudness. LUFS (Loudness Units relative to Full Scale) is the unit that tracks what listeners actually judge.
  • Correlation — whether left and right agree; strongly negative values warn the mix may weaken in mono.
  • Goniometer — a dot-plot of the stereo field. Read it on the usual rotated display, which puts left−right across and left+right up (a raw left-against-right plot rotates every shape below by 45°). A tall vertical blob means a mostly-mono signal, a wide horizontal spread means a wide stereo image, and a cloud collapsing onto the horizontal axis warns of phase or polarity trouble. A cloud tilted to one side is a plain left/right level imbalance — the image sits off-centre, which is a balance problem, not a phase one.

Peak, RMS, and correlation in libsonare cover one processed block (or the whole render for a one-shot mix), with no smoothing. The steady needle of a VU meter (about 300 ms of integration) or the slow fall and peak hold of a program meter are ballistics that the display adds on top; LUFS already has its own fixed 400 ms and 3 s windows. See Metering for the details.

Meters describe; they do not decide. Use them to catch problems your ears miss, not to chase numbers.

LOUDNESS · TRUE PEAKIDLE
Inter-sample peaks — why a master clips on playback

The dots are samples of a sine wave; the curve shows its analytic waveform. A crest can fall between samples, above every stored value. The gap depends on frequency and phase, so it does not increase smoothly toward Nyquist. Compare the analytic peak with the oversampled meter reading. Raising the sample peak toward 0 dBFS can leave an inter-sample over that clips a converter or processor without sufficient headroom.

Sample peak
-0.3 dBFS
Frequency (×Nyquist)
0.4
METERS · LOUDNESSIDLE
Loudness metering — LUFS, true-peak, and range

The bar tracks momentary loudness as the clip plays; the panel is the loudness over time. Integrated LUFS is the single overall number, true-peak estimates peaks between samples, and LRA captures how much the loudness moves. Switch the window to compare the fast momentary meter with the smoother short-term one — each reports only once its window has filled, so the short-term contour starts three seconds into the clip.

Window
How libsonare models automation and metering

Automation is scheduled on AutomationLanes as sample-accurate AutomationEvents with an AutomationCurve (linear/exponential/s-curve/hold); an AutomationTarget points at a fader, pan, send, or insert parameter, and InsertAutomationLane automates inside an insert. Metering uses a MeterProcessor (MeterConfig) for peak/true-peak/RMS/LUFS and correlation, plus a GoniometerBuffer of GoniometerPoints for the vectorscope. All of this is real-time-safe, so automation plays back and meters update both offline and inside an AudioWorklet, with engine-side telemetry available for UI displays.

The true-peak meter reads one reconstruction-filter group delay behind the block, which is what makes its reading independent of the block size. The last few samples of a signal are therefore still pending when the final block ends; call Mixer.flushMeters() (Python: flush_meters()) after the last block of an offline render to read them against silence and fold them into the snapshot. Offline engine renders and the one-shot mix flush every meter themselves.

Related: Mixing Basics, Channel Strip, True Peak, Reading Mastering Meters