Move key signatures with Insert Time and Cut Time

Found while testing crates/engine/src/cmd/event.rs:147-196 (insert_time, cut_time); key_signatures in crates/model/src/session.rs:344

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
NetterSilver
2026-10-28 12:43:00 +00:00
co-authored by Claude Haiku 5.5
parent e82c1689b3
commit 50d0028e07
3 changed files with 53 additions and 0 deletions
+11
View File
@@ -165,6 +165,11 @@ fn insert_time(e: &mut Engine, p: &Value) -> Result<Value> {
m.end += r.len();
}
}
for (at, _) in &mut s.key_signatures {
if *at >= r.start {
*at = at.saturating_add(r.len());
}
}
Ok(json!({"inserted": r.len()}))
}
@@ -192,6 +197,12 @@ fn cut_time(e: &mut Engine, p: &Value) -> Result<Value> {
m.end -= r.len();
}
}
s.key_signatures.retain(|(at, _)| !r.contains(*at));
for (at, _) in &mut s.key_signatures {
if *at >= r.end {
*at -= r.len();
}
}
Ok(json!({"removed": r.len()}))
}
+1
View File
@@ -16,5 +16,6 @@ mod random_edits;
mod recording;
mod session_transport;
mod split_into_mono;
mod time_key_signatures;
mod track_name_collisions;
mod trim_to_selection;
@@ -0,0 +1,41 @@
use serde_json::json;
use soundcraft_engine::Engine;
use soundcraft_model::{ChannelFormat, Session, TrackKind};
fn engine_with_keys() -> Engine {
let mut session = Session::default();
session.add_track(TrackKind::Audio, ChannelFormat::Mono, None);
let mut engine = Engine::new(session);
for (at, key) in [(10, "C major"), (48000, "D major"), (100000, "E major")] {
engine.execute("event.add_key_change", &json!({"key": key, "at": at})).unwrap();
}
engine
}
fn keys(engine: &Engine) -> Vec<(u64, String)> {
engine.session().key_signatures.iter().map(|(at, k)| (*at as u64, k.clone())).collect()
}
fn k(at: u64, key: &str) -> (u64, String) {
(at, key.to_string())
}
#[test]
fn insert_time_moves_key_signatures() {
let mut engine = engine_with_keys();
let original = keys(&engine);
engine.execute("event.insert_time", &json!({"start": 48000, "length": 1000})).unwrap();
assert_eq!(keys(&engine), vec![k(10, "C major"), k(49000, "D major"), k(101000, "E major")]);
engine.undo();
assert_eq!(keys(&engine), original);
}
#[test]
fn cut_time_removes_and_moves_key_signatures() {
let mut engine = engine_with_keys();
let original = keys(&engine);
engine.execute("event.cut_time", &json!({"start": 20, "end": 60000})).unwrap();
assert_eq!(keys(&engine), vec![k(10, "C major"), k(40020, "E major")]);
engine.undo();
assert_eq!(keys(&engine), original);
}