This commit is contained in:
Thomas Forgione 2026-02-24 00:43:23 +01:00
parent bda18d8b46
commit 50e29abf03
2 changed files with 153 additions and 60 deletions

View File

@ -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;

View File

@ -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
}