Metering (Audio Tap)

Per-track and master loudness/true-peak/spectrum/stereo from the MCP Tap Max-for-Live devices, plus cross-track mix analysis.

Tools on this page
  1. get_audio_tap_status
  2. list_taps
  3. reset_meter
  4. read_meter
  5. read_track_meter
  6. measure_loudness
  7. measure_mix
  8. deploy_taps
  9. remove_taps

get_audio_tap_status

get_audio_tap_status()

Report per-track tap registry connectivity.

Returns JSON {ok, data:{connected, tracks}}. connected is True when at least one ‘MCP Audio Tap’ device is streaming into the registry on 9878; tracks is the list of connected tap identities (uuid/name/index/kind + sample_rate + block_count). Empty/False until a tap device is loaded onto a track.

list_taps

list_taps()

List the connected per-track taps.

Returns JSON {ok, data:{count, tracks}} where tracks is the list of tap identities (uuid/name/index/kind + sample_rate + block_count) currently streaming into the registry.

reset_meter

reset_meter(track_index: int = None)

Reset tap accumulators (clears buffered blocks).

track_index: omit to reset every connected tap; pass -1 for the master tap or a track index to reset just that one. Returns JSON {ok, data:{reset:true}}. Call before playing material you want measured.

read_meter

read_meter()

Master tap signal summary (compat shim for read_track_meter(-1)).

Delegates to read_track_meter for the master tap. Returns JSON {ok, data} with the integrated/momentary/short-term LUFS, true-peak dBTP, linear peak/rms, crest, block_count and sample_rate. {ok:false,error} if no master tap is connected.

read_track_meter

read_track_meter(track_index: int = -1)

Integrate a track’s buffered tap blocks into a signal summary.

track_index: -1 for the master tap (default), or a track index whose ‘MCP Audio Tap’ device is streaming. Returns JSON {ok, data:{integrated_lufs, momentary_lufs, short_term_lufs, true_peak_dbtp, peak, rms, crest, block_count, sample_rate}}. LUFS/dBTP are computed via BS.1770 gating over the buffered 100 ms K-weighted blocks (loudness fields are null until enough blocks exist - momentary needs 0.4 s, short-term 3 s). peak/rms are linear; crest is peak-to-rms in dB. An empty buffer returns ok with block_count 0 and null metrics. {ok:false,error} if no tap is connected for that track.

measure_loudness

measure_loudness(seconds: float = None)

Reset the master meter, play the set, wait, and read back loudness.

seconds: how long to capture (default 10.0). For an integrated-loudness pass over a whole song, pass its length. Returns the same signal-summary payload as read_meter plus data.played (False if the transport did not advance - e.g. nothing to play - so a bogus reading is not mistaken for real). {ok:false,error} if no master tap is connected.

measure_mix

measure_mix(window_s: float = 15.0, region: str = None)

Timed multi-track measure pass -> per-track signals + cross-track findings.

Resets every connected tap, plays the set for window_s seconds (via the same transport seam as measure_loudness), then integrates each tap’s buffered blocks into a per-track signal (LUFS/dBTP/peak/rms/crest plus the 8-band spectrum and stereo width/correlation). region is reserved for a future arrangement-window capture.

IMPORTANT - per-track taps are PRE-FADER: the MCP Tap is an audio-effect in the track’s device chain and Ableton’s mixer fader sits AFTER the device chain, so each per-track signal reflects the instrument + device-chain output, NOT the post-fader level. A fader move does not change its track’s reading. The only post-fader measurement point is the master (or a return), so the master tap’s signal (data.master) is the authoritative balance/loudness reference. Deploy one with deploy_taps (it auto-adds a master tap by default).

Returns JSON {ok, data:{window_s, tracks, master, findings}}:

  • tracks: [{name, index, kind, signal:{…}}] one per connected PER-TRACK tap (the master tap is excluded here and reported under master).
  • master: the master tap’s {name, index, kind, signal} (post-fader program output), or null when no master tap is connected.
  • findings: cross-track analysis from masking_utils over the per-track signals
    • masking (pairwise spectral overlap), balance (tracks sitting too far below the loudest), headroom (near-clip / over-compressed), stereo (mono-compat risk). Each is a (possibly empty) list. The master is NOT compared against instruments here (it would skew balance/masking).

With no taps connected this still returns ok with empty tracks, null master, and empty findings (not an error). Track names blank-reported by the device are backfilled from the LOM track index.

deploy_taps

deploy_taps(track_indices: List[int] = None, include_master: bool = True)

Load the MCP Tap metering device onto tracks for per-track analysis.

track_indices: omit to auto-target every regular audio track + every MIDI track holding an instrument; or pass explicit track indices. Use -1 for the master bus (e.g. track_indices=[-1] taps the master only). The device must be present in the User Library (copy m4l/’MCP Tap.amxd’ there once); see m4l/README.md.

include_master (default True): in auto-target mode (track_indices omitted), also drop a tap on the master bus. The master tap is the only POST-FADER measurement point, so it is the authoritative balance/loudness reference - per-track taps are pre-fader (instrument + device-chain output, ahead of the fader) and do not reflect fader moves. Pass include_master=False to skip it. When track_indices is given explicitly, include_master is ignored (add -1 to the list yourself).

Idempotent: a target that ALREADY holds an MCP Tap is skipped (reported in already_present) rather than getting a second, duplicate tap stacked on it. Use remove_taps to clear taps before re-deploying.

Returns JSON {ok, data:{targets, deployed:[{track_index,device}], already_present:[{track_index,device}], failed:[{track_index,error}]}}. If EVERY load fails (e.g. the device isn’t in the browser), data.manual is true with a drag-it-yourself message listing the target tracks - the registry still works once the device is dragged on by hand. After deploying, run measure_mix or analyze_set(measure=True).

A slow Max-for-Live / Node-for-Max boot (notably Live 12 / Max 8.6) can outlast the socket read timeout, so the load reply is lost even though the device loaded + connected. When a load times out, deploy_taps polls the tap registry and, if a tap connects on that track, records it as deployed with “confirmed_via”: “registry” instead of failing.

remove_taps

remove_taps()

Remove every loaded MCP Tap device from the set (delete by name match).

Scans all regular tracks AND the master bus for devices named ‘MCP Tap’ and deletes them (per-track, highest device index first so re-indexing is safe). Returns JSON {ok, data:{removed_count, removed:[{track_type,track_index,device_index}], errors:[…]}}. No-op (removed_count 0) when none are loaded.


ableton-mcp-max - free for noncommercial use; commercial licensing available. Built by Ryan Robson / Robworks Software LLC. Not affiliated with or endorsed by Ableton AG.

This site uses Just the Docs, a documentation theme for Jekyll.