Files
hot-step-cpp-ROCm/plugins/postprocess/md_audio_tiled.lua
T
2026-08-16 18:24:52 +07:00

84 lines
3.8 KiB
Lua

--[[
md_audio_tiled.lua
Postprocess plugin adapter for MD Audio Tiled Core
Wraps md_audio_tiled_core.lua (v3.0.1) to conform to the HOT-Step
postprocess plugin contract. The core module is loaded via require()
and exposes execute_tiled_decode() as the entry point.
© 2026 Alexander Allan (MDMAchine) | A&E Concepts
GPL v3
--]]
local core = require("md_audio_tiled_core")
postprocess = {
name = "md_audio_tiled",
display = "MD Audio Tiled Decoder",
description = "Tiled VAE decode with OLA crossfade, dual-pass merge, LSS, and DSP chain",
accent = "cyan",
params = {
{ key = "dual_pass", type = "toggle", label = "Dual Pass",
default = false,
hint = "Two staggered decode passes merged with trapezoidal weights. Eliminates seam artifacts but doubles VAE decode time." },
{ key = "lss_strength", type = "slider", label = "LSS Strength",
default = 0.25, min = 0, max = 1, step = 0.01,
hint = "Latent channel suppression. Reduces hum from low-variance VAE bias channels." },
{ key = "stereo_width", type = "slider", label = "Stereo Width",
default = 0.8, min = 0, max = 2, step = 0.01,
hint = "M/S stereo width. 0=mono, 1=unity, 2=doubled side." },
{ key = "hum_notch", type = "toggle", label = "Hum Notch Filter",
default = true,
hint = "Multi-band surgical cuts at 74/94/654Hz to remove Oobleck VAE hum." },
{ key = "peak_normalize_db", type = "slider", label = "Peak Normalize",
default = -1, min = -12, max = 0, step = 0.5,
hint = "Transparent peak normalization (pure gain reduction, no distortion). Scales audio so the loudest peak = target dBFS. Applied before soft clip. Set to 0 to disable." },
{ key = "soft_clip_db", type = "slider", label = "Soft Clip Ceiling",
default = -3.0, min = -12, max = 0, step = 0.5,
hint = "tanh saturation ceiling in dB. Acts as safety net after peak normalize. Set to 0 to disable." },
},
}
-- Entry point called by the engine via lua_call_postprocess()
-- Args:
-- latents: Lua table, 1-indexed [B * C_lat * W] flat row-major
-- B: batch size (always 1 — engine calls per-batch-item)
-- C_lat: latent channels (64)
-- W: latent width (time frames)
-- C_aud: audio channels (2)
-- final_samples: expected audio samples per channel
-- upscale_factor: 1920 (VAE upsample ratio)
-- vae_decode_fn: callback(latent_table, T_latent) → audio_table, T_audio
function process(latents, B, C_lat, W, C_aud, final_samples, upscale_factor, vae_decode_fn)
-- Build params table from UI-injected globals
local p = {}
for k, v in pairs(core.DEFAULT_PARAMS) do
p[k] = v
end
-- Override from UI params (injected by lua_inject_params)
if params then
if params.dual_pass ~= nil then p.dual_pass = params.dual_pass end
if params.lss_strength then p.lss_strength = params.lss_strength end
if params.stereo_width then p.stereo_width = params.stereo_width end
if params.hum_notch ~= nil then p.hum_notch_enabled = params.hum_notch end
if params.peak_normalize_db then
-- 0 dB means disabled (peak_normalize_db must be < 0 to activate)
if params.peak_normalize_db < 0 then
p.peak_normalize_db = params.peak_normalize_db
else
p.peak_normalize_db = nil -- disable
end
end
if params.soft_clip_db then p.soft_clip_db = params.soft_clip_db end
end
local audio = core.execute_tiled_decode(
vae_decode_fn, latents, B, C_lat, W,
C_aud, final_samples, upscale_factor, p)
-- Bridge expects two return values: audio_table, T_audio
return audio, final_samples
end