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