Strudelify

Tha Crossroads

Bone

KeyE majorTempo72 bpm
0:00/0:00
// Tha Crossroads — Bone
// 72.2 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 71 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(72.2/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 · piano · "Bass"
const bass = note("<A B C D A B C D A B C D A B C D A B E F ~@51>".pickRestart({
  A: "f#1@3 f#1 g#1@3 g#1", B: "a1@18 a1@12 b1@3 ~@3 b1@2 ~ c#2@2 ~ e2@5 ~", C: "f#1@17 ~ f#1@6 g#1@18 g#1@6",
  D: "a1@17 ~ a1@11 ~ b1@5 ~ b1@2 ~ c#2@2 ~ e2@5 ~", E: "f#1@17 ~@2 f#1@6 g#1@18 g#1@5",
  F: "~ a1@17 ~ a1@11 ~ b1@5 ~ b1@2 ~ c#2@2 ~ e2@5",
})).s("gm_piano").gain(0.8)

// bass · fretless bass · "Bass"
const bass_2 = note(`<
  ~@20 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B A B C D A B C E F G F G H@2 F G H@2 F G ~
>`.pickRestart({
  A: "~ f#1@18 f#1@6 g#1@18 g#1@5", B: "~ a1@18 a1@12 b1@3 ~@3 b1@2 ~ c#2@2 ~ e2@5", C: "~ f#1@17 ~ f#1@6 g#1@18 g#1@5",
  D: "~ a1@17 ~ a1@11 ~ b1@5 ~ b1@2 ~ c#2@2 ~ e2@5", E: "~ a1@17 ~@2 a1@11 ~ b1@5 ~ b1@2 ~ c#2@2 ~ e2@4",
  F: "~ f#1@9 f#1@3 g#1@9 g#1@2", G: "~@2 a1@18 a1@12 b1@3 ~@3 b1@2 ~ c#2@2 ~ e2@4",
  H: "[~@2 f#1@17 ~ f#1@6 g#1@18 g#1@6 a1@17 ~ a1@11 ~ b1@5 ~ b1@2 ~ c#2@2 ~ e2@4]/2",
})).s("gm_fretless_bass").gain(0.8)

// bass · piano
const bass_3 = note(`<
  ~@2 A B A B A B C D C E C D C E C D F G H I H G H I H G H I H G H I H G H I H G H I H G H I H G H I H I H G H I H J K
  L K L M@2 K L M@2 K L ~
>`.pickRestart({
  A: "[f#1,f#2]@16 ~@2 [f#1,f#2]@6 [g#1,g#2]@17 ~ [g#1,g#2]@6", // F# G#
  B: "[a1,a2]@16 ~@2 [a1,a2]@11 ~ [b1,b2]@3 ~@3 [b1,b2]@3 [c#2,c#3]@3 [e2,e3]@6", // A B C# E
  C: "[f#1,f#2]@3 [f#1,f#2] [g#1,g#2]@3 [g#1,g#2]", // F# G#
  D: "[a1,a2]@6 [a1,a2]@4 b2@2 [b1,b2] [c#2,c#3] [e2,e3]@2, ~@10 b1 ~@5", // A B C# E
  E: "[a1,a2]@6 [a1,a2]@4 [b1,b2]@2 [b1,b2] [c#2,c#3] [e2,e3]@2", // A B C# E
  F: "[f#1,f#2]@18 ~ [f#1,f#2]@6 [g#1,g#2]@18 [g#1,g#2]@5", // F# G#
  G: "~ [a1,a2]@18 [a1,a2]@12 [b1,b2]@6 [b1,b2]@3 [c#2,c#3]@3 [e2,e3]@5", // A B C# E
  H: "~ [f#1,f#2]@18 [f#1,f#2]@6 [g#1,g#2]@18 [g#1,g#2]@5", // F# G#
  I: "~ [a1,a2]@18 [a1,a2]@12 b2@6 [b1,b2]@3 [c#2,c#3]@3 [e2,e3]@5, ~@31 b1@3 ~@14", // A B C# E
  J: "~ [a1,a2]@18 ~ [a1,a2]@12 [b1,b2]@6 [b1,b2]@3 [c#2,c#3]@3 [e2,e3]@4", // A B C# E
  K: "~ [f#1,f#2]@9 [f#1,f#2]@3 [g#1,g#2]@9 [g#1,g#2]@2", // F# G#
  L: "~@2 [a1,a2]@18 [a1,a2]@12 b2@6 [b1,b2]@3 [c#2,c#3]@3 [e2,e3]@4, ~@32 b1@3 ~@13", // A B C# E
  M: "[~@2 [f#1,f#2]@18 [f#1,f#2]@6 [g#1,g#2]@18 [g#1,g#2]@6 [a1,a2]@18 [a1,a2]@12 [b1,b2]@6 [b1,b2]@3 [c#2,c#3]@3 [e2,e3]@4]/2", // F# G# A B C# E
})).s("gm_piano").gain(0.8)

// chords · pad bowed · "BowedGlass"
const pad_bowed = note("<A@4 B@2 C@2 ~@4 A@4 B@2 D@2 ~@8 E@4 F@2 G@2 ~@4 E@4 F@2 G@2 ~@12 H@5 ~@6>".pickRestart({
  A: "[~@2 b6 b5 e6 ~ b5 e6 b6 b5 e6 b6 ~ e6 b6 b5 e6 b6 b5 e6 b6 b5 [e6,b6] [b6,b7] e6 b6 e6 b5 e6 b5 e6 b6 b5 e6 [b6,e7] b5 e6 ~ b5 e6 ~ b5 [e6,b6] [b6,e7] [b5,b7] e6 b6 e6 b6 b5 [e6,e7] b6 b5 ~ e6 b5 e6 b6 [b5,e7] [e6,b7] b6 b5 e6 b6, ~@15 b6@9 b7@11 ~ [b5,b6]@5 ~ b7@24 ~@6 c#7@30 ~@3 b7@6 b6@9 b6@6 ~@9 c#7@14 ~@4 b7@6 b6@12 ~@12 e7@8 ~]/4", // E5 B E5 B E E5 B
  B: "[~ b6!2 [e6,e7] b6 e6 b5 e6 ~ b5 [e6,e7] b6 b5 [e6,b6] b6 b5 b5 e6 b6 e6 [b6,e7] [e6,b7] [b5,b6] b5 e6 b6 b5 [e6,b6] [b6,e7] [e6,b7] [b5,e7] [e6,b6], [b5,b7]@6 ~@6 b7@6 b6@6 b6@5 ~@4 b7@7 ~@5 c#7@14 ~@10 c#7@6 e7@6 ~@15]/2", // E E5 B E5 B
  C: "[[b5,b6] [e6,e7] b6 e6 b5 e6 b6 b5 [b5,e7] [e6,b6] b6 b5@2 e6 b6 e6 b5 [e6,b6] [b6,e7] e6 b6 e6 b5 e6 b6 [b5,b6] [e6,e7] [b6,b7] [e6,b6] [b6,e7] e6 b5, ~@6 b7@9 c#7@8 ~@7 e7@9 c#7@6 e7@6 ~@6 b7@6 c#7@6 e7@6 ~@15 c#7@6]/2", // B E E5 B E B E5
  D: "[[b5,b6]@3 [e6,e7]@3 b6@3 e6@3 b5@3 e6@3 ~ b6@3 b5@3 [b5,e7]@3 [e6,b6]@3 b6@3 b5@6 e6@3 b6@3 e6@3 b5@3 [e6,b6]@3 [b6,e7]@3 e6@3 b6@3 e6@3 b5@3 e6@3 b6@3 [b5,b6]@3 [e6,e7]@3 [b6,b7]@3 [e6,b6]@3 [b6,e7]@3 e6@3 b5@2, ~@6 b7@9 c#7@8 ~@8 e7@9 c#7@6 e7@6 ~@6 b7@6 c#7@6 e7@6 ~@15 c#7@5]/2", // B E E5 B E B E5
  E: "[~@7 b6@3 b5@3 e6@3 ~@3 b5@3 e6@3 b6@3 b5@3 e6@3 b6@3 ~@3 e6@3 b6@3 b5@3 e6@3 b6@3 b5@3 e6@3 b6@3 b5@3 [e6,b6]@3 [b6,b7]@3 e6@3 b6@3 e6@3 b5@3 e6@3 b5@3 e6@3 b6@3 b5@3 e6@3 [b6,e7]@3 b5@3 e6@3 ~@3 b5@3 e6@3 ~@3 b5@3 [e6,b6]@3 [b6,e7]@3 [b5,b7]@3 e6@3 b6@3 e6@3 b6@3 b5@3 [e6,e7]@3 b6@3 b5@3 ~@3 e6@3 b5@3 e6@3 b6@3 [b5,e7]@3 [e6,b7]@3 b6@3 b5@3 e6@3 b6@2, ~@16 b6@9 b7@11 ~ [b5,b6]@5 ~ b7@24 ~@6 c#7@30 ~@3 b7@6 b6@9 b6@6 ~@9 c#7@14 ~@4 b7@6 b6@12 ~@12 e7@8]/4", // E5 B E5 B E E5 B
  F: "[~@4 b6@3 b6@3 [e6,e7]@3 b6@3 e6@3 b5@3 e6@3 ~@3 b5@3 [e6,e7]@3 b6@3 b5@3 [e6,b6]@3 b6@3 b5@3 b5@3 e6@3 b6@3 e6@3 [b6,e7]@3 [e6,b7]@3 [b5,b6]@3 b5@3 e6@3 b6@3 b5@3 [e6,b6]@3 [b6,e7]@3 [e6,b7]@3 [b5,e7]@3 [e6,b6]@2, ~ [b5,b7]@6 ~@6 b7@6 b6@6 b6@5 ~@4 b7@7 ~@5 c#7@14 ~@10 c#7@6 e7@6 ~@14]/2", // E E5 B E5 B
  G: "[~ [b5,b6]@3 [e6,e7]@3 b6@3 e6@3 b5@3 e6@3 b6@3 b5@3 [b5,e7]@3 [e6,b6]@3 b6@3 b5@6 e6@3 b6@3 e6@3 b5@3 [e6,b6]@3 [b6,e7]@3 e6@3 b6@3 e6@3 b5@3 e6@3 b6@3 [b5,b6]@3 [e6,e7]@3 [b6,b7]@3 [e6,b6]@3 [b6,e7]@3 e6@3 b5@2, ~@7 b7@9 c#7@8 ~@7 e7@9 c#7@6 e7@6 ~@6 b7@6 c#7@6 e7@6 ~@15 c#7@5]/2", // B E E5 B E B E5
  H: "[~@8 b6@3 b5@3 e6@3 ~@3 b5@3 e6@3 b6@3 b5@3 e6@3 b6@3 ~@3 e6@3 b6@3 b5@3 e6@3 b6@3 b5@3 e6@3 b6@3 b5@3 [e6,b6]@3 [b6,b7]@3 e6@3 b6@3 e6@3 b5@3 e6@3 b5@3 e6@3 b6@3 b5@3 e6@3 [b6,e7]@3 b5@3 e6@3 ~@3 b5@3 e6@3 ~@3 b5@3 [e6,b6]@3 [b6,e7]@3 [b5,b7]@3 e6@3 b6@3 e6@3 b6@3 b5@3 [e6,e7]@3 b6@3 b5@3 ~@3 e6@3 b5@3 e6@3 b6@3 [b5,e7]@3 [e6,b7]@3 b6@3 b5@3 e6@3 b6@3 ~@46, ~@17 b6@9 b7@11 ~ [b5,b6]@5 ~ b7@24 ~@6 c#7@30 ~@3 b7@6 b6@9 b6@6 ~@9 c#7@14 ~@4 b7@6 b6@12 ~@12 e7@8 ~@47]/5", // E5 B E5 B E E5 B
})).s("gm_pad_bowed").gain(0.09)

// other · synth strings 1 · "Strings"
const synth_strings_1 = note(`<
  A@8 ~@4 B C B D B C E F ~@7 G H I H F ~@3 G H I H F ~@7 G H I H I H F H I H F J@3 ~@3 K@4 J@3
>`.pickRestart({
  A: "[~ [g#3,b3,e4,b4]@2 [g#3,b3,d#4,b4]@4 [g#3,b3,c#4]@2 [g#3,b3,e4,b4]@2 [g#3,b3,d#4,b4]@4 [g#3,b3,c#4]@2 [g#3,b3,e4,b4]@2 [g#3,b3,d#4,b4]@4 [g#3,b3,c#4]@2 [g#3,b3,e4,b4]@2 [g#3,b3,d#4,b4]@4 [g#3,b3,c#4]]/8", // E G#m C#7 E G#m C#7 E G#m …
  B: "g#4@15 c#5", C: "b4@15 f#4", D: "b4", E: "g#4@45 ~ c#5@2", F: "~ b4@47", G: "~@7 b4@39 f#4@2",
  H: "~ g#4@45 c#5@2", I: "~ b4@45 f#4@2", J: "[~@2 g#4@45 c#5@3 b4@45 f#4@3 ~@46]/3",
  K: "[~@2 g#4@45 c#5@3 b4@45 f#4@3 g#4@45 c#5@3 b4@46]/4",
})).s("gm_synth_strings_1").gain(0.24).pan(0.3)

// chords · epiano1 · "Rhodes"
const epiano1 = note("<~@2 A@4 B@2 C D E F ~@12 G@5 H@6 I@3 J@2 ~@4 K@3 L@7 M@3 N@2 ~ O@2 P@2 O@6 ~>".pickRestart({
  A: "[~@6 e5@3 b4@21 e5@3 b4@6 e5@3 b4@12 e5@3 b4@45 e5@3 b4@21 e5@3 b4@4 ~@2 e5@3 b4@12 e5@3 b4@21 e5@3 b4@15]/4",
  B: "[~@6 e5@3 b4@21 e5@3 b4@4 ~@2 e5@3 b4@12 e5@3 b4@21 e5@3 b4@15]/2",
  C: "~@2 e5@6 ~@5 f#4@3, e4@11 ~ e4@12, ~ b4@7 ~ b4@7, ~@5 e5@3", D: "~ e5@7, e4@15 ~, ~@3 b4@44 ~",
  E: "~@2 e5@6 ~@5 f#4@3, e4@11 ~ e4@12, ~@3 b4@20 ~@4 b4@21, ~@5 e5@3", F: "~@6 e5@37 ~@5, e4@43 ~@5, ~@3 b4@40 ~@5",
  G: "[~@7 e5@6 e5@12 ~@6 e5@3 ~@9 f#5@6 ~@6 e5@42 ~@11 e5@13 ~@6 e5@3 ~@9 f#5@6 ~@6 e5@37 ~@17 e5@12 d#5@9 e5@9 f#5@5, ~ e4@22 ~@2 e4@24 g#5@59 ~@28 f#4@9 g#5@59 ~@36, ~@4 b4@21 d#5@9 e5@15 e4@45 ~@3 e4@22 ~@2 e4@24 e4@43 ~@52, ~@28 b4@23 ~ b4@44 ~@4 b4@20 ~ d#5@9 e5@18 ~@92, ~@20 f#4@5 ~@37 b4@11 ~ b4@20 ~@26]/5",
  H: "[~ g#5@59 ~ e5@12 d#5@9 e5@9 f#5@5]/2",
  I: "[~@55 e5@18 ~@15 f#4@9 ~@6 e5@41, ~ g#5@59 ~@19 e5@21 ~@44, ~@49 e4@22 ~@2 e4@24 e4@45 ~@2, ~@52 b4@21 ~@3 b4@23 ~ b4@44]/3",
  J: "[~@7 e5@18 ~@15 f#4@9 ~@6 e5@37 ~@4, ~ e4@22 ~@2 e4@24 e4@43 ~@4, ~@2 b4@10 ~@2 b4@11 ~ b4@20 ~@2, ~@31 e5@21 ~@44]/2",
  K: "[~@7 e5@6 e5@12 ~@6 e5@3 ~@9 f#5@6 ~@6 e5@42 ~@12 e5@12 ~@6 e5@3 ~@9 f#5@5, ~ e4@22 ~@2 e4@24 g#5@59 ~@28 f#4@8, ~@4 b4@21 d#5@9 e5@15 e4@45 ~@3 e4@22 ~@2 e4@23, ~@28 b4@23 ~ b4@44 ~@4 b4@20 ~ d#5@9 e5@14, ~@20 f#4@5 ~@37 b4@10]/3",
  L: "[~@7 e5@37 ~@11 e5@6 e5@12 ~@6 e5@4 ~@9 f#5@5 ~@6 e5@42 ~@6 e5@6 e5@12 ~@6 e5@4 ~@9 f#5@5 ~@6 e5@42 ~@12 e5@12 ~@15 f#4@9 ~@6 e5@41, ~ g#5@59 ~@16 b4@21 e4@45 ~@3 e4@22 ~@2 e4@24 g#5@59 ~@84, ~ e4@43 ~@5 e4@22 ~@2 e4@24 g#5@59 ~@28 f#4@9 e4@45 ~@3 e4@22 ~@2 e4@24 e4@45 ~@2, ~@4 b4@40 ~@8 b4@21 ~ d#5@9 e5@18 ~@69 d#5@9 e5@18 ~@74 e5@21 ~@44, ~@88 f#4@10 ~@2 b4@44 ~@4 b4@21 ~@3 b4@23 ~ b4@44 ~@4 b4@21 ~@3 b4@23 ~ b4@44]/7",
  M: "[~@7 e5@6 e5@12 ~@6 e5@4 ~@9 f#5@5 ~@6 e5@37 ~@17 e5@13 d#5@8 e5@9 f#5@5, ~ e4@22 ~@2 e4@24 e4@43 ~@5 e4@22 ~@25, ~@4 b4@20 ~@2 d#5@9 e5@18 ~@91, ~@28 b4@22 ~@2 b4@40 ~@8 b4@21 ~@23, ~@40 f#4@9 g#5@59 ~@36]/3",
  N: "[~ g#5@59 ~@36]/2",
  O: "[~@8 e5@18 ~@15 f#4@9 ~@6 e5@40, ~@2 e4@22 ~@2 e4@24 e4@45 ~, ~@5 b4@21 ~@3 b4@23 ~ b4@43, ~@32 e5@21 ~@43]/2",
  P: "[~@8 e5@18 ~@15 f#4@9 ~@6 e5@37 ~@3, ~@2 e4@22 ~@2 e4@24 e4@43 ~@3, ~@5 b4@20 ~@4 b4@22 ~@2 b4@40 ~@3, ~@32 e5@21 ~@43]/2",
})).s("gm_epiano1").gain(0.15).pan(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~@7 A B C B C B C B C B C D E F G F G F G F E F G F G F G F G F G F E F G F G F G F E F G F G@2 ~ F G F H I ~ J I J I
  ~@7
>`.pickRestart({
  A: "~@11 x ~@4", B: "x ~@2 x!2 ~@2 x", C: "x ~@2 x ~@4", D: "x ~@18 x ~@5 x ~@17 x ~@4", E: "~ x ~@46",
  F: "~ x ~@17 x ~@5 x ~@17 x ~@4", G: "~ x ~@17 x ~@28", H: "~ x ~@18 x ~@5 x ~@17 x ~@3", I: "~ x ~@8 x ~@13",
  J: "~ x ~@8 x ~@2 x ~@8 x ~",
})).gain(0.51)

// drums · rim
const rim = s("rim").struct("<~@7 A B@10 C ~ D@7 ~ D@11 ~ D@7 ~ D@4 E ~ D@3 F G H F@3 G ~@7>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@12 x ~@24 x ~@10", D: "~@13 x ~@23 x ~@10", E: "~@13 x ~@34", F: "~@7 x ~@11 x ~@4",
  G: "~@7 x ~@16", H: "~@19 x ~@4",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct("<~@7 [~@3 x] ~@63>").gain(0.46)

// drums · low tom
const low_tom = s("lt").struct("<~@19 A ~@7 A ~@11 A ~@7 B ~@5 B ~@17>".pickRestart({
  A: "~@37 x ~@5 x ~@4", B: "~@40 x ~@2 x ~@4",
})).gain(0.51)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@7 A B C B C B C B C B C D E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E G H F E F I J K L M L N
  ~@7
>`.pickRestart({
  A: "~@7 x", B: "~ x!7", C: "x!8", D: "~@6 x ~@5 x ~@6 x ~@5 x ~@5 x ~@5 x ~@5 x ~@4",
  E: "~ x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@4", F: "~@7 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@4",
  G: "~@7 x ~@5 x ~@5 x ~@28", H: "~@25 x ~@5 x ~@5 x ~@5 x ~@4",
  I: "~ x ~@6 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@3", J: "~@4 x ~@2 x ~@2 x ~@13", K: "~@19 x ~@2 x ~",
  L: "~@4 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~", M: "~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~",
  N: "~ x ~@2 x ~@2 x ~@2 x ~@13",
})).gain(0.46)

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 A ~@7 A ~@11 A ~@7 B ~@5 B ~@17>".pickRestart({
  A: "~@17 x ~@6", B: "~@37 x ~@10",
})).gain(0.46)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@8 A ~ A ~ A ~ A ~ A ~ A B ~@2 B ~ B ~ B@2 ~@2 B ~ B ~ B ~ B ~ B@2 ~@2 B ~ B ~ B@3 ~ B ~ B ~ B ~ B@2 ~@4 C ~@8
>`.pickRestart({
  A: "x", B: "~ x ~@46", C: "~ x ~@22",
})).gain(0.51)

// drums · high tom
const high_tom = s("ht").struct("<~@47 [~@17 x ~@6] ~@23>").gain(0.46)

// drums · crash
const crash = s("cr").struct("<~@8 A ~@11 B ~@7 B ~@11 B ~@7 B ~@5 B ~@5 C ~@10>".pickRestart({
  A: "x", B: "~ x ~@46", C: "~ x ~@22",
})).gain(0.51)

// drums · tambourine
const tambourine = s("tb").struct("<~@8 A@10 B C@33 D E C@3 F G H I@3 J ~@7>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", B: "~@3 x ~@5 x ~@5 x ~@6 x ~@5 x ~@5 x ~@5 x ~@5 x ~",
  C: "~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x", D: "~@2 x ~@2 x ~@2 x ~@2 x ~@12",
  E: "~@14 x ~@2 x ~@2 x ~@2 x", F: "~@4 x ~@6 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x",
  G: "~@5 x ~@5 x ~@5 x ~@5 x ~@24", H: "~@35 x ~@5 x ~@5 x", I: "~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x",
  J: "~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@18",
})).gain(0.31)

stack(
  bass, bass_2, bass_3, pad_bowed, synth_strings_1, epiano1, kick, rim, snare, low_tom, hihat, mid_tom, open_hat,
  high_tom, crash, tambourine
)

More by Bone