Mastering (Ozone)

Module-aware control of an iZotope Ozone 12 instance on the master track. Ozone exposes 873 host params but Ableton Configures at most 128 at once, so expose a chosen module’s params into the Configure slots (patching the .als and reloading in place), then read/set them per module: EQ bands, Maximizer, Dynamics bands, and any module’s params or bypass.

Tools on this page
  1. get_ozone_modules
  2. expose_ozone_modules
  3. get_ozone_module
  4. set_ozone_module_param
  5. set_ozone_module_enabled
  6. set_ozone_eq_band
  7. set_ozone_maximizer
  8. set_ozone_dynamics_band
  9. get_ozone_state
  10. set_ozone_state
  11. get_izotope_states
  12. recommend_master
  13. apply_master
  14. ensure_ozone_master

get_ozone_modules

get_ozone_modules(track_index: int, device_index: int = 0, track_type: str = 'master')

List an Ozone 12 instance’s modules with exposed/bypassed state.

Reads the device’s currently-exposed LOM params (get_device_parameters) and reports, per Ozone module, whether any of its params are exposed and whether its Bypass is engaged. Ozone 12 lives on the master by default.

expose_ozone_modules

expose_ozone_modules(
    track_index: int,
    modules: list,
    device_index: int = 0,
    track_type: str = 'master',
    reload: bool = True,
)

Configure the given Ozone 12 modules’ params as settable LOM params.

Ozone exposes 873 params but Ableton Configures at most 128 at once; this fills the device’s Configure slots with the requested modules’ params (in order), reloads the set in place, and reports overflow. The set must be saved first (save_set_as). modules: list of module keys (e.g. [“EQ”,”MAX”,”IMG”]); see get_ozone_modules for keys.

get_ozone_module

get_ozone_module(
    track_index: int,
    module: str,
    device_index: int = 0,
    track_type: str = 'master',
)

Read the currently-exposed params of one Ozone 12 module (native + normalized).

set_ozone_module_param

set_ozone_module_param(
    track_index: int,
    module: str,
    role: str,
    value: float,
    band: int = None,
    section: str = None,
    native: bool = True,
    device_index: int = 0,
    track_type: str = 'master',
)

Set one Ozone 12 module param. role/band/section identify the param (see get_ozone_module); value is native units by default (native=False for 0-1). The param must be exposed first (expose_ozone_modules).

set_ozone_module_enabled

set_ozone_module_enabled(
    track_index: int,
    module: str,
    on: bool,
    device_index: int = 0,
    track_type: str = 'master',
)

Enable/disable an Ozone 12 module via its Bypass param (on=True -> not bypassed). The module’s Bypass must be exposed (expose_ozone_modules).

set_ozone_eq_band

set_ozone_eq_band(
    track_index: int,
    band: int,
    freq: float = None,
    gain: float = None,
    q: float = None,
    enable: float = None,
    section: str = 'stereo_main',
    device_index: int = 0,
    track_type: str = 'master',
)

Set an Ozone 12 EQ band (freq Hz / gain dB / q / enable) in one call. The EQ module must be exposed first (expose_ozone_modules [“EQ”]).

set_ozone_maximizer

set_ozone_maximizer(
    track_index: int,
    threshold: float = None,
    ceiling: float = None,
    character: float = None,
    device_index: int = 0,
    track_type: str = 'master',
)

Set Ozone 12 Maximizer controls (threshold via input gain, output ceiling, character). Maximizer must be exposed first (expose_ozone_modules [“MAX”]).

set_ozone_dynamics_band

set_ozone_dynamics_band(
    track_index: int,
    band: int,
    comp_threshold: float = None,
    comp_ratio: float = None,
    comp_attack: float = None,
    comp_release: float = None,
    section: str = 'stereo_main',
    device_index: int = 0,
    track_type: str = 'master',
)

Set an Ozone 12 Dynamics band’s compressor controls in one call. Dynamics must be exposed first (expose_ozone_modules [“DYN”]).

get_ozone_state

get_ozone_state(
    track_index: int,
    device_index: int = 0,
    track_type: str = 'master',
    module: str = None,
)

Read Ozone 12 params directly from the plugin state blob (native values).

Unlike get_ozone_module, this needs NO Configure/exposure and returns REAL native units (Hz/dB, not clamped 0-1) for ANY module. Saves the set, then decodes the device’s ProcessorState from the .als on disk (no reload).

Parameters:

  • track_index: track holding the Ozone 12 instance.
  • device_index: which plugin device on the track (0 = first).
  • track_type: ‘master’ (default), ‘return’, or ‘regular’.
  • module: a module name (blob-native like ‘Maximizer’, or a Phase 1 key like ‘MAX’). Omit for a per-module summary of the whole instance.

Returns JSON {ok, data:{set_path, module, params:[{name,type,value}]}} for one module, or {ok, data:{set_path, modules:[{name,param_count,bypass}]}} for all.

set_ozone_state

set_ozone_state(
    track_index: int,
    changes: dict,
    device_index: int = 0,
    track_type: str = 'master',
    reload: bool = True,
)

Author Ozone 12 params in native units by patching the state blob.

Batch authoring: changes sets many params across many modules in ONE save+patch+reload. Native units land un-clamped (unlike the Phase 1 wrappers), with no 128-slot cap. Only changes existing params (never adds modules); unknown module/param or a wrong type is reported in skipped, not silently dropped. The set must be saved to a real file first (save_set_as).

Parameters:

  • track_index: track holding the Ozone 12 instance.
  • changes: {module: {param: value}}. module is blob-native (‘Maximizer’, ‘Dynamic EQ’) or a Phase 1 key (‘MAX’,’DYNEQ’). value is native and typed per the param (Float dB/Hz, Bool bypass, UInt mode); see get_ozone_state.
  • device_index: which plugin device on the track (0 = first).
  • track_type: ‘master’ (default), ‘return’, or ‘regular’.
  • reload: reload the set in place after patching (default True).

Returns JSON {ok, data:{set_path, reloaded, applied:[…], skipped:[…]}}.

get_izotope_states

get_izotope_states()

Read every iZotope plugin instance in the set (Ozone 12, Neutron 5, Nectar 4) from its saved plugin state, in one pass.

Saves the set once (titled sets only), then decodes each instance’s state blob from the .als. Needs no Configure/exposure. Per instance: product, global_bypass, the ACTIVE signal chain in order (modules outside the chain do not process audio, whatever their own bypass says), per-module bypass, plugin_ordinal (the device_index get_ozone_state takes), and limiter when a limiting stage is in the chain - Ozone Maximizer {target_lufs, ceiling_db (Margin), true_peak_safe (Prevent Intersample Clipping), mode, character}, or a Neutron/Nectar Limiter {ceiling_db}.

Returns JSON {ok, data:{set_path, tracks:[{track_type, track_index, track_name, instances:[…]}]}}. An instance with an empty chain passes audio through untouched.

recommend_master

recommend_master(
    intent: str,
    target: float = None,
    true_peak: float = -1.0,
    prefer_reuse: bool = True,
)

Propose an Ozone 12 mastering chain from a free-text intent + loudness target. Picks a character bucket (transparent/warm/loud_club/punchy/bright) and resolves the LUFS target (explicit arg > platform keyword like spotify/apple/club > default -14). Returns a chain dict in set_ozone_state’s shape. Best-effort: if a saved master/Ozone preset in the catalog matches, proposes reuse instead. PROPOSE ONLY - pass the returned chain to apply_master to write it. Returns {ok, data:{intent, parsed, target, true_peak, chain, decision, top_matches, reason, next}}.

apply_master

apply_master(
    chain: dict,
    track_index: int = 0,
    device_index: int = 0,
    track_type: str = 'master',
    deploy_tap: bool = True,
    input_gain_db: float = None,
)

Apply a mastering chain (from recommend_master) to an Ozone 12 instance in one shot, then set up the live trim loop. Writes the chain via set_ozone_state (one reload, un-clamped native values), exposes the Maximizer so the skill can nudge ceiling/gain without further reloads, and deploys a master tap so measure_loudness has post-fader audio. Errors clearly if the target device is not Ozone 12. Returns {ok, data:{applied, skipped, reloaded, exposed, tap, next}}. deploy_tap=False skips the tap (loop then runs un-metered).

The chain’s Maximizer ‘Target Loudness’ does NOT set output loudness (it is the auto-learn goal). input_gain_db sets Ozone’s input trim in dB (negative = quieter), which is what brings a mix that is already hotter than the target down to it: render, measure integrated LUFS, pass target - measured, then render again to confirm. The Maximizer Gain only drives louder.

ensure_ozone_master

ensure_ozone_master(track_index: int = 0, track_type: str = 'master')

Prepare the master for mastering: guarantee exactly one enabled Ozone 12, with older Ozone versions (9/10/11) disabled (never deleted), and confirm the instance’s state blob is authorable before returning. Reuses an existing Ozone 12 (re-enabling it if off; lowest index if several), else loads one onto the master (appends - existing master devices are untouched). Detection is exact-name so the single-module ‘Ozone 12 ' component plugins are ignored. The set must already be saved to a file (an untitled set errors). Hand data.device_index straight to apply_master. Returns {ok, data:{ device_index, action: reused|reused_reenabled|loaded, disabled_indices, blob_ready}}.


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.