Strudelify
KeyD♭ majorTempo125 bpm
0:00/0:00
// Trouble — Lindsey Buckingham
// 125 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 11 "Vocal" clarinet (copy of ch 2 "Vocal" clarinet, 0.167 beats late); ch 9 "Lead Guitar" acoustic guitar steel (copy of ch 8 "Lead Guitar" acoustic guitar steel, 0.333 beats late)
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Lead Guitar.
setcpm(125/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 · harpsichord · "Harp"
const harpsichord = note(`<
  ~@4 A B C D A E C F A G C H I J K L M@2 N@2 M@2 N@2 M@2 O@2 A P C Q A R C F A G C H I J K L M@2 N@2 M@2 N@2 M@2 S@2 T
  U V W T X V Y Z G C H I J K L M@2 N@2 M@2 N@2 M@2 S@2 ~@25
>`.pickRestart({
  A: "[db4,f4,db6] [c4,eb4,c6]", B: "[bb3,db4]@2 ~ [bb3,db4,bb4] [bb3,db4,bb4,db6]!2 [bb3,db4,bb4]@2, db6@4 ~@2 db6 ~",
  C: "[bb3,db4,bb5]@8 [ab3,c4,ab5]@7 ~", // Bbm Ab
  D: "[f3,bb3,f5]@6 [f3,bb3,bb4]@2 [bb3,f4,bb4]@2 f4 ~ [ab4,eb5]@4, ~@6 [f5,bb5] ~ [f5,bb5] ~ [bb3,bb4,bb5]@6, ~@5 f5@2 ~", // Bb5 Ab5 Bb5 Bb
  E: "[bb3,db4]@2 ~ [bb3,db4,bb4] [db4,bb4] [bb4,db6]!3, db6@8 bb3 ~ [bb3,db4]@5 ~", // Bbm Gb Bbm
  F: "[f3,bb3,f5]@3 [f3,bb3,bb4] [bb3,f4,bb4] f4 [ab4,eb5]@2, ~@6 [f5,bb5] ~ [f5,bb5] ~ [bb3,bb4,bb5]@6, ~@5 f5@2 ~", // Bb5 Ab5 Bb5 Bb
  G: "[bb3,db4,db6]@3 [bb3,db4,bb4,db6] bb3!2 bb3@2, ~ [db4,bb4,db6]", // Bbm Gb
  H: "[f3,bb3,f5]@3 [f3,bb3,bb4] f5@2 [ab4,eb5]@2, ~@6 [f5,bb5] ~ [bb3,f4,bb4,bb5]@6 ~@2", // Bb5 Ab5 Bb5
  I: "[gb3,bb3,db4,gb4,gb5] [gb3,ab3,c4,f4,f5]", // Gb Fm
  J: "[gb3,bb3,gb4,gb5]@3 [gb3,bb3,db4,gb4,gb5] [gb3,bb3,db4,gb4,gb5]@4, eb4 ~", // Gb
  K: "[ab3,c4,eb4,ab4,gb5,ab5]@3 [ab3,c4,eb4,ab4,ab5] [ab3,db4,ab4,ab5]@4, ~@4 f5@3 ~", // Ab7 Ab Db5
  L: "[ab3,c4,eb4,ab4,eb5,ab5]@3 [ab3,c4,eb4,ab4,ab5] [ab3,bb3,db4,eb4,ab4,ab5]@4, ~@4 db5@3 ~", // Ab Absus4
  M: "[~@4 [db4,db5,db6]!2 [bb4,bb5,bb6] [ab4,ab5,ab6]@3 [f4,f5,f6]@2 [db4,db5,db6]@2 [ab3,ab4,ab5]@2]/2", // Db Bb Ab F Db Ab
  N: "[[bb3,bb4,bb5]@2 [ab3,ab4,ab5]@3 ~@3]/2", // Bb Ab
  O: "[[bb4,bb5]@4 [ab4,ab5]@4 [bb4,bb5]@4 [ab4,ab5]@4 db5 ~ db5 ~ c5@2 ab4@2 ab5 f5 ~ ab4 ab5 f5 db5 ~, bb3@4 ab3@6 ~@3 db5 ~@2]/2", // Bb Ab Bb Ab
  P: "[ab3,db4,db5], db6 ~", Q: "f5@5 ~ bb4@2 [f4,bb4]@2 f4 ~ [ab4,eb5]@4, [f3,bb3], ~@5 bb4@3",
  R: "db6@4 ~ db6!3, [bb3,db4,bb4]@15 ~", // Bbm
  S: "[[bb4,bb5]@2 [ab4,ab5]@2 [bb4,bb5]@2 [ab4,ab5]@2 [db5,db6]@2 ~ ab4 [ab5,ab6]@2 [f5,f6]@2, bb3@2 ab3@3 [bb5,bb6] ~@2]/2", // Bb Ab Bb Ab Db Ab F Bb
  T: "[db4,f4]@7 ~ [c4,eb4]@7 ~", U: "[ab3,db4,db5]", V: "[bb3,db4]@7 ~ [ab3,c4]@7 ~", W: "~@3 ab4, [f3,bb3]",
  X: "[bb3,db4,bb4]@15 ~", // Bbm
  Y: "[f3,bb3]@3 [f3,bb3,bb4] [bb3,f4,bb4] f4 [ab4,eb5]@2, ~@6 f5 ~ f5 ~ [bb3,bb4]@6, ~@5 f5@2 ~", // Bb5 Ab5 Bb
  Z: "[db4,f4]@7 ~ [c4,eb4,c6]@8", // Db Cm
})).s("gm_harpsichord").gain(0.48).pan(0.7)

// bass · electric bass pick · "Bass"
const bass = note(`<
  ~@4 A B C D B E F G A B C H I J K L M N O@2 M N O@2 M N O P A B C D B E F G A B C H I J K L M N O@2 M N O@2 M N O P A
  B C D B E F G A B C H I J K L M N O@2 M N O@2 M N O P M N O@2 M N O@2 M N O P M N O@2 M N O@2 M N O P ~
>`.pickRestart({
  A: "db2@4 ~@2 db2 ~ db2@7 ~", B: "db2@5 ~ db2 ~ db2@6 ~@2", C: "bb1@4 ~@2 bb1 ~ bb1@6 ~@2", D: "bb1@5 ~ f2@2 bb2@8",
  E: "db2@4 ~@2 db2 ~ db2@6 ~@2", F: "bb1@5 ~ bb1 ~ bb1@5 ~@3", G: "bb1@5 ~ f2 ab2 bb2@8",
  H: "bb1@4 ~@2 f2 ~ bb2@4 ab2@4", I: "gb2@5 ~ gb2 ~ gb2@6 ~@2", J: "gb2@4 ~@2 gb2 ~ gb2@6 ~@2",
  K: "ab2@5 ~ ab2 ~ ab2@6 ~@2", L: "ab2@4 ~@2 f2 ~ ab2@2 f2@2 db2@4", M: "gb1@4 ~@2 gb1 ~ gb1@7 ~",
  N: "gb1@5 ~ gb1 ~ gb1@6 ~@2", O: "ab1@4 ~@2 ab1 ~ ab1@6 ~@2", P: "ab1@4 ~@2 ab1 ~ ab1@2 bb1@2 c2@2 ab1@2",
})).s("gm_electric_bass_pick").gain(0.64).pan(0.4)

// other · electric guitar muted · "Mute Guitar"
const electric_guitar_muted = note(`<
  ~@4 A B C D A B C D A@4 E@2 F G A B E H A B E H A B E H A B C D A B C D A@4 E@2 F G A B E H A B E H A B E H A B C D A
  B C D A@4 E@2 F G A B E H A B E H A B E H A B E H A B E H A B E H A B E H A B E H A B E H ~
>`.pickRestart({
  A: "db4 ~ db4 ~@3 ab3 ~ db4 ~ db4 ~@3 ab3 ~", B: "db4 ~ db4 ~@3 ab3 ~ db4 ~ c4 ~ bb3 ~ ab3 ~",
  C: "bb3 ~ bb3 ~@3 f3 ~ bb3 ~ bb3 ~@3 f3 ~", D: "bb3 ~ bb3 ~@3 f3 ~ bb3 ~ ab3 ~ bb3 ~ c4 ~",
  E: "bb3 ~ bb3 ~@3 ab3 ~ bb3 ~ bb3 ~@3 ab3 ~", F: "c4 ~ c4 ~@3 ab3 ~ c4 ~ c4 ~@3 ab3 ~",
  G: "eb4 ~ eb4 ~@3 ab3 ~ eb4 ~ eb4 ~@5", H: "bb3 ~ bb3 ~@3 ab3 ~ bb3 ~ ab3 ~ bb3 ~ c4 ~",
})).s("gm_electric_guitar_muted").gain(0.46).pan(0.7)

// chords · epiano1 · "Piano"
const epiano1 = note(`<
  ~@20 A@2 B@2 A@2 B C A@2 B@2 ~@16 A@2 B@2 A@2 B C A@2 B@2 ~@16 A@2 B@2 A@2 B C A@2 B@2 A@2 B@2 A@2 B C A@2 B@2 A@2 B@2
  A@2 B C A@2 B@2 ~
>`.pickRestart({
  A: "[db5,gb5] ~ [db5,gb5] ~ [db5,gb5] ~ [db5,gb5] ~", B: "[eb5,ab5] ~ [eb5,ab5] ~ [eb5,ab5] ~ [eb5,ab5] ~",
  C: "[eb5,ab5]@2 ~@2 [eb5,ab5]@2 ~@2 [eb5,ab5]@3 ~ [eb5,ab5]@2 ~@2", // Ab5
})).s("gm_epiano1").gain(0.56).pan(0.6)

// other · acoustic guitar steel · "Lead Guitar"
const acoustic_guitar_steel = note("<~@62 A@2 ~@49>".pickRestart({
  A: "[~@15 f4@4 ~@13]/2",
})).s("gm_acoustic_guitar_steel").gain(0.52).pan(0.7)

// other · acoustic guitar steel · "Lead Guitar"
const acoustic_guitar_steel_2 = note(`<
  ~@60 A B C D E F G H ~@20 I@3 J K L M@3 N O P Q@2 R S T@3 U V W X@2 ~
>`.pickRestart({
  A: "c5 db5 eb5 c5 db5 eb5 c5 db5", B: "eb5 c5 db5 eb5 c5 db5 c5 db5", C: "c5 bb4 c5 db5 c5 bb4 c5 bb4",
  D: "f4@2 ab4 c5 ab4 f4 c5 ab4", E: "c5 db5 eb5 db5 c5 db5 c5 db5", F: "f4 ab4 bb4 f4@2 ~ db4 eb4",
  G: "f4@2 f4!2 f4@2 f4@2 f4@2 db4@2 f4@2 c4@2", H: "f4@2 bb3@2 f4@2 ab3@2 f4@2 f3@2 f4@3 ~",
  I: "[db5 ~ c5 ~ bb4 ~ ab4 ~ gb4 ~ f4 ~ eb4 ~ db4 ~ c4 ~@6 eb5, ~@2 eb5@3 ~@2 c5@2 ~ c5@3 ~@2 ab4@2 ~ ab4@2 ~@3 f4@2 ~ f4@2 ~@3 db4@2 ~@2 db4@2 eb4@2 f4@2 gb4@2 ab4@2 bb4@2 ~, ~@3 db5@3 db5@2 ~@3 bb4@3 bb4@3 ~@2 gb4@2 ~ gb4@2 ~@3 eb4@2 ~ eb4@2 ~@2 f4@2 gb4@2 ab4@2 bb4@2 c5@2 db5@2 ~@2]/3",
  J: "c5 db5 eb5 c5 db5 eb5 db5 c5", K: "db5 c5 bb4 ab4 bb4 ab4 gb4 ab4", L: "bb4 ab4 gb4 f4 gb4 ab4 bb4 ab4",
  M: "[db5 ~ c5 ~ bb4 ~ ab4 ~ gb4 ~ f4 ~ eb4 ~ db4 ~ bb3@5 ~@3, ~@2 eb5@3 ~@2 c5@2 ~ c5@3 ~@2 ab4@2 ~ ab4@2 ~@3 f4@2 ~ f4@2 ~@3 db4@2 ~@15, ~@3 db5@3 db5@2 ~@3 bb4@3 bb4@3 ~@2 gb4@2 ~ gb4@2 ~@3 eb4@2 ~ eb4@2 ~@16]/3",
  N: "~@10 db5 ~ eb5 ~ f5 ~", O: "db5 eb5@7", P: "~@5 f5 ~@2", Q: "[f5@3 ~@3 f5@6 bb4@10 ~@6 db5@2 eb5@2]/2",
  R: "f5 eb5 db5 eb5@3 ~@2", S: "~@6 bb4 c5",
  T: "[db5 ~ c5 ~ bb4 ~ ab4 ~ gb4 ~ f4 ~ eb4 ~ db4 ~ bb3@3 ab3@3 ~@2, ~@2 eb5@3 ~@2 c5@2 ~ c5@3 ~@2 ab4@2 ~ ab4@2 ~@3 f4@2 ~ f4@2 ~@3 db4@2 ~@15, ~@3 db5@3 db5@2 ~@3 bb4@3 bb4@3 ~@2 gb4@2 ~ gb4@2 ~@3 eb4@2 ~ eb4@2 ~@16]/3",
  U: "~@2 bb4 c5 db5 c5 bb4 db5", V: "gb4@3 ~@5", W: "~@7 db5", X: "[db5 eb5 eb5@7 ~@7]/2",
})).s("gm_acoustic_guitar_steel").gain(0.54).pan(0.2)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x!2 ~@3]!112 ~>").gain(0.72)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!112 ~>").gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!112 ~>").gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<~@23 A ~@27 A ~@27 A ~@11 A ~@11 A ~@9>".pickRestart({
  A: "~@7 x",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@23 A ~@6 B ~@16 C ~@3 A ~@3 D ~@2 B C ~@15 C ~@3 A ~@3 D ~@2 B C ~@3 A ~@3 D ~@2 B C ~@3 A ~@3 D ~@2 B C ~
>`.pickRestart({
  A: "~@4 x!2 ~@2", B: "~@4 x!3 ~", C: "~@6 x!2", D: "~@3 x ~@2 x ~",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@23 A ~@23 B ~@3 A ~@3 C ~@3 B ~@15 B ~@3 A ~@3 C ~@3 B ~@3 A ~@3 C ~@3 B ~@3 A ~@3 C ~@3 B ~
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@4 x!2 ~@2", C: "~@4 x!2 ~ x",
})).gain(0.72)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@50 A ~@27 A ~@11 A ~@11 A ~@10>".pickRestart({
  A: "~ x!2 ~@2 x!2 ~",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~@20 A ~@27 A ~ B ~ A ~@3 A ~@19 A ~ B ~ A ~@3 A ~@3 A ~ B ~ A ~@3 A ~@3 A ~ B ~ A ~@3 A ~@4
>`.pickRestart({
  A: "x", B: "x!2",
})).gain(0.64)

// drums · guiro
const guiro = s("guiro:4").struct(`<
  ~@4 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 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "x",
})).gain(13.52)

// drums · triangle
const triangle = s("triangles:35").struct("<~@46 A ~@6 A ~@20 A ~@6 A ~@11 A ~@11 A ~@7>".pickRestart({
  A: "x",
})).gain(4.18)

stack(
  harpsichord, bass, electric_guitar_muted, epiano1, acoustic_guitar_steel, acoustic_guitar_steel_2, kick, snare, hihat,
  low_tom, mid_tom, high_tom, high_tom_soft, crash, guiro, triangle
)