Strudelify

One Thing Leads to Another

FIXX

KeyB♭ minorTempo138 bpm
0:00/0:00
// One Thing Leads to Another — FIXX
// 138 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 "Overdrive" overdriven guitar (copy of ch 3 "Bass&Lead" lead 8 bass lead)
// note: Full arrangement: all 124 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(138/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 · lead 3 calliope · "SynCalliop"
const lead_3_calliope = note(`<
  ~@7 A@2 B C@2 D E F G H I J@3 K L M@3 N O P Q R S@2 B C@2 D E F G H I J@3 K L M@3 N O P Q R T ~@4 U V W ~@16 X@3 N O P
  Q R Y@2 B C@2 D E F G H I J@3 K L M@3 N O P Q R Z U V W ~ U V W ~ U V W ~
>`.pickRestart({
  A: "[~@10 f5 ~ f5 ~ ab5@5 ~ f5@3 ~@5 f5@3 ~]/2", B: "db5@3 ~@11 db5 ~",
  C: "[eb5 ~ eb5 ~ eb5 ~ eb5@3 ~ db5 ~ eb5 ~ f5@7 ~@5 f5 ~ f5 ~ f5 ~]/2", D: "ab5@3 ~ f5@3 ~@7 db5 ~",
  E: "eb5 ~ eb5 ~ eb5@3 ~@7 db5 ~", F: "eb5 ~ db5 ~ eb5 ~ db5 ~ eb5 ~ db5 ~ eb5 ~ bb4 ~", G: "bb4@5 ~@5 f5 ~ f5 ~ f5 ~",
  H: "ab5@3 ~ f5@7 ~ f5@3 ~", I: "db5@5 ~@11",
  J: "[eb5 ~ db5 ~ eb5 ~ db5 ~ eb5 ~ db5@3 ~ f5@7 ~@5 f5 ~ f5 ~ ab5@5 ~ f5 ~ f5 ~ db5@3 ~ bb4 ~ db5 ~]/3",
  K: "eb5@3 ~ eb5 ~ db5 ~ eb5@3 ~@5", L: "~@2 f5 ~ eb5 ~ db5 ~ eb5 ~ db5 ~ eb5 ~ db5 ~",
  M: "[f5@3 ~ f5 ~ db5@3 ~ db5@3 ~ eb5@5 ~ eb5 ~ eb5 ~ db5@4 ~@2 eb5@5 ~ eb5 ~ eb5 ~ db5@5 ~@3]/3",
  N: "f5@3 ~ eb5@3 ~ db5 ~ eb5 ~ db5 ~ f5@2", O: "~@2 f5@3 ~ bb4 ~ db5 ~ db5 ~ eb5 ~ db5 ~",
  P: "f5 ~ bb4 ~ db5 ~ bb4 ~ db5 ~ db5 ~ bb4 ~ db5@2", Q: "~@2 ab4 ~ ab4@7 ~@5",
  R: "f5@3 ~ eb5@3 ~ db5 ~ f5 ~ db5 ~ f5@2", S: "[~@2 f5@5 ~@3 eb5 ~ f5 ~ ab5@5 ~ f5@3 ~@5 f5@3 ~]/2",
  T: "~@2 f5 ~ db5@3 ~ db5@3 ~ db5@3 ~", U: "f5@3 ~ f5@3 ~@9", V: "db5@3 ~ db5@3 ~ g5@3 ~ ab5 ~ g5 ~",
  W: "bb5@2 ab5@2 g5 ~ f5@7 ~@3",
  X: "[~@4 f5 ~ db5 ~ db5 ~ db5@3 ~ eb5@5 ~ eb5 ~ eb5 ~ db5@4 ~@2 eb5@5 ~ eb5 ~ eb5 ~ db5@5 ~@3]/3",
  Y: "[f5 ~ f5@5 ~@3 eb5 ~ f5 ~ ab5@5 ~ f5@3 ~@5 f5@3 ~]/2", Z: "~@2 f5 ~ db5@3 ~ db5@3 ~@5",
})).s("gm_lead_3_calliope").gain(0.48)

// bass · electric bass finger · "FingeredBs"
const bass = note(`<
  A B C ~ A B C ~ D E F B D E F B D E F B G E F H I J K@2 I L M N D E F B D E F B D E F B G E F H I J K@2 I L M ~ O@8 D
  E F B D E F B D E F B G E F H I J K@2 I L M N D E F B D E F B D E F B G E F H I J K@2 I L M N P@12
>`.pickRestart({
  A: "bb1@4 ~@2 bb1 ~ db2@3 ~ bb1 ~@3", B: "~@14 ab1 ~", C: "bb1@3 ~ db2 ~ bb1 ~@9",
  D: "bb1@3 ~@3 bb1 ~ db2@3 ~ bb1@3 ~", E: "~@6 bb2@3 ~ eb2 ~ db2@3 ~", F: "[bb2,f3,ab3]@3 ~ db3 ~ bb2 ~@9",
  G: "bb1@3 ~@3 bb1 ~ bb1@3 ~ bb1@3 ~", H: "~@12 [bb2,f3,ab3]@3 ~", I: "[bb2,f3,ab3]@11 ~@5",
  J: "[bb2,f3,ab3]@8 ~@4 ab2 ~ bb2 ~", K: "[bb1@27 ~@5]/2", L: "[bb2,f3]@5 ~@3 bb2@3 ~ ab2 ~ bb2 ~", M: "bb1@11 ~@5",
  N: "~@12 ab2 ~ bb2 ~", O: "bb1@3 ~@3 bb1 ~ bb1@3 ~@3 bb1 ~", P: "bb1@3 ~@3 bb1 ~ bb1@3 ~ ab2 ~ bb2 ~",
})).s("gm_electric_bass_finger").gain(0.27).pan(0.1)

// chords · lead 8 bass lead · "Bass&Lead"
const lead_8_bass_lead = note("<~@31 A@6 B@8 C@3 ~@15 A@6 B@8 C@3 ~@7 A@6 B@8 C@3 ~@20>".pickRestart({
  A: "[~@14 bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ g4@2 bb1 ~ [db4,f4,ab4] ~ g4@3 ~ bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 [db4,f4,ab4]@2, ~@14 [db4,f4,ab4,bb4]@5 ~@11 [db4,f4,ab4]@5 ~@5 bb1@2 ~@4 [db4,f4,ab4,bb4]@5 ~@11 [db4,f4,ab4,bb4]@5 ~@11 [db4,f4,ab4,bb4]@5 ~@11 bb1 ~]/6", // Bbm7 Db Bbm7 Db Bbm7 Db Bbm7
  B: "[bb1@3 ~ g4@2 bb1 ~ [db4,f4,ab4] ~ g4@3 ~ bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ g4@2 bb1 ~ [db4,f4,ab4] ~ g4@3 ~ bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 [db4,f4,ab4]@2, ~@8 bb1@2 ~@4 [db4,f4,ab4,bb4]@5 ~@11 [db4,f4,ab4,bb4]@5 ~@11 [db4,f4,ab4,bb4]@6 ~@10 [db4,f4,ab4,bb4]@5 ~@5 bb1@2 ~@4 [db4,f4,ab4,bb4]@5 ~@11 [db4,f4,ab4,bb4]@5 ~@11 [db4,f4,ab4,bb4]@5 ~@11 bb1 ~]/8", // Db Bbm7 Db Bbm7 Db Bbm7
  C: "[bb1@3 ~ g4@2 bb1 ~ [db4,f4,ab4] ~ g4@3 ~ bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~ bb1@2 [db4,f4,ab4,bb4] ~@3 bb1 ~ bb1@3 ~ [db4,f4,ab4,bb4] ~ bb1 ~@9, ~@8 bb1@2 ~@4 [db4,f4,ab4,bb4]@5 ~@11 [db4,f4,ab4,bb4]@5 ~@13]/3", // Db Bbm7
})).s("gm_lead_8_bass_lead").gain(0.31).pan(0.9)

// drums · kick
const kick = s("bd").struct(`<
  [x!2]!24
  [x ~@3 x!2 ~@2]!7
  [x!2]!17
  [x ~@3 x!2 ~@2]!16
  [x!2]!16
  [x ~@3 x!2 ~@2]!7
  [x!2]!17
  [x ~@3 x!2 ~@2]!20
>`).gain(0.37)

// drums · snare
const snare = s("sd").struct("<~@3 A B@3 C B@15 C B@7 C B@15 C B@11 C B@3 D B@23 C B@36>".pickRestart({
  A: "~@6 x!2", B: "~ x ~ x", C: "~@2 x ~@3 x!2", D: "~@4 x ~@7 x!4",
})).gain(0.46)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!4 [x!8]!120>").gain(0.37)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 A ~@19 A ~@23 A ~@11 A ~@3 A ~@60>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.46)

// drums · high tom
const high_tom = s("ht").struct("<~@3 A ~@19 A ~@23 A ~@11 A ~@3 A ~@60>".pickRestart({
  A: "~@6 x!2",
})).gain(0.46)

// drums · crash
const crash = s("cr").struct("<~@4 A ~@3 A ~@15 A ~@7 A ~@15 A ~@7 A ~@3 A ~@3 A ~@23 A ~@35>".pickRestart({
  A: "x",
})).gain(0.37)

// drums · tambourine
const tambourine = s("tb").struct("<[~ x ~ x]!4 ~@120>").gain(0.46)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@56 [x!4]!4 ~@64>").gain(2.32)

stack(lead_3_calliope, bass, lead_8_bass_lead, kick, snare, hihat, mid_tom, high_tom, crash, tambourine, cabasa)