Strudelify

Jamaican Rhumba

Benjamin Arthur

KeyF majorTempo120 bpm
0:00/0:00
// Jamaican Rhumba — Benjamin Arthur
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 33 bars on a 32-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.

// chords · piano · "A.PIANO 1"
const piano = note("<A B C@3 D@3 E F G@2 H@3 I@6 J@4 K@4 L M N O>".pickRestart({
  A: "~@3 c4@3 ~@3 f2@2 ~ c4@2 ~ c5 ~@2 [c3,bb3]@4 [bb4,c5]@2 ~ [f2,c3]@3 c4@2 [f4,a4,c5] ~", // C7 Bbsus2 F5 F
  B: "~ c3 f2@2 ~ c4 ~ f4 a4 ~@5 [bb4,c5]@3 [f2,c3]@3 c4@2 [a4,c5] f4 ~ a3@2 ~ c4@3 ~, ~@10 [c3,bb3]@7 ~@8 c3@7", // Bbsus2 F5 Am C7
  C: "[~@5 [f4,c5]@3 ~@3 db4@3 [f4,a4,c5] ~@8 f4 ~@4 [f4,a4,c5]@2 ~ [g2,d3]@3 ~@2 [f4,c5] a4 ~ bb3@2 ~ d4@3 [f4,a4,c5] ~ g2 d3 ~@2 [a4,c5] ~ c2@2 ~ d4@3 e4 ~ c3 ~@7 c5 ~ c5 ~@2 c5 ~@5 [e4,d5]@2 ~ [g4,c5] ~@2 bb4 ~ a4 ~@2 bb4 ~@2 [c4,a4] ~, ~@2 [f2,c3]@6 [gb2,db3]@6 ~@3 [db3,bb3]@5 c5@2 ~@10 d4@4 ~@12 f4@2 ~@7 c5@10 ~@8 c5@4 ~@5 bb3@6 ~@4, ~@20 db4@4 ~ [gb2,db3]@5 ~@9 d3@6 ~@8 c3@6 bb4@5 ~@14 f2@4 ~@12 c3@2]/3", // F5 F G5 F5 F Am E7 C5 …
  D: "[~ g4 ~@2 [c3,f4]@2 a4@6 c4 ~ d4@3 c4@2 ~ c3@2 ~ c4@2 ~ [c3,g4]@3 bb4@6 [c3,d4]@3 ~@3 c4@2 c3 ~@2 c4@2 ~@2 [c3,a4]@2 ~@6 e4@2 ~ f4 ~@2 c5@2 c5 [c3,c4] ~ c5 ~@2 c5@2 ~ d5@2 c5 g4 ~ bb4 ~@2 a4@2 bb4@2 ~ [c3,c4] ~@2 [e4,g4] ~@2 [f2,c3,f4]@2, ~@14 f4@6 d4 ~@14 bb3@8 ~@6 f2@3 ~@5 c3@9 ~@6 [f2,c3]@6 ~@2 [c3,bb3]@6 ~@10, ~@38 g4@10 ~@4 c5@8 a4@3 ~@25 a4@2 ~@6, ~@38 e4@5 d4@5 ~@10 a3@9 ~@29, ~@61 d4@5 ~@9 e4 ~@20]/3", // F5 C5 Csus2 F C Em F5 C7
  E: "a4@6 c4 ~ d4 ~@5 [c3,d4]@2 ~ c4@3 c3@3 bb4@6 d4@3, ~@6 a3@9 ~@17, ~@6 c3@5 ~@21, ~@8 f4@12 g4 ~@11", // Csus2
  F: "~@3 c4 ~@2 [c3,d4] ~@2 c4 ~@5 f5@2 ~ d5 ~ c5@2 ~@4 c5 ~ c5 ~@2 c5, e4@6 g4@5 [c3,f4]@6 ~@15, ~@14 ab4@3 ~@15", // Csus2 F5
  G: "[~@2 [f2,c5]@3 d5@2 ~ c5 ~ bb4 c3@2 a4 ~ bb4@2 ~ c4 e4 ~ g4 ~@2 c3@2 ~@6 c4 c3@2 f4@6 ~@3 c4@3 [c3,g4]@3 ~@9 e4@5, ~@10 bb3@3 ~@5 [c3,a4]@5 ~ [f2,f4]@8 a3@8 ~ [c3,d4]@6 ~@8 d4@3 g4@6, ~@27 a4@9 ~@14 bb4@6 bb3@8]/2", // F5 C5 F Csus2
  H: "[[c3,d4] ~@2 c4@2 ~ [f2,c3,a4]@3 c5@5 e4@2 ~ f4 ~@3 c5@2 ~ c4@2 c5 ~@5 [e4,d5] ~@2 [g4,c5] ~@2 bb4 ~ a4 ~@2 bb4 ~@2 [c4,a4] ~@2 [e4,g4]@3 [f2,c3,f4]@3 ~@5 c4@2 ~ f4@6 c3 ~@2 c4@3 [f2,g4]@3 ~@11 c4@2 ~ [c3,d4] ~@2 c4, ~@14 a3@12 ~@4 [f2,c3]@5 ~@3 c3@4 ~@4 c3@6 ~@32 bb3@8 ~@4, ~@17 a4@3 ~@4 c5 ~@4 c5@2 ~@24 a4@8 ~@15 bb4@8 ~@6 g4@3 ~, ~@18 d4@5 ~@15 bb3@7 ~@24 d4@5 ~@9 d4@4 e4@5 ~@4]/3", // Csus2 F E7 C5 F Em F5 Fsus2 …
  I: "[~@2 f4 ~@7 c5@2 ~ c4@2 ~ f4@2 ~ d4 ~@2 c4 ~@6 [bb4,c5]@2 ~@6 [f4,bb4,c5] ~@2 [f4,c5]@2 ~@7 c3@3 c5 ~@2 [a4,c5] ~@5 d4@4 ~@11 [e4,bb4,c5] ~@2 [e4,bb4]@4 bb3@3 ~@14 f4 [a4,c5] ~ [f4,a4,c5] ~@2 c4@4 ~@9 c4@2 ~ c3@3 [e4,bb4,c5] ~ [e4,bb4,c5]@4 ~@2 [f4,bb4,c5] ~@2 [f4,bb4,c5]@3 ~@3 [g4,bb4,c5]@3 ~@3 [d5,a5,c6] ~@8 [d5,f5] ~@5 d5@3 c5@2 ~ f2@2 ~@4 [c4,e4]@2 ~ a4 ~@2 bb4@3 g4 ~@2 [bb3,d4,f4] ~@2 [e4,g4] ~, ~@2 [f2,c3]@10 ~@13 c3@12 d3@6 ~@6 f3@5 ~@4 a3@4 ~@3 c4@5 c4@4 c3@6 ~@9 c4@6 c4@3 c3@6 ~@9 c4@6 ~@2 c4@12 ~@12 [c4,f4]@5 ~@4 [c4,a4]@13 ~@5 bb3@5 bb3@8 ~@7, ~@4 [ab4,f5]@8 ~@3 ab3@2 ~ a3@2 ~@5 c2@9 c2@5 ~@3 e3@8 ~@2 g3@7 c3@14 g3@4 a3@7 ~@2 [e4,g4]@15 bb3@7 ~@2 [f4,a4]@11 ~@18 e4@7 ~@3 g4@7 ~@4 c5@6 ~@3 g4@8 ~@15, ~@7 d5@5 ~@55 [c2,d4]@9 ~@16 [c2,d4]@10 ~@14 [c3,d4]@5 ~@10 c3@4 ~@34 c3 ~@22, ~@8 a4@4 ~@19 [bb4,c5]@6 ~@9 [g4,bb4,c5]@5 ~@10 a4@15 ~@3 c5 ~@6 d4@6 ~@5 a3@5 ~@8 d4@6 ~@17 d4@7 ~@11 [d5,c6]@5 ~ a5@10 ~@25]/6", // Bbsus2 Fsus4 F5 Am C7 Edim Am F …
  J: "[~@7 [f4,b4,eb5]@6 ~@8 [f4,b4,eb5]@3 ~@3 [f4,eb5]@3 ~@6 [f4,b4,eb5]@3 [f4,b4,eb5]@2 ~@3 [f4,b4,eb5]@3 db4@3 [f4,bb4,db5]@3 ~@6 bb4@3 ~@5 [f4,bb4,db5]@3 ~@2 d5 [e4,bb4] ~@7 c5@3 c6 ~@2 c6 ~@2 c6 ~@2 c6 ~@2 [e5,d6]@2 ~ [g5,c6] ~ bb5 ~@2 a5@2 ~ bb5 ~@2 [c3,c5,a5] ~@2 [e5,g5] ~@2 f5 ~@7 c5@3 ~, ~@15 [b4,eb5]@6 ~@12 [db4,ab4]@9 db3@5 ~@9 gb4@14 ~@6 d5@8 ~@35 a5@9, ~@16 f4@5 ~@9 [f4,b4,eb5]@6 ~@17 [f4,bb4,db5]@5 [f4,db5]@3 ~ [f4,bb4,db5]@5 ~@8 [e4,bb4]@8 ~@45, ~@18 [db3,ab3]@6 [db3,ab3]@17 ab3@2 ~@4 gb3@17 [gb3,db4]@5 ~ [c3,g3]@14 ~@9 [f2,c3]@6 ~@29, ~@56 db4@8 ~@14 c4@6 ~@17 bb3@6 ~@21]/4", // Fm7b5 F7 Fm7b5 Bbm Edim E7 C5 F …
  K: "[~@5 [c3,d5]@4 c5@2 ~@4 bb5@6 d5@2 ~ e5@3 c5 ~@2 c3 ~@2 c5@2 ~ c3@2 ~ c6@6 e5@3 d4@3 c6@2 ~ [c5,c6] ~@2 c6 ~@13 a5@3 bb5 ~@2 [c3,c5,a5] ~@2 [e5,g5] ~@10 c5@2 ~ d5 ~@2 c5@2 ~ d5 ~@2 c5@2 ~ f2@2 bb4@3 ~@6 db5@3 ~@6 [bb4,db5,gb5]@2, f5@10 ~@2 g5@12 g5@11 ~ a5@11 ~ a5@2 ~@9 c6@6 ~ [g5,c6]@5 ~@12 f5@11 f5@10 ~@2 gb5@11 bb4@6 [f2,db3,f5]@5, ~@21 bb3@9 d5@5 ~@10 [c3,a3]@10 ~@5 [f2,c3]@8 bb3@7 ~@16 a3@8 ~@13 bb4@2 db3@6 gb5@6 ~@2, ~@48 d5 ~@14 [e5,d6]@6 c3@4 ~@27 c3@5 ~ db3@8 [bb3,ab5]@14, ~@68 bb5@2 ~@16 a5@9 ~@16 db5@6 bb5@11]/4", // Csus2 C F Em Gb C5 Db F …
  L: "~ [f2,c3]@2 ~ d5@2 ~@9 [d5,g5]@2 [f2,c3] ~@2 [bb4,g5]@4 f6@3 [a5,c6]@2 ~ ab5@2, ~ g5@13 bb4@2 ~@8 f5 ~@5 b5 ~, ~@3 bb4@3 [bb4,d5]@6 bb5@5 f5@6 ~ a6@2 ~@6, ~@9 [c3,bb3,a5]@8 ~@15", // F5 G5 F5 Eb Am Bb F
  M: "~@3 [f5,a5] ~@2 [e5,ab5] ~@4 [d5,f5] ~@2 [f4,a5] ~@2 [a4,c5] ~ b4 ab4 ~ c5@2 ~ [f4,a4] ~ [e4,ab4] ~@2 d5 ~, f6 ~@7, ~ c6@4 ~@4 [b5,d6]@4 ~ f5@3 ~@5 f5 ~@9", // F E Dm F Am F E Bm
  N: "[d4,f4]@2 ~ [f3,f4,a4] ~@2 [a3,c4] ~@2 ab3 ~ f4@2 ~ a3 ~@2 ab3@2 d4@3 f3 ~@9", // Dm F Am
  O: "~@2 [c3,bb3,db4,gb4,ab4]@9 [c4,g4,d5]@7 ~@14", // Gb Csus2
})).s("gm_piano").gain(0.32)

// chords · piano · "A.PIANO 1" · soft notes
const piano_soft = note("<A B C ~ D E ~@2 F@2 G H I J@2 K@3 L ~ M N ~@2 O@2 P Q R ~ S T U>".pickRestart({
  A: "[f2,c3]@6 [f4,a4,c5] ~@2 c3@2 ~@4 [f4,a4] ~@6 [d4,e4]@2 ~@8", B: "~@8 c5 ~@5 d4@4 ~@13 f4",
  C: "[a4,c5] ~@4 a4@3 ~@15 a4 ~@8", D: "~ c4@4 ~@9 c3@4 ~@4 c3@4 ~@6", E: "~@4 f2@3 ~@5 a3@7 ~@7 f2@3 ~@3, ~@3 c3 ~@4",
  F: "[~@12 c4@2 ~@6 f2@3 ~@7 c3 ~@12 f2@6 ~ a4@2 ~@3 c4@3 ~@6, ~@29 bb3@9 ~@26]/2", G: "~@2 c3@3 e4 ~@2 g4 ~@23",
  H: "~@3 d4@2 ~ c4 ~@8 f2@4 ~@5 c3@4 ~ c4@2 ~", I: "~@15 c3@6 ~@3 c3@2 ~@6",
  J: "[~@29 c3@2 d4@2 ~@2 c4 ~@7 c3@9 c3@4 ~@8, ~@29 a3@7 ~@28]/2",
  K: "[~@29 e4@2 e4@6 ~@3 bb4@3 ~@9 [d4,a4] ~@2 d4@3 ~@4 f4@15 ~@6 c3@13]/3", L: "~@11 c3@9 ~@12",
  M: "~@17 c3@8 ~@2 c3@2 ~@3", N: "~ db3@2 ~ f4@3 ~@6 [f4,b4,eb5]@3 ~@11 b4@3 ~@2, ~ ab3@17 ~@14, ~@5 [db4,ab4]@7 ~@4",
  O: "[~@6 c3@5 ~@9 c3 f2@2 ~@6 c3@3 d5@2 ~ c5@2 ~@7 [f2,c3]@10 c3@3 ~@7, ~@29 a3@9 ~@26]/2", // F5
  P: "~@4 f2@2 ~@10 f5 ~@5 c4@2 ~@8", Q: "~@19 f2@2 ~@6 c3@4 ~, ~@19 c3 ~@12", R: "~@13 db5@2 ~@9 db5@6 ~@2",
  S: "~@30 b4 ~", T: "~@9 b3 ~ c4@2 ~@4 e3 ~ b3 ~@12", U: "~@11 [f3,a3]@6 ~@15",
})).s("gm_piano").gain(0.24)

stack(piano, piano_soft)