Strudelify

Whispering Grass (Don't Tell the Trees)

The Ink Spots

KeyC majorTempo90 bpm
0:00/0:00
// Whispering Grass (Don't Tell the Trees) — The Ink Spots
// 90 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 56 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · acoustic bass
const bass = note(`<
  A B A C D E F@2 G H I C D E F@2 G H J K L M L@2 N O P Q D E F@2 R S T U L M L@2 N O P Q D E F@2 R S ~@6
>`.pickRestart({
  A: "c2 c#2", B: "d2 g1", C: "d2@12 g1@11 ~", D: "c2@10 ~@2 c2@11 ~", E: "e2@11 ~ e2@11 ~", F: "f2@11 ~ f2@11 ~",
  G: "c2@11 ~ a1@12", H: "d2@4 g2@3 ~", I: "c2@11 ~ c#2@12", J: "c2@11 ~ f2@8 ~@2 f2@2",
  K: "c2@5 ~ c2@5 ~ c2@5 ~ c2@3 ~@3", L: "c2 ~ c2 ~ c2 ~ c2 ~@5 c2 ~ c2 ~ c2 ~ c2 ~@5",
  M: "d2 ~ d2 ~ d2 ~ d2 ~@5 g2 ~ g2 ~ g2 ~ g2 ~@5", N: "a1@5 ~ a1@6 e2@5 ~ e2@6", O: "a1@5 ~ a1@6 a1@5 ~ a1@4 ~@2",
  P: "d2@5 ~ d2@5 ~ a2@5 ~ a2@6", Q: "f#3@6 g#2@6 g2@3 ~ g2@2 c#2@6", R: "c2@11 ~ d#2@11 ~", S: "d2@6 g#2@5 ~",
  T: "c2@11 ~ g#2@12", U: "c2@5 ~ c#2@6 d2@5 ~ g2@5 ~",
})).s("gm_acoustic_bass").gain(0.48)

// chords · piano
const piano = note(`<
  A B C D E F G H I J@2 K L M N O P Q R S T U V W X Y Z AA AB AC AD O AE AF AG AH T U V W X Y Z AI AJ AK AL AM AN AO@4
  AP@3
>`.pickRestart({
  A: "~@12 c#4@2 e4@2 g4@2 a#4 ~ c#5@2 e5@2", B: "~@3 a5@2 ~ a4@3 b4@6 ~@3 e5@2 a5@2 g5@2, f5@5 ~@19",
  C: "e5@6 c5@2 e5@2 g5@2 a#4@5 ~ e5@2 g5@2 a#5@2",
  D: "b5@3 [a5,b5] a5 ~ f5 ~ a4@2 a#4@2 b4@2 g5@2 ~@2 b4 a#4 a4 g#4 g4 f#4, ~@4 f5 ~", E: "f4 e4@6 ~@16 d#5",
  F: "e5@15 ~@3 g5@4 e5@2", G: "f5@11 ~@13", H: "~@10 e6@2 d6@2 c6 g#5 ~ e5 d5 ~ c5@2 g#4 f4, ~@9 c6@2 ~@13",
  I: "e4@7 ~@13 g#4@2 g4@2",
  J: "[f#4@10 ~@2 f4@8 ~ f#4 ~ e4@7 ~@2 a4@2 c5@2 e5@2 g4@2 a#4@2 c#5@2 e5@2 g5@2, ~@11 f4 ~@3 g4@2 ~@7]/2",
  K: "f5@2 ~@2 a5 [a5,b5] ~@2 a4@2 a#4@2 b4@2 g5@2 f5@4 a4@2 c5@2", L: "e5@5 ~@17 g4 [f4,f#4]",
  M: "e4@4 ~@3 b4 e5 g5 b5 e5", N: "d6@7 ~@17",
  O: "g#4@6 c5@2 ~@2 g#5 ~ d6@3 c6 [c6,d6] ~@2 f5 ~ b4@2 ~, ~@4 d5 ~@5 d5 ~, ~@9 f5@2 ~@7 g#5@2 ~@4", P: "~ g4",
  Q: "f#4@7 ~@3 f#4@2 f4@8 ~@2 f4@2",
  R: "[g4,c5]@4 ~@2 [g4,c5]@3 ~@3 [f4,g#4,c5]@4 ~@2 [f4,g#4,c5]@3 ~@3, e4 ~@2, c3 ~@3", // C5 Fm
  S: "[g4,e5]@2 ~@2 [g4,c5,e5] ~ [c4,g4,c5,e5] ~@3 [c4,g4,c5,e5] ~ [c4,c5,e5,g5,a5] ~@3 [c4,c5,e5,g5,a5] ~ [c4,c5,e5,g5,c6] ~@5, c5 ~@23", // C Am7 C
  T: "[c3,c4,e4,g4] ~ [c3,c4,e4,g4] ~ [c3,c4,e4,g4] ~ [c3,c4,e4,g4] ~@5 [c3,c4,e4,a4] ~ [c3,c4,e4,a4] ~ [c3,c4,e4,a4] ~ [c3,c4,e4,a4] ~@5", // C Am
  U: "[d3,d4,f4,a4] ~ [d3,f4,a4] ~ [d3,d4,f4,a4] ~ [d3,d4,f4,a4] ~@5 [g3,d4,f4,b4] ~ [g3,f4,b4] ~ [g3,f4,b4] ~ [g3,d4,f4,b4] ~@5", // Dm G7
  V: "[c3,e4,g4,a4,c5] ~ [c3,a4,c5] ~ [c3,g4,a4,c5] ~ [c3,e4,g4,a4,c5] ~@5 [c3,e4,g4,a4,c5] ~ [c3,g4] ~ [c3,g4,a4] ~ [c3,e4,g4,a4,c5] ~@5", // Am7 F Am7 C5 Am7
  W: "[c3,e4,g4,a4,c5] ~ [c3,a4,c5] ~ [c3,g4,a4] ~ [c3,e4,g4,a4,c5] ~@5 [c3,e4,g4,a4,c5] ~ [c3,g4,a4,c5] ~ [c3,e4,g4,a4,c5] ~ [c3,e4,g4,a4,c5] ~@5", // Am7 F Am7
  X: "[e4,g4,a4,c5]@2 ~@4 [e4,g4,a4,c5]@3 ~@3 [d4,g#4,b4]@3 ~@3 [d4,g#4,b4]@3 ~@3, [a2,a3]@3 ~ e3@2 ~@2", // Am7 G#dim A
  Y: "[e4,g4,a4,c5]@3 ~@3 [e4,a4,c5]@2 ~@4 [e4,g4,a4,c5]@2 ~@4 [e4,g4,a4,c5] ~@5, [a2,a3]@6 g4 ~@5 [a2,a3]@6 ~@6", // Am7 Am Am7 A
  Z: "[f4,a4,c5]@3 ~@3 [f4,a4,c5]@3 ~ d3@2 [g4,b4,c#5]@3 ~@3 [g4,b4,c#5]@4 a3@2, d3 ~ a3 ~", // F C#m7b5
  AA: "[f#4,a4,c5]@3 ~@3 [f#4,g#4,c5]@4 d4@2 [f4,g4,b4]@3 ~@3 b4 ~ b4@2 d#5@2, d4@3 ~@3 g3@3 [f4,g4]@2 ~", // F#dim G#7 G7 Fsus2
  AB: "e5 e5@7 ~@14 g4 [f4,f#4]", AC: "e4@4 ~@2 g5 b5 d6 e5 g5 b5", AD: "a5@7 ~@17",
  AE: "c3@2 ~ c3@2 ~ [d#4,f#4,b4]@5 ~, [e4,g4,c5]@5 ~@7", // B C
  AF: "[d4,f4,a4]@11 ~@12 b5, ~@12 [d4,f4,g#4]@9 f5@2 ~, ~@19 b4@3 g#5@2, ~@20 d5@3 ~", // Dm Ddim
  AG: "g4@4 [d4,f4,g#4]@3 ~, e4@5 ~@7, c6@7 ~@17", // Ddim
  AH: "~@4 c5@2 g4@2 a4@2 c#5@2 a4@2 b4@2 d5@2 ~@2 b4@2 d5 ~, e4@6 ~@12 f4@5 ~, ~ g4@2 ~@9",
  AI: "[f#4,a4,c5]@3 ~@3 [f#4,a4,c5]@4 d4@2 [g3,f4,g4,b4]@4 g3@2 b4@2 b4@2 [f4,d#5]@2, d4@3 ~@6 [f4,g4]@2 ~", // F#dim G7 F7 Fsus2
  AJ: "e5 e5@7 ~@14 g4 [f4,f#4], e4@7 ~@17", AK: "e4@8 ~ g5@3 b5@4 g5!2 e5 ~ b4@2 a#4@2, ~@8 b5 ~@3", AL: "a4 ~@3",
  AM: "~@6 c6@2 e6@2 d6@2 c6@2 g#5 ~ f5@2 d5@2 f5@2 g#5@2", AN: "[e4,g4,c5]@5 ~ [d#4,f#4,b4]@5 ~, g5 ~@3, c3 ~@5",
  AO: "[[d4,f4,a4]@11 ~@12 g#6@15 ~@8 c5@24 ~@7 g#5@19, ~@12 [d4,f4,g#4]@8 f6@17 ~@38 f5@21, ~@13 b4@24 ~@6 c3@27 ~@26, ~@16 g#5@21 ~@7 g3@26 g#3@26, ~@17 b5@20 ~@8 [c4,g4]@25 ~ f4@25]/4", // Dm Ddim C5
  AP: "[~@35 g6@29 ~@8, ~@3 c3@20 c6@41 ~@8, ~ [g3,g4]@6 a6@9 ~@2, ~@7 g5@24 ~@5, ~@9 d6@23 ~@4]/3", // G
})).s("gm_piano").gain(0.34).pan(0.8)

// chords · piano · soft notes
const piano_soft = note("<~@4 A B ~@9 C ~@2 D E ~ F G H ~ I ~@5 C ~ J K ~@2 F G H ~ I ~@6 L M@3 N O@3>".pickRestart({
  A: "~@22 d5 ~", B: "~@8 e5 ~@3", C: "~@22 g4 f4", D: "~@10 c3@3 ~@11", E: "c4 ~@3 c4 ~@19",
  F: "~@2 d4 ~@11 d4 ~ d4 ~@7", G: "~@2 [e4,g4] ~ e4 ~@9 [e4,a4,c5] ~ [e4,c5] ~@7",
  H: "~@2 [e4,g4] ~ [e4,c5] ~@9 e4 ~@9", I: "~@5 e3 ~@6", J: "d3@3 ~@3 d3@4 ~@14",
  K: "c3@2 ~@4 c3@5 ~ g#3@2 ~@4 g#3@4 ~@2", L: "~@3 c3@2 ~@7",
  M: "[d3@3 ~@3 d3@4 ~@9 d6@19 ~@9 e5@23 ~@2, ~@14 d5@23 ~@8 e4@25 ~@2, ~@15 f5@22 ~@35]/3", N: "~ d5@11, g#4, ~ b4@23",
  O: "[~@5 a5@24 ~@7, ~ e4@12 ~@5]/3",
})).s("gm_piano").gain(0.2).pan(0.8)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<A@8 B@2 C@8 D E F G H I@4 J@6 K L M F G H I@4 N@6 O P@3 Q@3>".pickRestart({
  A: "[~@4 g3@2 [c4,e4] ~@9 g3@2 [c#4,e4] ~@9 a3@2 [d4,f4] ~@9 g3@2 [b3,e4] ~@9 g3@2 [c4,e4] ~@9 g3@2 [c#4,e4] ~@9 a3@2 [d4,f4] ~@9 g3@2 [b3,f4] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,b3]@6 [e3,g3,b3] ~@5 [e3,g3,b3]@6 [e3,g3,b3] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@3 f2@2, c2@7 ~@3 c2@9 ~@5 d2@7 ~@3 d2@9 ~@3 d2@9 ~@5 c#2@7 ~@3 c#2@9 ~@5 g1@7 ~@101, ~@12 c#2@7 ~@3 c#2@9 ~@5 g1@7 ~@5 c2@7 ~@3 c2@9 ~@5 d2@7 ~@3 d2@9 ~@3 d2@9 ~@3 c3@9 ~@3 e2@9 ~@3 e2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@5]/8", // C C#m Dm E5 C C#m Dm Bdim …
  B: "[[c3,e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,a3,c#4]@6 [e3,g3,a3,c#4] ~@5 [f#3,a3,c4]@6 [f#3,a3,c4] ~@5 [f3,a3,b3]@6 [f3,a3,b3] ~@5, ~@10 a2@9 ~@3 d2@9 ~@3 g2@9 ~@5]/2", // C A7 F#dim Bm7b5
  C: "[~@4 g3@2 [c4,e4] ~@9 g3@2 [c#4,e4] ~@9 a3@2 [d4,f4] ~@9 g3@2 [b3,e4] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,b3]@6 [e3,g3,b3] ~@5 [e3,g3,b3]@6 [e3,g3,b3] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@5 [c3,e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,a3,c#4]@6 [e3,g3,a3,c#4] ~@5 [f#3,a3,c4]@6 [f#3,a3,c4] ~@5 [f3,a3,b3]@6 [f3,a3,b3] ~@5, c2@7 ~@3 c2@9 ~@5 d2@7 ~@3 d2@9 ~@3 d2@9 ~@3 c3@9 ~@3 e2@9 ~@3 e2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@3 a2@9 ~@3 d2@9 ~@3 g2@9 ~@5, ~@12 c#2@7 ~@3 c#2@9 ~@5 g1@7 ~@149]/8", // C C#m Dm E5 C Em Dm Fm …
  D: "[e3,g3,c4]@6 [e3,g3,c4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@5", // C Fm
  E: "[e3,g3,c4]@6 [e3,g3,c4] ~@3 e3@2 [e3,g3,c4]@6 [e3,g3,c4] ~@5", // C
  F: "[e3,g3,c4]@2 [e3,g3,c4]@2 [e3,g3,c4]@2 [e3,g3,c4] ~@5 [e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4] ~@5", // C Am7
  G: "[f3,a3,c4]@2 [f3,a3,c4]@2 [f3,a3,c4]@2 [f3,a3,c4] ~@5 [g3,b3,d4]@2 [g3,b3,d4]@2 [g3,b3,d4]@2 [g3,b3,d4] ~@5", // F G
  H: "[e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4] ~@5", // Am7
  I: "[[e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4]@2 [e3,g3,a3,c4] ~@5 [e3,g3,a3,c4]@6 [e3,g3,a3,c4] ~@5 [d3,g#3,b3]@6 [d3,g#3,b3] ~@5 [e3,g3,a3,c4]@6 [e3,g3,a3,c4] ~@3 e3@2 [e3,g3,a3,c4]@6 [e3,g3,a3,c4] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [g3,a3,c#4]@6 [g3,a3,c#4] ~@3 f#3@2, ~@22 a2@9 ~@3 e2@9 ~@3 a2@9 ~@15 d2@9 ~@3 a2@9 ~@5]/4", // Am7 G#dim Am7 Dm A7
  J: "[[f#3,a3,c4]@6 [f#3,g#3,c4] ~@5 [f3,g3,b3]@6 [f3,g3,b3] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,b3]@6 [e3,g3,b3] ~@5 [e3,g3,b3]@6 [e3,g3,b3] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [d#3,f#3,a3]@6 [d#3,f#3,a3] ~@5, ~@10 g2@9 ~@3 g1@9 ~@3 c3@9 ~@3 e2@9 ~@3 e2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@17]/6", // F#dim G#7 G7 C Em Dm Fm C …
  K: "[d3,f3,a3]@6 [d3,f3,a3] ~@5 [d3,f3,g#3]@6 [d3,f3,g#3] ~@5", // Dm Ddim
  L: "[e3,g3,c4]@6 [e3,g3,c4] ~@5 [d3,f3,g#3]@6 [d3,f3,g#3] ~@5", // C Ddim
  M: "[e3,g3,c4] ~ [c#3,e3,g3] ~ [d3,f3,a3] ~ [f3,g3,b3] ~", // C C#dim Dm G7
  N: "[[f#3,a3,c4]@6 [f#3,a3,c4] ~@5 [f3,g3,b3]@6 [f3,g3,b3] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [e3,g3,b3]@6 [e3,g3,b3] ~@5 [e3,g3,b3]@6 [e3,g3,b3] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [f3,a3,d4]@6 [f3,a3,d4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@5 [f3,g#3,c4]@6 [f3,g#3,c4] ~@5 [e3,g3,c4]@6 [e3,g3,c4] ~@5 [d#3,f#3,a3]@6 [d#3,f#3,a3] ~@5, ~@10 g2@9 ~@3 g1@9 ~@3 c3@9 ~@3 e2@9 ~@3 e2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@3 f2@9 ~@17]/6", // F#dim G7 C Em Dm Fm C D#dim
  O: "[d3,f3,a3]@6 [d3,f3,a3] ~@5 [d3,f3,g#3]@7 ~@5", // Dm Ddim
  P: "[~@7 e4@8 ~ d4@8, ~@9 c2@13 ~@14, ~@19 [g2,e3]@26 ~ g#2@26, ~@20 [c3,g3,c4]@25 ~@2 [f3,g#3,b3]@25]/3", // C C5 Fdim
  Q: "[~@5 [c3,e3,g3]@48 ~@19, ~ [c2,g2]@12 ~@5]/3", // C C5
})).s("gm_acoustic_guitar_steel").gain(0.2).pan(0.2)

stack(bass, piano, piano_soft, acoustic_guitar_steel)