summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJSDurand <mmemmew@gmail.com>2022-08-27 15:38:23 +0800
committerJSDurand <mmemmew@gmail.com>2022-08-27 15:38:23 +0800
commitb7e0fa06ca5454314f1341a63148001f497ff018 (patch)
tree89c955660162de96919d4bc6efa98d791c88c8de
parente954df3f896bd18494cd27d77b26bbb2005de8a7 (diff)
some new songs and small modifications
-rw-r--r--songs/105-water.rumu205
-rw-r--r--songs/experiment.rumu34
-rw-r--r--songs/take me hand.rumu14
-rw-r--r--songs/test.rumu27
-rw-r--r--src/instruments.rs54
-rw-r--r--src/lib.rs13
6 files changed, 314 insertions, 33 deletions
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:
+; <https://www.youtube.com/watch?v=6HnYNmcM_7A>
+
+
+{
+ 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 / <b / d) * 4
+ (o4 g / f / b / d 1) * 3
+
+ (o4 a / c+ / e- 2 )*2
- (o4 a / > c / < e) * 4
+ (o4 e / g / <b / d 1) * 3
- (o4 d / f / a / c) * 4
+ o4 d / f+ / a 2 d / < f+ / a
- (g / b / d / f) * 4
+ (o4 a / > 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<Pulse> = 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<Pulse> = 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<Pulse> = 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<Semitones> for Hertz {
fn from(st: Semitones) -> Self {
(*Self::default() * STD_BASE.powf(*st)).into()