Strudelify

Some Guys Have All the Luck

Robert Palmer

KeyA majorTempo92 bpm
0:00/0:00
// Some Guys Have All the Luck — Robert Palmer
// 92 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 slap bass 2 (copy of ch 2 synth bass 2); ch 7 string ensemble 2 (copy of ch 6 string ensemble 1); ch 13 flute (copy of ch 8 french horn); ch 12 pizzicato strings (copy of ch 11 pizzicato strings)
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(92/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 · synth bass 2
const bass = note(`<
  ~ A B C D E F G H I J K L M N O P I Q R S T N U V W X R Y T N Z AA I J K L M N O P I J K L M N O P I J K L M N O P I J
  K L M N O P I J K L M N O P I J K L M N O P I J K L M N O AB AC@2
>`.pickRestart({
  A: "a1@6 e2@4 ~@2 e1 f#1 a1 f#1", B: "a1@2 ~ e2@4 ~", C: "f#1@5 ~ c#2@6 f#1 g#1 a1 g#1", D: "f#1@5 ~ c#2@8 ~@2",
  E: "b1@5 ~ f#2@7 ~ b1 a1", F: "g1@5 ~ g1@9 ~", G: "e1 ~ e1 ~ e1@4 e1!3 ~ e1@3 ~", H: "e1 ~ e1 ~ e1@3 ~ e1!3 ~ e1@3 ~",
  I: "a1!4 e1 ~@2 e1 a1!3 ~ e1@3 ~", J: "a1!4 e1 ~@2 e1 a1!3 ~ a1@2 g#1@2", K: "f#1!4 c#1 ~@2 c#1 f#1!3 ~ c#1@3 ~",
  L: "f#1!4 c#1@2 ~ c#1 f#1!3 ~ f#1@2 a1@2", M: "b1!4 f#1 ~@2 f#1 b1!3 ~ f#1@3 ~", N: "g1!4 d1@2 ~ d1 g1!3 ~ d1 ~ b1@2",
  O: "e2 b1 e2 b1 e2@2 ~ e1 e2 b1 e2 b1 e1@2 ~ b1", P: "e2 b1 e2 b1 e2@2 ~ b1 e2 b1 e1@4 e1 ~",
  Q: "a1!4 e1@2 ~ e1 a1!3 ~ a1 ~ g#1@2", R: "f#1!4 c#1@2 ~ c#1 f#1!3 ~ c#1@3 ~",
  S: "f#1!4 c#1@2 ~ c#1 f#1!3 ~ f#1 ~ a1 ~", T: "b1!4 f#1@2 ~ f#1 b1!3 ~ f#1@3 ~",
  U: "e2 b1 e2 b1 e2 ~@2 e1 e2 b1 e2 b1 e1@3 b1", V: "e2 b1 e2 b1 e2@2 ~ b1 e2 d2 b1 ~ e1@3 e1",
  W: "a1!4 e1@2 ~ e1 a1!3 ~ e1@3 ~", X: "a1!4 e1@2 ~ e1 a1!3 ~ a1@2 g#1@2", Y: "f#1!4 c#1@2 ~ c#1 f#1!3 ~ f#1@2 a1 ~",
  Z: "e2 b1 e2 b1 e2@2 ~ e1 e2 b1 e2 b1 e1@3 b1", AA: "e2 b1 e2 b1 e2@3 b1 e2 b1 e1@4 e1 ~",
  AB: "f#1!5 ~@3 e1!3 ~ e1 ~ e1 ~", AC: "[a1@3 ~]/2",
})).s("gm_synth_bass_2").gain(0.35)

// chords · synth brass 2
const synth_brass_2 = note(`<
  ~@9 A B C D E F ~@2 A B C D E F ~@2 A B C D E F ~@2 A B C D E F ~@2 A B C D E F ~@2 A B C D E F ~@2 A B C D E F ~@2 A
  B C D E F ~@2 A B C D E F ~@2 A B C D E F ~ G H@2
>`.pickRestart({
  A: "[e4,b4,c#5]@5 ~ [e4,a4,c#5]@9 ~", B: "[e4,b4,c#5]@5 ~ [e4,a4,c#5]@8 ~@2",
  C: "[f#4,b4,c#5]@5 ~ [f#4,a4,c#5]@8 ~@2", D: "[f#4,b4,c#5]@5 ~ [f#4,a4,c#5]@9 ~", E: "[f#4,b4,d5]@15 ~",
  F: "[g4,b4,d5]", G: "[f#4,a4,c#5]@7 ~ [e4,g#4,b4]@7 ~", H: "[[c#4,e4,a4]@3 ~]/2",
})).s("gm_synth_brass_2").gain(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~ A@2 B@2 C D E@2 A@2 B@2 C D E@2 A@2 B@2 C D E@2 A@2 B@2 C D E@2 A@2 B@2 C D E@2 A@2 B@2 C D E@2 A@2 B@2 C D E@2 A@2
  B@2 C D E@2 A@2 B@2 C D E@2 A@2 B@2 C D E@2 A@2 B@2 C D E F G ~
>`.pickRestart({
  A: "~@2 [e4,a4,c#5] ~@3 [e4,a4,c#5] ~@3 [e4,a4,c#5] ~@3 [e4,a4,c#5] ~", // A
  B: "~@2 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~", // F#m
  C: "~@2 [f#4,b4,d5] ~@3 [f#4,b4,d5] ~@3 [f#4,b4,d5] ~@3 [f#4,b4,d5] ~", // Bm
  D: "~@2 [g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [g4,b4,d5] ~", // G
  E: "~@2 [e4,a4,b4,e5] ~@3 [e4,a4,b4,e5] ~@3 [e4,g#4,b4,e5] ~@3 [e4,g#4,b4,e5] ~", // Esus4 E
  F: "~@2 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~@3 [e4,g#4,b4] ~@3 [e4,g#4,b4] ~", G: "[c#4,e4,a4]",
})).s("gm_electric_guitar_clean").gain(0.3)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~ A@2 B@2 C D E@2 ~@16 F G H@2 I J K@2 ~@14 L M F G H@2 I J K@2 ~@16 F G H@2 I J K@2 F G H@2 I J N O P@2
>`.pickRestart({
  A: "[c#6@7 e6]/2", B: "[f#6@7 e6]/2", C: "d6@6 c#6 b5", D: "d6", E: "e6/2", F: "f#5@3 a5 c#6@6 c#6 a5 b5 c#6@2 ~",
  G: "f#5@3 a5 c#6@6 ~ c#6 ~ b5 a5 ~", H: "[[f#5,f#6]@7 ~]/2", I: "d6@7 b5", J: "b5@2 c#6 d6@13", K: "[e6@31 ~]/2",
  L: "a5 g#5, [b4,e5]", M: "[b4,e5,a5]@6 f#5@2 f#5@4 e5@3 ~, ~ [g#4,b4]", N: "e6@15 ~", O: "f#6 e6", P: "[a5@3 ~]/2",
})).s("gm_string_ensemble_1").gain(0.35).pan(0.3)

// chords · french horn
const french_horn = note(`<
  ~@5 A@2 B@2 ~@4 C@2 ~ D@2 E@2 F@3 G H I J K L M N ~@6 C@2 ~ D@2 E@2 O@3 G H I J K L M N ~ P@2 E@2 Q@3 R@2 S@2 T U M N
  V W X Y K Z AA AB AC AD X Y K Z AA AB AE AF AG@2
>`.pickRestart({
  A: "[f#4 g4, d5@31 ~]/2", B: "[a4 g#4 a4 g#4, e5]/2", C: "[f#4 g4, b3]/2", D: "[~@12 c#5@2 d5 c#5@5 ~@12]/2",
  E: "[~@12 b4@2 c#5 f#4@5 ~@12]/2", F: "[~@12 f#4@2 ~ b4@5 ~@8 b4@2 c#5 d5@5 ~@12]/3", G: "[b3,a4] [b3,g#4]",
  H: "a4@3 f#4 f#4@2 e4@2, b3 ~", I: "~ e4 f#4 g#4", J: "b4@3 ~ a4@2 [c#4,e4]@10", K: "~ f#4 g#4 a4",
  L: "b4@4 a4 ~ [f#4,d5]@4 [f#4,c#5]@5 ~", M: "[b3,f#4]", N: "[b3,g4]",
  O: "[~@12 f#4@2 a4 b4@5 ~@8 b4@2 c#5 d5@5 ~@12]/3", P: "[~@12 c#5@2 d5 a4@5 ~@12]/2",
  Q: "[~@12 f#4@2 c#5 d5@5 ~@8 b4@2 c#5 d5@5 ~@4 b3 c#4 d4 e4@5]/3", R: "[b3,f#4] [g#3,e4]",
  S: "[[c#4,a4]@11 ~ [a3,f#4]@2 [a3,f#4]@10 ~@8]/2", T: "~@7 [a4,e5]", U: "[f#4,c#5]@3 ~ [c#4,a4]@2 [c#4,a4]@10",
  V: "[c#4,a4]!4 [b3,g#4]@4", W: "~@4 [g#4,e5]@2 [f#4,d5]@3 ~ [e4,c#5]@6", X: "~@4 e4@4 f#4@4 g#4@3 ~",
  Y: "b4@2 a4 [a3,e4]@5", Z: "b4@4 a4@2 [f#4,d5]@3 ~ [f#4,c#5]@5 ~", AA: "[b3,f#4]@15 ~", AB: "[b3,g4]@15 ~",
  AC: "a4!4 g#4@4", AD: "~@2 [g#4,e5] [f#4,d5] ~ [e4,c#5]@3", AE: "[d4,a4]!4 [e4,g#4]@4",
  AF: "[a4,c#5]@2 [a4,c#5]@2 [a4,c#5]@2 [a4,c#5]@2 [g#4,b4]@2 ~@2 [e4,b4]@3 ~", AG: "[[c#4,a4]@3 ~]/2",
})).s("gm_french_horn").gain(0.4).pan(0.4)

// other · alto sax
const alto_sax = note("<~@56 A B C D@2 E F@3 ~@26>".pickRestart({
  A: "~@14 e4 ~", B: "b4@2 ~ c#5@2 ~ e4@8 ~@2", C: "~@6 e4 ~ b4@2 ~ c#5@2 e4@2 ~",
  D: "[f#4@10 ~@2 g#4@3 a4@9 ~@6 b4 c#5]/2", E: "d5@2 d5 ~ d5 ~ d5 e5@3 d5 ~ c#5@2 b4 ~",
  F: "[d5 ~ d5 ~ d5 ~ d5 e5@3 d5 ~ c#5@2 b4 c#5@3 e5 c#5@2 ~ a4 b4@4 ~ f#5 e5 e5@4 ~@4 c#5 b4@5 ~@4]/3",
})).s("gm_alto_sax").gain(0.5)

// other · pizzicato strings
const pizzicato_strings = note(`<
  ~ A@4 B@2 C@2 D ~ D ~ E ~ C ~ D ~ D ~ E ~ C ~ F G F G H@2 I@2 J ~ J ~ K ~ I ~ J ~ J ~ K ~ I ~ F G F G H@2 I@2 J ~ J ~
  K ~ I ~ J ~ J ~ K ~ I ~ F G F G H@2 I@2 F G F G H@2 ~@4
>`.pickRestart({
  A: "~@2 c#5 a4 b4 c#5 ~ a4 b4 ~ c#5 a4 ~@4", B: "~@2 d5 b4 c#5 d5 ~ b4 c#5 ~ d5 b4 ~@4", C: "e5 b4 c#5 e5 ~@12",
  D: "c#5 a4 b4 c#5 ~@12", E: "d5 b4 c#5 d5 ~@12", F: "e4 f#4 a4!2 ~@6 b4 ~ b4 c#5 ~@2",
  G: "e4 f#4 a4!2 ~@6 b4 c#5 ~ b4 a4 ~", H: "b4!2 c#5 d5 ~@12", I: "e4 b3 c#4 e4 ~@12", J: "c#4 a3 b3 c#4 ~@12",
  K: "d4 b3 c#4 d4 ~@12",
})).s("gm_pizzicato_strings").gain(0.4).pan(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B C B A B A B A B A B A B A B A B A D A B A B A B A B A B A B A B A B A B A B A B A D A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B E ~
>`.pickRestart({
  A: "x!2 ~ x", B: "~@2 x ~@3 x!2", C: "x!3 ~@3 x ~", D: "x ~ x ~@3 x!2", E: "x",
})).gain(0.45)

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!88 x ~>").gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@15 B ~@23 B ~@15 C ~@15 C ~@7 D ~@2>".pickRestart({
  A: "~@7 x", B: "~@10 x!3 ~@3", C: "~@12 x!3 ~", D: "~@12 x!4",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~ [x!3 ~ x ~ x!3 ~ x ~ x ~ x!2]!88 ~@2>").gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@7 B ~@15 C ~@23 C ~@7 D ~@7 E ~@15 E ~@7 F ~@2>".pickRestart({
  A: "~@3 x!3 ~ x!3 ~ x!4 ~", B: "~@11 x!3 ~@2", C: "~@4 x!2 ~ x ~@8", D: "~@6 x!2", E: "~@8 x!2 ~ x ~@4",
  F: "~@4 x!2 ~@2",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@24 A ~@23 A ~@7 B ~@7 C ~@15 C ~@7 C ~@2>".pickRestart({
  A: "x!2 ~ x ~@12", B: "~@10 x!2 ~@4", C: "~@4 x!2 ~ x ~@8",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@7 A ~@7 A ~@6 B A ~@7 A ~@7 A ~@6 B A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~
>`.pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [x!3 ~@4 x!2 ~@6 x]!88 ~@2>").gain(1.26)

stack(
  bass, synth_brass_2, electric_guitar_clean, string_ensemble_1, french_horn, alto_sax, pizzicato_strings, kick, rim,
  low_tom, hihat, mid_tom, high_tom, crash, cabasa
)

More by Robert Palmer