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
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