From fe1b4fc8aeba65a6db37d73340f6b30a96272110 Mon Sep 17 00:00:00 2001 From: Xiaohan-Tian <157918347+Xiaohan-Tian@users.noreply.github.com> Date: Mon, 18 May 2026 18:28:31 -0700 Subject: [PATCH] feat: added an option to allow user choose whether to trim leading silence when bouncing audio --- public/config.json | 1 + .../settings/sections/BehaviorSettings.tsx | 25 ++++ src/constants/coreConstants.ts | 2 +- .../audio-interface/KGOfflineRenderer.test.ts | 108 +++++++++++++++++- src/core/audio-interface/KGOfflineRenderer.ts | 3 +- src/core/config-upgrader/KGConfigUpgrader.ts | 5 + .../config-upgrader/upgradeConfigToV4.test.ts | 64 +++++++++++ src/core/config-upgrader/upgradeConfigToV4.ts | 30 +++++ src/core/config/ConfigManager.ts | 2 + 9 files changed, 236 insertions(+), 4 deletions(-) create mode 100644 src/core/config-upgrader/upgradeConfigToV4.test.ts create mode 100644 src/core/config-upgrader/upgradeConfigToV4.ts diff --git a/public/config.json b/public/config.json index 88226c1..5a9763c 100644 --- a/public/config.json +++ b/public/config.json @@ -76,6 +76,7 @@ "default_open": true }, "audio": { + "bounce_starts_from_beat_1": true, "enable_audio_capture_for_screen_sharing": false, "input_device_id": "default", "lookahead_time": 0.05, diff --git a/src/components/settings/sections/BehaviorSettings.tsx b/src/components/settings/sections/BehaviorSettings.tsx index 88f6d05..4688346 100644 --- a/src/components/settings/sections/BehaviorSettings.tsx +++ b/src/components/settings/sections/BehaviorSettings.tsx @@ -14,6 +14,7 @@ const BehaviorSettings: React.FC = () => { const [midiAutomationInterpolationIntervalMs, setMidiAutomationInterpolationIntervalMs] = useState(10); const [playbackDelay, setPlaybackDelay] = useState('200'); const [recordingOffset, setRecordingOffset] = useState('0'); + const [bounceStartsFromBeat1, setBounceStartsFromBeat1] = useState(true); const [enableAudioCapture, setEnableAudioCapture] = useState(false); const [lookaheadValidationErrors, setLookaheadValidationErrors] = useState([]); const [playbackDelayValidationErrors, setPlaybackDelayValidationErrors] = useState([]); @@ -42,6 +43,7 @@ const BehaviorSettings: React.FC = () => { setPlaybackDelay(((playbackDelaySeconds * 1000).toFixed(0))); const recordingOffsetSeconds = (configManager.get('audio.recording_offset') as number) ?? 0; setRecordingOffset(((recordingOffsetSeconds * 1000).toFixed(0))); + setBounceStartsFromBeat1((configManager.get('audio.bounce_starts_from_beat_1') as boolean) ?? true); setEnableAudioCapture((configManager.get('audio.enable_audio_capture_for_screen_sharing') as boolean) ?? false); }; @@ -158,6 +160,12 @@ const BehaviorSettings: React.FC = () => { await configManager.set('audio.enable_audio_capture_for_screen_sharing', boolValue); }; + const handleBounceStartsFromBeat1Change = async (value: string) => { + const boolValue = value === 'yes'; + setBounceStartsFromBeat1(boolValue); + await configManager.set('audio.bounce_starts_from_beat_1', boolValue); + }; + return (
@@ -325,6 +333,23 @@ const BehaviorSettings: React.FC = () => {
+
+ + +
+ Yes includes leading silence from the start of the song up to the first rendered region when bouncing WAV/MP3. No trims that leading silence and starts bounce at the first rendered note or audio region. +
+
+