Strudelify
Good Lovin cover art

The Origins

Good Lovin

The Rascals

KeyD majorTempo195 bpm
0:00/0:00
// Good Lovin — The Rascals
// 195 bpm, 4/4, key D 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 121 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(195/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 · "SYN BASS 2"
const bass = note(`<
  ~ A@2 B C D@2 E ~@3 A@2 B C A@2 B C A@2 B C A@2 B C F G H I J K L M A@2 B C D@2 E ~@3 A@2 B C A@2 B C A@2 B C A@2 B C
  F G H I J K L M A@2 B C D@2 E ~@3 A@2 B C A@2 B C A@2 B C A@2 N O P Q ~ A@2 B C A@2 B C A@4 B C D@2 E ~ R S T U V
>`.pickRestart({
  A: "[d2@3 ~ d2@4 g1@4 ~@2 a1@4 a2@4 a1 ~ g1@4 g2@2 g1@2]/2", B: "d2@3 ~ d2@3 ~ g1 ~ g1@2 g2@2 a1@2",
  C: "~@2 a1@2 a2@2 a1 ~ g1@4 g2@2 g1@2", D: "[d2@3 ~ d2@4 g1 ~ g1@2 ~@2 a1@4 a2@2 a1@2 a2@2 g1@4 g2@3 ~]/2",
  E: "d2 ~@7", F: "d2@5 ~ g2@4 ~@2 d2@4", G: "~@2 g2@5 ~ d2@4 a1@4", H: "d2@5 ~ e2@5 ~ d2@4", I: "~@2 g2@6 d2@3 ~@5",
  J: "e2@3 ~ e2@3 ~ e2@3 ~ e2 ~ e2@2", K: "~ e2@2 e1 ~@2 e1 ~, ~@8 e2@7 ~", L: "a1@4 a2 ~ a2@2 a1@4 a2@2 a1@2",
  M: "~ a1 a2 a1 a2 a1 a2 ~", N: "f#2@5 ~ d2@5 ~ f#2@3 ~", O: "g#2@5 ~ e2@5 ~ g#2@3 ~", P: "a2 a1 a2 a1 a2 a1 a2 a1",
  Q: "a2@3 ~@13", R: "d2@3 ~@3 g1@3 ~@3 a1@4", S: "~@2 a1@5 ~ g1@4 a1@3 ~", T: "d2@4 ~@2 g1@5 ~ a1@4, ~@12 f1 ~@3",
  U: "~@2 a1@5 ~ g1@3 ~ a1@4", V: "d2 ~@3",
})).s("gm_synth_bass_2").gain(0.72)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~ A@2 B@2 C@2 D E F G A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 H I J K L@2 M@2 A@2 B@2 C@2 D E F G A@2 B@2 A@2 B@2 A@2 B@2 A@2
  B@2 H I J K L@2 M@2 A@2 B@2 C@2 D E F G A@2 B@2 A@2 B@2 A@2 B@2 A@2 N O P@2 ~ A@2 B@2 A@2 B@2 A@4 B@2 C@2 D E F G F G
  Q
>`.pickRestart({
  A: "[[d4,f#4,a4]@4 [d4,f#4,a4]@3 ~ [g3,b3,d4] ~ [g3,b3,d4]@2 ~@2 [a3,c#4,e4]@3 ~ [a3,c#4,e4]@4 ~@2 [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~, [d3,a3]@7 ~ g2@2 ~@2 [a2,e3]@7 ~@3 g2@6 ~@4]/2", // D G A G D5 A5
  B: "[[d4,f#4,a4]@3 ~ [d4,f#4,a4]@2 ~@2 [g3,b3,d4] ~ [g3,b3,d4]@2 ~@2 [a3,c#4,e4]@3 ~ [a3,c#4,e4]@3 e3 a2 ~ [g3,b3,d4]@3 ~ [b3,d4]@2 ~@2, [d3,a3]@4 ~@4 g2@2 ~@4 [a2,e3]@4 ~@10 g3 ~@3]/2", // D G A G Bm D5 A5
  C: "[[d3,a3,d4,f#4,a4]@4 [d4,f#4,a4]@2 ~@2 [g3,b3,d4] ~ [g3,b3,d4]@2 ~@2 [a3,c#4,e4]@3 ~ [a3,c#4,e4]@2 [a2,e3]@4 [g3,b3,d4]@3 ~ [g2,g3,b3,d4]@2 ~@2, ~@4 g2 ~ [a2,e3]@3 ~@7]/2", // D G A A5 G A5
  D: "[d3,a3]@2 ~ [g2,d3]@2 ~ [a2,e3]@2", E: "~@2 [a2,e3]@2 ~@2 [a2,e3] ~ [g2,d3]@3 ~ [a2,e3]@2 ~@2",
  F: "[a3,d4,f#4] ~@5 [g3,b3,d4] ~@5 [a3,c#4,e4] ~@3", // D G A
  G: "~@2 [a3,c#4,e4] ~@3 [a3,c#4,e4] ~ [g3,b3,d4]@2 ~@2 [a3,c#4,e4] ~@3", // A G A
  H: "[a3,d4,f#4]@2 ~ [b3,d4,g4]@2 ~ [a3,d4,f#4]@2", I: "~ [b3,d4,g4]@2 ~ [a3,d4,f#4] ~@3",
  J: "[a3,d4,f#4]@5 ~ [b3,d4,g4]@4 ~@2 [a3,d4,f#4]@4", K: "~@2 [b3,d4,g4]@5 ~ [a3,d4,f#4]@2 ~@6",
  L: "[~ [g#3,b3]@2 [g#3,b3,e4]@2 [e4,g#4,b4]@3, e2, ~@4 e3@17 ~@11]/2", // G#m E
  M: "[~@4 [g3,c#4,e4]@8 [g3,c#4,e4]@8 [a2,e3,c#4,e4,a4]@3 ~@9, [a2,e3]@5 ~@3]/2", N: "[d3,a3,d4,f#4,a4]@13 ~@3",
  O: "[d4,g#4,b4]@11 ~@5, [e3,b3]@13 ~@3", // G#dim E5
  P: "[[a3,c#4,e4] [a2,e3] [a3,c#4,e4] [a2,e3] [a3,c#4,e4] [a2,e3] [a3,c#4,e4] ~ [a3,c#4,e4] ~@7, ~@15 [a2,e3]@3 ~@14]/2", // A A5 A A5 A A5 A A5
  Q: "[d3,a3,d4] ~@3", // D5
})).s("gm_epiano2").gain(0.56)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~ A B C D E F G@2 H@2 A B C D A B C D A B C D A B C D I@2 J K L@2 M@2 A B C D E F G@2 H@2 A B C D A B C D A B C D A B
  C D I@2 J K L@2 M@2 A B C D E F G@2 H@2 A B C D A B C D A B C D A B N O P@2 ~ A B C D A B C D A B A B C D E F G@2 H@2
  Q@2 R
>`.pickRestart({
  A: "[a3,d4,f#4]@3 ~ [a3,d4,f#4]@2 [a3,d4,f#4]@2 [b3,d4,g4] ~ [b3,d4,g4]@4 [c#4,e4,a4]@2", // D G A
  B: "~@2 [c#4,e4,a4]@4 [c#4,e4,a4] ~ [b3,d4,g4]@4 [b3,d4,g4]@2 [b3,d4,g4]@2", // A G
  C: "[a3,d4,f#4]@3 ~ [a3,d4,f#4]@3 ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4]@2 [c#4,e4,a4]@2", // D G A
  D: "~@2 [c#4,e4,a4]@4 [c#4,e4,a4] ~ [b3,d4,g4]@3 ~ [b3,d4,g4]@3 ~", // A G
  E: "[a3,d4,f#4]@3 ~ [a3,d4,f#4]@3 ~ [b3,d4,g4] ~ [b3,d4,g4]@4 [c#4,e4,a4]@2", // D G A
  F: "~@2 [c#4,e4,a4]@4 [c#4,e4,a4] ~ [b3,d4,g4]@3 ~ [b3,d4,g4]@2 ~@2", // A G
  G: "[[d3,a3]@4 [d3,a3]@2 [g2,d3]@3 ~ [g2,d3]@2 [g2,d3]@6 [g2,d3]@4 [g2,d3] ~ [g2,d3]@3 ~ [a2,e3]@3 ~]/2", // D5 G5 A5
  H: "[[d3,a3]@4 [d3,a3]@2 [g2,d3]@4 [g2,d3]@2 [g2,d3]@6 [g2,d3]@4 [g2,d3]@2 [g2,d3]@3 ~ [a2,e3]@3 ~]/2", // D5 G5 A5
  I: "[[d3,a3]@5 ~ [g2,d3]@5 ~ [d3,a3]@6 [g2,d3]@5 ~ [d3,a3]@5 ~@3, ~@6 a#2 ~@25]/2", // D5 G5 D5 G5 D5
  J: "[d3,a3]@5 ~ [g2,d3]@5 ~ [d3,a3]@4", K: "~@2 [g2,d3]@5 ~ [d3,a3]@4 ~@4",
  L: "[~ [g#3,b3]@2 [d3,g#3,b3]@2 [d3,g#3,b3]@2 [d3,g#3,b3], e2@3 e2@5, ~ e3@7]/2", // G#m G#dim
  M: "[~ [g3,c#4,e4]@2 [g3,c#4,e4]@2 [a2,g3,c#4,e4]@2 ~, a2@5 ~@3, ~ a3@6 ~]/2", N: "[f#3,a3,d4]@11 ~@5",
  O: "[g#3,b3]@11 ~@5, e4@7 ~", // G#m
  P: "[[a3,c#4,e4]@3 ~ [a3,c#4,e4]@2 [a2,e3]@2 [a3,c#4,e4]@2 [a2,e3]@2 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4]@2 ~@14, [a2,e3]@2 ~@5 [a2,e3]@2 ~@7]/2", // A A5 A A5 A A5
  Q: "[[d3,a3]@3 ~ [d3,a3] ~ [g2,d3]@4 [g2,d3]@2 [g2,d3]@6 [g2,d3]@4 [g2,d3]@2 [g2,d3]@3 ~ [a2,e3]@3 ~]/2", // D5 G5 A5
  R: "[d3,a3] ~@3", // D5
})).s("gm_acoustic_guitar_steel").gain(0.56)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~ A@2 B@4 ~@2 C@2 D@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 E F E F G@2 H@2 A@2 B@4 ~@2 C@2 D@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 E F
  E F G@2 H@2 A@2 B@4 ~@2 C@2 I@2 J K L@2 M N O P O P Q P R S T@2 ~ A@2 B@2 A@2 B@2 A@4 B@4 ~@2 C@2 U@2 V
>`.pickRestart({
  A: "[[a4,d5,f#5]@8 [b4,d5,g5]@5 ~ [c#5,e5,a5]@9 ~ [b4,d5,g5]@7 ~]/2", // D G A G
  B: "[[a4,d5,f#5]@7 ~ [b4,d5,g5]@5 ~ [c#5,e5,a5]@9 ~ [b4,d5,g5]@7 ~]/2", // D G A G
  C: "[~@23 a5@5 [b5,c6] [d5,e5,f5,g5] [f4,g4,a4,b4,c5] [a3,b3,c4,d4,e4], [d5,d6]@29 ~@3]/2", // Cmaj7 Em7 F Am D
  D: "[[a4,d5,f#5]@8 [b4,d5,g5]@5 ~ [c#5,e5,a5]@9 ~ [b4,d5,g5]@7 ~, g3 ~@31]/2", // D G A G
  E: "[a4,d5,f#5]@5 ~ [b4,d5,g5]@5 ~ [a4,d5,f#5]@4", F: "~@2 [b4,d5,g5]@5 ~ [a4,d5,f#5]@3 ~@5",
  G: "[~@15 e5, [e4,b4], e5@15 ~, ~@3 d5]/2", H: "[[c#5,e5]@16 [a4,c#5,e5]@13 ~@3, g4@29 ~@3]/2",
  I: "[[d5,d6]@23 [e5,e6]@5 [g5,g6]@4, g3 ~@31]/2", J: "[f#5,f#6]@8 [d5,d6]@7 ~", K: "[a4,a5]@15 ~",
  L: "[[d5,d6]@23 ~ [e5,e6]@4 [g5,g6]@4]/2", M: "[f#5,f#6] [d5,d6]", N: "[a4,a5]", O: "[d5,f#5,a5,d6,f#6,a6]@15 ~",
  P: "[e5,g5,b5,e6,g6,b6]@15 ~", Q: "[d5,f#5,a5,d6,f#6,a6]@7 ~", R: "[f#5,f#6]@5 ~ [d5,d6]@6 [f#5,f#6]@4",
  S: "[g#5,g#6]@3 [e5,e6]@3 [g#5,g#6]@2", T: "[a5,a6]",
  U: "[g3 ~@27 [b5,c6] [d5,e5,f5,g5] [f4,g4,a4,b4,c5] [a3,b3,c4,d4,e4], [d5,d6]@7 g6, ~@7 a6@25, ~@19 f#6@6 e6@7, ~@23 a5@6 ~@3]/2", // Cmaj7 Em7 F Am D
  V: "g3 ~@15",
})).s("gm_rock_organ").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B C ~ C D A B A B A B A B A B A B A B A B E F E F A B A G A B A B A B C ~ C D A B A B A B A B A B A B A B
  A B E F E F A B A G A B A B A B C ~ C D A B A B A B A B A B A B A@2 B@2 H C ~ A B A B A B A B A B A B A B A B C ~ C D
  I J C
>`.pickRestart({
  A: "x ~@3 x!2 ~ x", B: "~ x ~ x!3 ~ x", C: "x", D: "~@3 x!4 ~", E: "x ~@2 x ~ x ~@2", F: "~ x ~@2 x!2 ~@2",
  G: "~ x ~ x!5", H: "x!4 ~@4", I: "~@2 x ~@2 x ~@2", J: "x ~@2 x ~ x!3",
})).gain(0.8)

// drums · snare
const snare = s("sd").struct(`<
  ~ A@6 ~@3 B C@17 D C D C@3 E A@6 ~@3 B C@17 D C D C@3 E A@6 ~@3 B A@16 F G B A@16 ~@3 B H I G
>`.pickRestart({
  A: "~ x ~@2", B: "~@6 x!2", C: "~ x ~ x", D: "~@2 x ~@3 x!2", E: "~@5 x!3", F: "~@4 x!4", G: "x",
  H: "x ~@2 x ~@2 x ~", I: "~ x ~@4 x!2",
})).gain(0.8)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  A ~@9 B ~@16 C D C D ~@3 E ~@9 B ~@16 C D C D ~@3 E ~@9 B ~@16 E ~@21 B ~ F ~
>`.pickRestart({
  A: "~ x", B: "~ x ~@4 x ~", C: "~@3 x", D: "~ x ~@2", E: "~@6 x!2", F: "~@5 x!3",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<A@7 B@4 A@30 B@4 A@30 B@4 A@16 C B@2 A@16 B@6 ~>".pickRestart({
  A: "x!4", B: "~ x ~ x", C: "x",
})).gain(0.8)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A B A B A B ~@4 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 ~@4 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 ~@4 A B A B A B A B A B A B A@2 B@2 ~@3 A B A B A B A B A B A B A B A B ~@7
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A B@6 ~@2 C D ~@16 E F E F ~@3 G B@6 ~@2 C D ~@16 E F E F ~@3 G B@6 ~@2 C D B@16 H ~@2 B@16 ~@2 C D ~ D ~
>`.pickRestart({
  A: "~@2 x ~@3 x!2", B: "~@6 x!2", C: "~@3 x", D: "~ x", E: "~@3 x ~@4", F: "~ x ~@6", G: "~@4 x!2 ~@2",
  H: "~@5 x ~@2",
})).gain(0.8)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~@2 A@2 ~@4 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@7
>`.pickRestart({
  A: "~@7 x",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct("<A ~@8 B ~@17 A ~ A ~@13 B ~@17 A ~ A ~@13 B ~@38 B ~@2 C ~>".pickRestart({
  A: "x", B: "~@3 x ~@4", C: "~ x ~@6",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct("<~@120 x>").gain(0.8)

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

// drums · tambourine
const tambourine = s("tb").struct("<~ A@6 ~@4 A@30 ~@4 A@30 ~@4 A@16 ~@3 A@16 ~@7>".pickRestart({
  A: "~ x ~ x",
})).gain(0.8)

stack(
  bass, epiano2, acoustic_guitar_steel, rock_organ, kick, snare, snare_soft, low_tom, hihat, hihat_soft, mid_tom,
  open_hat, high_tom, crash, ride, tambourine
)

More by The Rascals