Strudelify

Almost a Whisper

Yanni

KeyA majorTempo116 bpm
0:00/0:00
// Almost a Whisper — Yanni
// 116 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 77 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(116/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.

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@7 A B C D E F@2 G@2 H I J@2 K L M N O P Q R S@2 T@2 H U V@2 W@2 X Y@3 Z AA AB AC AD AE AF AG AH@2 O L AI AJ O AK AL
  AM F@2 G@2 H I J@2 ~@9
>`.pickRestart({
  A: "~@4 b4 f#4 a4 d4", B: "~@5 f#4 g#4 a4", C: "~ f#4 a4 f#4!2 a4 d4 f#4", D: "~ d4 f#4 a4 b4 f#4 a4 d4",
  E: "~@2 d4@2 f#4@2 a4@2 b4@2 a4@2 d6 c#6 b5 a5, b3@4 ~@2 [f#4,f#5] [d4,d5]", // F# D
  F: "[e3@2 g#3@2 b3@2 e4@2 g#4@2 e4@2 [b3,e5,b5]@2 [g#3,c#6]@2 a3@2 c#4@2 e4@2 a4@2 c#5@2 a4@2 c#6 b5 a5 g#5, [e5,b5]@3 e5@3 ~ e5@7 [e4,e5] [c#4,c#5], ~@4 a5@3 ~]/2", // E5 C#5 E5 E C#
  G: "[f#3@2 a3@2 c#4@2 f#4@2 a4@2 c#4@2 [c#5,a5]@2 ~@2 b3@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 d6 c#6 b5 a5, a5@6 ~ [d5,b5]@7 f#5@2, c#5@3 c#5@3 a3@2 ~@6 a4 d4]/2", // F#m G
  H: "c#3 f3 g#3 [c#4,f#5] f4 c#4 g#3 [c#3,f#5], b4, g#5@3 ~ g#5@3 ~", // F#5
  I: "g#5 a5 f#3@2 a3@2 a5 [a5,b5] f#4@2 d4@2 [a3,f#5]@2 ~ a5, d5, d3 b5@2 d4 g#5@2 ~ d3", // Asus2 D
  J: "[e3 g#3 b3 e4 f#4 g#4 b4 e5 b5@8, g#5]/2", K: "~@3 f#5 g#5@3 f#5", L: "g#5@3 f#5 g#5@2 a5@2", M: "~@14 d5 e5",
  N: "d5@15 a5", O: "g#5@3 f#5 g#5@3 f#5", P: "b5@6 a5 [a5,b5] g#5@6 f#5@2",
  Q: "~@2 d4@2 f#4@2 a4@2 b4@2 a4@2 f#4@2 [f#5,d6] [g#5,e6], b2, ~@7 a4", // D C#m
  R: "~@2 d4@2 f#4@2 a4@2 b4@2 a4@2 [f#5,d6] c#6 [d5,b5] a5, b2, [f#5,d6]@3 d4", // D G D
  S: "[e3@2 g#3@2 b3@2 e4@2 g#4@2 e4@2 [b3,e5,b5]@2 [g#3,c#6]@2 ~@2 c#4@2 e4@2 a4@2 c#5@2 a4@2 [e5,c#6] b5 [c#5,a5] g#5, [e5,b5]@3 e5@3 ~ e5@7 e4 c#4, ~ a2, ~@4 c#6@3 ~]/2", // E5 C#5 C#m F#m E5
  T: "[~@2 a3@2 c#4@2 f#4@2 a4@2 c#4@2 [c#5,a5]@2 ~@4 d3@2 f#3@2 a3@2 b3@2 a3@2 [f#5,d6] c#6 b5 a5, f#2 b2, a5@6 ~ [d5,b5]@7 ~@2, c#5@3 c#5@3 a3@2 ~@6 d3 a3]/2", // F#m D G
  U: "g#5 a5 f#3@2 a3@2 a5 [a5,b5] f#4@2 d4@2 a3@2 d3@2, d5, d3 b5@2 d4 g#5@2 f#5@2", // Asus2
  V: "[e3 g#3 b3 e4 f#4 g#4 b4 e5 ~@8, g#5]/2",
  W: "[~@4 [c#5,a5]@2 [c#5,a5]@6 [b4,g#5]@2 [b4,g#5]@4 [a4,f#5]@6 [a4,f#5]@6 e5 d5, ~@15 a4]/2", // F#m E D
  X: "[a4,e5]@12 d5 c#5 b4 a4, ~@12 a4@3 ~", // A5
  Y: "[[e3,g#4]@2 [g#3,a4]@2 [b3,b4]@2 [g#3,e4]@2 ~@2 b3@2 g#3@2 e4@2 ~@4 [c#5,a5]@2 [c#5,a5]@6 [b4,g#5]@2 ~@2 d3@2 a3@2 d4@2 a3@2 ~@2 a3@2 d4@2 e5 d5, ~@4 e4@3 e3@9 ~@7 [a3,a4], ~@15 [b4,g#5]@2 [a4,f#5]@3 [a4,f#5]@3 ~]/3", // E Amaj7 B C#m F#m E A E …
  Z: "[a4,e5]@12 a5 [a5,b5] g#5 f#5, ~@6 c#5 a4", // A5 Asus2
  AA: "[e3,g#5] [g#3,a5] [b3,b5] g#3 e4 b3 g#3 [e3,g#5,e6], e5@3 e5@4 ~", // E Amaj7 B E
  AB: "b2 d3 f#3 [b3,f#5,d6] d4 f#3 ~ [e5,c#6], [g#5,e6]@3 ~ [f#5,d6]@3 ~, ~@3 b3", // Bm C#m D
  AC: "e3 g#3 b3 [e4,d5,b5] g#4 e4 ~ [c#5,a5], [e5,c#6]@3 ~ [d5,b5]@3 ~, ~@3 b3", // E7 F#m C#m G
  AD: "a2 e3 a3 c#4 e4 a4 e4 c#4, [d5,b5]@3 [e5,c#6]@5", AE: "a3 c#4 e4 a4 a3 c#4 e4 [c#4,a5], [c#5,a5]@3 ~",
  AF: "f#3 a3 c#4 f#4 a4 f#4 c#4 [f#4,a5], b5@7 ~", AG: "f#3 a3 c#4 f#4 a4 f#4 a3 [f#4,a5], b5@7 ~",
  AH: "[a3@2 c#4@2 e4@2 a4@2 b4@2 a4@2 e4@2 a4@2 c#5@2 c#4@2 e4@11 a5, b5@3 c#6@11 ~@2]/2",
  AI: "~@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 a4@2 d5 e5, e5@7 ~, b3@4 ~@3 d4",
  AJ: "~@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 a4@2 ~ a5, d5@15 ~, b3@4 ~@3 d4",
  AK: "~@2 f#4@2 a4@2 a5 [a5,b5] f#4@2 a4@2 d4@2 f#4@2, d4 ~, b5@3 f#4 g#5@2 f#5@2", // Asus2
  AL: "~@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 a4@2 [f#5,d6] [g#5,e6], [g#5,e6]@7 ~, b3@4 ~@3 d4", // D C#m
  AM: "~@2 d4@2 f#4@2 a4@2 b4@2 a4@2 d6 c#6 b5 a5, [f#5,d6]@3 ~, b3@4 ~@2 [f#4,f#5] [d4,d5]", // D F# D
})).s("gm_string_ensemble_1").gain(0.22)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@4 A@2 B@2 A C B@2 D E F G H I J@2 K@2 L@2 M N O@2 D P Q R H I J@2 M N S T M N S T U T V S K@2 W@2 A@2 B@2 A C B@2 D
  E F G H I J@2 X@8 ~
>`.pickRestart({
  A: "c#3", B: "b2", C: "d3", D: "[e1,e2]", E: "[a1,a2]", F: "[f#1,f#2]", G: "[b1,b2]", H: "[c#1,c#2]", I: "[d1,d2]",
  J: "[e2, e1 ~]/2", K: "f#2/2", L: "b2/2", M: "f#2", N: "d2", O: "b1/2", P: "[a0,a1]", Q: "f#1", R: "[b0,b1]", S: "a2",
  T: "e2", U: "b1", V: "a1", W: "a2/2", X: "[f#1@3 f#1@2 c#3@2 f#1@2 c#3@2 f#1@4 f#2]/8",
})).s("gm_electric_bass_finger").gain(0.36)

// chords · piano
const piano = note(`<
  A B A C D E F G D H I J K@2 L@2 M N O@2 P Q R S T U V W X@2 Y@2 M Z O@2 AA@3 AB AC@3 AD AE AF AG AH AI AJ AK@2 D E F G
  D H I J K@2 L@2 M N O@2 AL AM AN AO@2 AP AQ AR@2
>`.pickRestart({
  A: "~ f#4 g#4 a4 ~ f#4 g#4 a4, c#4!2", B: "~ f#4 g#4 a4 b4 g#4 a4 f#4, c#4",
  C: "~ f#3 g#3 b3 c#4@4, [f#4,g#4,c#5], c#3 ~", D: "~ f#4 g#4 [a4,f#5] ~ f#4 g#4 [a4,f#5], c#4!2, g#5@3 ~ g#5@3 ~",
  E: "~ f#4 g#4 [a4,f#5] ~ f#4 g#4 a4, c#4!2, g#5@3 ~ g#5@2 a5@2", // D
  F: "~@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 a4@2 d5 e5, e5@7 ~, b3@4 ~@3 d4",
  G: "~@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 a4@2 ~ a5, d5@15 ~, b3@4 ~@3 d4",
  H: "~@2 f#4@2 a4@2 a5 [a5,b5] f#4@2 a4@2 d4@2 f#4@2, d4 ~, b5@3 f#4 g#5@2 f#5@2", // Asus2
  I: "~@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 a4@2 [f#5,d6] [g#5,e6], [g#5,e6]@7 ~, b3@4 ~@3 d4", // D C#m
  J: "~@2 d4@2 f#4@2 a4@2 b4@2 a4@2 d6 c#6 b5 a5, [f#5,d6]@3 ~, b3@4 ~@2 [f#4,f#5] [d4,d5]", // D F# D
  K: "[e3@2 g#3@2 b3@2 e4@2 g#4@2 e4@2 [b3,e5,b5]@2 [g#3,c#6]@2 a3@2 c#4@2 e4@2 a4@2 c#5@2 a4@2 c#6 b5 a5 g#5, [e5,b5]@3 e5@3 ~ e5@7 [e4,e5] [c#4,c#5], ~@4 a5@3 ~]/2", // E5 C#5 E5 E C#
  L: "[f#3@2 a3@2 c#4@2 f#4@2 a4@2 c#4@2 [c#5,a5]@2 ~@2 b3@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 d6 c#6 b5 a5, a5@6 ~ [d5,b5]@7 f#5@2, c#5@3 c#5@3 a3@2 ~@6 a4 d4]/2", // F#m G
  M: "c#3 f3 g#3 [c#4,f#5] f4 c#4 g#3 [c#3,f#5], b4, g#5@3 ~ g#5@3 ~", // F#5
  N: "g#5 a5 f#3@2 a3@2 a5 [a5,b5] f#4@2 d4@2 [a3,f#5]@2 ~ a5, d5, d3 b5@2 d4 g#5@2 ~ d3", // Asus2 D
  O: "[e3 g#3 b3 e4 f#4 g#4 b4 e5 b5@8, g#5]/2", P: "f#3 a3 c#4 [f#4,f#5] a4 f#4 ~ f#5, g#5@3 ~ g#5@3 ~, ~@3 c#4",
  Q: "f#3 a3 c#4 [f#4,f#5] g#4 f#4 [c#4,a5]@2, g#5@3 ~ g#5@2 ~@2", // F# F#m
  R: "b3@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 a4@2 d5 e5, e5@7 d4", S: "b3@2 d4@2 f#4@2 a4@2 b4@2 f#4@2 a4@2 ~ a5, d5@7 d4",
  T: "f#3 a3 c#4 [f#4,f#5] [a3,f#4]@2 ~ f#5, g#5@3 ~ g#5@3 ~, ~@3 [a3,f#4]", // F# D
  U: "d3@2 f#3@2 a3@2 a5 [a5,b5] f#4@2 d4@2 a3@2 [f#3,f#5]@2, b5@3 d4 g#5@3 ~", // Asus2 F#
  V: "~@2 d4@2 f#4@2 a4@2 b4@2 a4@2 f#4@2 [f#5,d6] [g#5,e6], b2, [g#5,e6]@7 a4", // D C#m
  W: "~@2 d4@2 f#4@2 a4@2 b4@2 a4@2 [f#5,d6] c#6 [d5,b5] a5, b2, [f#5,d6]@3 d4", // D G D
  X: "[e3@2 g#3@2 b3@2 e4@2 g#4@2 e4@2 [b3,e5,b5]@2 [g#3,c#6]@2 ~@2 c#4@2 e4@2 a4@2 c#5@2 a4@2 [e5,c#6] b5 [c#5,a5] g#5, [e5,b5]@3 e5@3 ~ e5@7 e4 c#4, ~ a2, ~@4 c#6@3 ~]/2", // E5 C#5 C#m F#m E5
  Y: "[~@2 a3@2 c#4@2 f#4@2 a4@2 c#4@2 [c#5,a5]@2 ~@4 d3@2 f#3@2 a3@2 b3@2 a3@2 [f#5,d6] c#6 b5 a5, f#2 b2, a5@6 ~ [d5,b5]@7 ~@2, c#5@3 c#5@3 a3@2 ~@6 d3 a3]/2", // F#m D G
  Z: "g#5 a5 f#3@2 a3@2 a5 [a5,b5] f#4@2 d4@2 a3@2 d3@2, d5, d3 b5@2 d4 g#5@2 f#5@2", // Asus2
  AA: "[f#3@2 a3@2 [c#4,c#5,a5]@2 a3@2 a4@2 a3@2 [c#4,b4,g#5]@2 a3@2 d3@2 a3@2 d4@2 a3@2 ~@2 a3@2 d4@2 e5 d5 ~@2 a3@2 c#4@2 a3@2 e4@2 c#4@2 d5 c#5 b4 a4, ~@6 [c#5,a5]@6 ~@2 [b4,g#5]@4 [a4,f#5]@6 [a4,f#5]@6 a3@4 ~@10 [a3,a4]@3 ~, ~@15 a4 [a4,e5]@6 ~ c#4]/3", // F#m C#7 F#m E D A A5
  AB: "[e3,g#4] [g#3,a4] [b3,b4] [g#3,e4] ~ b3 g#3 [e3,e4], ~@4 e4@3 ~", // E Amaj7 B C#m E
  AC: "[f#3@2 a3@2 [c#4,c#5,a5]@2 a3@2 a4@2 a3@2 [c#4,b4,g#5]@2 a3@2 d3@2 a3@2 d4@2 a3@2 ~@2 a3@2 d4@2 e5 d5 ~@2 a3@2 c#4@2 a3@2 e4@2 c#4@2 a5 [a5,b5] g#5 f#5, ~@3 [c#5,a5]@3 ~ [b4,g#5]@2 [a4,f#5]@3 [a4,f#5]@3 a3@2 ~@5 [a3,c#5] [c#4,a4], ~@15 a4 [a4,e5]@6 ~@2]/3", // F#m C#7 Asus2 F#m E D A F#m …
  AD: "[e3,g#5] [g#3,a5] [b3,b5] g#3 e4 b3 g#3 [e3,g#5,e6], e5@3 e5@4 ~", // E Amaj7 B E
  AE: "b2 d3 f#3 [b3,f#5,d6] d4 f#3 ~ [e5,c#6], [g#5,e6]@3 ~ [f#5,d6]@3 ~, ~@3 b3", // Bm C#m D
  AF: "e3 g#3 b3 [e4,d5,b5] g#4 e4 ~ [c#5,a5], [e5,c#6]@3 ~ [d5,b5]@3 ~, ~@3 b3", // E7 F#m C#m G
  AG: "a2 e3 a3 c#4 e4 a4 e4 c#4, [d5,b5]@3 [e5,c#6]@5", AH: "a3 c#4 e4 a4 a3 c#4 e4 [c#4,a5], [c#5,a5]@3 ~",
  AI: "f#3 a3 c#4 f#4 a4 f#4 c#4 [f#4,a5], b5@7 ~", AJ: "f#3 a3 c#4 f#4 a4 f#4 a3 [f#4,a5], b5@7 ~",
  AK: "[a3@2 c#4@2 e4@2 a4@2 b4@2 a4@2 e4@2 a4@2 c#5@2 c#4@2 e4@11 a5, b5@3 c#6@11 ~@2]/2",
  AL: "[b4,c#5] [d5,e5] c#3@2 f#3@2 g#3@2 a3@2 b3@2 c#4@2 f#4@2, a4, f#2 ~@7, ~ f#5@15", // Bsus2 Dsus2
  AM: "g#4 a4 c#5 f#5 f#2 c#3 f#3 [g#3,f#5], ~@4 g#5@3 ~", // G#7
  AN: "a3 b3 c#4 [e4,f#5] a4 c#4 g#4 [c#4,a5], g#5@3 ~ g#5@3 ~", // Esus2 F#m
  AO: "[f#4@2 a3@2 c#4@2 f#3@2 c#6 c#5 ~@2 f#3@2 g#3@2 a3@2 b3@2 c#4@2 a6@2 g#6@2 [c#4,e6]@2 a3@2 c#4@2, b5@2 e6@2 f#2 c#3 ~@5 f#4@2 ~@3, ~@11 c#6@9 ~@8 g#6@4]/2", // C#m
  AP: "[g#3,f#6] a3 f#3 c#3 f#2 c#3 [g#3,b5] [a3,c#6], ~ c#6@3 ~@4", // G#7 G#m A
  AQ: "[c#4,e6] [a3,b5] g#3 c#3 f#2 c#3 e3 f#3, ~ a5@2 g#5", // C#m Asus2
  AR: "[g#3@2 a3@2 b3@2 c#4@2 a5 g#5 f#5@14 ~@8, c#6 e5 [f#3,c#4,f#4]@4 ~@2]/2", // F#5
})).s("gm_piano").gain(0.36)

// chords · brass section · "Brass"
const brass_section = note("<~@11 A ~@8 B ~ C ~@3 D ~@8 E ~@41>".pickRestart({
  A: "[f#5,d6]@3 ~", B: "g#5@3 ~@5", C: "e5@7 ~", D: "[g#5,e6]@7 ~", E: "b5",
})).s("gm_brass_section").gain(0.36)

stack(string_ensemble_1, bass, piano, brass_section)

More by Yanni