Strudelify

Blue Suede Shoes

Carl Perkins

KeyA majorTempo172 bpm
0:00/0:00
// Blue Suede Shoes — Carl Perkins
// 172 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 95 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(172/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 · acoustic bass
const bass = note(`<
  ~ A B C ~ D E F G H I@2 J H K L@5 B D E F G H I@2 J H M@3 J E F G H I@2 J H K L@5 B D E F G H I@2 J H M@3 J E F G H
  I@2 J H K L N D E F G H I@2 J H M@3 J E F G H I@2 J O@2
>`.pickRestart({
  A: "~@3 a2", B: "a2@5 ~@19", C: "~@6 a2@5 ~ a2@5 ~@7", D: "a2@6 b2@5 ~ c3@6 c#3@6", E: "d3 c3 a2 c3",
  F: "d3 c3 a2 g2", G: "a2!2 e2!2", H: "a2!2 e2 g2", I: "e2!2 b2 d3", J: "a2 g2 e2 g2", K: "a2@6 ~@12 a2@5 ~",
  L: "a2@5 ~@13 a2@5 ~", M: "a2 c#3 e3 g2", N: "a2@5 ~@13 a2@6", O: "[a2@6 a2@3 ~ a2@6 ~@2 a2@27 ~@3]/2",
})).s("gm_acoustic_bass").gain(0.36)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A B C ~@2 D@2 E@2 F@2 E@2 G@6 H ~ D@2 E@2 F@2 E@6 D@2 E@2 F@2 E@2 G@6 H ~ D@2 E@2 F@2 E@6 D@2 E@2 F@2 E@2 G@2 H ~
  D@2 E@2 F@2 E@6 D@2 E@2 F@2 E I@2
>`.pickRestart({
  A: "~@8 a2 [a2,e3,a3,c#4]@2 [a2,e3,a3]", B: "[a2,e3,a3,c#4]@5 ~@19",
  C: "~@4 a2@2 [a2,e3,a3,c#4]@4 [a2,e3,a3]@2 [a2,e3,a3,c#4]@5 ~@7", // A A5 A
  D: "[d3,a3,d4]@2 [a3,d4] ~@2 d3 [d3,a3,d4]@2 [d3,a3,d4] [d3,a3]@2 [d3,a3], f#4 f#4@2 [d4,f#4], ~@2 d3@3 ~@7, ~ [a3,d4] ~@2", // D5 D D5
  E: "[e3,a3,c#4]@2 [a3,c#4] ~@2 e3 [e3,a3,c#4]@2 [e3,a3,c#4] [e3,a3]@2 [e3,a3], e4 e4@2 [c#4,e4], ~@2 e3@3 ~@7, ~ [a3,c#4] ~@2", // A A5 C#m A
  F: "[e3,g#3,b3]@2 [g#3,b3] ~@2 e3 [e3,g#3,b3]@2 [e3,g#3,b3] [e3,g#3]@2 [e3,g#3], e4 e4@2 ~, ~@2 e3@3 ~@7, ~ [g#3,b3] ~ [b3,e4]", // E G#m E G#m E5
  G: "[e3,a3,c#4,e4]@2 ~@6 [e3,a3,c#4] [e3,a3]@2 [e3,a3], ~@3 [c#4,e4]", H: "[e3,a3,c#4,e4] ~@5",
  I: "[[e3,a3,c#4]@2 [a3,c#4] [a3,c#4,e4]@2 [e3,a3,c#4,e4]@3 ~ [f#4,a4]@12 ~@3, e4@3 ~@6 c#4@13 ~@2, ~@4 e3@6 ~@7 [e3,a3]@26 ~@5]/2", // A F#m A5
})).s("gm_acoustic_guitar_steel").gain(0.23).pan(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@6 A@2 B@2 C D E@2 ~@8 F@2 G H@2 I J K L M N O P Q@2 R S T@2 U ~@8 F@2 V W X Y J Z@2 AA M N AB AC AD AE AF@2 AG AH
  ~@4 AI AJ AK AL AM AN AO AP AQ@4 AI AJ AQ@2 AR AS AT AU@2
>`.pickRestart({
  A: "[~@28 [d4,f#4]@4 ~@2 a3@5 ~ [a3,d4]@6 ~@2, ~@2 f#4@3 a3@4 d4@4 ~@7 f#4@2 ~@2, ~@6 d4@6 f#4@9 ~ a3@11 ~@15]/2", // D D5
  B: "[~@4 c5@8 a4@4 g4@2 a4@3 ~ g4@5 ~ e4@2 g4@4 a4@8 g4@6]/2",
  C: "~@4 [g#3,b3,d4,f#4]@2 ~@4 [g#3,b3,d4,f#4]@3 ~@3 [g#3,b3,d4,f#4]@2 ~@4 [g#3,b3,d4,f#4]@2", // G#m7b5
  D: "~@4 [g#3,b3,d4,f#4]@3 ~@3 [g#3,b3,d4,f#4]@3 ~@3 [g#3,b3,d4,f#4]@3 ~@5", // G#m7b5
  E: "[~@4 e4@2 a4@4 g4@2 a4@6 g4@2 ~@2 [e4,a4]@6 e4@2 g4@3 ~ [e4,a4]@10 ~@4]/2", // A5
  F: "[~@4 [d4,f#4]@7 ~@17 [d4,f#4]@4 ~@2 a3@5 ~ [a3,d4]@6 ~@2, ~@4 a3@8 f#4@9 ~ a3@11 ~@15, ~@9 d4@4 ~@7 f#4@2 ~@2]/2", // D D5
  G: "~@3 a4@5 e4 g4@2 e4",
  H: "[a4@4 a4@2 g4@4 a4@5 ~@7 [e3,g#3]@6 b3@2 [b3,d4,f#4]@3 ~ [b3,d4,f#4]@3 ~@3 [b3,d4]@3 ~@3 [b3,d4,f#4]@2]/2", // E Bm
  I: "~@4 [b3,d4,f#4]@2 [e3,b3]@3 ~ [b3,d4,f#4]@3 ~@3 [b3,d4]@4 ~@4", J: "~@3 [e4,a4]@5 e4 g4@2 e4",
  K: "[e4,a4]@6 g4@4 [e4,a4]@6 [a4,c5]@5 ~ d4@2", L: "c#4@2 d4 [d#4,a4]@2 d4 [e4,a4]@2 d#4 e4@2 a4",
  M: "d#4@2 e4 a4@2 d#4 e4@2 a4 d#4@2 e4", N: "a4@2 d#4 e4@2 a4 d#4@2 e4 a4@2 d#4",
  O: "e4@2 a4 d#4@2 e4 a4@2 d#4 e4@2 a4", P: "~@4 [a3,c4]@6 a3 ~ a3@3 ~ a3 ~ a3@3 ~ a3 ~, ~@6 [c4,a4]@5 ~",
  Q: "[c4@4 a3 ~ [c4,a4]@4 a3 ~ [c4,a4]@4 [a3,a4]@2 c4@4 c#4@8 a4@9 ~ e4 ~ c5@2 ~@4]/2", // F A
  R: "a4@2 e4 g4@2 ~@3 g4@4, ~@5 e4@7, ~@5 a4@4 ~@3", S: "e4@3 ~ e4@2 e4@4 d4@2 c4@4 a3@2 [c4,e4]@4 a3@2, a4 ~",
  T: "[c4@4 a3 ~ [c4,e4]@4 ~@2 c4@3 ~ a3@2 g3@3 ~ [a3,e4]@6 [c#4,a4]@3 ~@5 [c#4,a4]@4 a4@2 g4@2 ~@4, ~@40 c#4@5 ~@3]/2", // C A5 F#m
  U: "[c#4,a4]@4 a4@2 f#4@2 ~@2 [c#4,a4]@6 [c#4,f#4]@5 ~@3, ~ c#4 ~@4", V: "~@3 [e4,a4]@6 g4@2 ~",
  W: "a4@4 a4@2 g4@4 a4@6 g4@5 ~@3", X: "~@4 b3@2 [d4,f#4,b4]@3 ~ [d4,f#4,b4]@3 ~@3 [f#4,b4]@3 ~@3 [d4,f#4,b4]@2",
  Y: "~@4 [d4,f#4,b4]@2 [b3,d4]@3 ~ [b3,d4,f#4]@3 ~@3 [b3,d4]@4 ~@4", // Bm
  Z: "[[e4,a4]@6 g4@4 [e4,a4]@6 g4@5 ~ d#4@2 e4@4 c#4@2 d4@4 d#4@2 e4@4 e4@2 e4@4 d#4@2, ~@22 a4@13 ~ a4@8 ~@4]/2", // A5
  AA: "e4@2 [e4,a4] d#4@2 e4 [e4,a4]@2 d#4 e4@2 a4", AB: "e4@3 d#4@2 d4 c4@2 a3 c4@2 d4",
  AC: "d#4@3 ~ e4@2 [c4,a4]@4 e4@2 c4@4 a3 ~ [a3,c4]@3 ~ c4@2", AD: "a3@3 e4@2 a4 e4@2 a4 [e4,a4]@3",
  AE: "[e4,a4]@2 [e4,a4] [e4,a4]@2 [e4,a4] [e4,a4]@2 a3 c4@2 d4", // A5
  AF: "[e4@4 d4 ~ e4@4 d4@2 c4@3 ~ a3@3 ~@3 c4@6 d4@2 c4@4 a3@2 c4@4 a3@2 c4@3 ~ c4@2]/2",
  AG: "a3@6 e4@8 ~@2 e4@2 f#4@4 e4 ~, ~@6 a4@13 ~@5",
  AH: "[e4,a4]@3 ~@3 f#4@3 ~ a4@6 f#4@4 ~@4, ~@2 [e4,a4]@2 ~ e4@5 ~@2", // A5
  AI: "~@4 [a3,c4,f#4]@3 ~@5 [a3,c4,f#4]@4 ~@6 [a3,c4,f#4]@2", // F#dim
  AJ: "~@4 [a3,c4,f#4]@4 ~@2 [a3,c4,f#4]@3 ~@3 [a3,c4,f#4]@5 ~@3", // F#dim
  AK: "a3@3 ~@3 [a3,c#4,e4,a4]@10 f#4@2 e4@4 a3@2, ~@8 c#4@3 ~, ~@4 a3 ~", // A
  AL: "[a3,c#4,a4]@2 a4 f#4@2 [c#4,a4]@3 [a3,c#4,f#4]@3 ~, ~@4 [a3,c#4]@5 ~ a3@4 ~@10", // A F#m A
  AM: "~@4 [d4,f#4,b4]@2 [d4,f#4,b4]@3 ~ [d4,f#4,b4]@2 ~@4 [d4,f#4,b4]@6 ~@2", // Bm
  AN: "~@4 [d4,f#4,b4]@2 f#4 ~@3 [d4,f#4,b4]@3 ~@3 [d4,f#4,b4]@3 ~@5", // Bm
  AO: "~@3 [a3,c#4,e4,a4]@5 g4 e4@2 a3, ~@8 c#4@3 ~, ~@4 a3 ~", // A
  AP: "[a3,c#4,a4]@2 a4 g4@2 [c#4,a4]@3 [a3,c#4,g4]@3 ~, ~@4 [a3,c#4]@5 ~ a3@4 ~@10", // A F#m A7 A
  AQ: "a2@2 a2 c#3@2 d3 e3@2 e3 f#3@2 e3", AR: "e2@2 ~@2 e2@6 e3@8 b2@5 ~", AS: "e2@3 ~ e2@5 ~ f#2@6 g#2@4 ~@4",
  AT: "~@6 c#5@4 a4@2 g#4@3 ~ e4@2 e4@3 ~ c#4@2",
  AU: "[c4@3 ~ c#4@3 a3@3 a3@4 ~@4 a4@27 ~@3, ~@5 a3@9 ~@2, ~@16 [c#4,e4]@27 ~@5, ~@17 f#4@26 ~@5]/2", // C#m
})).s("gm_electric_guitar_clean").gain(0.28).pan(0.7)

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

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

// drums · hihat
const hihat = s("hh").struct("<~ A B C ~@10 D@6 B ~@21 D@6 B ~@21 D@2 B ~@22>".pickRestart({
  A: "~@3 x", B: "x", C: "~ x!2 ~", D: "x ~@2 x",
})).gain(0.38)

// drums · ride
const ride = s("rd").struct("<~@6 A@8 ~@8 A@20 ~@8 A@20 ~@4 A@19 B ~>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x", B: "x ~ x!2 ~ x ~@6",
})).gain(0.33)

// drums · splash
const splash = s("cr").struct("<~@93 [~@3 x] ~>").gain(0.44)

stack(bass, acoustic_guitar_steel, electric_guitar_clean, kick, snare, hihat, ride, splash)