admin
a7b01d3484
fix(bridge): 3 bug âm thanh Qin/Nexus standalone
...
1) wavesynth tự phát khi mở app: probe calibrate() render vào live mix
(renderAll process cùng instance) -> thêm calibratingCh_[16], renderAll
bỏ qua channel đang calibrate; plugin_host panic (sustain off + all
notes off + 128 noteOff) ngay sau preset apply để startup im lặng.
2) bấm GUI mở 2 cửa sổ Qin: sandbox VST2 child tự sở hữu top-level window
-> ownsGuiWindow() + main.cpp forward OPEN_GUI control, không tạo native
parent / không registry double-open.
3) play phát nhạc cụ sai: restore clobber — seed preset đè patch thật trong
state file (ch3 63ba3667 -> 7f07473c) do saveStateJob chạy lúc child còn
seed. Fix: queuePreset(waitApply=true) chờ child apply xong (presetOut
memcmp), consume-before-apply (zero presetInLen trước khi apply), deferred
double-load re-check trong main.cpp skip assign trùng path, watchdog
respawn re-queue lastPreset_.
2026-08-21 08:50:28 +07:00
admin
b91e6d3875
bridge: fix Qin VST2 silent playback via per-child SHM sandbox
...
- out-of-process VST2 sandbox: each Qin track spawns its own plugin_host.exe child
with unique SHM (SonicForge_PluginHost2_<bridgePid>_<ch>_<seq>), watchdog <=3 respawns
- preset round-trip bridge<->child over SHM (presetIn/presetOut 64KB), stub rejection MIN_PRESET=100
- seed qin_default.b64 default preset into every fresh child; saved patch wins on restore
- forward MIDI on channel 0 (Qin_RV only listens on ch0); one instrument per child
- controls 4/5/6 = OPEN_GUI/CLOSE_GUI/QUIT
- gitignore runtime carla_projects
2026-08-20 19:16:43 +07:00
admin
d6649e4474
bridge: auto-create jBridge Qin settings (RUN_IN_EXISTING_AUXHOST 0)
...
Makes the unlimited-Qin fix durable: bridge writes
%APPDATA%\jBridge\SettingsFilesFor{64,32}BitPlugins\Qin_RV.jBridge
at startup when missing, so every Qin instance runs in its own
auxhost on any machine. Verified: 4 Qin ch0/1/2/9 live, 4 auxhost.exe,
0 ML_RELEASE_ERROR, GUI attachView ok=1 on all.
2026-08-20 11:14:39 +07:00
admin
c78d9f2911
bridge: drop 2-instance Qin cap (jBridge per-plugin settings fix)
...
Qin bridges via jBridge shared auxhost; 3rd live instance flooded
ML_RELEASE_ERROR (engine per-auxhost capacity, not our code). Fix:
write %APPDATA%\jBridge\SettingsFilesFor64BitPlugins\Qin_RV.jBridge
with RUN_IN_EXISTING_AUXHOST 0 -> each instance gets own auxhost,
unlimited tracks. Remove LOAD REJECT/restore SKIP guards. Verified:
4 Qin ch0/1/2/9 live, 4 auxhost.exe, 0 ML_RELEASE_ERROR, GUI all attach.
2026-08-20 11:11:27 +07:00
admin
588c0da32d
native_bridge: recalibrate after preset restore, reject 3rd live VST2 instance
2026-08-20 10:50:11 +07:00
admin
4932bb88db
fix(bridge): restore VST2 preset chunk on respawn + offline render (Qin silent fix)
2026-08-20 10:18:18 +07:00
admin
7c22ae1f02
refactor(bridge): split fx bridge, stabilize VST3 host chain, drop old install engines
...
- remove diagnostic canaries from audio hot path (crackle fix) and
stuck C5 note raw-MIDI test (Vst2Instrument::init noteOff)
- split native bridge into daw_vst_bridge (VSTi) + fx_vst_bridge (VST FX)
- VST3: processData prepare before setActive, zero input buses, accept
both .vstpreset and bridge-state blob in RenderJob presets
- native_render/vst_engine: bridge-exe discovery + render_fx_chain + /fx-gui
- delete old install/ engine binaries (install via sidecar+resources now)
- add BUILD_LAYOUT.md, build_selfcheck, tools/ diagnostics
2026-08-20 09:42:42 +07:00
admin
819257a1b3
Fix bypass JSON bool + load SF2 tracks into bridge on restore
...
- RenderFxJob: parse bypass as JSON bool (memberBool) — bypass:true
previously ignored (memberInt parses numbers only), plugin kept
processing. Verified: bypass RMS == plain, VST3 loaded once.
- preloadTrackInstruments / bridge reconnect: load SF2 instruments
into bridge too (loadAnyTrackToBridge) — opened projects with SF2
tracks sent MIDI to empty bridge channels (C++ silent), never
reaching the native mastering chain.
- rebuild app.precompiled.js from app.jsx (was stale: missing A14).
2026-08-19 21:55:48 +07:00
admin
45a7bdebfa
Phase 0 (PLAN_MASTERBUS_FX_RACK_VST): banner ra stderr de stdout sach cho --scan JSON / --fx-gui port
...
Test /c/tmp/test_fx_phase0.py: 7/7 pass — gain0 bit-exact, gain -6dB RMS/2,
normalize peak<=0.25, empty chain rc=1, Ozone 11 Maximizer VST3 render khac
input (88172 samples), --scan phan loai dung (Ozone is_fx, Scaler 2 instrument).
2026-08-19 21:16:01 +07:00
admin
6a3b430da0
A14: MIDI-out từ plugin (VST2/VST3) → SHM → Rust emit → DAW track
...
- Vst2Instrument: audioMaster callback thu VstEvents, push SHM midiOutQueue
- Vst3Instrument: IEventList output bus (kAudioMasterWantMidi) — check
- SharedMemoryIPC.h: midiOutQueue[64] + midiOutCount (offset 27556/28324, sizeof 28328)
- shm.rs: MidiEventIPC Serialize, drain_midi_out() emit 'bridge-midi-out'
- lib.rs: pump emit midi-out events
- nativeBridgeService.js: onMidiOut API
- app.jsx: route MIDI-out về selected track qua SonicMidiRouter (feedback guard)
- TASKS.md: A14 ✅
2026-08-19 21:12:07 +07:00
admin
6efef85e47
fix(bridge): VST2 host dung ABI SDK — crash outs>2, NaN input, editOpen(NULL), opcodes; docs A14 MIDI-out + phan tich Ozone -Inf
...
- aeffect.h: bo sung opcodes 4-22, 53, 55 + audioMaster 15/41-44 + ERect (dung chuan VST2.4 SDK, DUNE load OK khong crash)
- Vst2Instrument: cap du pointer arrays theo numInputs/numOutputs (fix AV 0xC0000005 Qin outs=32), input fill 0.0f (het NaN poison effect), bo probe effEditOpen(NULL) (crash WaveObserver), GetDirectory + SizeWindow hook, canDo sendVstEvents/sendVstTimeInfo
- TASKS.md: A14 MIDI-out tu plugin (Scaler2/Instacomposer/MelodicFlow xuat MIDI khong phai audio)
- PLAN_MASTERBUS_FX_RACK_VST.md: phan tich Ozone -Inf — chain day du, nguyen nhan = audio DAW khong chay qua bridge master ring
2026-08-19 20:57:16 +07:00
admin
2f5c70ac29
Fix master volume + VST3FX GUI state restore on save/reload
...
- serializeProjectToSchema now writes master volume_db and mastering gui_open_path/name
- deserialize restores masterVolume + masteringSettings.gui_open_path/name
- track vst_gui_open_path/name fallback to live state (not just _persistFxGui*)
- MasteringModal/FXRackModal reopen effects react to isOpen + restored gui path
- openMasterVstGui/openVstGui store gui name for reopen
- bridge: /preset capture endpoint + RenderFxJob.captureState for GUI knob state
2026-08-19 14:44:40 +07:00
admin
dbbcb85ffe
Fix fx-gui z-order: anchored window HWND_TOPMOST so real clicks reach plugin over webview; /hide demotes
2026-08-19 11:39:11 +07:00
admin
2bbe80efa3
fix(bridge): set ringMask=7 on Windows — ring collapsed to 1 slot (slot = writeIndex & 0), dropped audio blocks on GUI jank
2026-08-19 11:20:39 +07:00
admin
466b2022f2
fix(fx): apply preset_b64 in realtime FX chain (issue 4)
2026-08-19 10:56:21 +07:00
admin
e5ce9ca90a
fix(vst-gui): borderless fx-gui window + anchored re-show (mouse stable)
...
- RenderFxJob: offscreen fx-gui window now WS_POPUP (borderless) so
GetWindowRect == client rect; anchored placement over the embed panel is
exact. WS_OVERLAPPEDWINDOW put the client ~31px lower/right -> cursor
jumped on hover and clicks hit the webview (relay rejected).
- AdjustWindowRect sizes to the window's own style (no caption for POPUP).
- FxGuiServer: mousemove only SetCursorPos while dragging (buttons!=0);
hover no longer teleports the cursor.
- FxGuiServer /show: skip SetWindowPos/resize when rect unchanged (frontend
now re-POSTs /show every ~500ms to re-anchor on scroll/resize).
- app.jsx VstGuiEmbed: drop shownRef one-shot; re-POST /show each refresh.
- Rebuilt bridge (6 locations) + Tauri release (embedded sidecar) + v=202608190002.
2026-08-19 10:22:35 +07:00
admin
da0f8fa40e
feat(native): realtime master FX chain + fx-gui fast start, hide/show, non-topmost
...
- FxGuiServer: HWND_TOP (no longer always-on-top), /hide + /show endpoints,
onStarted callback prints SF_FXGUI_PORT before plugin load (fast connect)
- RenderFxJob: RealtimeFxChain (mutex+worker, SEH-guarded, bypass slots,
deferred Vst3Fx dtor); --fx-gui split into parse/create/load-attach stages
- main: FreeConsole unless SF_KEEP_CONSOLE; control type 6 SET_FX_CHAIN feeds
g_fxChain on the audio loop; shutdown before CoUninitialize
- plugins.py: CREATE_NO_WINDOW on both Popen paths
- lib.rs: set_fx_chain command -> push_control(6)
- app.jsx/nativeBridgeService: setFxChain sync from MasteringModal; panel close
uses /hide + refs to fix closure bug; VstGuiEmbed rect refresh -> /show
2026-08-19 09:59:13 +07:00
admin
c6de0720f4
fix(bridge): anchored fx-gui embed - dance dat window dung panel rect, khong park/restore cursor, resize view qua WM_FXGUI_RESIZE
2026-08-19 09:25:43 +07:00
admin
346ada6e47
fix(bridge): real-input dance dat window tai cursor thay vi goc work-area - het GUI floating ngoai cua so DAW khi click vao embed (iZotope/JUCE reject PostMessage)
2026-08-19 08:25:12 +07:00
admin
d3a7a0f793
FX GUI embed: WS_EX_TOOLWINDOW + no minimize box for offscreen window (no stray taskbar button that cannot be restored)
2026-08-18 21:35:48 +07:00
admin
d07f626a6c
Fix FX GUI panel frozen: prefer PrintWindow live frame + real-input fallback for GPU-rendered editors
2026-08-18 21:24:33 +07:00
3dtours
ba9ceeea90
fix(bridge): WAV header data_size for IEEE float32 (was 16-bit byte count)
...
- finishWav call sites accumulated n*4 (stereo 16-bit) but float32 writer
emits n*8 bytes -> RIFF/data chunk sizes half the real value; players and
soundfile truncated renders to half length
- gate test now asserts file size == 44 + data_size to catch this
2026-08-18 17:35:54 +07:00
admin
351ee56080
fix(bridge): load dung VSTi theo track (V9) - bo early-return mui theo flag, load qua Tauri invoke khi co path, guard path sai (WaveObserver vs Nexus), chi mo GUI khi load OK; sync 6 ban JS + index.html ?v; kem cac fix bridge truoc (bugs 1-4, GUI restore)
2026-08-18 16:56:05 +07:00
admin
cbcc1f658c
merge: Normalize Linux audio pipeline to lossless Float32 ( a2f9313)
2026-08-18 12:10:24 +07:00
3dtours
a2f93138be
Normalize Linux audio pipeline to lossless Float32 (skill: lossless-audio-compliance)
...
- native bridge WAV writers: 16-bit PCM truncation -> IEEE Float32 (fmt 3, bit-exact)
- vendor sheredom_json.h (vst3sdk 3.8.1 lacks moduleinfo/json.h)
- Dockerfile: drop nonexistent sfizz tag v1.2.3
- Python sf.write -> subtype=FLOAT everywhere
- resample_poly -> kaiser(16) window (>=130dB stopband)
- audio_editor._write_wav_lossless(): FLOAT passthrough, TPDF dither only for
8/16/24-bit final exports
- app.jsx WAV encoders: Float32 default, TPDF dither for integer depths, fix 24-bit
- tests: lossless compliance gate (null test < -140dBFS, float32 format) 9/9 pass
- TASKS_WINDOWS_AUDIO_NORMALIZE.md: Windows-side remaining tasks
2026-08-18 11:50:26 +07:00
admin
308857c4a7
fix: VST GUI embed chup frame trang (Ozone 11 GPU) - luon chup ca BitBlt va PrintWindow PW_RENDERFULLCONTENT, chon frame chi tiet hon; fix loi JPEG chi ghi hang dau tien
2026-08-18 09:56:53 +07:00
admin
569be72110
fix(native_bridge): strip query string in fx-gui HTTP path + walkthrough notes
...
- readRequest now trims '?t=<ms>' cache-buster so /frame?t=... matches
/frame route (frontend VstGuiEmbed polls with timestamp → was 404, no image)
- document: jpeg62.dll manual copy, add auto-opens GUI (already_running
expected), reopen needs bridge exit wait
2026-08-18 08:27:35 +07:00
3dtours
c382afe2a6
feat: embed native VST GUI in mastering + fx rack panels (bridge --fx-gui frame capture + input relay)
...
Linux parts (0L1-4L1 per TASKS_LINUX_WINDOWS.md):
- native_bridge: FxGuiServer.cpp HTTP server (Winsock) — /frame BitBlt +
PrintWindow fallback -> JPEG (libjpeg-turbo q70), /input PostMessage relay
(mouse/wheel/key, coords scaled), /close, /ping; RenderFxJob fxGuiSetup +
run_fx_gui_server (offscreen); main.cpp --fx-gui dispatch; vcpkg +
CMakeLists WIN32-only + JPEG.
- api: open_fx_gui embed flag spawn --fx-gui, parse SF_FXGUI_PORT -> embed_url,
fx-gui/close endpoint; 4 unit tests.
- ui: VstGuiEmbed component (frame refresh 100ms, ping 2s, input relay,
scale coords) shared by MasteringModal + FXRackModal; swap graph<->GUI,
cleanup on unmount, dead-bridge toast fallback.
- docs: TASKS_LINUX_WINDOWS.md, WALKTHROUGH_WINDOWS.md, PLAN status.
Windows tasks 0W1-4W1 remain (build + E2E real VST).
2026-08-17 22:37:55 +07:00
admin
38f4cbd8b5
feat: open native VST FX GUI from mastering panel + FX rack (bridge --open-fx-gui)
2026-08-17 21:52:40 +07:00
admin
b261eb0d7e
feat: VST FX rack per-track + masterbus render via native_bridge
2026-08-17 21:31:57 +07:00
admin
e79dae5d5c
phase4: Linux native_bridge build (Docker) — sfizz from source, --render SF2/SFZ
...
- Dockerfile: build sfizz tu native_bridge/sfizz-src (hoac git clone v1.2.3),
sed fix sfizz.pc (-llibsfizz -> -lsfizz), cmake bridge voi 3 flag SMTG OFF
(VSTGUI/plugin/hosting examples) — bridge headless chi can --render.
- CMakeLists: nhanh non-WIN32 build daw_vst_bridge tu main_linux.cpp +
RenderJob.cpp + NativeInstrumentEngine.cpp (SF2/SF3 + SFZ; VST3/VST2
hosting Windows-only, guard #ifdef _WIN32). gui_probe/plugin_host/
seh_channel_test chi build tren Windows.
- RenderJob.cpp: JSON parser (sheredom json.h) khong con phu thuoc
HAVE_VST3SDK — render SF2/SFZ chay duoc khong can VST3 SDK.
- NativeInstrumentEngine.cpp: guard windows.h/VST3/VST2/Sandbox/SEH.
- main.cpp: g_engine unconditional + guard disable_ime_contexts (_WIN32).
- engine.spec: bo pedalboard collect_dynamic_libs + hidden imports.
- vst_engine/render_engine: DecentSampler -> NotImplementedError + huong
dan convert .dspreset -> .vstpreset; pianobook fallback synth.
- Verified: WSL Ubuntu 24.04 build OK, bridge Linux --render SF2 ra WAV
44100 stereo peak 1575; Python tests 115 passed 1 skipped.
- Dockerfile build chua test duoc (may khong co Docker).
2026-08-17 11:46:24 +07:00
admin
bbb11f8066
Phase 1: import .vstpreset in offline render (loadSerializedState)
...
daw_vst_bridge --render now applies a VST3 preset when job has 'preset'
(base64 of a .vstpreset file). Parse the SDK binary chunk format with
PresetFile (vst3sdk), rewrap component/controller state into the bridge
blob [4B BE compLen][comp][4B BE ctrlLen][ctrl] and apply via
loadSerializedState before rendering. SF2/SFZ ignore preset (warning).
Bad base64/magic/chunks fail the job with rc 1 and no partial clip.
Tests: golden Nexus .vstpreset fixture; VST3 with/without preset,
bad preset -> rc 1, non-VST3 preset ignored. 20/20 pass.
2026-08-17 10:44:13 +07:00
admin
0cca84c5f9
feat(bridge): add --render offline CLI (Phase 0 of pedalboard replacement)
...
daw_vst_bridge --render <job.json> --out <clip.wav> renders MIDI notes
through the same instrument engines as realtime (SF2/SFZ/VST3/VST2) to a
16-bit stereo WAV, headless, no SHM. Mirrors plugins.py/vst_engine.py
note semantics (velocity int(vel*127), bank CC0 + program at t=0, beatSec
60/max(30,bpm), totalNeeded max(1024,endSample), no tail). Chunk clamped
to 256 to match VST3 host prepared buffers. Uses vendored sheredom json.h
(gated on HAVE_VST3SDK); rc: 0 ok, 1 arg/job error, 2 load fail, 3 crash.
Partial output removed on failure. Verified: SF2, SFZ, Nexus VST3 render
non-silent at exact duration; 9/9 tests pass.
2026-08-17 08:04:25 +07:00
admin
4111995a5c
Add VST2 hosting to native bridge; fix CC7 data2 routing verified via SHM test
...
VST2 (Steinberg 2.4 ABI) host via Vst2Instrument: aeffect.h, dispatcher,
process events/replacing, kEffectStartProcess, headless GUI skip.
- create_instrument returns Vst2Instrument for InstrumentType::VST2
- 64B-aligned scratch buffers for SIMD plugins; SEH crash capture module+stack
- plugins.py: VST2 resolves .dll/.so; vst_engine.py reports VST2 type
- app.jsx: derive instrumentType from scan (VST3 vs VST2), not hardcoded
- Install exes refreshed from Release build
SF2 FluidSynth audio verified end-to-end through SHM ring (energy 1.33):
silence was a test-harness bug (CC7 value written to velocity field, bridge
reads data2) — app sends data2 correctly. All temporary diagnostics removed.
2026-08-17 07:55:46 +07:00
admin
cead8c8c71
fix(vsti): crackle fix P1-P3 — SHM 8-slot ring + drain-delta pump + AudioWorklet sink
...
- SharedMemoryIPC.h/main.cpp: render into ring slot (idx & ringMask), 8 slots
- shm.rs: ring fields + read_ring_audio; lib.rs pump drains FULL delta, not just latest
- bridgeAudioNode.js: AudioWorklet primary (bridge-audio-sink), ScriptProcessor fallback
- bridgeAudioWorklet.js: ring 64 blocks, underrun fade, overrun drop + crossfade
- layout tests: sizeof 27560 (8-align via u64)
2026-08-16 20:43:50 +07:00
admin
7bcaf19c28
feat(vst-gui): open VST3 GUI while playing (level 1)
...
- main.cpp: drop transportStopped defer in handleOpenGui (G0.1 legacy);
G0.1b setReloading-before-job + single UiThread (G1.2) block the
2-thread-1-DLL race. GUI opens immediately during PLAY, short mute
(~0.1-0.3s first time, hasAttachedOnce_ false so reloadForGUI skips
reload); notes already sounding are kept. Reopen after close still
reloads (1-3s mute) - level 2 not feasible.
- app.jsx: remove !isPlayingRef.current guard before openNativeGUI in
loadTrackInstrumentToBridge.
- rebuild app.precompiled.js + daw_vst_bridge.exe.
2026-08-16 17:27:38 +07:00
admin
c29e024372
fix: stale-reload watchdog — force-unmute channel stuck in reloading >20s (60s if close/attach in flight) (V9)
2026-08-16 16:15:41 +07:00
admin
b6950d6418
fix: MIDI keyboard preview silent after transport STOP — live flag bypass guard (V8)
2026-08-16 15:43:23 +07:00
admin
761b48e41f
fix 5.2 audit findings on Windows: F-PROC-1 injection, F-MEM-5 UAF, F-PROC-2 restart race, F-PROC-3, F5, F6
2026-08-16 12:29:42 +07:00
admin
9fa3076359
G4.3 idle-skip + no fixed-tick render: idle CPU ~0, latency 9.8ms
2026-08-16 11:44:56 +07:00
admin
9436e66835
G4.3: double-buffer sandbox SHM - SandboxHostIPC writeSlot+2x256 double audio, latency 15.6ms, multi-instance no-xrun verified
2026-08-16 11:35:31 +07:00
admin
462a5104d2
G4.2: bridge-side plugin process pool — SandboxVst3Host spawns/respawns plugin_host.exe per channel, MIDI forward + audio snapshot + watchdog mute/respawn, crash isolation verified
2026-08-16 10:52:04 +07:00
admin
7de00955d8
G4.1: sandbox plugin host (plugin_host.exe) PoC — Nexus runs in child process, GUI + audio via SHM, crash isolation verified
2026-08-16 10:36:01 +07:00
admin
700f612674
chore: commit G3.2+G3.3 deploy binaries + debug scripts; ignore debug run artifacts
2026-08-16 10:27:36 +07:00
admin
85273a6a7f
debug: fix G1.5 stress test wait_log to read log file once per poll (avoids false timeouts on 140k-line log)
2026-08-16 10:23:55 +07:00
admin
0b8e80fe2c
G3.2+G3.3: classify hang/crash vs audio stall + SEH per-channel plugin crash isolation (mute channel)
2026-08-16 10:23:08 +07:00
admin
30fa98a441
G3.1: dedicated bridge heartbeat — watchdog liveness independent of audio loop
2026-08-16 10:04:16 +07:00
admin
b59e416566
G2.5+G2.6: stress driver for persistence restart (N loop + kill/respawn) + verify — regression G1.5 5/5, G2.5 5+10 PASS, G0.4 probe PASS
2026-08-16 08:37:27 +07:00
admin
d31312e824
G2.2: flush bridge state to disk before kill (control type=5 DUMP + Rust pre-kill)
2026-08-16 07:52:01 +07:00
admin
c2ae452844
G2.4: skip redundant LOAD of already-loaded instrument (keep restored preset)
2026-08-16 07:47:53 +07:00