From bda18d8b460901c55c93794f7af2ee5089c9b9cf Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Tue, 17 Feb 2026 17:40:07 +0100 Subject: [PATCH] Phase continuity --- src/piece.rs | 27 +++++++++++++++++++++++++-- src/technology.rs | 4 ++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/piece.rs b/src/piece.rs index 85d95e6..c1bcfad 100644 --- a/src/piece.rs +++ b/src/piece.rs @@ -27,6 +27,19 @@ impl Wave { } } } + + pub fn sample_from_phase(self, phase: f64) -> f64 { + match self { + Wave::Square => { + if phase < 0.5 { + 1.0 + } else { + -1.0 + } + } + Wave::Triangle => 4.0 * (phase - 0.5).abs() - 1.0, + } + } } pub struct NoteEvent { @@ -50,6 +63,7 @@ pub struct Track { pub amplitude: f64, pub notes: Vec, pub current_tick: Tick, + pub phase: f64, } impl Track { @@ -59,6 +73,7 @@ impl Track { amplitude, notes: vec![], current_tick: Tick(0), + phase: 0.0, } } @@ -120,6 +135,8 @@ impl Piece { let seconds_per_tick = 60.0 / (self.bpm as u64 * TICKS_PER_BEAT) as f64; let params = wav::Params::new(); + let mut track_phases: Vec = vec![0.0; self.tracks.len()]; + let total_samples = (self.max_beat() as f64 * seconds_per_beat * params.sampling_rate as f64).ceil() as u32; @@ -134,12 +151,18 @@ impl Piece { for i in 0..total_samples { let t = i as f64 / params.sampling_rate as f64; let mut value: f64 = 0.0; - for track in &self.tracks { + for (track, phase) in self.tracks.iter().zip(track_phases.iter_mut()) { for event in &track.notes { let start_time = event.start.0 as f64 * seconds_per_tick; let end_time = (event.start + event.duration).0 as f64 * seconds_per_tick; if t >= start_time && t < end_time { - value += track.amplitude * track.wave.sample(&event.note, t); + let freq = event.note.freq(); + // value += track.amplitude * track.wave.sample(&event.note, t); + value += track.amplitude * track.wave.sample_from_phase(*phase); + + // Update phase + *phase += freq / params.sampling_rate as f64; + *phase %= 1.0; } } } diff --git a/src/technology.rs b/src/technology.rs index 5025e63..f198b52 100644 --- a/src/technology.rs +++ b/src/technology.rs @@ -14,7 +14,7 @@ pub fn technology() -> Piece { } pub fn bass_track() -> Track { - let mut bass_track = Track::new(Wave::Square, 0.05); + let mut bass_track = Track::new(Wave::Triangle, 0.5); for _ in 0..4 { bass_track.add(A1, Tick::bar()); bass_track.add(G0, Tick::beats(2)); @@ -121,7 +121,7 @@ pub fn chords() -> Track { } pub fn main_track() -> Track { - let mut track = Track::new(Wave::Square, 0.1); + let mut track = Track::new(Wave::Square, 0.075); track.add_silence(Tick::bars(4)); // Lick 1