Strudelify

Bubbling Hot

Pato Banton

KeyA♭ majorTempo89 bpm
0:00/0:00
// Bubbling Hot — Pato Banton
// 89 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 81 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(89/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 · synth bass 1
const bass = note(`<
  ~@5 A B A B A B A B A B A ~ A B A B A B A ~ A B A C A B A C A B A B A B A ~ A B A C A B A C A B A ~ A B A B A B A ~ A
  B A C A B A C A B A C A B A C A B A C
>`.pickRestart({
  A: "ab1@2 ab1!2 ab1@2 ab1!6 c2 ~ eb2@2", B: "ab1@2 ab1!2 ab1@2 ab1!6 gb1 ~ eb1@2",
  C: "ab1@2 ab1!2 ab1@2 ab1!3 eb2!4 ~ eb2@2",
})).s("gm_synth_bass_1").gain(0.36)

// chords · piano
const piano = note(`<
  ~@5 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@4 A B A B ~@4 A B A B A
  B A B A B A B A B A B A B A C
>`.pickRestart({
  A: "~@2 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~@3 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~", // Ab Eb
  B: "~@2 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~@3 [g3,bb3,eb4] ~@2 eb3 [g3,bb3,eb4] eb3", // Ab Eb
  C: "~@2 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~@3 [g3,bb3,eb4] ~@2 eb3 [g3,bb3,eb4] ~", // Ab Eb
})).s("gm_piano").gain(0.49).pan(0.4)

// other · piano
const piano_2 = note(`<
  ~@5 A B A C A B A C A D A E ~@4 A F A F A D A E A D A E ~@4 A F A F A D A E A D A E ~@3 G ~@3 H ~@4 A D A I A D A I A
  D A I A D A I A D A I
>`.pickRestart({
  A: "ab2@3 ~@6 bb2@2 c3 db3 c3 bb2@2", B: "ab2@3 ~@8 eb2@2 ~ eb2@2",
  C: "ab2@3 ~@5 [ab4,eb5]!4 [ab4,c5] ~ [eb2,ab4] ~, ~@11 eb2@2 ~@3", // Ab5 Ab Ab5
  D: "eb5 c5 ab4 eb5 c5 ab4 eb5 ~@4 eb2@2 ~ eb2@2, ab2@3 ~@13",
  E: "eb5 c5 ab4 eb5 db5 bb4 c5 ~@4 eb2@2 ~ eb2 ~, ab2@3 ~@13", F: "ab2@3 ~@13",
  G: "~@8 [ab4,eb5]!4 [ab4,gb5] ~ [ab4,eb5] ~", H: "~@8 [ab4,eb5]!4 [ab4,gb5] [ab4,eb5]!2 ~",
  I: "eb5 c5 ab4 eb5 db5 bb4 c5 ~ [ab4,eb5]!4 [ab4,gb5] ~ [eb2,ab4,eb5] ~, ab2@3 ~@8 eb2@2 ~@3", // Ab5 Ab7 Ab5
})).s("gm_piano").gain(0.59)

// other · tenor sax
const tenor_sax = note(`<
  ~@5 A B A B A B A B A B A B ~@8 A B A B A B A B ~@8 A B A B A B A B A@4 ~@8 A B A B A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "ab2!9 ~@7", B: "ab2!9 eb2!3 ~@4",
})).s("gm_tenor_sax").gain(0.35).pan(0.6)

// chords · percussive organ · Ab Eb Ab Eb Ab Eb
const percussive_organ = note(`<
  ~@5
  [~@2 [ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~]!44
  ~@4
  [~@2 [ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~]!4
  ~@4
  [~@2 [ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~]!20
>`).s("gm_percussive_organ").gain(0.15).pan(0.6)

// other · rock organ
const rock_organ = note(`<
  ~@13 A B A C ~@7 D A B A B A B A C ~@2 E D ~@5 F ~ G A B A H I J K D ~@2 E D L@3 D A B A M A B A M A B A M A B A M A B
  A M
>`.pickRestart({
  A: "c6 eb6@11 db6 ~ bb5 ~", B: "c6 eb6 ~@7 eb6!3 gb6@2 eb6 ~", C: "c6 ~@15",
  D: "[eb5,ab5,c6,eb6] [ab5,c6,eb6,ab6] ~ [ab5,c6,eb6,ab6] ~ [eb5,eb6] [ab5,c6,eb6,ab6] [eb5,eb6] ~@8", E: "~@15 eb5",
  F: "~@9 eb6!3 gb6@2 eb6 ~", G: "~@8 [ab5,eb6]!4 gb6@2 eb6 ~", H: "c6 ~@7 [ab5,eb6]!4 gb6@2 eb6 ~",
  I: "~@14 [eb5,ab5,c6,eb6] ~", J: "~@13 [eb5,ab5,c6,eb6]!2 ~", K: "~@14 [eb5,ab5,c6,eb6] eb5",
  L: "~@2 [ab5,c6,eb6]!2 ~@2 [ab5,c6,eb6] ~@3 [eb5,g5,bb5,db6]!2 ~ eb5 [eb5,g5,bb5,db6] eb5", // Ab Eb7
  M: "c6 ab5 ~@7 eb6!3 gb6@2 eb6 ~",
})).s("gm_rock_organ").gain(0.25).pan(0.7)

// other · ocarina
const ocarina = note("<~@5 A ~@3 A ~@3 A ~@11 A ~@3 A ~@11 A ~@3 A ~@3 B C B C ~@8 A ~@7 A ~@7 A ~@3>".pickRestart({
  A: "ab6!4 ~@4", B: "ab6@2 ab6@2 ab6@2 ab6@2 ~@7 ab7", C: "ab7!6 ~@10",
})).s("gm_ocarina").gain(0.09).pan(0.6)

// other · ocarina · soft notes
const ocarina_soft = note(`<
  ~@5 A ~@3 A ~@3 A ~@11 A ~@3 A ~@11 A ~@3 A ~@3 A B A B ~@8 A ~@7 A ~@7 A ~@3
>`.pickRestart({
  A: "~@4 ab6 ~@3", B: "~@6 ab7!3 ~@7",
})).s("gm_ocarina").gain(0.06).pan(0.6)

// other · trumpet
const trumpet = note("<~ A B C@2 ~@76>".pickRestart({
  A: "~@4 eb4 ab4 c5 eb5 ~ eb5!2 c5 ~ c5 ~ ab4", B: "c5 ~ ab4 eb4@8 ~@2 eb4 ab4 c5",
  C: "[eb5 ~ eb5!2 c5 ~ c5!2 eb4 ~ eb4!2 ~ ab4@13 ~@6]/2",
})).s("gm_trumpet").gain(0.5)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  ~@9 A B A B A B A B ~@4 A B A B ~@8 A B A B ~@4 A B A B ~@4 A B A B ~@8 A B A B A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "~ ab3!3 c4 eb4 ~@10", B: "~ ab3!3 gb3 eb3 ~@10",
})).s("gm_electric_guitar_muted").gain(0.36).pan(0.6)

// other · trumpet
const trumpet_2 = note(`<
  ~@14 A ~@4 B C ~@5 D ~ E ~ A ~ F G H G I G J K L ~ D ~ E ~ A ~ M ~@4 N O P Q R S R T U V U ~@2 D ~ E ~ A ~@3 A ~@6
>`.pickRestart({
  A: "~@7 c5@5 ~@4", B: "ab4!2 ~@6 ab4!2 ~@6", C: "~@6 ab4!4 ~@6", D: "~@3 ab4!8 ~@5",
  E: "~@3 bb4@2 ab4!3 ab4@2 ab4!3 ~@3", F: "~@11 bb4 bb4@2 bb4 c5", G: "ab4!2 ~ ab4 ab4@2 ab4!4 ~ bb4!4 c5",
  H: "ab4!4 ab4@2 ab4!4 ~ bb4 bb4@2 bb4 c5", I: "ab4!2 ab4@2 ab4!6 ~ bb4!4 c5", J: "ab4@2 ab4!8 ~ bb4!4 c5",
  K: "ab4!2 ~ ab4!7 bb4!4 c5@2", L: "ab4!10 ~@6", M: "~@7 eb5 ab4 ~@7", N: "~@3 c5@2 ab4!3 bb4@2 ~@6",
  O: "~@3 c5@2 ab4!3 f4 eb4@2 ~@5", P: "~@3 c5@2 bb4@2 ab4 bb4@2 ~ bb4!4 c5", Q: "ab4!2 ~ ab4!5 ab4@2 ~@6",
  R: "~@3 ab4!3 eb4 ~@4 ab4!3 eb4 ~", S: "~@3 ab4!3 eb4@2 ~@3 ab4!3 eb4 ~", T: "~@3 ab4!3 eb4 ~@4 eb5!2 f5 eb5!2",
  U: "eb5 f5 eb5!2 ~@12", V: "~@11 eb5!2 f5 eb5!2",
})).s("gm_trumpet").gain(0.49).pan(0.7)

// other · trumpet · soft notes
const trumpet_soft = note("<~@26 A ~@15 A ~@18 B ~ B ~@2 A ~@14>".pickRestart({
  A: "~@11 ab4!4 ~", B: "~@4 eb5 f5 eb5!3 f5 eb5!3 f5 eb5!2",
})).s("gm_trumpet").gain(0.22).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@5 [x ~@6 x!2 ~ x ~@5]!28 x ~@3 [x ~@6 x!2 ~ x ~@5]!44>").gain(0.45)

// drums · snare
const snare = s("sd").struct("<~@5 A@28 ~ B ~ B A@12 C@3 A@29>".pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~@2 x ~@3 x!2",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<A ~@4 B@28 C@4 B@13 D@3 B D@2 B@25>".pickRestart({
  A: "x!4", B: "x ~@2 x", C: "x", D: "~@3 x",
})).gain(0.05)

// drums · open hat
const open_hat = s("oh").struct("<~@5 [~@5 x ~ x]!28 [~@7 x]!4 [~@5 x ~ x]!12 [~@5 x ~@2]!7 [~@5 x ~ x]!25>").gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 A@19 B A@8 ~ C ~ C A@3 B A@8 D@3 B@4 A@25>".pickRestart({
  A: "x!2 ~ x!13", B: "x!2 ~ x!10 ~@3", C: "~@3 x", D: "x!2 ~ x!10 ~ x ~",
})).gain(0.3)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~@5
  [~@7 x ~ x ~@3 x ~@2]!28
  ~@4
  [~@7 x ~ x ~@3 x ~@2]!12
  [~@7 x ~ x ~@6]!3
  [~@7 x ~ x ~@3 x ~@2]
  [~@7 x ~ x ~@6]!3
  [~@7 x ~ x ~@3 x ~@2]!25
>`).gain(0.78)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@5 [~@2 x!2]!28 ~@4 [~@2 x!2]!44>").gain(0.78)

// drums · congas
const congas = s("conga:18").struct("<~@5 [~@2 x!2 ~@6 x!2 ~@4]!28 ~@4 [~@2 x!2 ~@6 x!2 ~@4]!44>").gain(1.27)

// drums · ht
const ht = s("ht").struct(`<
  ~@4 A ~@7 A ~@3 A ~@7 A ~@7 A ~@7 A ~@7 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A
>`.pickRestart({
  A: "~@11 x!2 ~ x ~",
})).gain(0.45)

// drums · mt
const mt = s("mt").struct("<~@32 [~@9 x!3 ~@4] ~@15 [~@9 x!3 ~@4] ~@32>").gain(0.3)

// drums · triangle
const triangle = s("triangles:30").struct("<~@5 [~ x ~@2 x ~@4 x ~@2 x ~@3]!76>").gain(3.02)

// drums · triangle
const triangle_2 = s("triangles:35").struct(`<
  ~@5
  [x ~ x!2 ~@2 x ~ x ~ x!2 ~@2 x ~]!44
  [x ~ x!2 ~@2 x ~ x ~ x!2 ~@4]!7
  [x ~ x!2 ~@2 x ~ x ~ x!2 ~@2 x ~]!25
>`).gain(3.02)

stack(
  bass, piano, piano_2, tenor_sax, percussive_organ, rock_organ, ocarina, ocarina_soft, trumpet, electric_guitar_muted,
  trumpet_2, trumpet_soft, kick, snare, hihat, open_hat, crash, tambourine, bongos, bongos_2, congas, ht, mt, triangle,
  triangle_2
)