Strudelify

I Second That Emotion

Smokey Robinson

KeyD majorTempo108 bpm
0:00/0:00
// I Second That Emotion — Smokey Robinson
// 108 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 4 string ensemble 1 (copy of ch 1 piano)
// note: Full arrangement: all 73 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(108/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 · piano
const piano = note(`<
  ~@2 A@2 B@5 C B D B D E F G H G I F A@2 J F A@2 B@3 C B D B D E F G H G I F A@2 J F A@2 F K F A@2 F G H G I F A@2 J F
  A@2 F K F K F A@2 L
>`.pickRestart({
  A: "[[a3,c#4,e4,a4]!2 ~ [a3,c#4,e4,a4]@4 ~ [g3,b3,d4,g4]!2 ~ [g3,b3,d4,g4]@10 ~ g3 a#3 b3 ~ d4 ~ e4 d4 b3 ~]/2", // A G
  B: "[a3,d4,f#4]@9 ~ [b3,d4,g4]@2 ~ [b3,d4,g4]@3", // D G
  C: "~@7 b3@2 ~ b3!2 d4 b3!2 ~, [a3,d4,f#4]@9 ~@7, ~@7 a#3 ~@2 [d4,g4]@2 ~ [d4,g4]@3", // D G5
  D: "~@7 b3@3 b3!2 d4 b3!2 ~, [a3,d4,f#4]@9 ~@7, ~@7 a#3 ~@2 [d4,g4]@2 ~ [d4,g4]@3", // D G5
  E: "[g3,b3,d4,g4]!2 ~ [g3,b3,d4,g4]@4 ~ [a3,c#4,e4,a4]!2 ~ [a3,c#4,e4,a4]@3 ~@2", F: "[a3,d4,f#4]@13 ~@3",
  G: "[b3,d4,g4]@13 ~@3", H: "~@7 a#3 b3@2 ~ b3 d4 ~ b3 ~, [a3,f#4]@13 ~@3, d4@5 d4 ~@2",
  I: "[a3,d4,f#4]@6 ~@2 [a3,d4,f#4]@5 ~@3", J: "[a3,d4,f#4]@4 ~ [a3,d4,f#4]@2 ~",
  K: "[a3,c#4,e4,a4]!2 ~ [a3,c#4,e4,a4]@4 ~ [g3,b3,d4,g4]!2 ~ [g3,b3,d4,g4]@3 ~@2", L: "[a3,d4,f#4] ~@15",
})).s("gm_piano").gain(0.41)

// bass · fretless bass
const bass = note(`<
  ~@2 A@2 B@10 C D E D E F D A@2 G D A@2 B@8 C D E D E F D A@2 G D A@2 D H D A@2 D E D E F D A@2 G D A@2 D H D H D A@2 I
>`.pickRestart({
  A: "[a2!2 ~ a2@4 ~ g2!2 ~ g2@10 ~ g2 a#2 b2 ~ d3 ~ e3 d3 b2 ~]/2", B: "d3@2 ~ d3 b2@2 ~ b2 g2@3 g2 a2 ~ b2 ~",
  C: "g2!2 ~ g2@4 ~ a2!2 ~ a2@2 ~ c#3 ~", D: "d3@2 ~ d3 b2@2 ~ b2 a2@3 a2 b2 ~ f#2 ~",
  E: "g2@2 ~ g2 b1@2 ~ b1 c2@3 c2 c#2 ~ c#2 ~", F: "d2@3 d2 b1@2 a1 ~ d2@3 d2 b1 ~ a1 ~",
  G: "d3@2 ~ d3 b2 ~ a2 ~ d3 ~ d3 ~ b2 ~ a2 ~", H: "a2!2 ~ a2@4 ~ g2!2 ~ g2@3 ~@2", I: "d3 ~@15",
})).s("gm_fretless_bass").gain(0.41)

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

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

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

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@7 A ~@7 A ~ A ~ B A ~@3 A ~@3 A ~@7 A ~ A@2 B A ~@3 A ~@2 A ~ A ~@2 A ~ A@2 B A ~@3 A ~@2 A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@5 x!2 ~", B: "~@3 x!2 ~@6 x!2 ~@3",
})).gain(0.46)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~ A ~ A ~ A ~ A ~@2 A@2 ~ A B A ~@2 C A ~@2 A ~ A ~ A ~ A ~ B A@2 ~ A B A ~@2 C A ~@2 A ~ A ~@2 A@2 ~ A B A ~@2
  C A ~@2 A ~ A ~ A ~@2 A
>`.pickRestart({
  A: "x", B: "x!2", C: "x ~@4 x ~@2",
})).gain(0.46)

stack(piano, bass, kick, snare, hihat, mid_tom, high_tom, crash)

More by Smokey Robinson