Strudelify

Passing Through

Bruce Hornsby

KeyD♭ majorTempo106 bpm
0:00/0:00
// Passing Through — Bruce Hornsby
// 106 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(106/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 · distortion guitar
const distortion_guitar = note(`<
  ~ A@3 B A@3 B C D C B C D C B E@4 F@3 ~ G H I J G H I J ~@4 A@3 B C D C B C D C B E@4 F@3 ~ G H I J G H I J ~@16 G H I
  J G H I J ~@12 A@3 B ~@8 A@3 B
>`.pickRestart({
  A: "[ab3,b3]@2 ~ [ab3,db4]@4 ~ [ab3,b3] ~ [ab3,b3] ~ [ab3,db4]@3 ~", // Abm Db5 Abm Db5
  B: "[gb3,db4,gb4]@2 ~ [gb3,db4,e4]@2 ~ [ab3,db4]@7 ~@3", // Gb5 Gb7 Db5
  C: "[ab3,db4]@2 ~ [ab3,db4]@2 ~ [ab3,db4]@3 ~ [ab3,db4]@4 ~@2", // Db5
  D: "[gb3,db4]@2 ~ [gb3,db4]@2 ~ [ab3,db4]@3 ~ [ab3,db4]@4 ~@2", // Gb5 Db5
  E: "[gb4 ~ b4 ~ bb4 gb4 db4 ~ bb4 ~ gb4 db4@2 ~ bb4 ab4@3 ab4 ~ e4 b3 ab3 ~ [db4,bb4] ~ gb4 db4@2 ~ bb4 ab4@2 ~ b4 ~ bb4 gb4 db4 ~ bb4 ~ gb4 db4@2 ~ bb4 ab4@3 bb4 ~ ab4 f4 db4 ~ ab4 ~ eb4 db4@4 ~]/4", // Gb
  F: "[gb4 ~ b4 ~ bb4 gb4 db4 ~ bb4 ~ gb4 db4@2 ~ bb4 ab4@3 ab4 ~ e4 b3 ab3 ~ bb4 ~ gb4 db4@2 ~ bb4 ab4@3 ~@14]/3",
  G: "[gb3,b3,eb4]@2 ~ [gb3,b3,eb4]@2 ~ [gb3,b3,eb4]@3 ~ [gb3,b3,eb4]@4 ~@2", // B
  H: "[bb3,db4,gb4]@2 ~ [bb3,db4,gb4]@2 ~ [ab3,db4,f4]@8 ~@2", I: "[ab3,f4] [ab3,eb4] [ab3,db4] [f3,ab3,db4]",
  J: "[gb3,bb3]@2 ~ db4@2 ~ [ab3,db4,f4]@8 ~@2", // Gb Db
})).s("gm_distortion_guitar").gain(0.32)

// other · lead 5 charang
const lead_5_charang = note(`<
  ~@33 A@2 B C ~@28 D@2 E F G@2 H C ~@16 G@2 H C I@2 B C J@2 K F ~@4 D@2 E F G@2 H C ~@4
>`.pickRestart({
  A: "[eb4@2 gb4 ~ bb4@2 ab4@3 ~ f4@2 db4 ~ b3@4 eb4 ~ gb4 ~ ab4@2 f4 ~ db4 ~ ab3@3 ~]/2",
  B: "eb4@2 gb4@2 bb4 ~ ab4@3 ~ f4 ~ db4@2 b4@2", C: "~@2 bb4@3 ~ ab4 ~ ab4@7 ~",
  D: "[eb4@2 gb4@2 bb4 ~ ab4@3 ~ f4 ~ db4@2 b3@4 eb4@2 gb4 ~ ab4 ~ f4@2 db4 ~ ab3@3 ~]/2",
  E: "eb4 ~ gb4 ~ bb4@2 ab4@3 ~ f4@2 db4 ~ b4@2", F: "~@2 bb4@3 ~ ab4@2 ab4@7 ~",
  G: "[eb4@2 gb4 ~ bb4 ~ ab4@3 ~ f4 ~ db4@2 b3@4 eb4@2 gb4 ~ ab4@2 f4@2 db4 ~ ab3@3 ~]/2",
  H: "eb4 ~ gb4@2 bb4 ~ ab4@3 ~ f4 ~ db4 ~ b4@2",
  I: "[eb4@2 gb4 ~ bb4@2 ab4@3 ~ f4@2 db4@2 b3@4 eb4 ~ gb4 ~ ab4@2 f4 ~ db4 ~ ab3@3 ~]/2",
  J: "[eb4 ~ gb4 ~ bb4@2 ab4@3 ~ f4@2 db4 ~ b3@4 eb4 ~ gb4@2 ab4@2 f4 ~ db4@2 ab3@3 ~]/2",
  K: "eb4@2 gb4 ~ bb4 ~ ab4@3 ~ f4 ~ db4@2 b4@2",
})).s("gm_lead_5_charang").gain(0.41)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~ A@3 B A@3 B C D C D C D C D E F E G E F H@2 I J K J I J K J L@2 M@2 A@3 B C D C D C D C D E F E G E F H@2 I J K J I
  J K J L@2 M@2 L@2 M@2 E F E G E F H@2 I J K J I J K J L@2 M@2 L@2 M@2 L@2 M@2 A@3 B L@2 M@2 L@2 M@2 A@3 N
>`.pickRestart({
  A: "[b3,db4,ab4]", B: "[gb3,db4,gb4]@2 ~ [gb3,db4,e4]@2 ~ [ab3,db4]@7 ~@3", C: "[ab3,db4]",
  D: "db4@3 [ab3,db4]@5, gb3 ~", E: "[c4,eb4,gb4]@3 [db4,eb4,gb4]@5", F: "[gb4,ab4,bb4]@3 [c4,ab4,bb4]@5",
  G: "[c4,ab4,bb4]@3 [db4,eb4,gb4]@5", H: "[eb4,ab4]/2", I: "[b3,eb4,gb4]", J: "[bb3,db4,gb4]@3 [ab3,db4,f4]@5",
  K: "[ab3,f4] [ab3,eb4] [ab3,db4] [f3,ab3,db4]", L: "[[eb4,f4]@3 [bb3,db4,ab4]@4 [ab3,b3]@4 [db4,ab4]@5]/2",
  M: "[[eb4,f4]@3 [bb3,db4,ab4]@4 [b3,eb4,gb4,b4]@2 [db4,gb4,bb4]@2 [db4,f4,ab4]@5]/2", // Ebsus2 Bbm7 B Gb Db
  N: "[gb3,db4,gb4]@2 ~ [gb3,db4,e4]@2 ~ [ab3,db4] ~@9", // Gb5 Gb7 Db5
})).s("gm_synth_strings_1").gain(0.1)

// bass · slap bass 1
const bass = note(`<
  ~ A@3 B C@3 D E F G H I J K L M N M O P Q R S T U V U T U V W X Y Z@2 AA@3 AB E F G H I J K L M N M O P Q R S T U V U
  T U V W X Y AC@2 X Y AD@2 M N M O P Q R S T U V U T U V W X Y AC@2 AE AF AG@2 AE AH AI@2 AA@3 AB AE AF AG@2 AE AH AI@2
  AA@3 AJ
>`.pickRestart({
  A: "db3 db3@5 db3!2 ~ db3 ~ db3@2 ~ db3!2", B: "bb2@2 ~ b2@2 ~ db3@5 ~@5",
  C: "db3 db3@5 db3!2 ~ db3 ~ db3 db2 ~ db2 db3", D: "bb2@2 ~ b2@2 ~ db3@5 ~@2 db3 ab2 bb2",
  E: "db2@2 ~ db3@2 ~ db2@2 ~ db2!2 ~ db2 ~ bb2 db3", F: "gb2@2 ~ db3@2 ~ db2@2 ~ db2!2 ~ db2 ~ e2 f2",
  G: "db2@2 ~ db3@2 ~ db2@2 ~ db2!2 ~ db2 ~ db2 ~", H: "gb2@2 ~ bb2 b2 c3 db3@2 ~ db2!2 ~ db2 ~ ab2 bb2",
  I: "db2@2 ~ db3@2 ~ db2@2 ~ db2!2 ~ db2 ~ db2 f2", J: "gb2@2 ~ bb2@2 ~ db3@2 ~ db3!2 ~ db3 ~ e3 f3",
  K: "db2@2 ~ db3@2 ~ db2@2 ~ db2!2 ~ db2 ~ f2 ~", L: "gb2@2 ~ bb2 b2 c3 db3@2 ~ db2!2 ~ db2@3 ~",
  M: "ab2@2 ~ ab2@2 ~ b2@3 ~ b2@2 ~ b2@2 ~", N: "e2@2 ~ e2@2 ~ gb2@3 ~ gb2@2 ~ gb2@2 ~",
  O: "gb2@2 ~ gb2@2 ~ db3@2 ~ db3!2 f3 ab3 f3 eb3 db3", P: "ab2@2 ~ ab2@2 ~ b2@3 ~ b2@2 ~ b2!2 ~",
  Q: "e2@2 ~ e2@2 ~ gb2@3 ~ gb2@2 ~ gb2!2 ~", R: "ab2@2 ~ ab2@2 ~ b2 ~ eb3 ~ f3 ~ ab3 ~ eb3 ~",
  S: "gb3@3 ~ e3@3 ~ eb3@3 ~ db3@3 ~", T: "b2@2 ~ b2 ~ b2 b2@5 ~@2 b2!2 ~",
  U: "gb2@2 ~ bb2 ~ b2 db3@2 ~ db2!2 ~ db2@3 ~", V: "db3@3 ~ b2@3 ~ bb2@3 ~ ab2@3 ~",
  W: "gb2 ab2 bb2 ~ db3 eb3 db3@2 ~ db2!2 ~ db2@3 ~", X: "eb2@2 ~ eb2@2 ~ gb2@2 ~ gb2 gb2@3 ~ gb2 ~",
  Y: "ab2@2 ~ ab2@2 ~ db3@2 ~ db3 db3@3 ~ db3 eb3",
  Z: "[eb2@2 ~ eb2@2 ~ gb2@2 ~ gb2 gb2@3 ~ ab2@4 b2@3 ~ db3 ~ db3@5 ~@3]/2",
  AA: "gb2@2 ~ bb2@2 ~ db3@3 ~ db3@3 ~ db3!2", AB: "bb2@2 ~ b2@2 ~ db3@5 ~@3 ab2 bb2",
  AC: "[eb2@2 ~ eb2@2 ~ gb2@2 ~ gb2 gb2@3 ~ ab2@4 b2@3 ~ db3 ~ db3 ~ db3!3 db2!2 ~]/2",
  AD: "[eb2@2 ~ eb2@2 ~ gb2@2 ~ gb2 gb2@3 ~ ab2@4 b2@3 ~ db3 ~ db3 ~ db3 ab2 db3 ~ ab2 ~]/2",
  AE: "b2@2 ~ b2@2 ~ b2@2 ~ b2 b2@3 ~ b2 ~", AF: "gb2@2 ~ bb2@2 ~ db3@2 ~ db3 db3@3 ~ db3!2",
  AG: "[b2@2 ~ b2@2 ~ b2@2 ~ b2 b2@3 ~ b2@4 b2@3 ~ db3 ~ db3@4 ~@2 db3!2]/2",
  AH: "gb2@2 ~ bb2 ~ b2 db3@2 ~ db3 db3@3 ~ db3!2",
  AI: "[b2@2 ~ b2@2 ~ b2@2 ~ b2 b2@3 ~ b2@4 b2@3 ~ db3 ~ db3@4 ~@4]/2", AJ: "bb2@2 ~ b2@2 ~ db3 ~@9",
})).s("gm_slap_bass_1").gain(0.29)

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

// drums · snare
const snare = s("sd").struct(`<
  A B@3 C B@2 C D B@3 C B@3 E B@3 F B@3 G B H B I C J B@8 C K B@2 C L M B@6 J H B@2 G B N B@2 O P B Q B@7 D R S R S R S
  B T B N B@2 O P B Q B@7 U B@3 D B@2 C D B C B U B@3 D B@2 C V
>`.pickRestart({
  A: "~@8 x ~ x!3 ~@3", B: "~ x ~ x", C: "~@4 x ~@4 x ~@2 x ~@3", D: "~ x ~@2", E: "~@4 x ~@4 x!2 ~ x!3 ~",
  F: "~@4 x ~@3 x!8", G: "~@4 x ~@5 x!3 ~ x!2", H: "~@4 x ~@7 x ~@2 x", I: "~@4 x ~@7 x ~ x!2", J: "~@2 x ~@3 x!2",
  K: "~@8 x!6 ~ x", L: "~@4 x ~@8 x ~ x", M: "~ x ~ x!2 ~@7 x ~@3", N: "~@4 x ~@4 x ~@2 x!2 ~ x",
  O: "~@3 x!2 ~@7 x ~@3", P: "~ x ~@2 x ~@7 x ~ x ~", Q: "~ x ~@2 x ~@7 x ~@3", R: "~ x", S: "~@3 x",
  T: "~@4 x ~@2 x!2 ~ x ~ x ~@3", U: "~@4 x ~@3 x!2 ~ x!3 ~ x", V: "x ~@2 x ~@2 x ~@9",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@8 A ~@13 A ~@9 B ~@15 C ~@5 A ~@5 B ~@3 B ~@7 B ~ D ~ D ~ D ~@5 B ~@3 B ~@11 E ~@3 F ~@7 E ~@4
>`.pickRestart({
  A: "~@7 x", B: "~@14 x!2", C: "~@11 x ~@4", D: "~ x", E: "~@7 x ~ x!2 ~@5", F: "~@8 x ~@5 x!2",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~ A@32 ~@4 A@28 ~@8 A@16 ~@12 A@4 ~@8 A@3 B>".pickRestart({
  A: "x!16", B: "x!7 ~@9",
})).gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@8 A ~@23 B ~@15 C ~@3 D ~@11 B ~@3 E ~@3 F ~@15 B ~@3 E ~@7 G ~@3 H ~@7 G ~@4
>`.pickRestart({
  A: "~@5 x!2 ~", B: "~@10 x!4 ~@2", C: "~@13 x!2 ~", D: "~@5 x ~@2", E: "~@14 x!2", F: "~@3 x", G: "~@11 x!5",
  H: "~@12 x!2 ~@2",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<A ~@39 B ~@32 C ~ C ~ C ~@26 D ~@12>".pickRestart({
  A: "~@2 x!2", B: "~@13 x ~ x", C: "~@3 x", D: "~@8 x ~ x!2 ~@4",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@33 A@4 ~@28 A@8 ~@16 A@12 ~@4 A@8 ~@4>".pickRestart({
  A: "x!8",
})).gain(0.4)

// drums · china
const china = s("cr").struct("<~ A ~@2 A ~@3 A ~@12 A ~@18 B ~@12 A ~@50 A ~@11 B>".pickRestart({
  A: "x", B: "x ~@2 x ~@2 x ~@9",
})).gain(0.4)

stack(
  distortion_guitar, lead_5_charang, synth_strings_1, bass, kick, snare, low_tom, hihat, mid_tom, high_tom, ride, china
)

More by Bruce Hornsby