Strudelify

Good Times Roll

The Cars

KeyB majorTempo109 bpm
0:00/0:00
// Good Times Roll — The Cars
// 109 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(109/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 · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  A B@4 C D B C@2 E B F G H G I J@2 K@2 L@2 M@5 N O@3 P O@2 Q R S T K@2 U K L@2 M@5 N O@3 P O@2 Q R S T K@2 U K L@2 M@2
  N@2 V@2 L@2 M@2 N@2 V@2 W@2 X@2
>`.pickRestart({
  A: "~@7 b2", B: "b3 b2 b3 ~@2 b2 b3 b2", C: "b3 b2 b3 ~@2 b2 b3 a2", D: "a2 ~@3 a2 ~@5 a2 ~@3 b2 ~",
  E: "~ a2 ~@4 a2 b2", F: "b3 b2 b3 ~@2 b2!2 a2", G: "g2!2 ~@2 g2!2 f#2 g2", H: "a2!2 ~@2 a2!2 g2 f#2",
  I: "a2!2 ~ a2!4 ~", J: "[b2,f#3]!2 b3 ~ [b2,f#3]!2 b3 [b2,f#3]", K: "[g2,d3]!2 g3 ~ [g2,d3]!2 g3 [g2,d3]",
  L: "[e2@3 b2@3 e2@10]/2", M: "[b2,f#3]!2 b3 [b2,f#3]!3 b3 [b2,f#3]", N: "[a2,e3]!2 a3 [a2,e3]!3 a3 [a2,e3]",
  O: "b2!2 ~@2 b2!2 ~@2", P: "a2!2 ~@2 a2!2 ~@2", Q: "[g2,d3,g3]!2 ~@2 [g2,d3,g3] g2 f#2 g2",
  R: "[a2,e3]!2 ~@2 [a2,e3]!2 g2 f#2", S: "[g2,d3]!2 ~@2 [g2,d3] g2 f#2 g2", T: "[a2,e3]!2 ~ [a2,e3]!4 ~",
  U: "[g2,d3]!2 g3 ~ [g2,d3]!2 ~ [g2,d3]", V: "[g2,d3]!2 g3 [g2,d3]!3 g3 [g2,d3]", W: "[e2@3 b2@3 e2@6 e3@2 b2@2]/2",
  X: "[d2@9 ~@7]/2",
})).s("gm_distortion_guitar").gain(0.39).pan(0.1)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~ A@5 B C@3 D C@2 E F E G H I J@2 K@2 L@2 ~@2 I M I@3 M I@2 J M J M I@2 J@2 N@2 ~@4 I M I@3 M I@2 J M J M I@2 J@2 O@2
  P@2 Q@2 R S ~@2 P@2 Q@2 R T@2 ~@3
>`.pickRestart({
  A: "~@3 [f#3,b3,f#4,b4,f#5]@2 ~@3", B: "~@3 a4!2 ~@3, ~@3 [a3,e4,e5]@2 ~@3", C: "~@3 [b3,f#4,b4,f#5]@2 ~@3",
  D: "~@3 [a3,e4,a4,e5,a5]@2 ~@3", E: "[g3,d4,g4,d5]!2 ~@6", F: "[e3,a3,e4,a4] [e3,a3,e4,a4,c#5] ~@6",
  G: "[e3,a3,e4,a4]!2 ~@6", H: "[f#3,b3,f#4,b4]!2 ~@6", I: "[f#3,b3,f#4,b4]!2 ~@2 [f#3,b3,f#4,b4]!2 ~@2",
  J: "[b3,d4,g4,b4]!2 ~@2 [b3,d4,g4,b4]!2 ~@2", K: "[[g#3,g#4,b4,e5]@3 [f#4,a4,b4,d5]!2 ~ [g#4,c#5,e5]@10]/2",
  L: "[[f#3,b3,b4,d#5] ~@7, f#4@9 ~@7]/2", M: "[e3,a3,e4,a4]!2 ~@2 [e3,a3,e4,a4]!2 ~@2",
  N: "[[e3,g#3,b3,e4,g#4,b4]@3 [b3,d4,f#4,a4]@3 e4@2 e4@2 ~@6, ~@3 [g#3,c#4,g#4,c#5]@5]/2", // E Bm7 C#5
  O: "[[e3,g#3,b3,e4,g#4,b4]@3 [b3,d4,f#4,a4]@3 e4@2 e4@8, ~@3 [g#3,c#4,g#4,c#5]@5]/2", P: "[f#3,b3,f#4,b4]/2",
  Q: "[c#4 c#4, [e3,a3,e4,a4]]/2", R: "[d3,g3,b3,d4,g4] [d3,b3,d4,g4]@6 ~", S: "[g3,b3,d4,g4,b4] [g3,b3,d4,g4,b4]@6 ~",
  T: "[[g3,b3,d4,g4,b4] d4@5 d4@5 ~@5, ~ [g3,b3,g4,b4]@6 ~@9]/2", // G
})).s("gm_overdriven_guitar").gain(0.41).pan(0.9)

// other · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note("<~@29 A@3 B A@2 ~@16 A@3 B A@2 ~@28>".pickRestart({
  A: "b2 d#3 e3 d#3 b2 d#3 e3 d#3", B: "a2 d#3 e3 d#3 a2 d#3 e3 d#3",
})).s("gm_synth_strings_1").gain(0.36).pan(0.9)

// other · synth strings 1 · "SYN STR 1"
const synth_strings_1_2 = note("<~@67 A B C D@2 E F@2 C D@2 G@2 H I@2 J@2>".pickRestart({
  A: "~@4 f#4@7 d#4 ~ d#4 ~ e4", B: "~ d#4@2 b3@5", C: "~@4 f#4@6 d#4@2 ~ d#4@2 ~, ~@6 e4 ~",
  D: "[e4 d#4@2 b3@7 f#4@3 d#4 e4 d#4]/2", E: "e4@2 d#4@4 b3@9 ~", F: "[g#4@5 f#4@7 e4@19 ~]/2",
  G: "[e4@2 d#4@4 b3@14 f#4@6 ~ e4@2 d#4@2 ~, ~@13 d#4 ~@2]/2", H: "e4 d#4@2 b3@5", I: "[g#4@3 f#4@3 e4@10]/2",
  J: "[b3@9 ~@7]/2",
})).s("gm_synth_strings_1").gain(0.37).pan(0)

// other · tremolo strings · "TREMOLOSTR"
const tremolo_strings = note(`<
  ~@4 A B C@2 D E F G ~ H I J K L M N O P@2 Q ~@2 R S T U R V T U ~ W X J K L M N Y Z@2 AA ~@2 AB S T U R V T U ~ W X J
  K L M AC Y AD@3 AE AF AG AF AH AD@3 AE AF AG AF AH ~@4
>`.pickRestart({
  A: "~@7 d#5", B: "d#5!2 f#5 d#5@4 ~", C: "[~@2 e5!3 d#5 f#4 d#5@2 ~@7]/2", D: "~@6 d#5!2", E: "d#5!2 f#5 ~ d#5@3 ~",
  F: "~@2 e5!3 d#5@2 f#4", G: "d#5@3 ~@5", H: "~@2 b4 d5!2 f#5@3", I: "e5!3 c#5@3 ~@2", J: "~@2 d5!2 d5@2 ~ a4",
  K: "c#5 d5 e5@2 f#5@2 e5 d5", L: "c#5 b4@2 b4@3 ~@2", M: "~@6 d5!2", N: "d5 b4@2 b4@3 g4@2", O: "~@6 b4!2",
  P: "[g#5@3 [d5,f#5]@3 [c#5,e5]@10, e5 ~@3]/2", Q: "[b4,d#5] ~@3", R: "~@6 d#5 f#4", S: "d#5!4 ~@4, ~ f#5 ~@2",
  T: "~@2 e5!4 f#5@2", U: "d#5 ~@3", V: "d#5 d#5@2 d#5 d#5@2 ~@2", W: "~@2 d5!3 f#5@3", X: "e5@2 e5@2 e5@2 c#5@5 ~@5",
  Y: "~@10 b4!2 b4@2 b4@2", Z: "[[e5,g#5]@3 [d5,f#5]@3 [c#5,e5]@10]/2", AA: "b4 ~, d#5 ~@3",
  AB: "~@10 d#5 ~ d#5@2 f#4@2", AC: "d5 b4@2 b4 ~@2 g4@2",
  AD: "[[e5,g#5]@3 [d5,f#5]@3 ~@8 f#5 ~ [b4,d#5]@2 b4@2 b4 b4@2 ~, ~@6 c#5@10 f#5 ~@7, ~@2 e5@3 e5@3]/3", // E D B
  AE: "~@10 f#5!2 f#5@2 e5@2", AF: "f#5 b4@2 b4 b4@2 ~@2", AG: "~@6 f#5 e5", AH: "~@10 b4!2 c#5@4",
})).s("gm_tremolo_strings").gain(0.32).pan(0.2)

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

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

// drums · clap
const clap = s("cp").struct("<~@20 [x!2] ~@64>").gain(0.59)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@12 A ~@9 A ~@11 A ~ A ~ A ~ B ~@3 A ~@11 A ~ A ~ A ~ B ~@3 A ~@7 A ~@7 A ~@2
>`.pickRestart({
  A: "~@14 x!2", B: "~@8 x ~ x!3 ~ x ~",
})).gain(0.59)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@12 A ~@9 A ~@11 A ~ A ~ A ~@5 A ~@11 A ~ A ~ A ~@5 A ~@7 A ~@7 A ~@2>".pickRestart({
  A: "~@12 x!2 ~@2",
})).gain(0.59)

// drums · open hat
const open_hat = s("oh").struct("<~@13 A@2 ~@6 B C ~@20 B C ~@20 B C ~@6 B C ~@6 B C D ~>".pickRestart({
  A: "x!2", B: "x ~@2 x ~@2 x ~", C: "~ x ~@2", D: "x",
})).gain(0.59)

// drums · high tom
const high_tom = s("ht").struct("<~@12 A ~@9 A ~@11 A ~ A ~ A ~@5 A ~@11 A ~ A ~ A ~@5 A ~@7 A ~@7 A ~@2>".pickRestart({
  A: "~@4 x!2 ~@2",
})).gain(0.59)

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

// drums · ride
const ride = s("rd").struct("<~@13 A ~@7 B C ~@20 B C ~@18 A ~ B C ~@6 B C ~@6 B C A ~>".pickRestart({
  A: "x", B: "x ~@2 x ~@2 x ~", C: "~ x ~@2",
})).gain(0.59)

stack(
  distortion_guitar, overdriven_guitar, synth_strings_1, synth_strings_1_2, tremolo_strings, kick, snare, clap, low_tom,
  hihat, mid_tom, open_hat, high_tom, crash, ride
)

More by The Cars