feat: VSTi live playback 100% client-side (không Carla) — autosample SF2 backend (pedalboard) → FluidSynth WASM qua masterBus → mastering → main out; SonicVstiAutosample ensure+dedup+cooldown; runtime gating __enableCarlaLivePlayback; âm bắt qua ensureMidiCapture → clientSideExport

This commit is contained in:
2026-08-11 14:28:42 +07:00
parent 7293d7ac7e
commit cadb5402a3
12 changed files with 676 additions and 44 deletions
+19 -4
View File
@@ -470,10 +470,25 @@ class PythonRenderEngine:
_cache={},
)
# Normalization to prevent clipping
max_peak = np.max(np.abs(master_buffer))
if max_peak > 1.0:
master_buffer /= max_peak
# Mastering chain — mirror client WebAudio (app.jsx applyMasteringSettings /
# rebuildMasteringGraph). Truoc day mastering_settings bi BO QUA hoan toan:
# export WAV khong qua EQ/Imager/Maximizer -> file khac am nghe live.
# Gio ap dung dung chain (thu tu settings['chain']) khi mastering bat.
mastering_settings = project_json.get("mastering_settings")
mastered = bool(mastering_settings and mastering_settings.get("masterConnected")
and not mastering_settings.get("isBypassed"))
if mastered:
# Import lazy (scipy.signal) — giam thoi gian khoi dong engine
from app.core.mastering_engine import apply_mastering
master_buffer = apply_mastering(master_buffer, mastering_settings,
self.sample_rate)
# Hard clip [-1,1] — khớp WAV encoder client (browser) sau mastering
np.clip(master_buffer, -1.0, 1.0, out=master_buffer)
else:
# Normalization to prevent clipping
max_peak = np.max(np.abs(master_buffer))
if max_peak > 1.0:
master_buffer /= max_peak
# Write final output file (bit_depth: 16/24/32 → WAV PCM subtype)
subtype_map = {16: "PCM_16", 24: "PCM_24", 32: "PCM_32"}