From b7e0fa06ca5454314f1341a63148001f497ff018 Mon Sep 17 00:00:00 2001 From: JSDurand Date: Sat, 27 Aug 2022 15:38:23 +0800 Subject: some new songs and small modifications --- songs/105-water.rumu | 205 ++++++++++++++++++++++++++++++++++++++++++++++++ songs/experiment.rumu | 34 +++++--- songs/take me hand.rumu | 14 ++-- songs/test.rumu | 27 ++++++- src/instruments.rs | 54 ++++++++++--- src/lib.rs | 13 +++ 6 files changed, 314 insertions(+), 33 deletions(-) create mode 100644 songs/105-water.rumu diff --git a/songs/105-water.rumu b/songs/105-water.rumu new file mode 100644 index 0000000..4a90729 --- /dev/null +++ b/songs/105-water.rumu @@ -0,0 +1,205 @@ +; The sheet comes from this YouTube video: +; + + +{ + iipiano iv0.8 ib137 + +; B flat major scale +; +; There are two flats: Bb and Eb +; +; Bb C D Eb F G A Bb + + o5 d2 d e- d c d < g1 > c2 < b- g1 b- > c1 + + c2 c d c < b- > c d1 < b-2 g g b- g b- + +; first line over + + o4 g1 > d2 d e- d c < b- > d c1 d2 < g1 g2 b- + + a 1 a2 a > d1 d + + < b- p2 r2 o4 d2 f a > d p2 o6 f1. o4 f2 + +; second line over + + o5 f1 d2 c < b- > c d < b- + + iv1.3 + + o4 f / a / > c 1. iv0.8 o4 f 2 g f e f + + o5 d1 d2 c d 1 < g1 f p3 f1 + +; third line over + + o5 f 1 d2 c < b- > c d < b- + + o5 c 1. < f2 g f e f + + o5 d1 d2 c+ d1 b- + + a f < g a + +; fourth line over + + o4 b- b-2 a b-1 > d + + iv1.3 + + o4 f / a / > c iv0.8 c 2 < b- > c1 < a + + o4 f / > d < b-2 a b-1 f + + g p3 g2 a + + e- / b-1 b- 2 a b-1 > d + +; fifth line over + + o5 c2 c c < b- > c < b- a > c + + o4 b- p2 d 2 f a > c + + iv2 + + o4 a / > c / d / f / a1 iv0.8 d2 d e- d c d + + o4 g1 > c2 < b- g1 b- + +; sixth line over + + o5 c1 c2 c d c < b- > c + + d1 < b-2 g g b- g b- + + g1 > d2 d e- d c < b- + + o5 d c1 d2 < g 1 g2 b- + +; seventh line over + + o4 a1 a2 a > d1 d + + o4 b-1 r4 d f b- d f b- > d < f b- > d f + + o4 b- / > b- 1 d2 d e- d c d + + o4 g1 > c2 < b- g1 b- + +; eighth line over + + o4 f / > c 1 c 2 c d c < b- > c + + iv1.3 o4 f / a / > d 1 + iv0.8 o4 b- 2 g g b- g b- + + g1 > d2 d e- d c < b- + + o4 e- / > d 2 c1 d 2 < g1 g2 b- + +; nineth line over + +; to begin at 1:15 of the video + +} + +{ + iipiano iv0.5 ib137 + + r p3 + + o3 e- 1 b- / > e- 2 o3 e- r e- b- / > e- o3 e- + + f 1 o4 c / f 2 o3 f r f o4 c / f o3 f d1 a / o4 d 2 + + < d r d a / > d < d + +; first line over + + o3 g1 > d / g 2 < g r g > d / g < g + + e- 1 b- / > e- 2 < e- r e- b- / > e- < e- + + o3 f1 > c / f 2 < f r f > c / f < f + + o2 b- > f b- > e- p4.5 r 1 o2 b-1 + +; second line over + + o2 e- / > e- 1 b- / > e- 2 o3 e- r e- b- / > e- < e- + + o2 f / > f 1 a / > c 2 < f r f a / > c < f + + o2 d / > d 1 iv1 f / a / > d 2 iv0.5 < d r d + + iv1 f / a / > d iv0.5 < d + + o2 g / > g 1 b- / > d 2 < g r g b- / > d < g + +; third line over + + o2 e- / > e- 1 b- / > e- 2 < e- r e- b- / > e- < e- + + o2 f / > f 1 a / > c 2 < f r f a / > c < f + + o2 b- 1 > f / b- 2 < b- r b- > b- f + + o2 b- 2 > a f d < b- > d < f b- + +; fourth line over + + o2 e-1 o3 e- / g 2 < b- r b- > e- < e- + + o2 f / > f1 a / > c2 < f r f a / > c < f + + o2 d / > d1 f / a / > d2 < d r d iv1 f / a / > d iv0.5 < d + + o2 g / > g1 b- / > d 2 < g r g b- / > d < g + + o2 e- / > e- 1 b- / > e- 2 < e- r e- b- / > e- < e- + +; fifth line over + + o2 f / > f1 a / > c2 < f r f a / > c < f + + o1 b- / > b- 2 o3 f b- > c p5 o1 b- / > b- 1 + + o2 e- / > e- 1 b- / > e- 2 o3 e- 1 e- 2 b- / > e- < e- + +; sixth line over + + o2 f / > f 1 a / > c 2 < f1 f2 a / > c2 < f + + o2 d / > d 1 iv1 f / a / > d 2 iv0.5 < d 1 d 2 + iv1 f / a / > d iv0.5 < d + + o2 g / > g 1 b- / > d 2 < g 1 g2 b- / > d < g + + o2 e- / > e- 1 b- / > e- 2 o3 e- 1 e- b- / > e- < e- + +; seventh line over + + o2 f / > f 1 a / > c 2 < f1 f2 a / > c < f + + o1 b- / > b- 1 > f / b- 2 < b-1 b-2 > f / b- < b- + + o1 b- / > b- 1 o3 f / b- 2 o2 b- 1 b- 2 o3 f / b- 2 o1 b- / > b- + + o2 e- / > e-1 b- / > e- 2 o3 e-1 e- 2 o2 b- o3 e- < e- + +; eighth line over + + o2 f / > f 1 a / > c 2 < f1 c2 f < f + + o2 d / > d 1 f / a / > d 2 < d1 < a2 > d < d + + o2 g / > g 1 b- / > d 2 < g1 d2 g < g + + o2 e- / > e-1 b- / > e- 2 < e-1 < b-2 > e- < e- + +; nineth line over + +} diff --git a/songs/experiment.rumu b/songs/experiment.rumu index cfc8f86..03ff12c 100644 --- a/songs/experiment.rumu +++ b/songs/experiment.rumu @@ -30,10 +30,10 @@ ; the 3rd chord is D F A ; the 6th chord is G Bb D - (o3 e- / g / b- 1) * 4 - (o3 f / a / > c 1) * 4 - (o3 d / f / a 1) * 4 - (o3 g / b- / >d 1) * 4 + ; (o3 e- / g / b- 1) * 4 + ; (o3 f / a / > c 1) * 4 + ; (o3 d / f / a 1) * 4 + ; (o3 g / b- / >d 1) * 4 ; Then the C major scale ; @@ -47,19 +47,31 @@ ( - (o4 f / a / c / e p1)*4 + (o4 f / a / c / e 1)*3 - (o4 g / f / b / d) * 4 + (d / f+ / a 2)*2 - (o4 e / g / c / < e) * 4 + (o4 e / g / c / < e 1) * 3 - (c / e / g) * 4 + o4 a / c+ / e- 2 a / c+ / e- / g + + (o4 d / f / a / c 1) * 3 + + d / f+ / a / > c+ 2 < d / f+ / a + + (g / b / d / f 1) * 3 + + < g / b / d / > f 2 < g / b / > d / f 2 + + (c / e / g 1) * 3 )*1 diff --git a/songs/take me hand.rumu b/songs/take me hand.rumu index a3ec84d..a4bb990 100644 --- a/songs/take me hand.rumu +++ b/songs/take me hand.rumu @@ -7,11 +7,11 @@ { iipiano iv1 ib123 - o6 f2 d e1. < b2 r - o6 f2 d e1. f2 r < b - o6 f2 d e1. < b2 r + o5 f2 d e1. < b2 r + o5 f2 d e1. f2 r < b + o5 f2 d e1. < b2 r b - o6 f2 d e1. f2 r < b + o5 f2 d e1. f2 r < b @@ -21,13 +21,13 @@ { iipiano iv0.5 ib123 - o3 g1 > d b. < a1 > e + o2 g1 > d b. < a1 > e - o5 c+1. o3 b 1 > f+ b + o4 c+1. o3 b 1 > f+ b f+ - o5 d < f+ > d + o4 d < f+ > d } diff --git a/songs/test.rumu b/songs/test.rumu index ed485f1..f1e2046 100644 --- a/songs/test.rumu +++ b/songs/test.rumu @@ -2,9 +2,30 @@ ; algorithms. { - iv1 iisinus ib60 + iv1 iipiano ib120 - (o4 c1 d e f g a b > c < b a g f e d c) * 4 + ; o2 + + ; a2 b + + ; o3 + ; c c d e f g a b -} \ No newline at end of file + o4 + + c d e f g a b > c + + ; o5 + + ; c c d e f g a b + + ; o6 + + ; c c d e f g a b + + ; o7 + + ; c c d e f g a b + +} diff --git a/src/instruments.rs b/src/instruments.rs index 15ac7d4..622754c 100644 --- a/src/instruments.rs +++ b/src/instruments.rs @@ -192,6 +192,8 @@ impl Instrument for PianoWOver { let mut result: Vec = vec![]; + let mut current_adsr = 0f64; + for i in 0..nb_samples { let mut y = f64::sin(theta); // let mut y = 0.6f64 * f64::sin(theta) + 0.4f64 * f64::sin(2f64 * theta); @@ -201,6 +203,10 @@ impl Instrument for PianoWOver { y *= *volume; + current_adsr = adsr(i, nb_samples, current_adsr); + + y *= current_adsr; + result.push(y.into()); theta += step; @@ -247,6 +253,8 @@ impl Instrument for PianoVideo { let mut result: Vec = vec![]; + let mut current_adsr = 0f64; + for i in 0..nb_samples { let mut y = 0.6f64 * f64::sin(theta) + 0.4f64 * f64::sin(2f64 * theta); y *= f64::exp((-0.0015f64) * theta); @@ -255,6 +263,10 @@ impl Instrument for PianoVideo { y *= *volume; + current_adsr = adsr(i, nb_samples, current_adsr); + + y *= current_adsr; + result.push(y.into()); theta += step; @@ -307,6 +319,8 @@ impl Instrument for PianoStackoverflow { let mut result: Vec = vec![]; + let mut current_adsr = 0f64; + for i in 0..nb_samples { let mut y = f64::sin(theta) + (1f64 / 2f64) * f64::sin(2f64 * theta) @@ -320,6 +334,10 @@ impl Instrument for PianoStackoverflow { y *= *volume; + current_adsr = adsr(i, nb_samples, current_adsr); + + y *= current_adsr; + result.push(y.into()); theta += step; @@ -329,7 +347,6 @@ impl Instrument for PianoStackoverflow { } } -#[allow(dead_code)] fn adsr(step: usize, total: usize, current: f64) -> f64 { if step < 4320 { if current <= 1f64 { @@ -371,6 +388,29 @@ impl Instrument for PianoFromC { let duration = duration.into(); let volume = volume.into(); + let (note_octave, note_rem): (usize, usize) = note.octave(); + + let exp_coeff = match note_octave { + n if n <= 3 => 0.0015f64, + 4 => 0.0015f64, + 5 => 0.001f64, + 6 => { + if note_rem < 9 { + 0.0005f64 + } else { + 0.0003f64 + } + } + 7 => { + if note_rem < 5 { + 0.0003f64 + } else { + 0.00009f64 + } + } + _ => 0.00009f64, + }; + let bpm = bpm.into(); let duration_per_beat: Seconds = bpm.into(); let duration: Seconds = (*duration * *duration_per_beat).into(); @@ -379,9 +419,6 @@ impl Instrument for PianoFromC { let note_h: Hertz = note.into(); - // dbg!(note); - // dbg!(note_h); - let step = *note_h * 2f64 * PI / *rate; let mut theta = 0f64; @@ -390,12 +427,11 @@ impl Instrument for PianoFromC { let mut adsr_factor = 1f64; - #[allow(unused_variables)] for i in 0..nb_samples { let mut y = 0.65f64 * f64::sin(theta) + 0.475f64 * f64::sin(2f64 * theta) + 0.05f64 * f64::sin(3f64 * theta); - y *= f64::exp((-0.0015f64) * theta); + y *= f64::exp((-exp_coeff) * theta); y += y * y * y; y *= 1f64 + 16f64 * i as f64 * f64::exp((-6f64) * i as f64); @@ -404,12 +440,6 @@ impl Instrument for PianoFromC { y *= *volume; - // if y >= 1f64 { - // y = 1f64; - // } else if y <= -1f64 { - // y = -1f64; - // } - result.push(y.into()); theta += step; diff --git a/src/lib.rs b/src/lib.rs index 5fa7e79..23fffe2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -245,6 +245,19 @@ impl Default for Hertz { } } +impl Semitones { + /// Return the octave of the semitone. + fn octave(self) -> (usize, usize) { + let translated = *self + 9f64; + + let quotient = translated.div_euclid(12f64) as i64; + + let rem = translated.rem_euclid(12f64) as usize; + + ((quotient + 4) as usize, rem) + } +} + impl From for Hertz { fn from(st: Semitones) -> Self { (*Self::default() * STD_BASE.powf(*st)).into() -- cgit v1.2.3-18-g5258