diff --git a/src/piece.rs b/src/piece.rs index c1bcfad..1706f9e 100644 --- a/src/piece.rs +++ b/src/piece.rs @@ -86,6 +86,10 @@ impl Track { pub fn add_silence(&mut self, duration: Tick) { self.current_tick += duration; } + + pub fn current_beat(&self) -> f64 { + self.current_tick.0 as f64 / crate::time::TICKS_PER_BEAT as f64 + } } pub struct Piece { @@ -156,9 +160,22 @@ impl Piece { 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 { + let factor = 1.0; + + // Factor adds a little bit of fade in and fade out + // I hate it, it sounds like a flute + // let fade_time = Tick::sixteenth().0 as f64 * seconds_per_tick / 2.0; + // let factor = if t < start_time + fade_time { + // (t - start_time) / fade_time + // } else if t > end_time - fade_time { + // (end_time - t) / fade_time + // } else { + // 1.0 + // }; + let freq = event.note.freq(); // value += track.amplitude * track.wave.sample(&event.note, t); - value += track.amplitude * track.wave.sample_from_phase(*phase); + value += factor * track.amplitude * track.wave.sample_from_phase(*phase); // Update phase *phase += freq / params.sampling_rate as f64; diff --git a/src/technology.rs b/src/technology.rs index f198b52..4d937ff 100644 --- a/src/technology.rs +++ b/src/technology.rs @@ -8,6 +8,7 @@ pub fn technology() -> Piece { piece.tracks.push(bass_track()); piece.tracks.push(chords()); piece.tracks.push(main_track()); + piece.tracks.push(harmony_track()); // piece.add_metronome(Wave::Square, 0.05); piece @@ -15,7 +16,7 @@ pub fn technology() -> Piece { pub fn bass_track() -> Track { let mut bass_track = Track::new(Wave::Triangle, 0.5); - for _ in 0..4 { + for _ in 0..8 { bass_track.add(A1, Tick::bar()); bass_track.add(G0, Tick::beats(2)); bass_track.add(A1, Tick::beats(2)); @@ -65,7 +66,7 @@ pub fn chords() -> Track { track.add(B3, Tick::sixteenth()); }; - for _ in 0..4 { + for _ in 0..6 { track.add_silence(Tick::half()); add_e_minor(&mut track); @@ -124,71 +125,146 @@ pub fn main_track() -> Track { let mut track = Track::new(Wave::Square, 0.075); track.add_silence(Tick::bars(4)); - // Lick 1 - track.add(A4, Tick::half()); - track.add(E4, Tick::quarter()); - track.add(A4, Tick::quarter()); - track.add(G3, Tick::half()); - track.add(E4, Tick::quarter()); - track.add(G3, Tick::quarter()); - track.add(E3, Tick::beat()); + for _ in 0..2 { + // Lick 1 + track.add(A4, Tick::half()); + track.add(E4, Tick::quarter()); + track.add(A4, Tick::quarter()); + track.add(G3, Tick::half()); + track.add(E4, Tick::quarter()); + track.add(G3, Tick::quarter()); + track.add(E3, Tick::beat() - Tick::eighth()); + track.add(A3, Tick::half() + Tick::eighth()); - track.add_silence(Tick::half()); - track.add(A4, Tick::beat()); - track.add(G3, Tick::beat()); - track.add(E3, Tick::half()); - track.add(E3, Tick::quarter()); - track.add(F3, Tick::quarter()); - track.add(E3, Tick::quarter()); - track.add(D3, Tick::quarter()); - track.add(E3, Tick::half()); + track.add(G3, Tick::eighth()); + track.add(A4, Tick::beat() - Tick::eighth()); + track.add(G3, Tick::beat()); + track.add(E3, Tick::half()); + track.add(E3, Tick::quarter()); + track.add(F3, Tick::quarter()); + track.add(E3, Tick::quarter()); + track.add(D3, Tick::quarter()); + track.add(E3, Tick::half()); - track.add(C3, Tick::half()); - track.add(E3, Tick::beat()); - track.add(C3, Tick::half()); // 0.33); - track.add(D3, Tick::half()); // 0.42); - track.add(E3, Tick::beat() + Tick::half()); // 1.75); + track.add(C3, Tick::half()); + track.add(E3, Tick::beat() - Tick::quarter()); + track.add(C3, Tick::half()); + track.add(D3, Tick::quarter()); + track.add_silence(Tick::quarter()); + track.add(D3, Tick::eighth()); + track.add(E3, Tick::beat() + Tick::half() + Tick::eighth()); - track.add(C3, Tick::half()); - track.add(E3, Tick::beat()); - track.add(C3, Tick::half()); - track.add(E2, Tick::half()); - track.add(D2, Tick::beat() + Tick::quarter()); + track.add(C3, Tick::half()); + track.add(D3, Tick::eighth()); + track.add(E3, Tick::beat() - Tick::quarter() - Tick::eighth()); + track.add(C3, Tick::half()); + track.add(E2, Tick::half()); + track.add(D2, Tick::beat() + Tick::half()); - track.add(G2, Tick::quarter()); - track.add(C3, Tick::quarter()); - track.add(G3, Tick::quarter()); + track.add(G2, Tick::quarter()); + track.add(C3, Tick::quarter()); + track.add(G3, Tick::quarter()); - // Lick 2 - track.add(A4, Tick::half()); - track.add(E4, Tick::quarter()); - track.add(A4, Tick::quarter()); - track.add(G3, Tick::half()); - track.add(E4, Tick::quarter()); - track.add(G3, Tick::quarter()); - track.add(E3, Tick::beat()); + println!("{}", track.current_beat()); - track.add_silence(Tick::half()); - track.add(A4, Tick::beat()); - track.add(G3, Tick::beat()); - track.add(E3, Tick::half()); - track.add(B4, Tick::quarter()); - track.add(C4, Tick::quarter()); - track.add(B4, Tick::quarter()); - track.add(A4, Tick::quarter()); - track.add(B4, Tick::half()); + // Lick 2 + track.add(A4, Tick::half()); + track.add(E4, Tick::quarter()); + track.add(A4, Tick::quarter()); + track.add(G3, Tick::half()); + track.add(E4, Tick::quarter()); + track.add(G3, Tick::quarter()); + track.add(E3, Tick::beat() - Tick::eighth()); + track.add(A3, Tick::half() + Tick::eighth()); - track.add(C3, Tick::half()); - track.add(E3, Tick::beat()); - track.add(C3, Tick::half()); - track.add(D3, Tick::half()); - track.add(E3, Tick::beat() + Tick::half()); + track.add(G3, Tick::eighth()); + track.add(A4, Tick::beat() - Tick::eighth()); + track.add(G3, Tick::beat()); + track.add(E3, Tick::half()); + track.add(B4, Tick::quarter()); + track.add(C4, Tick::quarter()); + track.add(B4, Tick::quarter()); + track.add(A4, Tick::quarter()); + track.add(B4, Tick::half()); - track.add(C3, Tick::half()); - track.add(E3, Tick::beat()); - track.add(C3, Tick::half()); - track.add(E2, Tick::half()); - track.add(D2, Tick::beats(2)); + track.add(C3, Tick::half()); + track.add(E3, Tick::beat() - Tick::quarter()); + track.add(C3, Tick::half()); + track.add(D3, Tick::quarter()); + track.add_silence(Tick::quarter()); + track.add(D3, Tick::eighth()); + track.add(E3, Tick::beat() + Tick::half() + Tick::eighth()); + + track.add(C3, Tick::half()); + track.add(D3, Tick::eighth()); + track.add(E3, Tick::beat() - Tick::quarter() - Tick::eighth()); + track.add(C3, Tick::half()); + track.add(E2, Tick::half()); + track.add(D2, Tick::beats(2) + Tick::quarter()); + } + + track +} + +pub fn harmony_track() -> Track { + let mut track = Track::new(Wave::Square, 0.075); + track.add_silence(Tick::bars(12)); + + // Lick 1 + track.add(C4, Tick::beat()); + track.add(B4, Tick::beat()); + track.add(G3, Tick::beat()); + track.add_silence(Tick::half()); + + track.add(B4, Tick::eighth()); + track.add(C4, Tick::beat() - Tick::eighth()); + track.add(B4, Tick::beat()); + track.add(G3, Tick::beat()); + track.add_silence(Tick::beat() + Tick::half()); + + track.add(G3, Tick::beat() - Tick::quarter()); + track.add(E3, Tick::half()); + track.add(F3, Tick::quarter()); + track.add_silence(Tick::quarter()); + track.add(F3, Tick::eighth()); + track.add(G3, Tick::beat() + Tick::half() + Tick::eighth()); + + track.add(E3, Tick::half()); + track.add(F3, Tick::eighth()); + track.add(G3, Tick::beat() - Tick::quarter() - Tick::eighth()); + track.add(E3, Tick::half()); + track.add(C3, Tick::half()); + track.add(B3, Tick::beat() + Tick::half() + Tick::quarter()); + + track.add_silence(Tick::half()); + + // Lick 2 + track.add(C4, Tick::beat()); + track.add(B4, Tick::beat()); + track.add(G3, Tick::beat()); + track.add_silence(Tick::half()); + + track.add(B4, Tick::eighth()); + track.add(C4, Tick::beat() - Tick::eighth()); + track.add(B4, Tick::beat()); + track.add(G3, Tick::beat()); + track.add_silence(Tick::beat() + Tick::half()); + + track.add(G3, Tick::beat() - Tick::quarter()); + track.add(E3, Tick::half()); + track.add(F3, Tick::quarter()); + track.add_silence(Tick::quarter()); + track.add(F3, Tick::eighth()); + track.add(G3, Tick::beat() + Tick::half() + Tick::eighth()); + + track.add(E3, Tick::half()); + track.add(F3, Tick::eighth()); + track.add(G3, Tick::beat() - Tick::quarter() - Tick::eighth()); + track.add(E3, Tick::half()); + track.add(C3, Tick::half()); + track.add(B3, Tick::beat() + Tick::half() + Tick::quarter()); + + track.add_silence(Tick::half()); track }