Strudelify

Maybelline

Chuck Berry

KeyB♭ majorTempo210 bpm
0:00/0:00
// Maybelline — Chuck Berry
// 210 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 137 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(210/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.

// other · tenor sax · "Sax"
const tenor_sax = note(`<
  ~@4 A B C D E F G H I J@3 K L M N O P Q R S T U V W X C D Y F Z AA AB AC@3 K L M N O AD AE AF S T U AG W X C D Y F Z
  AA AB AC@3 ~@24 AH B C D E F G H I J@3 K AI AJ AK O AL AE AM AN T U AG W X C D Y F Z AA AB AC@3 ~@13
>`.pickRestart({
  A: "~@8 g4@5 ~ f4@2", B: "f4@3 ~ g4@4 ~@8", C: "~@2 g4@3 ~ g4@3 ~ f4@2 f4@3 ~", D: "f4 c4 d4@2 ~@4",
  E: "~@2 g4@2 f4@3 ~ f4@3 ~ db4@2 db4@2", F: "bb3@7 ~", G: "~@2 db4@3 ~ db4@3 ~ bb3@2 bb3@3 ~", H: "db4@3 ~ d4@8 ~@4",
  I: "~@10 bb3@2 d4@3 ~", J: "[eb4@2 eb4@2 d4@2 eb4@2 eb4@2 e4@3 ~ f4@5 ~ db4@3 ~ c4@3 ~ bb3@2 bb3@6 ~@12]/3",
  K: "~@7 bb3", L: "db4@3 ~ db4@3 ~ db4@2 db4@2 db4@2 bb3@2", M: "c4 bb3!2 db4@3 ~ bb3",
  N: "db4@3 ~ db4@2 bb3@2 c4@3 ~ g3@2 g3@2", O: "bb3@3 ~ bb3@2 f3@6 ~@2 f3@2", P: "db4!3 bb3 db4 g3!3",
  Q: "bb3@3 ~ bb3@2 db4@6 ~@4", R: "db4@2 db4@2 db4@3 ~ db4@3 ~ g3@3 ~", S: "bb3@2 bb3@3 ~ f3@6 ~@2 f3@2",
  T: "db4@2 db4@2 db4@3 ~ db4!2 g3@2 g3@3 ~", U: "bb3@3 ~ bb3@2 db4@3 ~ bb3@2 bb3@3 ~",
  V: "db4@2 db4@2 db4@2 db4@2 bb3@2 bb3@2 g3@3 ~", W: "bb3@3 ~ bb3@2 f3@3 ~ g4@3 ~ g4@2", X: "f4 ~",
  Y: "~@2 g4@2 f4@3 ~ f4@3 ~ c4@2 c4@2", Z: "~@2 c4@3 ~ c4@3 ~ bb3@2 bb3@3 ~", AA: "db4@3 ~ d4@12",
  AB: "~@10 d4@2 d4@3 ~", AC: "[eb4@2 eb4@2 eb4@3 ~ eb4@2 eb4@2 eb4@2 f4@5 ~ db4@3 ~ c4@3 ~ bb3@2 bb3@10 ~@8]/3",
  AD: "db4@3 ~ db4@3 ~ db4@2 g3@2 g3@3 ~", AE: "bb3@3 ~ bb3@2 db4@6 ~@2 f3@2",
  AF: "db4@2 db4@2 db4@3 ~ db4@3 ~ g3@2 g3@2", AG: "db4@3 ~ db4@2 db4@2 bb3@2 bb3@2 g3@3 ~",
  AH: "~@2 g4@5 ~ g4@3 ~ f4@3 ~", AI: "db4@2 db4@2 db4@3 ~ db4@3 ~@3 bb3@2", AJ: "c4@3 ~ bb3@3 ~ db4@4 ~@2 bb3@2",
  AK: "db4@3 ~ db4@2 bb3@2 c4@3 ~ g3@3 ~", AL: "db4@2 db4@2 db4@3 ~ db4@2 g3@2 g3@2 g3@2",
  AM: "db4@2 db4@2 db4@3 ~ db4@2 db4@2 g3@2 g3@2", AN: "bb3@2 bb3@3 ~ f3@6 ~@4",
})).s("gm_tenor_sax").gain(0.31).pan(0.3)

// chords · overdriven guitar · "Guitar"
const overdriven_guitar = note(`<
  A B C D@6 E@2 D@2 F@2 D@18 E@2 D@2 F@2 D@18 E@2 D@2 F@2 D G H I H J K L M N O P Q R@2 S T@2 U V W@2 X Y Z@2 D@4 E@2
  D@2 F@2 D@18 E@2 D@2 F@2 D AA AB AC AD@2 AE AF AG AH AE AF AG AH
>`.pickRestart({
  A: "~@4 f3@3 ~ g3@3 ~ bb3@3 ~", B: "[c4,f4]@3 ~ [c4,f4]@6 ~@2 bb3@3 ~", C: "[d4,f4]@6 ~@2 [d4,f4]@5 ~ [d4,f4]@2",
  D: "bb2@3 ~ [f3,bb3,d4]@3 ~ f2@3 ~ [f3,bb3,d4]@3 ~", E: "eb3@3 ~ [bb3,eb4,g4]@3 ~ bb2@3 ~ [bb3,eb4,g4]@3 ~",
  F: "f2@3 ~ [c3,f3,a3]@3 ~ c3@3 ~ [c3,f3,a3]@3 ~", G: "~@4 eb4@7 ~ f4@3 ~", H: "e4@3 ~ f4@3 ~ e4@3 ~ e4@2 f4@2",
  I: "~@2 f4@3 ~ f4@2 e4@3 ~ f4@3 ~", J: "~@2 f4@3 ~ f4@2 f4@2 e4@3 ~ f4@2", K: "e4@4 f4@3 ~ e4@3 ~ e4@2 f4@2",
  L: "~@2 f4@3 ~ e4@3 ~ f4@2 e4@3 ~", M: "f4@2 e4@3 ~ f4@2 e4@3 ~ f4@3 ~", N: "e4@3 ~ f4@2 bb4@3 ~ ab4@5 ~",
  O: "f4 eb4@3 ~@4", P: "bb4@3 ~ g4@2 db4@3 ~ bb3@2 g3@3 ~", Q: "bb3@3 ~ f4 bb4 f4 [f4,bb4]",
  R: "[~@2 [f4,bb4]@3 ~ [f4,bb4,d5]@3 ~ [f4,bb4,d5]@3 ~ [f4,bb4,d5]@8 ~@2 [f4,bb4,d5]@4 ~@4]/2", // Bb5 Bb
  S: "~@2 [f4,bb4,d5]@3 ~ [f4,bb4,d5]@3 ~ [f4,bb4,d5]@3 ~ [f4,bb4,d5]@2", // Bb
  T: "[~@2 [eb4,g4,c5]@2 [eb4,g4,c5]@3 ~ [d4,f4,bb4]@2 [eb4,g4,c5]@3 ~ [d4,f4,c5]@5 ~ bb3@3 ~ [db4,f4]@2 [db4,f4]@4 [eb4,g4]@2]/2", // Cm Bb Cm Dm7 Db Eb
  U: "~ [e4,ab4] [eb4,g4]@5 ~", V: "[eb4,g4]@5 ~ [eb4,g4]@6 ~@2 [db4,f4]@2",
  W: "[[d4,f4]@2 [d4,f4]@2 [bb3,d4]@3 ~ [bb3,d4]@2 [bb3,d4]@3 ~ [f3,bb3,d4]@10 ~@2 [f3,bb3]@2 [f3,bb3]@3 ~]/2", // Dm Bb Bb5
  X: "[ab3,db4]@10 ~@2 [f3,bb3]@3 ~", Y: "[ab3,db4]@3 ~ [f3,bb3]@3 ~ [bb3,eb4]@2 [ab3,db4]@5 ~",
  Z: "[[f3,bb3,d4]@15 ~]/2", AA: "bb2@3 ~ [f3,bb3,d4]@3 ~ f3@3 ~ bb3@3 ~", AB: "[c4,f4]@13 ~@3",
  AC: "[c4,f4]@3 ~ [c4,f4]@3 ~", AD: "[[f3,bb3,d4]@21 ~@5 bb3@2 [bb3,d4]@3 ~]/2", AE: "[d4,f4]@3 ~ [d4,f4]@3 ~",
  AF: "[c4,eb4]@3 ~ [d4,f4]@3 ~", AG: "[bb3,d4]@7 ~", AH: "~@2 [bb3,d4]@2 f3@3 ~ g3@3 ~ bb3@3 ~",
})).s("gm_overdriven_guitar").gain(0.48).pan(0.1)

// chords · electric guitar muted · "Guitar"
const electric_guitar_muted = note(`<
  ~@5 A B A B C D E F G H A B I J K L K L M N M N M N O P Q R S T E F U V W X M N Y Z Y Z M N M N AA AB E F Q R AC AD E
  F U V E F I J K L AE AF I J AG AH K L Y Z Y Z AI AJ M N AK AL K L O P O P AM AN O P G H AO AP K L K L M N M N M N M N
  AO AP O P AQ AR W X AS AT O P M N I J M N K L M N AU AV
>`.pickRestart({
  A: "~@4 [bb3,d4,f4]@2 ~@2 [bb3,d4,f4] ~@7", B: "[bb3,d4,f4]@3 ~ [bb3,d4,f4] ~@2 [bb3,d4,f4]@4 bb2 [bb3,d4,f4]@3 ~",
  C: "~@4 [g3,bb3,eb4]@2 ~@2 [g3,bb3,eb4]@2 ~@5 bb3", D: "[g3,bb3,eb4]@2 ~@5 [g3,bb3,eb4] ~@3 eb4 g4 bb4 ~ eb5",
  E: "~@3 f3 [f3,bb3,d4]@2 ~@2 [f3,bb3,d4]@2 ~@5 f3", F: "[f3,bb3,d4]@2 ~@5 [f3,bb3,d4]@4 f3 [f3,bb3,d4]@2 ~@2",
  G: "~@4 [a3,c4,f4]@2 ~@2 [a3,c4,f4]@2 ~@5 c4", H: "[a3,c4,f4]@2 ~@5 [a3,c4,f4] ~@3 f4 a4 c5 ~ f5",
  I: "[bb2,f3,bb3,d4]@14 ~ f3", J: "[f3,bb3,d4]@2 ~@5 [f3,bb3,d4] ~@7 f3", K: "[bb2,bb3,d4,f4]@14 ~ f3",
  L: "[bb3,d4,f4]@2 ~@5 [bb3,d4,f4] ~@7 f3", M: "[bb3,d4,f4]@15 f3",
  N: "[bb3,d4,f4] ~@6 [bb3,d4,f4] ~@3 bb3 d4 f4 ~ bb4", O: "~@4 [bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@2 ~@5 bb2",
  P: "[bb3,d4,f4]@2 ~@5 [bb3,d4,f4] ~@3 bb2 [bb3,d4,f4] ~@3", Q: "~@3 f3 [bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@2 ~@5 f3",
  R: "[bb3,d4,f4]@2 ~@5 [bb3,d4,f4]@4 f3 [bb3,d4,f4]@2 ~@2", S: "~@4 [bb3,eb4,g4]@2 ~@2 [bb3,eb4,g4] ~@7",
  T: "[bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~@2 [bb3,eb4,g4]@4 eb3 [bb3,eb4,g4]@3 ~", U: "~@4 [a3,c4,f4]@2 ~@2 [a3,c4,f4] ~@7",
  V: "[a3,c4,f4]@3 ~ [a3,c4,f4] ~@2 [a3,c4,f4]@4 f3 [a3,c4,f4]@3 ~", W: "~@4 [f3,bb3,d4]@2 ~@2 [f3,bb3,d4]@2 ~@5 bb2",
  X: "[f3,bb3,d4]@2 ~@5 [f3,bb3,d4] ~@3 bb2 [f3,bb3,d4] ~@3", Y: "[f3,bb3,d4]@15 f3",
  Z: "[f3,bb3,d4] ~@6 [f3,bb3,d4] ~@3 bb3 d4 f4 ~ bb4", AA: "[f3,bb3,d4]@15 ~",
  AB: "[f3,bb3,d4] ~@6 [f3,bb3,d4] ~@7 f3", AC: "~@4 [g3,bb3,eb4]@2 ~@2 [g3,bb3,eb4]@2 ~@5 eb3",
  AD: "[g3,bb3,eb4]@2 ~@5 [g3,bb3,eb4] ~@3 eb3 [g3,bb3,eb4] ~@3", AE: "[eb3,g3,bb3,eb4]@14 ~ bb3",
  AF: "[g3,bb3,eb4]@2 ~@5 [g3,bb3,eb4] ~@7 bb3", AG: "[a3,c4,f4]@15 c4",
  AH: "[a3,c4,f4] ~@6 [a3,c4,f4] ~@3 f4 a4 c5 ~ f5", AI: "[g3,bb3,eb4]@15 bb3",
  AJ: "[g3,bb3,eb4] ~@6 [g3,bb3,eb4] ~@3 eb4 g4 bb4 ~ eb5", AK: "[f3,a3,c4,f4]@14 ~ c4",
  AL: "[a3,c4,f4]@2 ~@5 [a3,c4,f4] ~@7 c4", AM: "~@4 [g3,bb3,eb4]@2 ~@2 [g3,bb3,eb4] ~@7",
  AN: "[g3,bb3,eb4]@3 ~ [g3,bb3,eb4] ~@2 [g3,bb3,eb4]@4 eb3 [g3,bb3,eb4]@3 ~", // Eb
  AO: "~@4 [bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@2 ~@5 f3", AP: "[bb3,d4,f4]@2 ~@5 [bb3,d4,f4] ~@3 bb3 d4 f4 ~ bb4",
  AQ: "~@3 bb3 [g3,bb3,eb4]@2 ~@2 [g3,bb3,eb4]@2 ~@5 bb3", // Eb
  AR: "[g3,bb3,eb4]@2 ~@5 [g3,bb3,eb4]@4 bb3 [g3,bb3,eb4]@2 ~@2", AS: "~@2 [a3,c4,f4] ~ [a3,c4,f4] ~@3",
  AT: "[a3,c4,f4]@2 ~@5 [a3,c4,f4]@2 ~@2 f5 c5 a4 ~ f4", AU: "[bb3,d4,f4]@7 ~",
  AV: "~@3 [bb3,d4,f4] ~@4 [bb3,d4,f4] ~@2 f3 [bb3,d4,f4] ~@3", // Bb
})).s("gm_electric_guitar_muted").gain(0.35).pan(0.9)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@5 A B A B C D E F G H I J K@4 L@2 M@4 L@2 A B I J C D E F N O I J M@2 L@4 M@2 K@2 L@2 I J A B P Q A B R S A B M@2
  L@2 T@2 K@2 U@2 K@2 M@2 L@2 V@2 L@2 W@2 M@2 A B A B C D E F G H I J K@2 L@2 K@4 L@2 M@2 E F A B X Y E F R S E F M@6
  K@2 L@2 Z AA
>`.pickRestart({
  A: "bb1@3 bb0 d2@3 ~ f2@3 ~ g2@3 ~", B: "bb1@3 ~ d2@2 ~@2 f2@3 ~ g2 f2 ~ bb0", C: "eb2@3 eb1 g2@3 ~ bb2@3 ~ c3@3 ~",
  D: "eb2@3 ~ g2@2 ~@2 bb2@3 ~ c3 bb2 ~ eb1", E: "bb1@3 bb0 d2@3 ~ f2@3 ~ g2@3 bb0",
  F: "bb1@4 d2@3 ~ f2@3 bb0 g2@2 ~ f2", G: "f2@3 f1 a2@3 ~ c3@3 ~ d3@2 ~ c3", H: "f2@3 f1 a2@3 ~ c3@3 f1 d3@2 ~@2",
  I: "bb1@3 bb0 d2@3 ~ f2@3 ~ g2@2 ~ f2", J: "bb1@3 bb0 d2@3 ~ f2@3 bb0 g2@2 ~@2",
  K: "[bb1@15 ~ bb1@14 ~ f1, ~@15 f1@2 ~@15]/2", L: "[bb1@30 ~ bb0]/2", M: "[bb1@31 f1]/2",
  N: "f2@3 f1 a2@3 ~ c3@3 ~ d3@3 ~", O: "f2@3 ~ a2@2 ~@2 c3@3 ~ d3 c3 ~ f1", P: "eb2@3 eb1 g2@3 ~ bb2@3 ~ c3@2 ~ bb2",
  Q: "eb2@3 eb1 g2@3 ~ bb2@3 eb1 c3@2 ~@2", R: "f2@3 f1 a2@3 ~ c3@3 ~ d3@3 f1", S: "f2@4 a2@3 ~ c3@3 f1 d3@2 ~ c3",
  T: "[eb2@15 ~ eb2@14 ~ bb1, ~@15 bb1@2 ~@15]/2", U: "[f2@15 ~ f2@14 ~ c2, ~@15 c2@2 ~@15]/2", V: "[eb2@30 ~ eb1]/2",
  W: "[f2@31 c2]/2", X: "eb2@3 eb1 g2@3 ~ bb2@3 ~ c3@3 eb1", Y: "eb2@4 g2@3 ~ bb2@3 eb1 c3@2 ~ bb2", Z: "bb1@7 ~",
  AA: "bb1@13 ~@3",
})).s("gm_fretless_bass").gain(0.48).pan(0)

// bass · fretless bass · "Bass" · soft notes
const bass_soft = note(`<
  ~@5 A B A B C D ~@18 A B ~@2 C D ~@2 E F ~@16 A B ~@2 A B ~@2 A B ~@24 A B A B C D ~@20 A B ~@20
>`.pickRestart({
  A: "~@11 bb0 ~@4", B: "~@7 bb0 ~@3 bb0 ~@4", C: "~@11 eb1 ~@4", D: "~@7 eb1 ~@3 eb1 ~@4", E: "~@11 f1 ~@4",
  F: "~@7 f1 ~@3 f1 ~@4",
})).s("gm_fretless_bass").gain(0.2).pan(0)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@64 [~@12 x ~@2 x] ~@72>").gain(0.64)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@40 A ~@11 A ~@11 B ~@23 C ~@23 A ~@24>".pickRestart({
  A: "~@11 x ~@4", B: "~@8 x ~@2 x ~@4", C: "~@12 x ~@2 x",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<~@17 A@11 ~@13 A@11 ~@13 A@11 ~ A@11 ~@13 A@11 ~@13 A@12>".pickRestart({
  A: "x!2",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@64 [~ x ~@2] ~@23 [x ~@6 x ~@8] ~@48>").gain(0.64)

// drums · crash
const crash = s("cr").struct("<~@5 A ~@23 A ~@23 A ~@11 A ~@11 A ~@11 A ~@23 A ~@11 A ~@11>".pickRestart({
  A: "x",
})).gain(0.48)

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

stack(
  tenor_sax, overdriven_guitar, electric_guitar_muted, bass, bass_soft, kick, snare, low_tom, hihat, mid_tom, open_hat,
  high_tom, crash, ride
)

More by Chuck Berry