Strudelify

Whole Lotta Loving

Fats Domino

KeyB♭ majorTempo188 bpm
0:00/0:00
// Whole Lotta Loving — Domino Fats
// 188 bpm, 2/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 156 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(188/2)

// 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 · "A.PIANO 1"
const piano = note(`<
  A B C D E F G H I J K L M N O P Q R S T U V W X V Y Q Z R AA AB AC V AD AE W Q AF Q AG Q V W@2 V@2 W AH V AI AJ AK AL
  AM AN AO AP AQ AR AS A AT AU AV AW AX AY AZ@6 BA BB@6 BC@5 BD BE BF BG BH AR BI BJ BK BL@2 BM BN BO BP Q R S T U V W X
  V Y Q Z R AA AB AC V AD AE W Q AF Q AG Q V W@2 V@2 W AH V AI AJ BQ A B C D E F G H I J K L BR@2 BS BT@5
>`.pickRestart({
  A: "~@8 [d4,f4]@2 ~@2 [bb3,d4,f4]@3 ~, ~@8 bb3 ~@7", B: "~@5 bb3@2 ~ [bb3,d4,f4]@4 ~@4, ~@2 [d4,g4] ~@5",
  C: "~@4 [eb4,g4,bb4] ~ [g4,bb4]@2, ~@6 eb4 ~", D: "~@5 [eb4,g4]@3 [eb4,g4,bb4]@4 ~@4, ~@5 c5@5 ~@6",
  E: "~@8 [bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@3 ~", F: "~@2 [bb3,g4] ~ [bb3,d4,f4]@2 ~@2, ~@4 d4 ~@11",
  G: "~@8 [a3,c4]@2 ~@2 [f3,a3,c4]@3 ~, ~@8 f3 ~@7", H: "~@4 [a3,d4]@2 ~@2 [f3,a3,c4]@3 ~@5, ~@4 f3 ~@11",
  I: "~@4 [d4,f4] ~ [bb3,d4,f4] ~, ~@8 bb3 ~@7", J: "~@4 d4 bb3@2 ~ [bb3,d4,f4]@3 ~@5, ~@2 g4 ~@5",
  K: "~@4 [g4,bb4] ~ [g4,bb4]@2, ~@8 eb4 ~@3 eb4@2 ~@2", L: "~@4 [eb4,g4]@3 ~ [g4,bb4]@2 ~@6, ~ c5 ~@2",
  M: "~ [a3,f4]@2 ~ [f3,a3,c4,f4]@3 ~@5 [a3,c4]@2 ~@2, ~ [f3,c4] ~@10 [f3,f4] ~@3", // Dm F Am F5 F
  N: "[f3,a3,c4,f4]@3 ~@6 [f3,f4]@3 ~@4, ~@8 [a3,c4]@3 ~@5", O: "~ [bb3,d4]@4 ~@11, f3 ~@3", P: "~ [f3,a3,c4]@5 ~@10",
  Q: "~@8 [bb3,d4,f4]@3 ~@5", R: "~@8 [bb3,d4,f4]@5 ~@3", S: "~@8 [bb3,eb4,g4]@3 ~@5",
  T: "~@7 bb3@8 ~, ~@7 eb4@5 ~@4, ~@7 g4@3 ~@6", U: "~@9 [d4,f4]@3 ~@4, ~@8 bb3@3 ~@5", V: "~@2 [bb3,d4,f4] ~",
  W: "~@2 [eb4,g4,bb4] ~", X: "~@7 [eb4,g4,bb4]@4 ~@5", Y: "~@8 [c4,f4,a4]@3 ~@5", Z: "~@2 [bb3,f4] ~, ~@7 d4@5 ~@4",
  AA: "~@9 [d4,f4]@4 ~@3, ~@2 bb3 ~", AB: "~@9 bb4@4 ~@3, ~@2 g4 ~, ~@9 eb4@2 ~@5", AC: "~@2 bb4 ~, ~@7 [eb4,g4]@4 ~@5",
  AD: "~@2 f4 ~, ~@7 [bb3,d4]@4 ~@5", AE: "~@8 [eb4,g4,bb4]@5 ~@3", AF: "~@9 [c4,f4,a4]@3 ~@4",
  AG: "~@8 [bb3,f4]@5 ~@3, ~@7 d4@5 ~@4", AH: "~@7 [eb4,g4]@5 ~@4, ~@7 bb4@3 ~@6", AI: "~@2 [c4,f4,a4] ~",
  AJ: "~@8 [bb3,d4,f4]@7 ~", AK: "~ [bb3,d4,f4]", AL: "~@7 [bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@4 ~",
  AM: "~@4 [bb3,d4,g4]@3 ~ [bb3,f4]@4 ~@4, ~@7 d4@3 ~@6", AN: "~@8 [eb4,g4,bb4]@3 ~ [g4,bb4]@4, ~@6 eb4 ~",
  AO: "~@5 [eb4,g4]@2 ~@2 bb4@3 ~@4, ~@5 c5@5 ~@6, ~@2 [eb4,g4] ~", AP: "~@8 [bb3,f4] ~@3 [bb3,d4,f4]@3 ~, ~@4 d4 ~@3",
  AQ: "~@5 [bb3,g4]@3 [bb3,d4,f4]@4 ~@4, ~@5 d4 ~@10", AR: "~@8 [f3,a3]@2 ~@2 [f3,a3,c4]@3 ~, ~@8 c4 ~@7",
  AS: "~@5 [f3,a3,d4]@2 ~ [f3,a3,c4]@3 ~@5", AT: "~@5 [bb3,d4,g4]@2 ~@2 g4 ~@6, ~@8 [bb3,d4,f4]@3 ~@5",
  AU: "~@4 [eb4,g4,bb4] ~ [eb4,g4,bb4]@2", AV: "~@2 [eb4,c5]@2 [g4,bb4] ~@3, ~@2 g4 ~@5",
  AW: "[a3,c4]@2 ~@2 [f3,a3,c4]@3 ~@5 c4 f3 ~@2, f3 ~@11 a3@2 ~@2", AX: "[f3,a3,c4]@3 ~@5 [a3,c4]@4 ~@4, ~@4 f3 ~@3",
  AY: "[f3,bb3,d4]@5 ~@11", // Bb
  AZ: "[[f3,a3,c4,f4]@8 ~@8 [g4,bb4]@5 ~@3 [c5,ab5,c6]@4 ~ eb5@2 ~ [g4,bb4]@4 ~@4 [ab4,c5,c6]@4 [eb4,eb5]@3 ~ [bb4,g5]@4 ~@4 [ab5,c6]@4 [eb4,eb5]@3 ~@5 [eb4,eb5]@3 ~@6 [d4,f4]@8 bb3@3 [eb4,g4]@5 bb3@3, ~@15 bb5@5 ~@3 ab4@6 ~@2 [g5,bb5]@5 eb5@3 ab5@5 ~@9 eb5@4 ~@7 [g4,bb5]@6 ~@7 bb3@3 ~@16, ~@16 g5@3 ~@2 [eb4,eb5]@4 ~@3 eb4@4 ~@5 eb4@4 ~@6 [g4,bb5]@5 eb4@3 [ab4,c5]@5 ~@3 bb4@8 ~@25, ~@65 g5@5 ~@26]/6", // F Gm Fm Gm Ab Eb Ab Eb …
  BA: "[d4,f4]@5 bb3@3 [eb4,g4]@4 ~ bb3@3", // Dm Eb
  BB: "[~ d4@4 bb3@3 ~@5 [d4,f4,bb4]@5 ~@4 bb4@4 ~@6 c5@2 g4@3 e4@3 ~@4 e4@2 ~@14 e4@2 ~@2 c3@3 ~@2 e4@3 c3@5 d4@3 c3@5 ~@3 c3@5 f4@3, f4@8 ~@13 f4@7 ~@14 g4@4 ~@4 g4@4 c4@4 g4@4 c4@10 ~@13 c4@2 ~@9, ~@21 d4@4 ~@4 c4@13 ~@4 c4@4 ~@2 e4@4 c5@4 ~@4 c5@5 ~@17 c5@4 ~@6, ~@21 bb3@2 ~@9 c3@5 ~@3 [c3,c5]@4 ~@4 [c3,c5]@4 ~@5 c3@3 ~@7 g4@5 ~@5 [e4,g4,c5]@5 ~@3 [e4,g4]@5 ~@6]/6", // Bb C Em
  BC: "[f3@5 [f4,a4,c5]@3 f3@5 f4@3 f3@5 f4@3 ~@6 c5 ~@2 c5 ~@3 [d5,d6]@3 ~ [db5,db6]@3 ~ [c5,c6]@10 ~ f3@5 bb3@5 ~@6 [bb3,f4]@2 ~@3 [bb3,d4,f4]@3, ~@13 [a4,c5]@15 ~ a4@2 ~ [a4,eb5,eb6]@3 ~@45, ~@24 f3@29 ~@27, ~@30 f4@26 ~@16 d4 ~@7, ~@3 f5@2 ~@3]/5", // F D Db C Bb5 Bb Am Adim
  BD: "~@2 g4@2 f4@3 ~, ~@4 bb3@9 ~@3, ~@4 d4 ~@11", BE: "~@8 [eb4,g4,bb4]@3 ~ [eb4,g4,bb4]@4",
  BF: "~@2 [g4,bb4] ~, ~@5 eb4@10 ~, ~@5 c5@5 ~@6", BG: "~@4 [bb3,d4,f4] ~ [d4,f4]@2, ~@6 bb3 ~",
  BH: "~@5 g4@2 ~ [d4,f4]@4 ~@4, ~@5 bb3@9 ~@2, ~@5 d4 ~@10", // Dm
  BI: "~@5 [f3,d4]@2 ~ [a3,c4]@5 ~@3, ~@5 a3 ~@2 f3@3 ~@5, ~@8 d4 ~@7", // Dm Am
  BJ: "~@8 [bb3,d4,f4]@2 ~@3 bb3@2 ~, ~@12 [d4,f4]@3 ~", BK: "~@5 [bb3,d4,g4]@2 ~@2 f4@4 ~@3, ~@8 [bb3,d4]@3 ~@5",
  BL: "[~@8 [g4,bb4]@2 ~@2 [g4,bb4]@5 ~@3 [eb4,g4,c5]@6 ~@6, ~ eb3@29 ~@2, ~@8 eb4 ~@3 eb4@3 ~@17]/2", // Gm Cm
  BM: "[f2,f3,a3,c4]@3 ~@2 f2@4 ~@3 [a3,c4] f3 ~@2, f4 ~@3 [f3,a3,c4,f4]@4 ~@4 [f2,f4]@2 ~@2", // F Am F
  BN: "[f2,f3,a3,c4,f4]@3 ~@5 [f3,a3,c4,f4]@3 ~@5, ~@8 f2@5 ~@3", BO: "[bb2,bb3,d4,f4,bb4]@3 ~@5",
  BP: "[f2,f3,a3,c4,f4]@9 ~@7", BQ: "~@7 [bb3,d4,f4]@9",
  BR: "[~ [a3,f4]@2 ~ [f3,a3,c4,f4]@3 ~@5 [a3,c4]@2 ~ c5 [f3,a3,c4,f4]@3 ~@6 f3@2 ~@5, [a4,c5]@6 ~@9 a4@2 ~@8 f4 ~@6, ~ [f3,c4] ~@10 [f3,f4] ~@11 [a3,c4]@3 ~@5]/2", // Dm F Am F Am F5 F Am
  BS: "~ [e7,f7] ~@2 bb6 a6 ~@5 bb5 a5 g5 f5 e5, [f3,f4]@3 c7@2 ~ g6@2 e6@2 c6@2 ~@4, ~ [bb3,d4]@4 ~@11, ~@2 d7@2 ~@3 f6@2 d6@2 ~@5", // Fmaj7 F Bb
  BT: "[~@3 [c4,d4,f4,bb4]@62 ~@15]/5", // Bb
})).s("gm_piano").gain(0.38).pan(0.7)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A@2 B@2 C@2 D@2 E@2 F@2 G H I J A@2 K@2 A@2 K@2 L M C@2 A@2 N@2 A@2 O@2 L P Q@2 A@2 N@2 A@2 O@2 L M C@2 E@2 O@2 R@2
  S@2 T@2 U@2 G V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW P AX AY AZ V BA V A@2 K@2
  A@2 K@2 L M C@2 A@2 N@2 A@2 O@2 L P Q@2 A@2 N@2 A@2 O@2 L M C@2 A@2 B@2 C@2 D@2 E@2 F@2 G H BB BC@4 ~
>`.pickRestart({
  A: "[bb1@29 ~@3]/2", B: "[eb2@7 ~]/2", C: "[bb1@27 ~@5]/2", D: "[f1@27 ~@5]/2", E: "[bb1@7 ~]/2", F: "[eb2@3 ~]/2",
  G: "f1@2 ~@3 f1@3 ~@5 f1@2 ~", H: "f1@3 ~@5 f1@3 ~@5", I: "bb1 ~@3", J: "f1@11 ~@5", K: "[eb2@27 ~@5]/2",
  L: "bb1@3 ~", M: "f2@3 ~", N: "[eb2@29 ~@3]/2", O: "[eb2@15 ~]/2", P: "f2@13 ~@3", Q: "[bb1@13 ~@3]/2",
  R: "[bb1@31 ~]/2", S: "[f1@15 ~]/2", T: "[bb1@15 ~]/2", U: "[eb2@25 ~@7]/2", V: "f1@3 ~@5 f1@4 ~@4", W: "bb1@3 ~@5",
  X: "f1@9 ~@4 bb1@3", Y: "eb1@6 ~@2 g1@7 ~", Z: "bb1@7 ~ c2@5 ~@3", AA: "db2@3 ~ c2@3 ~", AB: "bb1@4 g1@3 ~",
  AC: "bb1@6 ~@2 d2@7 ~", AD: "f2@6 ~@2 g2@5 ~@3", AE: "ab2@5 ~@3 g2@6 ~@2", AF: "f2@4 d2@3 ~", AG: "c2@6 ~@2 e2@7 ~",
  AH: "g2@6 ~@2 a2@7 ~", AI: "c3@3 ~ a2@3 ~", AJ: "g2@7 ~ e2@5 ~@3", AK: "f1@7 ~ a1@7 ~", AL: "c2@5 f1@2 ~ d2@5 f1@2 ~",
  AM: "eb2@5 f1@3 d2@5 ~@3", AN: "c2@7 ~ a1@5 c2@2 ~", AO: "bb1@6 ~@2 f2@7 ~", AP: "bb1@3 ~ f2@3 ~",
  AQ: "eb2@3 ~ bb2@3 ~", AR: "eb2@6 ~@2 bb2@5 ~@3", AS: "bb1@3 ~ d2@3 ~", AT: "f2@6 ~@2 g2@5 d2 ~@2", AU: "f1@7 ~ c2@8",
  AV: "f1@7 ~ c2@7 ~", AW: "bb1@15 ~", AX: "eb2@7 ~", AY: "bb2@3 ~", AZ: "f1@3 ~@2 f1@4 ~@4 f1@2 ~",
  BA: "bb1@5 ~@8 f1@2 ~", BB: "~ bb1@6 ~@9", BC: "[~ bb1@62 ~]/4",
})).s("gm_acoustic_bass").gain(0.38)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
  A@2 B@2 C@2 D E F@2 G@2 H I J K ~@36 L@2 M@2 N@2 O P Q@2 R@2 S ~ T U ~@32 V@2 W@2 X@2 Y@2 Z AA AB@2 AC@2 AD@2 AE@2
  AF@2 AG AA AH@2 AI@2 AJ ~ AK@2 AL ~ AM AN AO@2 A@2 B@2 C@2 D E F@2 G@2 H I J ~@5
>`.pickRestart({
  A: "[~@9 [d4,f4]@11 ~@4 f4@3 ~@5, ~@21 [d4,g4]@6 ~@5]/2", B: "[~@8 [g4,bb4]@11 ~ c5@2 ~ bb4@2 ~@7, ~@20 g4@5 ~@7]/2",
  C: "[~@8 [d4,f4]@11 ~@2 [d4,g4]@2 ~ d4@4 ~@4, ~@12 f4 ~@3]/2", D: "~ [a3,c4]", E: "~@4 d4@3 c4@3 ~@6",
  F: "[~@8 [d4,f4]@11 ~ [d4,g4]@4 f4@3 ~@5]/2", G: "[~@8 [g4,bb4]@11 ~ c5@3 bb4@3 ~@6]/2",
  H: "[f4,a4]@2 ~@2 [f4,a4]@3 ~@5 [f4,a4]@2 ~@2", I: "[f4,a4]@3 ~@5 [f4,a4]@3 ~@5", J: "~ [f4,bb4]@3 ~@12",
  K: "~ [f4,a4]@11 ~@4", L: "[~@8 [d4,f4]@3 ~ g4@8 ~@4 d4@4 bb3@2 ~@2, ~@8 bb3@15 ~@9, ~@10 f4@5 ~]/2",
  M: "[~@8 [eb4,g4]@3 ~ [eb4,c5]@7 ~@5 g4@5 ~@3, ~@8 bb4@6 ~@6 bb4@9 ~@3, ~@11 g4@7 ~@14]/2", // Eb Cm
  N: "[~@8 [bb3,d4,f4]@3 ~@13 d4@5 ~@3, ~@12 [bb3,g4]@11 ~@9, ~@20 f4@9 ~@3]/2", O: "~@8 [f4,a4,c5]@3 ~ [a4,d5]@4",
  P: "~@5 f4@4 a4@5 ~@2, ~@5 c5@8 ~@3", Q: "[~@8 [d4,f4]@3 ~ g4@7 ~@5 d4@5 ~@3, ~@8 bb3@11 ~ f4@9 ~@3]/2",
  R: "[~@4 bb4@2 ~@4 bb4@2 g4 ~@3, ~@8 g4@9 ~@15, ~@8 eb4@3 ~ c5@13 ~@7]/2", S: "[f4,a4,c5]@5 ~@3",
  T: "[bb3,d4,f4]@5 ~@11", U: "[f4,a4,c5]@9 ~@7", V: "[~@8 d4@13 bb3@4 d4@5 ~@2, ~@4 f4@11 ~]/2",
  W: "[~@4 [g4,bb4]@7 ~@5, ~@8 eb4@11 ~@13]/2", X: "[~@12 bb3@6 ~@2 bb3@4 d4@5 ~@3, ~@8 f4@21 ~@3, ~@8 d4@13 ~@11]/2",
  Y: "[~@8 [g4,bb4]@13 ~@11]/2", Z: "~@8 [d4,f4]@5 bb3@2 ~", AA: "~@8 [c4,f4]@5 ~@3, ~@8 a4@3 ~@5",
  AB: "[~@4 [bb3,d4,f4]@7 ~@5]/2", AC: "[~@23 g4@4 ~@5, ~@4 [d4,f4]@11 ~]/2", AD: "[~@8 [eb4,g4,bb4]@11 ~@13]/2",
  AE: "[~@12 bb3@5 ~@3 bb3@4 d4@5 ~@3, ~@8 f4@21 ~@3, ~@8 d4@13 ~@11]/2", AF: "[~@8 [eb4,g4,bb4]@15 ~@9]/2",
  AG: "~@4 [d4,f4]@3 ~", AH: "[~@8 [d4,f4]@13 ~@11, ~ bb3 ~@2]/2", AI: "[~@6 bb3@3 ~@3 g4@2 ~@2, ~@8 [d4,f4]@21 ~@3]/2",
  AJ: "~@8 [eb4,g4,bb4]@7 ~", AK: "[~@12 bb3@5 ~@7 g4@4 ~@4, ~@8 [d4,f4]@21 ~@3]/2", AL: "~@4 [eb4,g4,bb4]@3 ~",
  AM: "bb3@8 [d4,f4]@5 ~@3", AN: "~@4 [c4,f4,a4]@3 ~", AO: "[~@8 [d4,f4]@13 ~@11, ~@8 bb3@9 ~@15]/2",
})).s("gm_electric_guitar_jazz").gain(0.33).pan(0.3)

// chords · electric guitar jazz · "JAZZ GTR" · soft notes
const electric_guitar_jazz_2 = note(`<
  ~@3 A ~@3 B ~@3 C ~@43 D ~@2 E ~ F G H@2 ~@48 I J ~@11 K ~@3 L ~@13 B ~@3 C ~@8
>`.pickRestart({
  A: "~@7 c5@2 ~@7", B: "~@4 a3@5 ~@7", C: "~@4 g4@7 ~@5", D: "~@4 eb4@5 ~@7", E: "~@3 f4", F: "~@11 d4@5",
  G: "~@4 bb3@3 ~@9", H: "[~@11 eb4@15 ~@6]/2", I: "~@3 bb3", J: "~@4 bb3@5 ~@7", K: "~@5 bb3@4 ~@7", L: "~ bb3 ~@2",
})).s("gm_electric_guitar_jazz").gain(0.16).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ 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 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4 B ~@4
>`.pickRestart({
  A: "x", B: "~ x ~@6",
})).gain(0.44)

// drums · snare
const snare = s("sd").struct("<A@12 B C D@2 A@80 B C D@2 A@48 B C D E ~@4>".pickRestart({
  A: "~ x", B: "x ~@4 x ~@7 x ~@2", C: "x!2", D: "x", E: "~ x ~@6",
})).gain(0.49)

// drums · clap
const clap = s("cp").struct("<~@41 A ~@3 A ~@79 A ~@3 A ~@26>".pickRestart({
  A: "x!2",
})).gain(0.49)

// drums · low tom
const low_tom = s("lt").struct("<~@150 [~@13 x ~@2] x ~@4>").gain(0.49)

// drums · hihat
const hihat = s("hh").struct("<A@6 B A@5 C A D E A@74 B A@5 C A D E A@42 B A@5 C A E ~@5>".pickRestart({
  A: "x!2", B: "x ~@4 x ~@2 x ~@7", C: "x ~@4 x ~@7 x ~@2", D: "x ~@12 x ~@2", E: "x",
})).gain(0.33)

// drums · mid tom
const mid_tom = s("mt").struct("<~@150 [~@11 x ~ x ~@2] ~@5>").gain(0.44)

// drums · high tom
const high_tom = s("ht").struct("<~@150 [~@5 x ~@2] ~@5>").gain(0.38)

// drums · ride
const ride = s("rd").struct("<A@12 B A C ~ A@80 B A C ~ A@48 B A C ~@5>".pickRestart({
  A: "x!2", B: "x ~@4 x ~@7 x ~@2", C: "x",
})).gain(0.33)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@29 A ~@3 A ~@79 A ~@3 A ~@38>".pickRestart({
  A: "x!2",
})).gain(2.77)

stack(
  piano, bass, electric_guitar_jazz, electric_guitar_jazz_2, kick, snare, clap, low_tom, hihat, mid_tom, high_tom, ride,
  cabasa
)

More by Fats Domino