Strudelify

You Didn't Have to Be So Nice

The Lovin' Spoonful

KeyC majorTempo124 bpm
0:00/0:00
// You Didn't Have to Be So Nice — The Lovin' Spoonful
// 124 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 85 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(124/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 · acoustic guitar steel · "Guitar"
const acoustic_guitar_steel = note(`<
  A@2 B@2 A@2 B C ~ B D E F B D E F A@2 B@2 A@2 B G B D E F B D E F A@2 B@2 A@2 B G B D E F B D E F A@2 B@2 A@2 B G ~ B
  D E F B D E F A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 ~
>`.pickRestart({
  A: "[d4,f4,a4]!2", B: "[c4,e4,g4]!2", C: "[b3,e4,g4] [b3,d4,e4,g4]", D: "[b3,e4,g4]!2", E: "[a3,d4,f4]!2",
  F: "[g3,b3,d4]!2", G: "[b3,e4,g4] [b3,d4,g4]",
})).s("gm_acoustic_guitar_steel").gain(0.8)

// other · overdriven guitar · "Lead G"
const overdriven_guitar = note("<A B C ~ A B D E ~@58 F G H@2 I J@3 K L M ~ N O P ~ I Q ~>".pickRestart({
  A: "~ f4 e4!2", B: "d4@6 ~ d4@8 e4@6 ~@3 e4@5 d4@2 ~, ~@21 d4@5 ~@6", C: "c4@13 ~@2 e4@15 ~@2, ~@13 d4@4 ~@15",
  D: "c4@13 d4@2 e4@15 ~@2", E: "e4@13 f4@2 ~ g4@15 ~", F: "~@4 f4@3 ~ e4@3 ~ e4@4",
  G: "d4@6 ~@2 d4@6 ~@7 d4@3 e4@5 d4@3, ~@21 e4 ~@10", H: "[c4@12 d4@4 e4@43 ~@5]/2", I: "~@4 f4@4 e4@3 ~ e4@4",
  J: "[d4@6 ~@2 d4@6 ~@2 e4@6 d4@3 e4@5 ~@2 c4@13 d4@3 e4@22 ~@26, ~@15 d4@2 ~@31]/3", K: "~@8 f4@8 e4@6 ~@2 e4@7 ~",
  L: "d4@7 ~ d4@7 ~ e4@5 d4@4 e4@2 d4@5", M: "c4@13 d4@3 e4@16", N: "~@15 e4@6 ~@3 e4@7 ~, ~@15 f4 ~@16",
  O: "d4@6 ~@3 d4@6 ~ e4@6 d4@2 e4@5 d4@3", P: "~ c4@12 d4@3 e4@16", Q: "d4@6 ~@2 d4@8 e4@5 d4@4 e4@4 d4@3",
})).s("gm_overdriven_guitar").gain(0.78)

// chords · drawbar organ · "Ryth Org"
const drawbar_organ = note(`<
  A@2 B@2 A@2 C D ~ E F G H I J G K L@2 B@2 A@2 C M E F G H I J G K L@2 B@2 A@2 C M E F G H I J G K L@2 B@2 A@2 C M ~ E
  F G H I J G K L@2 B@2 N@2 B@2 N@2 B@2 N@2 B@2 N@2 ~
>`.pickRestart({
  A: "[d4,f4,a4]/2", B: "[~@32 e5@3 d5@2 c5@3 e5@3 d5@2 c5@3 e5@3 d5@2 c5@3 e5@3 d5@2 c5@3, [c4,e4,g4]]/2",
  C: "[c4,e4,g4]@31 ~", D: "[b3,e4,g4] [b3,d4,g4]", E: "[c4,e4,g4]", F: "[e4,g4], b3@29 ~@3", G: "[a3,d4,f4]",
  H: "[g3,b3,d4]@4 [g3,b3,d4]@3 ~", I: "[c4,e4,g4]@29 ~@3", J: "[b3,e4,g4]@15 ~", K: "[g3,b3,d4]",
  L: "[[d4,f4,a4]@31 ~]/2", M: "[b3,e4]@7 ~ d4@7 ~, g4@15 ~, ~@15 b3@14 ~@3", N: "[f4@61 ~@3]/2",
})).s("gm_drawbar_organ").gain(0.8)

// other · tinkle bell · "Bell"
const tinkle_bell = note(`<
  A B C ~ A B D E ~@9 F G H ~ I J K L ~@8 F M H ~ I N O P ~@8 Q R H ~ S N T U ~@9 V W X ~ V W X ~ V W X ~ V W X ~ Y W ~
>`.pickRestart({
  A: "~ f5 e5@2", B: "d5@15 e5@14 ~@3", C: "c5 ~ e5@2, ~@13 d5@8 ~@11", D: "c5@8 ~@5 d5@8 ~@11", E: "~ d5@8 ~@7 g5@16",
  F: "~@8 f5 ~@7 e5@16", G: "d5@16 e5@7 ~@9", H: "[c5,e5] d5", I: "~ f5 ~@2", J: "d5@8 ~@13 d5@4 ~@7",
  K: "c5@4 ~@11 e5@15 ~@2", L: "e5@6 ~@3 g5@7", M: "d5 ~", N: "d5@2 ~@2 e5 ~@3", O: "c5@4 ~@12 e5@15 ~",
  P: "e5@12 ~@5 a5@11 ~@4", Q: "~@8 f5 ~@5 e5@14 ~@4", R: "d5@16 ~ e5@13 ~@2", S: "~ f5@2 ~", T: "~@14 c5 ~@3 e5@14",
  U: "e5@3 ~ g5@3 ~", V: "~@8 f5 ~@7 e5@15 ~", W: "d5@15 ~@17", X: "[c5,e5]@14 ~ d5@17", Y: "~@15 f5 e5@15 ~",
})).s("gm_tinkle_bell").gain(0.8)

// other · string ensemble 1 · "Ahh"
const string_ensemble_1 = note(`<
  A B@3 C D@2 E@3 F G@2 H@2 I@2 J@2 K@5 L ~ F G@2 H@2 I@2 J@2 K@5 L ~ F G@2 H@2 I@2 J@2 K@5 L ~@2 F G@2 H@2 I@2 J@2 M@16
  ~
>`.pickRestart({
  A: "~@7 f4@9 e4@16", B: "[d4@16 e4@15 c4@16 e4@47 ~@2]/3", C: "~@8 f4@7 e4@16 ~",
  D: "[d4@15 e4@16 c4@17 e4@14 ~@2]/2", E: "[e4@13 ~@3 g4@49 ~@31, ~@13 f4@5 ~@78]/3", F: "~@3 b4",
  G: "[a4@31 g4@26 a4@7]/2", H: "[g4@7 b4]/2", I: "[a4@39 g4@22 ~@3]/2",
  J: "[~ f4@5 ~@2 f4@11 ~@12 d4@18 c4@15, ~@19 e4@15 ~@30]/2",
  K: "[c4@13 d4@4 e4@48 ~@8 f4@7 ~@15 c4@6 d4@11 ~@15 c4@16 e4@16 ~, ~@80 e4@18 ~@14 e4@31 ~@17]/5",
  L: "e4@13 ~@3 g4@16, ~@13 f4@5 ~@14", M: "[c4@13 d4@4 e4@48 f4@5 ~@2 f4@11 ~@12 d4@18 c4@15, ~@83 e4@15 ~@30]/4",
})).s("gm_string_ensemble_1").gain(0.71)

// bass · acoustic bass · "Bass"
const bass = note(`<
  A B@2 C D E F G@2 H I J K L M@2 N O P Q R S T U V@2 W@3 X@2 Y Z@2 AA AB AC AD AE AF AG@7 AH@2 AI AJ AK@2 AL AM AN AO
  AP AQ AR@2 AS@3 AT@3 AU AV AW AX AY AZ BA BB BC@2 BD BE BF BG BH BI BJ ~
>`.pickRestart({
  A: "f2@7 ~ f2@8 e2@7 ~@2 e2@7", B: "[d2@6 ~@2 d2@7 ~ e2@6 ~@2 e2@7 c2@13 ~ d2@2 e2@15 ~@2]/2",
  C: "e2@6 ~@2 e2@6 ~@2 e2@6 ~@2 e2@7 ~", D: "f2@7 ~@2 f2@7 ~@6 e2 ~ e2@7 ~", E: "~@6 d2 ~ d2@8 e2@5 ~@10 e2",
  F: "c2@12 ~@4 e2@15 ~, ~@13 d2@6 ~@13", G: "[e2@12 ~ f2@4 g2@45 ~@2]/2", H: "~@13 g2@2 ~ g2@15 ~",
  I: "g2@6 ~ g2 g2@7 ~", J: "a2@13 ~ a2@15 d2@2 ~", K: "d2@13 ~ d2@2 d2@13 ~@3", L: "f2@12 ~ g2@15 ~@2 g2@2",
  M: "[g2@11 ~@2 g2@2 ~ g2@13 ~@2 a2@12 ~@2 a2@2 ~ a2@14 d2 ~]/2", N: "d2@11 ~@2 d2@2 ~ d2@12 ~@4",
  O: "~ f2@6 ~ f2@7 ~@2 e2@5 ~@2 e2@7 ~", P: "~ d2@14 ~@2 e2@5 ~@2 e2@6 ~@2", Q: "c2@7 ~ c2@6 ~@2 d2@6 ~@3 e2@4 ~@3",
  R: "~ e2@6 ~ e2@6 ~@2 e2@6 ~@2 e2@6 ~@2", S: "~@8 f2@6 ~@2 e2@5 ~@3 e2@6 ~@2",
  T: "d2@6 ~@2 d2@6 ~@2 e2@5 ~@3 e2@6 ~@2", U: "c2@6 ~@3 c2@6 ~@2 e2@5 ~@3 e2@5 ~@2",
  V: "[e2@6 ~@3 e2@6 f2@3 g2@20 ~@2 g2@4 ~@5 g2@6 ~ g2@5 ~@3]/2",
  W: "[~@10 g2 ~@3 a2@2 g2@13 ~@2 d2@13 ~@4 d2@12 ~@3 a2@13 ~@12 g2@6 ~@2, ~@79 a2@12 ~@5]/3",
  X: "[g2@12 ~@2 g2@13 ~@4 g2@13 ~@4 g2@9 ~ g2@2 ~@4, ~@30 a2@2 ~@15 a2@3 ~@14]/2", Y: "~@7 d2@7 ~ e2",
  Z: "[d2@12 ~@4 d2@12 ~@3 d2@2 f2@6 ~ f2@8 e2@6 ~@2 e2@6 ~@2, ~@33 g2@3 ~@28]/2",
  AA: "d2@6 ~@2 d2@8 ~ e2@5 ~@2 e2@6 ~@2", AB: "c2@13 d2@3 e2@15 ~", AC: "e2@7 ~@8 e2 e2@6 ~@2 e2@7 ~",
  AD: "f2@6 ~@3 f2@8 e2@6 ~ e2@7 ~", AE: "d2@6 ~@2 d2@7 ~@2 e2@4 ~@3 e2@7 ~", AF: "~@3 c2@9 ~ d2@5 ~ e2@12 ~",
  AG: "[~@12 e2 f2@5 g2@23 ~@7 a2 ~ a2@8 ~@5 g2@11 ~@6 g2@12 ~@3 e2@2 d2@10 ~@2 e2@3 d2@11 ~@5 g2@11 ~@3 a2@2 g2@11 ~@5 d2@10 ~@9 g2@7 ~@4 g2@11 ~@5 g2@12 ~@4 e2@2, ~@48 g2@4 ~@9 a2@4 ~@13 a2@5 ~@43 a2@4 ~@27 e2@5 ~@14 a2@6 ~@42]/7",
  AH: "[~ d2@9 ~@3 e2@2 ~ d2@9 ~@5 d2@12 ~@3 e2@3 d2@11 ~@3 d2@2]/2", AI: "~ f2@6 ~ f2@7 ~@2 e2@6 ~ e2@6 ~@2",
  AJ: "d2@5 ~@3 d2@7 ~ e2@5 ~@3 e2@7 ~", AK: "[c2@13 d2@3 e2@23 ~@17 e2@7 ~]/2", AL: "f2@7 ~@2 f2@7 e2@6 ~@3 e2@6 ~",
  AM: "~@6 d2 ~ d2@7 ~@2 e2@5 ~@2 e2@6 ~@2", AN: "~ c2@5 ~@3 c2@5 ~ d2@9 d2@7 ~", AO: "d2@6 ~@2 d2@4 ~@2 e2@4 f2@13 ~",
  AP: "~@11 g2@3 ~@2 g2@14 ~@2", AQ: "~@3 f2@2 ~@2 g2@7 ~@9 f2@4 ~@2 g2@2 ~",
  AR: "[~ g2@10 ~@3 g2@16 ~ e2@2 d2@12 ~ e2@3 d2@10 ~@5]/2",
  AS: "[~@2 a2@3 ~@8 g2@13 ~@6 g2@11 ~@4 g2@12 ~@7 d2@8 ~@2 e2@3 d2@10 ~@4 a2@3, g2@12 ~@19 a2@2 ~@13 a2@3 ~@14 e2@5 ~@28]/3",
  AT: "[g2@11 ~@5 g2@12 ~@3 e2@3 d2@8 ~@8 e2@2 ~@9 d2@4 f2@6 ~@8 f2 e2@6 ~@3 e2@7, ~@15 a2@2 ~@29 d2@13 ~@37]/3",
  AU: "d2@5 ~@3 d2@6 ~@3 e2@5 ~@2 e2@6 ~@2", AV: "c2@6 ~@2 c2@6 ~@8 e2 ~ e2@7 ~",
  AW: "~ e2@6 ~@2 e2@5 ~@2 e2@6 ~@2 f2@7 ~", AX: "g2 f2@5 ~@3 f2@6 ~@2 e2@5 ~@2 e2@6 ~@2",
  AY: "~ d2@6 ~ d2@6 ~@3 e2@5 ~@9 e2", AZ: "~@6 c2 ~ c2@6 ~@2 d2@7 ~ d2@7 ~", BA: "e2@5 ~@3 e2@5 ~@3 e2@6 ~@2 e2@6 ~@2",
  BB: "f2@6 ~@2 f2@7 ~ e2@6 ~@2 e2@6 ~@2", BC: "[d2@6 ~@2 d2@7 ~ e2@6 ~@3 e2@5 ~ d2@8 ~ d2@4 ~@4 e2@6 ~@2 e2@5 ~@3]/2",
  BD: "e2@5 ~@3 e2@6 ~@7 e2 ~@2 e2@6 ~@2", BE: "~@3 f2 ~@4 f2@8 e2@6 ~@10",
  BF: "d2@5 ~@3 d2@8 e2@5 ~@3 e2@7 ~, e2 ~@31", BG: "~@6 c2 ~ c2@6 ~@3 d2@6 ~ d2@6 ~@2",
  BH: "~ d2 d2@3 ~@3 d2@6 ~@2 e2@4 ~@4 e2@6 ~@2", BI: "~@6 f2 ~ f2@7 ~@2 e2@6 ~@2 e2@6 ~",
  BJ: "d2@5 ~@3 d2@7 ~ e2@5 ~@3 e2@6 ~@2",
})).s("gm_acoustic_bass").gain(0.8)

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

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  A B@6 C ~ D@3 A ~ D@2 ~ B@7 C D@3 A ~ D@2 ~ B@7 C D@3 A ~ D@2 ~ B@7 C ~ D@3 A ~ D@2 ~ B@18 ~
>`.pickRestart({
  A: "~ x!3", B: "x!4", C: "x!2 ~@2", D: "~@3 x ~@12",
})).gain(0.55)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 [~@24 x ~@2 x ~ x ~@2] ~@48 [~@24 x ~@2 x ~ x ~@2] ~@27>").gain(0.55)

// drums · high tom
const high_tom = s("ht").struct("<~@8 [~@16 x ~@2 x ~ x ~@10] ~@48 [~@16 x ~@2 x ~ x ~@10] ~@27>").gain(0.55)

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

stack(
  acoustic_guitar_steel, overdriven_guitar, drawbar_organ, tinkle_bell, string_ensemble_1, bass, kick, snare, hihat,
  open_hat, mid_tom, high_tom, crash
)

More by The Lovin' Spoonful