Strudelify
KeyE♭ minorTempo120 bpm
0:00/0:00
// Cuba — Gibson Brothers
// 120 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · tenor sax
const tenor_sax = note("<~@15 A B C D E ~@7 F G H I J K L M N ~@15 F G H I J K L M N ~@8 K L M N ~@17>".pickRestart({
  A: "~@14 bb3 ~", B: "bb4@2 ~ ab4@2 ~ gb4@2 ab4@2 ~ gb4@2 f4@2 ~", C: "gb4@2 f4@2 ~ eb4@2 ~ f4@2 ~@4 bb3 ~",
  D: "bb4@2 ~ ab4@2 ~ gb4@2 ab4@2 ~ gb4 ~@4", E: "gb4 f4 eb4 f4 ~@4", F: "~@14 eb4 ~",
  G: "bb4@2 ~ ab4@2 ~ gb4@2 ab4@2 ~ gb4@2 ~ f4@2", H: "gb4@2 ~ f4@2 ~ eb4@2 f4@3 ~@3 eb4 ~",
  I: "bb4@2 ~ ab4@2 ~ gb4 ~ ab4@2 ~ gb4@2 ~@3", J: "~@2 gb4 ~ f4 ~ eb4 f4@6 ~@3", K: "eb4 ~ gb4 gb4@12 ~",
  L: "db4@2 f4 f4@10 ~@3", M: "eb4@2 gb4 gb4@9 ~@4", N: "bb3@3 b3@3 bb3@8 ~@2",
})).s("gm_tenor_sax").gain(0.4)

// chords · brass section
const brass_section = note(`<
  ~@20 A@2 ~ B C@2 ~ D ~@16 A@2 ~ B A@2 ~ B ~@8 E B E B F ~ F ~@5 A@2 ~ B E B E B C@2 ~ D E B E B G
>`.pickRestart({
  A: "[~@10 [eb4,gb4,eb5,gb5]!4 ~ [eb4,ab4,eb5,ab5]@6 ~@11]/2", // Ebm Ab5
  B: "~@2 [eb4,gb4,c5,eb5,gb5,c6]!4 ~ [d4,f4,b4,db5,d5,f5,b5,db6] ~ [d4,f4,db5,d5,f5,db6] ~ [d4,f4,db5,d5,f5,db6] ~@4", // Cdim Bdim Dm
  C: "[~@5 [eb2,eb3,eb4,eb5]@5 ~@6]/2", D: "~@3 [bb2,bb3,bb4,bb5]",
  E: "[eb3,eb4,eb5] [f3,f4,f5] [gb3,gb4,gb5] [ab3,ab4,ab5] [bb3,bb4,bb5] ~ [eb3,eb4,eb5] [f3,f4,f5] [gb3,gb4,gb5] [ab3,ab4,ab5] [bb3,bb4,bb5] ~@5", // Eb F Gb Ab Bb Eb F Gb …
  F: "[bb3,bb4,bb5]@3 [b3,b4,b5] [bb3,bb4,bb5]@3 [b3,b4,b5] [bb3,bb4,bb5]@3 [b3,b4,b5] [bb3,bb4,bb5]!2 ~@2", // Bb B Bb B Bb B Bb
  G: "[eb3,eb4,eb5,eb6]@3 ~@13", // Eb
})).s("gm_brass_section").gain(0.42).pan(0.8)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@16 A B A C ~@2 D E ~@2 D E F G F H F G F I J@2 K@2 L@2 M@2 ~@2 D E ~@2 D E F G F H F G F I ~@5 N ~ N F G F I ~@2 D E
  ~@2 D E ~@2 D E ~@2 D E ~
>`.pickRestart({
  A: "[eb5,eb6]@3 [gb5,gb6]", B: "[f5,f6]", C: "[f5,f6]@12 [eb5,eb6] [db5,db6] [ab4,bb4,ab5,bb5] [gb4,gb5]",
  D: "~@10 [bb4,bb5] [b4,b5] [bb4,bb5] [gb4,gb5] [eb4,eb5] [b3,b4]", E: "[bb3,bb4] ~@7", F: "[bb4,bb5]", G: "[ab4,ab5]",
  H: "[ab4,ab5]@2 [f4,f5] [db5,db6]", I: "[bb4,bb5] [b4,b5] [bb4,bb5]@14", J: "[[eb5,eb6]@7 [db5,db6]]/2",
  K: "[[eb5,eb6]@24 [f5,f6]@4 [db5,db6]@3 ~]/2", L: "[[bb4,bb5]@7 [b4,b5]]/2",
  M: "[[bb4,bb5]@28 [b4,b5] [bb4,bb5] [gb4,gb5] [eb4,eb5]]/2", // Bb B Bb Gb Eb
  N: "[bb4,bb5] [ab4,ab5] [eb4,eb5] [b3,b4] [ab4,ab5] [eb4,eb5] [b3,b4] [ab3,ab4] [f4,f5] [d4,d5] [bb3,bb4] [ab3,ab4] [d4,d5] [bb3,bb4] [ab3,ab4] [f3,f4]", // Bb Ab Eb B Ab Eb B Ab …
})).s("gm_string_ensemble_1").gain(0.4).pan(0.2)

// chords · piano
const piano = note(`<
  ~@4 A B C D A B C D A B C D A B C D E F G H E F G H ~@8 I J I K L M N O E F G H E F G H ~@8 E F G H E F G H ~@4 E F G
  H E F G H E F G H E F G H ~
>`.pickRestart({
  A: "eb2@2 [eb3,gb3,bb3] ~ bb3 gb3 ~ [gb3,bb3] ~ [eb3,gb3,bb3]@4 ~ [eb3,gb3,bb3] ~, ~@3 eb3 ~@4", // Ebm Gb Ebm
  B: "ab2@2 [eb3,ab3,b3] ~ [eb3,ab3,b3]@2 ab2 [f3,bb3,d4] ~ [f3,bb3,d4] ~ [f3,d4] [f3,bb3,d4] ~ [f3,bb3,d4] ~", // Abm Bb Dm Bb
  C: "eb2@2 [eb3,gb3,bb3] ~@2 gb3 eb3 [eb3,gb3,bb3] ~ [eb3,gb3,bb3]@3 ~@2 [eb3,gb3,bb3] ~, ~@2 bb3 ~@5", // Ebm
  D: "ab2@2 [eb3,ab3,b3] ~ [eb3,ab3,b3] ~ ab2 [f3,bb3,d4] ~ [f3,bb3,d4] ~ f3 [f3,bb3,d4] ~ [f3,bb3,d4] ~", // Abm Bb
  E: "eb2@2 [gb3,bb3] eb2!2 [gb3,bb3] eb2 [gb3,bb3] ~ [gb3,bb3] eb2!2 [gb3,bb3]@2 eb2 [gb3,bb3]", // Gb
  F: "ab2@2 [gb3,b3] ab2!2 [gb3,b3] ab2 [f3,bb3] ~ [f3,bb3]@2 bb2 [f3,bb3] ~ bb2 [f3,bb3]", // B5 Bb5
  G: "eb2@2 [gb3,bb3] eb2!2 [gb3,bb3] eb2 [gb3,bb3] ~ [gb3,bb3] eb2!2 [gb3,bb3] ~ eb2 [gb3,bb3]", // Gb
  H: "ab2@2 [gb3,b3] ab2!2 [gb3,b3] ab2 [f3,bb3] ~ [f3,bb3] ~ bb2 [f3,bb3] ~ [f3,bb3] ~", // B5 Bb5
  I: "eb2 ~ [bb5,eb6,gb6] [eb2,bb5,eb6,gb6] [bb5,eb6,gb6]!2 eb2 [bb5,eb6,gb6] ~ [eb2,bb5,eb6,gb6] ~ [eb2,bb5,eb6,gb6]!2 ~ [eb2,bb5,eb6,gb6] ~", // Ebm
  J: "[ab2,f5,ab5,db6] ~ [f5,ab5,db6] ab2 [f5,ab5,db6] ~ [ab2,f5,ab5,db6] [bb2,d5,f5,bb5] ~ [bb2,d5,f5,bb5] ~ [bb2,f5,bb5] [bb2,d5,f5,bb5] ~ [db3,d5,f5,bb5] ~", // Db Bb Bb5 Bb
  K: "[ab2,f5,ab5,db6] ~ [f5,ab5,db6] ab2 [f5,ab5,db6] ~ [ab2,f5,ab5,db6] [bb2,d5,f5,bb5] ~ [bb2,d5,f5,bb5] ~ [bb2,d5,f5,bb5]!2 ~ [bb2,d5,f5,bb5] ~", // Db Bb
  L: "[eb2,eb5,eb6] ~ [gb4,gb5] [eb2,ab4,bb4,bb5] ~ [c5,c6] eb2 [eb5,eb6] ~ [eb2,gb4,gb5] ~ [eb2,bb4,bb5] [eb2,c5,c6] ~ [eb2,eb5,eb6] ~", // Eb Gb Ebsus4 C Eb Ebm Eb5 Cm …
  M: "[ab2,ab5] gb5 eb5 [ab2,b4] eb5 b4 ab2 [d3,f3,db4]@2 [bb2,f4] ~ [bb2,d3,f3,db4] [bb2,d4,f4,db5] ~ [db3,d4,f4,db5] ~, ~@7 [bb2,b3] ~ db5@2 ~@5", // Ab Abm Dm Bb5 Bb Db Bmaj7
  N: "[eb2,eb5,eb6] ~ [gb4,ab4,gb5] [eb2,bb4,bb5] ~ [c5,c6] eb2 [eb5,eb6] ~ [eb2,gb4,gb5] ~ [eb2,bb4,bb5] [eb2,c5,c6] ~ [eb2,eb5,eb6] ~", // Eb Gbsus2 Eb5 C Eb Ebm Eb5 Cm …
  O: "[ab2,b5] ab5 gb5 [ab2,eb5] gb5 eb5 ab2 [d4,f4,db5]@2 [bb2,d5,f5,db6] ~ [bb2,d4,f4,db5] [bb2,d5,f5,db6] ~ [bb2,d5,f5,db6] ~", // Abm Ab5 Dm Bb
})).s("gm_piano").gain(0.45).pan(0.8)

// bass · electric bass finger
const bass = note(`<
  A B A C A B A C A B A C A B A C A B A C A B A C A B A C D E F G H I J K A B A C A B A C A B A C A B A C D E F G H I J
  K A B A C A B A C H I J K A B A C A B A C A B A L A B A C M
>`.pickRestart({
  A: "eb2 ~@5 eb3!2 ~@6 bb2 a2", B: "ab2 ~ ab2 ~@3 ab1 ~ bb1 ~@3 bb2 ab2 gb2 f2",
  C: "ab2 ~ ab2 ~@3 ab1 ~ bb1@2 ~@2 bb2 ab2 gb2 f2", D: "b1@2 ~@2 b2 ~ b1!2 ~@5 b1@3",
  E: "bb1 ~ bb1 ~ bb2@2 bb1!2 ~ bb1@3 bb2@2 eb1@2", F: "b1@2 ~@2 b2 ~ b1!2 ~@5 b1 b2@2",
  G: "bb1 ~ bb1 ~ bb2@2 bb1!2 ~ bb1 ~@2 bb2@2 bb1@2", H: "b1 ~@3 b2 ~ b1!2 ~@4 b2@2 b1@2",
  I: "bb1 ~ bb1@2 bb2 ~ bb1!2 ~ bb1@2 ~ bb1@2 eb1@2", J: "b1@2 ~@2 b2@2 b1!2 ~@6 b2@2", K: "bb1@15 ~",
  L: "ab2 ~ ab2 ~@3 ab1 ~ bb1@2 ~@2 bb2 ab2 gb2 ~", M: "eb1@3 ~@13",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · epiano1
const epiano1 = note("<~@29 A ~ B ~@21 A ~ B ~@33>".pickRestart({
  A: "~@12 db5@3 ~, ~@8 db6@7 ~, ~@9 bb5@6 ~, ~@10 gb5@5 ~, ~@11 eb5@4 ~",
  B: "~@12 db4@3 ~, ~@8 db5@7 ~, ~@9 bb4@6 ~, ~@10 gb4@5 ~, ~@11 eb4@4 ~",
})).s("gm_epiano1").gain(0.3)

// drums · kick
const kick = s("bd").struct("<[x!2]!88 x>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!67 [~@4 x ~@5 x!4 ~ x] [~ x ~ x]!20 ~>").gain(0.5)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x ~ x!2 ~]!88 ~>").gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@35 [~@11 x!2 ~ x ~] ~@23 [~@11 x!2 ~ x ~] ~@11 [~@11 x!2 ~ x ~] ~@17>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct(`<
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!35
  ~
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!23
  ~
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!11
  ~
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!16
  ~
>`).gain(0.5)

// drums · mid tom
const mid_tom = s("mt").struct("<~@35 A ~ B ~ C ~ D ~ E ~@15 A ~@3 F ~@7 A ~@17>".pickRestart({
  A: "~@4 x ~ x!2", B: "~@11 x!2 ~ x!2", C: "~@9 x ~@6", D: "~@9 x ~ x ~@2 x!2", E: "x ~ x ~@2 x ~@3 x!3 ~@2 x ~",
  F: "~@9 x ~ x!2 ~ x ~",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<[~ x ~ x]!20 ~@8 [~ x ~ x]!7 ~@17 [~ x ~ x]!7 ~@9 [~ x ~ x]!3 ~@18>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@35 A ~ B ~ C D E D F ~@15 A ~@3 G ~@7 A ~@17>".pickRestart({
  A: "~@2 x ~@2 x ~@2 x ~@7", B: "~@9 x!2 ~@5", C: "~@7 x ~@3 x!2 ~ x!2", D: "~@15 x", E: "x ~ x ~@2 x!4 ~@3 x!2 ~@2",
  F: "x ~ x ~@2 x ~ x!2 ~@3 x!2 ~@2", G: "~@6 x!2 ~@8",
})).gain(0.45)

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

// drums · bongos
const bongos = s("bongo:4").struct("<~@60 A B@2 C B D B E ~@21>".pickRestart({
  A: "~@3 x ~@7 x ~@2 x ~", B: "~@3 x ~@7 x ~@4", C: "~@3 x ~@12", D: "~@3 x ~@8 x ~@3", E: "~ x ~@2",
})).gain(0.91)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@28 A@3 B A@3 ~@17 A@3 B A@3 ~@9 A@3 ~@18>".pickRestart({
  A: "~@3 x ~@8 x ~@3", B: "~@3 x ~@8 x ~ x!2",
})).gain(0.91)

// drums · congas
const congas = s("conga:33").struct("<~@28 A@4 B A@2 C ~@16 A@4 B A@2 C A D@2 C A E D F B A@2 C ~@17>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x!3 ~@2", C: "x", D: "x ~@2 x!2 ~@2 x", E: "x ~@2 x ~@3 x", F: "x ~@2 x ~@4",
})).gain(0.95)

stack(
  tenor_sax, brass_section, string_ensemble_1, piano, bass, epiano1, kick, snare, clap, low_tom, hihat, mid_tom,
  open_hat, high_tom, crash, bongos, bongos_2, congas
)

More by Gibson Brothers