From 590ac97e93ce5ed014399fc0a5a6771bc3a448ac Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Thu, 22 Oct 2026 09:54:38 +0200 Subject: [PATCH] Reset fades at cut edges in copy_range Found while testing crates/engine/src/edit.rs:157-174 Co-Authored-By: Claude Opus 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/engine/src/edit.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/crates/engine/src/edit.rs b/crates/engine/src/edit.rs index 5531953d..cea86073 100644 --- a/crates/engine/src/edit.rs +++ b/crates/engine/src/edit.rs @@ -149,9 +149,11 @@ pub fn copy_range(s: &Session, track: TrackId, range: Range) -> Vec { let old = part.start; part.trim_start_to(isect.start); rebase_midi_start(&mut part, old, t); + part.fade_in = Fade::default(); } if isect.end < part.end() { part.trim_end_to(isect.end); + part.fade_out = Fade::default(); } part.start -= range.start; out.push(part); @@ -868,6 +870,20 @@ mod tests { s.track(t).unwrap().clips().iter().map(|c| (c.start, c.length, c.source_offset())).collect() } + #[test] + fn copy_range_resets_fades_at_cut_edges() { + let (mut s, t) = session_with_clip(); + if let Some(c) = s.track_mut(t).and_then(|t| t.playlist_mut()).and_then(|p| p.clips.first_mut()) { + c.fade_in = Fade { len: 100, shape: FadeShape::Linear, curvature: 0.0 }; + c.fade_out = Fade { len: 100, shape: FadeShape::Linear, curvature: 0.0 }; + } + let fades = |r: Range| -> Vec<(Samples, Samples)> { copy_range(&s, t, r).iter().map(|c| (c.fade_in.len, c.fade_out.len)).collect() }; + assert_eq!(fades(Range::new(2000, 3000)), vec![(0, 0)]); + assert_eq!(fades(Range::new(0, 3000)), vec![(100, 0)]); + assert_eq!(fades(Range::new(2000, 6000)), vec![(0, 100)]); + assert_eq!(fades(Range::new(0, 6000)), vec![(100, 100)]); + } + #[test] fn separate_splits_and_heal_rejoins() { let (mut s, t) = session_with_clip();