Strudelify

Sad Eyes

Robert John

KeyC majorTempo72 bpm
0:00/0:00
// Sad Eyes — John Robert
// 72 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 67 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(72/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 · "ACOU BASS"
const bass = note(`<
  ~ A B C D E F G H I J@2 K L M N O P Q R S T U E F G H I J@2 K L M N O P Q R S T U N O P Q R S T U N O P Q R S T V W X
  Y Z AA AB AC AD AE@2
>`.pickRestart({
  A: "c2@10 a2@2 g2@3 ~ a2@2 g2@3 ~ a2@2", B: "d2@4 ~ a2 g2@2 a2 g2@3", C: "f1@5 d2 g1@3 g2@3",
  D: "c2@12 g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~", E: "c2@2 ~@8 g1@2 c2@5 ~@3 g1@2 a1@2", F: "c2@2 ~@8 c2@7 ~@3 g1@2 d2@2",
  G: "c2 ~@4 c2@4 ~ g1 a1", H: "c2@6 ~@6 g1 ~ g1 ~ g1@2 g2@2 g1@2 g2 ~", I: "c2 ~@4 c2@5 g1 d2", J: "c2 ~@4 c2@5 g1 a1",
  K: "g1 ~@9 g1@11 ~@3", L: "d2", M: "f1@17 ~ f1@4 ~@2", N: "c2@9 ~ a2@2 g2@4 a2@2 g2@3 ~ a2@2",
  O: "d2@8 ~@2 a2@2 g2@3 ~ a2@2 g2@3 ~ a2@2", P: "f1@9 ~ d2@2 c2@3 ~ d2@2 a1@4 g1@2",
  Q: "c2@9 ~ c2@2 g1@2 g2@2 g1@2 g2@2 g1@2 g2@2", R: "c2@9 ~ a2@2 g2@3 ~ a2@2 g2@3 ~ a2@2",
  S: "d2@9 ~ a2@2 g2@3 ~ a2@2 g2@3 ~ a2@2", T: "f1@5 d2 c2@2 d2 g1@3", U: "c2@5 ~ c2@6 g1@2 g2@2 g1@2 g2@2 g1@2 g2 ~",
  V: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", W: "d2@9 ~ b2@2 a2@4 b2@2 a2@3 ~ b2@2",
  X: "e2@8 ~@2 b2@2 a2@3 ~ b2@2 a2@3 ~ b2@2", Y: "g1@9 ~ e2@2 d2@3 ~ e2@2 b1@4 a1@2",
  Z: "d2@9 ~ d2@2 a1@2 a2@2 a1@2 a2@2 a1@2 a2@2", AA: "d2@9 ~ b2@2 a2@3 ~ b2@2 a2@3 ~ b2@2",
  AB: "e2@9 ~ b2@2 a2@3 ~ b2@2 a2@3 ~ b2@2", AC: "g1@5 e2 d2@2 e2 a1@3",
  AD: "d2@5 ~ d2@6 a1@2 a2@2 a1@2 a2@2 a1@2 a2 ~", AE: "[d2@37 ~@11]/2",
})).s("gm_acoustic_bass").gain(0.64)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A B C D E@2 F G H I J K L M N O P Q R S T U E@2 F G H I J K L M N O P Q R S T U N O P Q R S T U N O P Q R S T V W X
  Y Z AA AB AC AD AE@2
>`.pickRestart({
  A: "[c5,e5]@5 g5 ~@2 c5@2 ~ d5, [c3,g3,c4,g4], ~@5 e5@7, ~@5 c5 g5@4 [c5,g5]@2, ~@6 d5@5 ~", // C C5
  B: "c5@5 ~@6 d5, [d4,f4,a4], ~@5 e5@5 e5@2, ~@5 c5@3 [c5,f5]@4, ~@6 d5@5 ~", // Dm F5
  C: "c5@2 ~@2 f4@2 c5@4 c5 [g4,c5], [g3,a4] ~, f4@2 ~@3 f4, d5 ~@3 [g4,c5]@8 g4@10 ~@2", // C5 Gsus2 C5
  D: "e5 d5 ~@2 g4 [c4,g4] ~@4 [f3,c4]@2, [c3,e4] g2, c4@4 d4@2 ~ d3@2 d3@3, g4@3 g3@3 [f3,a3,c4]@2 a3@4, ~ c5@2 ~ [f3,c4] ~", // C5 F5 C F F5
  E: "[c3@9 ~@2 c4 [f4,a4]@10 [d4,f4,a4]@2, [g3,e4] [d3,c4], c4@5 d4 ~@6, g4@5 g4@7, ~@3 c3@5]/2", // F Dm C D7
  F: "f3@9 ~@2 f4, [a3,c4], ~@3 f3, ~@5 [g4,c5]", // Am C5
  G: "g4@4 ~ c4 ~ f3!3 f3@2, [c3,e4] g2, c4@5 ~@2 [a3,c4]@2 [a3,c4]@3, ~@2 [d4,g4] ~@3", // C Am G5
  H: "g3@9 ~@2 c4, [c3,e4], c4@11 ~, g4@5 [d4,g4], ~@3 g3", I: "[c4,f4,a4]@5 [c4,d4,f4,a4], d4 ~@23",
  J: "a4@2 ~ f4, [f3,c4], f4@3 ~, ~ [a4,c5]", K: "~@3 [b3,d4], g2, b3@3 d4 d3@2, d4@5 g3@7, g3@2 d3 a3@3",
  L: "[d3,a3,c4,f4,a4]", M: "~@8 [a3,c4]@3 ~, f2@11 ~, [a3,c4]@2 ~, f3@7 f3@4 ~, ~@6 c3@5 ~",
  N: "~@4 g4 [c4,g4] ~@3 g3@3, [c3,e4] [c3,b3,d4,g4], c4@5 ~@7, g4@2 d4 ~@3, ~ g3 ~@2", // C5 C G
  O: "a3@7 ~@13 d4@4, [c4,f4,a4], d3@5 d3@3, ~@4 a3@5 a3@3", // F
  P: "~@5 [g3,c4] [f3,a3,c4]@6, f2, a3 ~, c4@2 f3 ~@3, f3 c3 ~@2", // C5 F
  Q: "~@6 g3@5 ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ g2 ~, [c3,c4,e4,g4]@11 ~@13", // F C
  R: "~@5 [c4,e4,g4] ~@3 g3@3, [c4,e4,g4]@5 ~@7, ~ c3 [c3,b3,d4,g4]@2, ~@2 g3 ~@3", // C G
  S: "~@5 [e4,a4], d3, [c4,f4,a4] d4, a3@5 a3 a4@3 a3@3, ~ f3@2", // A5 F
  T: "~@8 f3@2 [g3,c4] ~ [f3,a3,c4]@8 [f3,a3,c4]@2 ~@2, f2@11 ~, [a3,c4]@11 ~@13, f3 ~@2, ~@6 c3@5 ~@13", // C5 F Am
  U: "[c4,e4]@5 ~ [c4,e4]@5 ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~, [c3,g3]@11 ~@13", // C F C5
  V: "[c3,g3,c4,e4]@2 [c3,g3,c4,e4] ~ [c3,g3,c4,e4]@2 [c3,g3,c4,e4]@2 [c3,g3,c4,e4]@2 [c3,g3,c4,e4] ~ [a2,e3,g3,c#4,e4] ~ [a2,e3,g3,c#4,e4] ~ [a2,e3,g3,c#4,e4] ~ [a2,e3,g3,c#4,e4] ~ [a2,e3,g3,c#4,e4] ~ [a2,e3,g3,c#4,e4] ~", // C A7
  W: "~@4 a4 [d4,a4] ~@3 a3@3, [d3,f#4] [d3,c#4,e4,a4], d4@5 ~@7, a4@2 e4 ~@3, ~ a3 ~@2", // D5 D A
  X: "b3@7 ~@13 e4@4, [d4,g4,b4], e3@5 e3@3, ~@4 b3@5 b3@3", // G
  Y: "~@5 [a3,d4] [g3,b3,d4]@6, g2, b3 ~, d4@2 g3 ~@3, g3 d3 ~@2", // D5 G
  Z: "~@6 a3@5 ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~ a2 ~, [d3,d4,f#4,a4]@11 ~@13", // G D
  AA: "~@5 [d4,f#4,a4] ~@3 a3@3, [d4,f#4,a4]@5 ~@7, ~ d3 [d3,c#4,e4,a4]@2, ~@2 a3 ~@3", // D A
  AB: "~@5 [f#4,b4], e3, [d4,g4,b4] e4, b3@5 b3 b4@3 b3@3, ~ g3@2", // B5 G
  AC: "~@8 g3@2 [a3,d4] ~ [g3,b3,d4]@8 [g3,b3,d4]@2 ~@2, g2@11 ~, [b3,d4]@11 ~@13, g3 ~@2, ~@6 d3@5 ~@13", // D5 G Bm
  AD: "[d4,f#4]@5 ~ [d4,f#4]@5 ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~ [a2,g3,b3,d4] ~, [d3,a3]@11 ~@13", // D G D5
  AE: "[[d3,a3,d4,f#4,a4]@19 ~@5]/2", // D
})).s("gm_piano").gain(0.64)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@5 A B@2 C D B E F ~ G H I J K H I J L A B@2 C D B E F ~ G H I J K H I J M N O P@2 Q R S T H I J K H I J U V W X Y V
  W X Z AA@2
>`.pickRestart({
  A: "~@6 [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5,e5] ~@11", // C
  B: "~@6 [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~@11", C: "~@6 [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5,e5] ~@13",
  D: "~@6 [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5,e5] ~@9", // C
  E: "~@6 [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~@13", F: "~@6 [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~@11",
  G: "[a3,c4,f4]@6 [a3,c4,f4]@6 [f2,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4] ~, [f2,c3] ~", // F F5
  H: "~@6 [g4,c5,e5] ~@11 [g4,b4,d5] ~@5", I: "~@6 [d4,f4,a4] ~@11 [d4,f4,a4] ~@5",
  J: "~@6 [c4,f4,a4] ~@11 [c4,f4,a4] ~@5", K: "~@6 [c4,e4,g4] ~@11 c4@6, ~ g2, ~@7 f3@5, ~@2 a3",
  L: "~@6 [c4,e4,g4] ~@7 [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~ [g2,f3,a3,c4] ~", // C F
  M: "~@12 g2@2 a2@2 b2@2 c3@2 d3@2 g3 ~", N: "g3@5 ~ c4@5 ~ d4@10 c4@2", O: "d4@4 ~ d4",
  P: "[c4@11 ~ a3@7 ~ g3@14 ~@2 g2@2 a2@2 b2@2 c3@2 d3@2 e3@2]/2", Q: "d4@7 ~ g4@3 ~ g4@2 ~@2 c5@3 ~ c5@3 ~",
  R: "d5@13 ~ c5@2 a4@2 c5 ~ d5 ~ g5 ~", S: "g5@5 ~ g5@6 ~@2 c5@2 d5@2 e5@2 d5@2 c5 ~",
  T: "d5@5 ~ d5@5 ~ d5@2 c5@2 b4@2 a4@2 g4@2 f4@2",
  U: "[c3,g3,c4] ~ [c3,g3,c4] ~ [c3,g3,c4] ~ [c3,g3,c4] ~ [c3,g3,c4] ~ [c3,g3] ~ [a2,e3,a3]@6 [a2,e3,a3]@5 ~", // C5 A5
  V: "~@6 [a4,d5,f#5] ~@11 [a4,c#5,e5] ~@5", W: "~@6 [e4,g4,b4] ~@11 [e4,g4,b4] ~@5",
  X: "~@6 [d4,g4,b4] ~@11 [d4,g4,b4] ~@5", Y: "~@6 [d4,f#4,a4] ~@11 d4@6, ~ a2, ~@7 g3@5, ~@2 b3",
  Z: "~@18 [a2,e3] ~ [a2,e3] ~ [a2,e3] ~", AA: "[d3@9 ~@7, d4 ~@7]/2",
})).s("gm_acoustic_guitar_steel").gain(0.52)

// chords · acoustic guitar steel · "STEEL GTR" · soft notes
const acoustic_guitar_steel_2 = note("<~@5 A B@2 ~ C B D E ~ F ~@8 A B@2 ~ C B D E ~ F ~@34>".pickRestart({
  A: "~@14 [g4,c5,e5] ~ [g4,c5,e5] ~@7", B: "~@14 [a4,c5,f5] ~ [a4,c5,f5] ~@7", C: "~@16 [g4,c5,e5] ~@7",
  D: "~@12 [a4,c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5] ~@7", E: "~@14 [g4,b4,d5] ~ [g4,b4,d5] ~@7", F: "f3@6 [c3,f3] ~@5",
})).s("gm_acoustic_guitar_steel").gain(0.3)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@13 A B C D E F G H@2 I ~@8 A B C D E F G H@2 I ~@8 C D E F G H@2 J K L M N O P@2 Q R@2
>`.pickRestart({
  A: "c6@23 ~", B: "[a5,c6,f6]@23 ~", C: "[c4,e4]@11 ~ [b3,d4,d6]@12, g4@23 ~, e6 ~", D: "[d4,f4,a4,c6]@23 ~",
  E: "[c4,f4,a4,a5]", F: "[c4,e4,g4,g5] ~", G: "[c4,e4,e6] [d4,d6], g4@23 ~, ~@6 b3@5 ~",
  H: "[[d4,c6] [c4,a5], [f4,a4]@47 ~]/2", I: "[g4,g5]@13 ~@11, [c4,e4]@11 ~@13",
  J: "[c5,e5,g5]@11 ~@7 a5@6, ~@12 [a4,c#5,e5]@11 ~", K: "[d4,f#4]@11 ~ [c#4,e4,e6]@12, a4@23 ~, f#6 ~",
  L: "[e4,g4,b4,d6]@23 ~", M: "[d4,g4,b4,b5]", N: "[d4,f#4,a4,a5] ~", O: "[d4,f#4,f#6] [e4,e6], a4@23 ~, ~@6 c#4@5 ~",
  P: "[[e4,d6] [d4,b5], [g4,b4]@47 ~]/2", Q: "[a4,a5]@13 ~@11, [d4,f#4]@11 ~@13", R: "[[d4,a4,f#5]@37 ~@11]/2",
})).s("gm_string_ensemble_2").gain(0.31)

// drums · kick
const kick = s("bd").struct("<~ A@12 B C A@16 B C A@32 B ~>".pickRestart({
  A: "x ~@4 x!2 ~@4 x", B: "x", C: "x ~@2 x ~@2 x ~@2 x!3",
})).gain(0.71)

// drums · rim
const rim = s("rim").struct("<~@5 [~ x ~ x]!8 ~@10 [~ x ~ x]!8 ~@36>").gain(0.57)

// drums · snare
const snare = s("sd").struct("<~@4 A ~@9 B C@3 D C@3 D ~@9 B C@3 D C@3 D C@7 E C@3 D C@3 F C@7 E ~@2>".pickRestart({
  A: "~@11 x", B: "~@9 x!3", C: "~ x ~ x", D: "~@3 x ~@6 x!2", E: "~@3 x!2 ~ x ~@2 x ~ x",
  F: "~@4 x ~ x ~@3 x ~ x ~@2 x!2 ~@3 x!3 ~",
})).gain(0.71)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@4 A ~@9 B ~@3 C ~@3 C ~@9 B ~@3 C ~@3 C ~@7 D ~@3 C ~@3 E ~@7 D ~@2
>`.pickRestart({
  A: "~@7 x!4 ~", B: "~@4 x ~@2 x!2 ~@3", C: "~@7 x!3 ~@2", D: "~ x!2 ~@4 x ~@4",
  E: "~@2 x!2 ~@4 x!2 ~@4 x ~@3 x!2 ~@4",
})).gain(0.21)

// drums · low tom
const low_tom = s("lt").struct("<~@14 A ~@17 A ~@15 B ~@7 C ~@7 B ~@2>".pickRestart({
  A: "~@11 x", B: "~@5 x", C: "~@14 x ~@7 x!2",
})).gain(0.71)

// drums · hihat
const hihat = s("hh").struct("<~ A@3 B C D C D C D C D ~ E A@8 C D C D C D C D ~ E A@14 F A@15 F A ~@2>".pickRestart({
  A: "x!12", B: "x!5 ~ x!6", C: "x!4", D: "x ~@2 x ~@2 x ~@2 x!3", E: "~ x", F: "x!11 ~",
})).gain(0.21)

// drums · mid tom
const mid_tom = s("mt").struct("<~@14 A ~@17 A ~@15 B ~@7 C ~@7 B ~@2>".pickRestart({
  A: "~@5 x ~@3 x!2 ~", B: "~@3 x ~@4 x ~@3", C: "~@4 x ~@7 x ~@3 x ~ x!4 ~@2",
})).gain(0.71)

// drums · open hat
const open_hat = s("oh").struct("<A ~@3 B@9 ~ C ~@8 B@8 ~ C ~@14 A ~@15 A ~ D ~>".pickRestart({
  A: "~@11 x", B: "~@5 x ~@6", C: "x ~@4 x ~@6", D: "x",
})).gain(0.71)

// drums · high tom
const high_tom = s("ht").struct("<~@56 [~@5 x ~@6] ~@10>").gain(0.71)

// drums · crash
const crash = s("cr").struct("<~@41 A ~@3 A ~@11 A ~@3 A ~@5>".pickRestart({
  A: "x",
})).gain(0.71)

// drums · ride
const ride = s("rd").struct(`<
  ~ A@4 ~@8 B@2 C ~ C ~ C ~ C ~@9 B@2 C ~ C ~ C ~ C ~ B@8 C ~ C ~ C ~ C ~ B@8 C ~
>`.pickRestart({
  A: "~ x ~ x", B: "x!4", C: "x",
})).gain(0.71)

stack(
  bass, piano, acoustic_guitar_steel, acoustic_guitar_steel_2, string_ensemble_2, kick, rim, snare, snare_soft, low_tom,
  hihat, mid_tom, open_hat, high_tom, crash, ride
)

More by Robert John