Strudelify

Cupid

Sam Cooke

KeyG majorTempo120 bpm
0:00/0:00
// Cupid — Sam Cooke
// 120 bpm, 4/4, key G 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 70 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · "Bass"
const bass = note(`<
  ~ A B A B C D C E C F G H C H F A I J K I C D C E C F G H C D C E C F G H C H F A I J K I C D C E C F G H C D C E C F
  G H A B A B A B A B ~
>`.pickRestart({
  A: "g1@3 b1@3 d2@2", B: "e1@5 ~ g1@6 b1@3 ~", C: "g1@6 b1@6 d2@3 ~", D: "e1@6 g1@6 b1@3 ~", E: "c1@6 e1@6 g1@3 ~",
  F: "d1@3 f#1@3 a1@2", G: "g1@3 b1@3 d2 ~", H: "d1@6 f#1@6 a1@3 ~", I: "g1@5 ~ b1@6 d2@4", J: "c2@3 e2@3 g2@2",
  K: "d2@5 ~ f#2@6 a2@2 ~@2",
})).s("gm_acoustic_bass").gain(0.71)

// chords · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~ A B C D E F G H I J K L M N O M P Q@2 R E F G H I J K L E F G H I J K L M N O M P Q@2 R E F G H I J K L E F G H I J
  K L A B C D A B C D ~
>`.pickRestart({
  A: "~@2 [b3,g4,b4] [g3,b3,d4,g4]@4 ~, ~@3 d4@3 ~@10", B: "~@4 [b3,g4,b4] ~ [b3,e4,g4]@9 ~, ~@3 e4@2 ~@11",
  C: "~@4 [b3,g4,b4] ~ [b3,d4,g4]@9 ~, g3@5 ~@11, ~@3 d4@2 ~@11", // Em G
  D: "~@4 [g4,b4] ~ [b3,e4,g4]@7 ~@3, ~@3 [b3,e4]@2 ~@11", E: "~@4 [b4,d5]@2 [d4,g4,b4,d5]@9 ~, ~@3 g4@3 ~@10",
  F: "~@4 [b4,e5] ~ [g4,b4,e5]@10, ~@3 [e4,g4]@2 ~@11", G: "~@4 [b4,d5]@2 [g4,b4,d5]@9 ~, ~@3 d4@2 ~@11",
  H: "~@4 [c5,e5]@2 [g4,c5,e5]@9 ~, ~@3 e4@2 ~@11", I: "~@4 [b4,d5] ~ [g4,b4,d5]@10, ~@3 [d4,g4]@2 ~@11",
  J: "~@3 [d4,f#4] [a4,d5] ~ [f#4,a4,d5]@10", K: "~@4 [b4,d5] ~ [g4,b4,d5]@10, ~@3 g4@2 ~@11",
  L: "~@4 c5@2 [d4,f#4,a4,c5]@9 ~, ~@3 [d4,f#4]@3 ~@10", M: "~@3 d4, ~ d5@3, ~@3 b4@5, ~@5 g4@3",
  N: "~@3 d4, ~ d5@3, ~@3 a4@5, ~@5 f#4@3", O: "~@12 f#4@3 ~, ~ d5@3, ~@3 c5@5, ~@10 a4@5 ~",
  P: "~@12 d4@3 ~, ~@4 d5@11 ~, ~@6 b4@9 ~, ~@10 g4@5 ~",
  Q: "[~@12 e4@7 ~@9 d4@3 ~, ~@4 e5@13 ~@3 d5@11 ~, ~@6 c5@11 ~@9 f#4@5 ~, ~@10 g4@6 ~@6 a4@9 ~]/2",
  R: "~@3 d4, ~@4 d5@11 ~, ~@3 b4@5, ~@5 g4@3",
})).s("gm_electric_guitar_jazz").gain(0.15).pan(0.7)

// chords · electric guitar jazz · soft notes
const electric_guitar_jazz_2 = note(`<
  ~@5 A ~ B@2 ~@2 C D ~@8 A ~ B@2 ~@2 C D A ~ B@2 ~@2 C D ~@8 A ~ B@2 ~@2 C D A ~ B@2 ~@2 C D ~@9
>`.pickRestart({
  A: "~@3 d4@3 ~@10", B: "~@3 g4@2 ~@11", C: "~@3 d4@2 ~@11", D: "~@2 a4 ~@5",
})).s("gm_electric_guitar_jazz").gain(0.1).pan(0.7)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~ A B C D E F G H G I J K L M N O P Q R S E F G H G I J K E F G H G I J K L M N O P Q R S E F G H G I J K E F G H G I
  J K A B C D A B C D ~
>`.pickRestart({
  A: "~@2 g4 ~@3 b3 g3, [g2,g3]@15 ~, ~@3 b3@9 ~@4, ~@3 d4@7 d4@5 ~, ~@6 g4@9 ~", // G
  B: "~@2 g4 ~@3 b3 g3, [e2,e3]@7 ~, ~@3 b3@9 ~@4, ~@2 e4@3 e4@2 ~, ~@3 g4@4 ~", // E
  C: "~@4 g4@2 ~@6 b3@2 g3 ~, [g2,g3]@15 ~, ~@3 d4@7 d4@5 ~, ~@6 g4@9 ~", // G
  D: "~@2 g4 ~@4 g3, [e2,e3], ~@3 b3@9 b3@4, ~@2 e4@3 e4@3, ~@3 g4@5", // E
  E: "~@2 g4 [d4,g4]@3 ~ b3, [g2,g3], ~@3 b3@2 ~ [d4,g4]@2", // G5 G G5
  F: "~@2 [e4,g4] [e4,g4]@3 [e4,g4] b3, [e2,e3], ~@3 b3@2 ~@3", G: "~@2 g4 [d4,g4]@3 [d4,g4] b3, [g2,g3]@15 ~",
  H: "~@2 [e4,g4] [e4,g4]@3 [e4,g4] c4, [c2,c3]@15 ~, ~@3 c4@2 ~@3", // Em C
  I: "~@2 f#4 c4@2 ~ [d4,f#4] ~, d3@15 ~, ~@3 [d4,f#4]@3 ~@2, ~@5 c4@2 ~", // D
  J: "~@2 g4 b3@2 ~ [d4,g4] b3, [g2,g3]@15 ~, ~@3 [d4,g4]@3 ~@2, ~@5 b3@2 ~", // G5 G G5
  K: "~@2 [d4,f#4] [d4,f#4]@3 [d4,f#4] ~, [d2,d3]@7 ~, ~@3 c4@2 ~@3", // D
  L: "~@2 [d4,g4] [b3,d4,g4]@2 b3 [d4,g4] ~, g3@15 ~", M: "~@2 [d4,f#4] [c4,d4,f#4]@2 ~ [d4,f#4] ~, d3@15 ~",
  N: "~@4 [d4,f#4] ~ [c4,d4,f#4]@4 ~@2 [d4,f#4]@2 ~@2, d3@15 ~, ~@5 c4@2 ~", // D D7 D
  O: "~@4 [d4,g4] ~ [b3,d4,g4]@5 ~ [b3,d4,g4]@4, g3@15 ~, ~@3 b3@2 ~@11", // G5 G
  P: "~@4 [d4,g4]@2 [b3,d4,g4]@6 [b3,d4,g4]@3 ~, g3@15 ~", Q: "~@4 [e4,g4]@2 [c4,e4,g4]@5 ~ [c4,e4,g4]@3 ~, c3@15 ~",
  R: "~@4 [d4,f#4] ~ [c4,d4,f#4]@5 ~ [c4,d4,f#4]@2 ~@2, d3@7 ~, ~@3 c4@2 ~@11", // D D7
  S: "~@4 [d4,g4]@2 [b3,d4,g4]@4 ~@2 [d4,g4]@3 ~, g3@3 ~, ~@10 b3@5 ~", // G5 G G5
})).s("gm_acoustic_guitar_nylon").gain(0.25).pan(0.2)

// chords · acoustic guitar nylon · soft notes
const acoustic_guitar_nylon_2 = note(`<
  ~@3 A ~ B C D E D F G H I J K ~ I K ~ I B C D E D F G H B C D E D F G H I J K ~ I K ~ I B C D E D F G H B C D E D F G
  H ~@2 A ~@3 A ~@2
>`.pickRestart({
  A: "~@3 b3@9 ~@4", B: "~@2 d4 ~@2 b3@2 ~, ~@3 b3@3 ~@10", C: "~@3 b3@3 ~@4 b3@4 ~@2",
  D: "~@2 d4 ~@2 b3@2 ~, ~@3 b3@7 ~@6", E: "~@3 c4@3 ~@4 c4@4 ~@2", F: "~@2 d4 ~@4 c4, d2@15 ~, ~@3 c4@3 ~@10",
  G: "~@2 d4 ~@5, ~@3 b3@3 ~@10", H: "~@3 c4@3 ~@4 c4@4 c4 ~", I: "~@3 b3@2 ~@11", J: "~@3 c4@2 ~@5 c4@3 ~@3",
  K: "~@3 c4@2 ~@11",
})).s("gm_acoustic_guitar_nylon").gain(0.16).pan(0.2)

// other · electric guitar jazz
const electric_guitar_jazz_3 = note(`<
  ~@12 A B C D E F G H I ~@15 A B C D E F G H I ~@4 J K L M I ~@3 J K L N ~@9
>`.pickRestart({
  A: "~@7 d3", B: "b3!7 g3", C: "c4 ~ c4@2 b3@2 c4@2 ~@6 a3@2", D: "c4 ~ c4 ~ c4@2 b3@2 c4 ~ c4 ~ c4@2 d4@2",
  E: "b3 ~ b3@2 a3@2 b3@2 ~@6 d3@2", F: "b3 ~ b3 ~ b3@2 a3@2 b3@2 c4 ~ d4@2 b3@2", G: "c4 ~ c4@2 d4@2 e4@10",
  H: "~@2 d4 c4 ~ b3 a3 ~", I: "g3 ~", J: "~@2 b3 ~ b3@2 ~ b3", K: "c4 a3 a3@3 ~ b3 a3", L: "b3@4 ~ e4@2 b3",
  M: "d4 e4 d4 d4@2 c4 b3 a3", N: "d4 e4 d4 d4@4 ~",
})).s("gm_electric_guitar_jazz").gain(0.45)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@22 A B@2 C D ~@2 E@5 F G H ~@4 I@4 J@7 K J@7 K L@8 ~>".pickRestart({
  A: "e5@15 ~, b4 ~@3", B: "[d5@3 e5]/2", C: "[b4,d5]@15 ~", D: "[a4,d5,f#5]",
  E: "[[b4,d5]@15 ~ b4@4 ~@8 e6@4 d6@16 ~@12 f#6@4 g6@16, g5, g6@7 ~@5 e6@3 ~@5, ~@16 e5@15 ~ d5@24 e5@8 ~@16]/5", // Bm
  F: "a6", G: "g6@3 e6", H: "[a4,f#5,a5,d6]",
  I: "[~@3 g5 e5@2 c5 a4 ~@2 f#6@2 [b4,b5,g6]@4, g6@5 ~@3, [b5,d6] [c6,e6] d6@2, ~@2 [f#4,a5] ~]/4", // Em Bm C F#m
  J: "[d6@2 e6@2 d6@2 [c6,e6,c7]@2 d6 ~ [a5,f#6]@2 [b5,g6]@2, g6@5 ~@2, [b5,b6]@3 ~ b5 ~@2, ~@9 d6@5]/7", // C D Em B
  K: "[a5,d6,f#6,a6]", // D
  L: "[g6@10 f#6@2 g6@2 f#6@2 e6@10 d6@2 e6@2 d6@2 g6@10 f#6@2 g6@2 f#6@2 e6@10 d6@2 e6@2 d6@2 g6@10 f#6@2 g6@2 f#6@2 e6@10 d6@2 e6@2 d6@2 g6@10 f#6@2 g6@2 f#6@2 e6@10 d6@2 e6@2 d6 ~, b5]/8",
})).s("gm_string_ensemble_2").gain(0.22)

// chords · string ensemble 2 · soft notes
const string_ensemble_2_soft = note("<~@22 A@2 B ~@2 C D ~ A@2 B E F C ~@13 G ~@7 G ~@12>".pickRestart({
  A: "[~@4 b4@27 ~]/2", B: "c5", C: "[b4,g5]@15 ~", D: "[a4,f#5,a5]", E: "[b4,d5]@15 ~", F: "[a4,d5,f#5]", G: "b6",
})).s("gm_string_ensemble_2").gain(0.13)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@3 B ~@3 B ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@3 B ~@3 B ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2
  A@2 ~@2 A@2 ~@2
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@7 x",
})).gain(0.12)

// drums · rim
const rim = s("rim").struct("<~ [~@2 x!2 ~@2 x ~]!68 ~>").gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C D E B C D E B C D E ~@8 B C D E B C D E B C D E B C D E ~@8 B C D E B C D E B C D E B C D E B C D E B C D E ~
>`.pickRestart({
  A: "x!4", B: "x ~ x!2 ~@2 x ~", C: "x ~ x!3 ~ x ~", D: "x ~ x!2 ~ x!2 ~", E: "x ~ x!2 ~ x!3",
})).gain(0.36)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A B C D A B C D A B C D ~@8 A B C D A B C D A B C D A B C D ~@8 A B C D A B C D A B C D A B C D A B C D A B C D ~
>`.pickRestart({
  A: "~ x ~@2 x!2 ~ x", B: "~ x ~@3 x ~ x", C: "~ x ~@2 x ~@2 x", D: "~ x ~@2 x ~@3",
})).gain(0.16)

// drums · ride
const ride = s("rd").struct(`<
  ~ A ~@3 A ~@7 B@3 C B@3 C D@2 E B F B G C D@2 E B F B G C B@3 C B@3 C D@2 E B F B G C D@2 E B F B G C H@8 ~
>`.pickRestart({
  A: "x", B: "x ~ x!2 ~@2 x ~", C: "x ~ x!2 ~ x!2 ~", D: "x!4 ~@2 x ~", E: "x ~ x!2 ~@2 x!2", F: "x ~ x!3 ~ x!2",
  G: "x ~ x!5 ~", H: "x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~",
})).gain(0.32)

// drums · ride · soft notes
const ride_soft = s("rd").struct(`<
  A ~@12 B@3 C B@3 C D@2 E B F B G C D@2 E B F B G C B@3 C B@3 C D@2 E B F B G C D@2 E B F B G C ~@9
>`.pickRestart({
  A: "~@14 x!2", B: "~ x ~@2 x!2 ~ x", C: "~ x ~@2 x ~@2 x", D: "~@4 x!2 ~ x", E: "~ x ~@2 x!2 ~@2", F: "~ x ~@3 x ~@2",
  G: "~ x ~@5 x",
})).gain(0.16)

// drums · china
const china = s("cr").struct("<~ A ~@19 A ~@7 A ~@15 A ~@7 A ~@7 A ~@3 A ~@4>".pickRestart({
  A: "x",
})).gain(0.36)

// drums · congas
const congas = s("conga:13").struct("<~@21 A@7 B A@7 B ~@8 A@7 B A@7 B ~@9>".pickRestart({
  A: "~@3 x", B: "~@5 x!2 ~",
})).gain(1.29)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@22 A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~@9 A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~@9
>`.pickRestart({
  A: "~@2 x!2 ~@4", B: "~@3 x ~@4",
})).gain(1.29)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  ~@21 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@10
>`.pickRestart({
  A: "~@2 x!2 ~@4",
})).gain(1.29)

stack(
  bass, electric_guitar_jazz, electric_guitar_jazz_2, acoustic_guitar_nylon, acoustic_guitar_nylon_2,
  electric_guitar_jazz_3, string_ensemble_2, string_ensemble_2_soft, kick, kick_soft, rim, hihat, hihat_soft, ride,
  ride_soft, china, congas, congas_2, congas_3
)

More by Sam Cooke