Strudelify

Calypso Cha-Cha

Richard Oliver

KeyE♭ majorTempo120 bpm
0:00/0:00
// Calypso Cha-Cha — Richard Oliver
// 120 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 3 "Bass" named as a bass, played on electric bass finger (its choir aahs patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/135922; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 70 bars on a 16-step grid, each part at one level. 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.

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@3 A B C D E F G H@2 I J K L I M N O I J K L I M P Q R S T U V W X Y R Z T AA ~@2 AB AC I J K L I M N Q I AD K AE I
  AD AF AG I AD K AE I AD N Q AH AI
>`.pickRestart({
  A: "~@7 c3", B: "f3 f3@2 f3 e3 e3@3", C: "eb3!4 d3 d3@3", D: "~ eb3!3 d3!2 c3!2", E: "bb2@6 ~ c3",
  F: "f3 f3@2 f3 e3 ~ e3@2", G: "eb3!3 ~ d3 d3@2 d3", H: "[c3@2 c3!2 d3 eb3@2 d3@4 g3@4 g3]/2",
  I: "d3!2 ~ d3 g3!2 ~ g3", J: "d3@2 d3@2 g3@2 ~ g3", K: "c3!2 ~ c3 g3!2 ~ g3", L: "c3@2 c3@2 g3@2 ~ g3",
  M: "d3!2 g3 ~", N: "~ c4 f3 ab3 c4@2 g3!2", O: "c4!2 g3 c4 ~@3 g3", P: "~ c4 f3 ab3 c4!2 g3!2", Q: "c4!2 g3 c4 ~@4",
  R: "ab3@2 bb3 c4@2 ab3!3", S: "g3@2 g3 c3@5", T: "~ ab3!2 bb3 c4@2 c3@2", U: "db3 ~ db4 c4@4 ~", V: "~@7 c4",
  W: "db4!2 c4 bb3@5", X: "~@7 ab3", Y: "bb3!2 ab3 g3@5", Z: "g3@3 c3@5", AA: "db3 ~ db4 c4@2 c4 ~@2",
  AB: "~ c4!2 db4 c4 bb3 ab3 f3", AC: "ab3 g3@2 f3@2 g3@2 g3", AD: "d3@4 d3@4 b2 ~ b2 ~ b2@2 ~@2",
  AE: "c3@4 c3@4 b2 ~ b2 ~ b2@2 ~@2", AF: "b2 ~@3", AG: "~@3 b2@2 b2@3 b2@4 ~@4", AH: "~ c4 bb3!2 c4@2 bb3!2",
  AI: "c4@4 ~@4 b2 ~ b2 ~ b2@2 ~@2",
})).s("gm_electric_bass_finger").gain(0.15)

// chords · piano
const piano = note(`<
  A B C D E F G H I J K@2 L M N O L M P Q L M N O L M R Q S T S U V W V X S T S U V W Y Z L M N O L M P Q L M AA AB L M
  ~@2 L M AA AB L M P Q AC AD
>`.pickRestart({
  A: "[f2,f4]@2 [ab2,ab4] [c3,c5] [e2,e4]@2 [ab2,ab4] [c3,c5]", // F Ab C E Ab C
  B: "[eb2,eb4]@2 [ab2,ab4]@2 [c3,c5]@2 [d2,d4]@4 [d2,d4] ~ [d2,d4]@2 ~@2", // Eb Ab C D
  C: "[db2,db4] [db3,b3,eb4,a4,db5]@2 [db3,b3,eb4,a4,db5]!5", D: "[c3,bb3,d4,g4,c5]@2 ~ [c2,c3,d4,g4,c5]@3 ~ [c2,c4]",
  E: "[ab3,c4,f4] ~@3 [ab3,c4,e4] ~ c2@2, f2@2 ~ c3@3 ~@2, ~ [ab3,c4,f4]@3 ~ [ab3,c4,e4]@3", // Fm Abaug Fm Abaug
  F: "[ab3,c4,eb4] ~@3 [ab3,c4,d4] ~ bb1@2, f2@2 ~ bb2@3 ~@2, ~ [ab3,c4,eb4]@3 ~ [ab3,c4,d4]@3", // Ab Dm7b5 Ab Dm7b5
  G: "~ [g3,bb3,eb4]!2 [g3,bb3,eb4]@2 [g3,bb3,d4] [g3,bb3,c4]!2, eb2@2 ~ bb2@3 bb1@2", // Eb Gm C7
  H: "eb2@2 ~ bb2@3 bb1 [bb1,d4,ab4,bb4,eb5], [g3,bb3,c4,eb4] ~", // Bb7 Cm7
  I: "[d4,f4,ab4,c5] ~@3 [e4,f4,ab4,c5] ~ c2@2, f2@2 ~ c3@3 ~@2, ~ [d4,f4,ab4,c5]@3 ~ [e4,f4,ab4,c5]@3", // Dm7b5 Fm Dm7b5 Fm
  J: "[eb4,f4,ab4,c5] ~@3 [d4,f4,ab4,c5] ~ bb1@2, f2@2 ~ bb2@3 ~@2, ~ [eb4,f4,ab4,c5]@3 ~ [d4,f4,ab4,c5]@3", // Fm7 Dm7b5 Fm7 Dm7b5
  K: "[[eb4,ab4,c5] ~ [eb4,ab4,c5]!2 [ab2,gb3,eb4,ab4,d5] [ab2,gb3,eb4,ab4,c5,eb5]@2 [g2,f3,g4,b4,d5]@4 [g1,g2,eb4,b4,g5]@4 ~, [ab2,gb3] ~@3]/2", // Ab Ab7 G7 Gaug Ab7
  L: "[c4,d4,f4,a4] ~ d3@2 [b3,d4,f4,g4] g3@2 g3, d3 ~@3, ~ [c4,d4,f4,a4]@3 ~ [b3,d4,f4,g4]@3", // Dm7 G7 Dm7 G7
  M: "d3 a3 [g3,c4,d4,f4,a4]@2 [d4,f4,g4,b4] ~@2 [d4,f4,g4,b4], [c4,d4,f4,a4] ~ g2 g3", // Dm7 G7 Dm7
  N: "[c4,e4,g4,a4] ~ c3@2 [d4,e4,g4,b4] g3@2 g3, c3 ~@3, ~ [c4,e4,g4,a4]@3 ~ [d4,e4,g4,b4]@3", // Am7 Em7 Am7 Em7
  O: "c3 a3 [g3,c4,e4,g4,a4]@2 [e4,g4,b4] ~@2 [e4,g4,b4], [c4,e4,g4,a4] ~ g2 g3", // Am7 Em Am7
  P: "[c2,c3] [c3,bb3,e4,c5] [bb2,ab3,d4,bb4]!2 [c3,bb3,e4,c5]@2 [bb2,ab3,d4,bb4]!2", // C C7 Bb7 C7 Bb7
  Q: "[c3,bb3,e4,c5]!2 [bb2,ab3,d4,bb4] [c3,bb3,e4,c5] ~ c3 c2@2", // C7 Bb7 C7
  R: "[c2,c3] [c3,bb3,e4,c5] [bb2,ab3,d4,bb4]!2 [c3,bb3,e4,c5]!2 [bb2,ab3,d4,bb4]!2", // C C7 Bb7 C7 Bb7
  S: "f2@4 ~ [eb4,f4] ~@8 [eb4,f4,ab4,c5]@2, ~@2 [ab4,c5] [eb4,f4,ab4,c5]@2 [eb4,f4,ab4,c5]@2 ~, ~@2 c3 c2", // Ebsus2 Fm7 Ab Fm7
  T: "g2@4 ~ [f4,g4] ~@8 [e4,g4,bb4,c5]@2, ~@2 [bb4,d5] [f4,g4,bb4,d5]@2 [e4,g4,bb4,c5]@2 ~, ~@2 c3 c2", // Fsus2 C7 Bb Gm7 C7
  U: "[db2,db4] ~ [db3,db5,db6] c3@2 c2 e2 g2, ~@3 [c5,e5,g5,c6]@5", // Db C
  V: "ab2@4 ~ [eb4,ab4] ~@8 [eb4,ab4,c5]@2, ~@2 c5 [eb4,ab4,c5]@2 [eb4,ab4,c5]@2 ~, ~@2 eb3 eb2", // Ab5 Ab
  W: "bb2@4 ~ [f4,ab4] ~@8 [eb4,g4,bb4,db5]@2, ~@2 [bb4,db5] [f4,ab4,bb4,db5]@2 [eb4,g4,bb4,db5]@2 ~, ~@2 eb3 eb2", // Fm Eb7 Bbm Bbm7 Eb7
  X: "bb2@4 ~ [db4,f4] ~@4 [e4,g4,bb4,c5]@4 [e2,e4,g4,bb4,c5]@2, ~@2 bb4 [db4,f4,bb4]@2 c2 ~@2, ~@2 c3 ~", // Db C7 Bbm
  Y: "[ab1,ab2,ab4,ab5]@2 [c3,c5,c6] [db3,db5,db6] [c3,c5,c6] [bb2,bb4,bb5] [ab2,ab4,ab5] [f2,f4,f5]", // Ab C Db C Bb Ab F
  Z: "[ab2,ab4,ab5] [g2,g4,g5]@2 [f2,f4,f5]@2 [g2,g3,b4,d5,f5,g5]@2 ~", // Ab G F G7
  AA: "[c4,e4,g4,b4] ~ c3@2 [d4,e4,g4,a4] g3@2 g3, c3 ~@3, ~ [c4,e4,g4,b4]@3 ~ [d4,e4,g4,a4]@3", // Cmaj7 Dsus4 Cmaj7 Dsus4
  AB: "c3 a3 [g3,c4,e4,g4,b4]@2 [e4,g4,b4] ~@2 [e4,g4,b4], [c4,e4,g4,b4] ~ g2 g3", // Cmaj7 Em Cmaj7
  AC: "~ [c3,bb3,e4,c5] [bb2,ab3,d4,bb4]!2 [c3,bb3,e4,c5]@2 [bb2,ab3,d4,bb4]!2", // C7 Bb7 C7 Bb7
  AD: "[c3,bb3,e4,c5] ~@4 c3 [c2,e4,g4,b4]@2", // C7 Cmaj7
})).s("gm_piano").gain(0.39)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@4
  [~@3 x ~@2 x!2]!8
  [~@2 x ~ x ~ x!2]!16
  [~ x ~ x ~ x ~@2]!16
  [~@2 x ~ x ~ x!2]!14
  ~@2
  [~@2 x ~ x ~ x!2]!9
  ~
>`).gain(0.41)

// drums · congas
const congas = s("conga:33").struct("<~@18 A@2 ~@6 A@2 ~@22 A@2 ~@14 A@3 ~>".pickRestart({
  A: "x",
})).gain(1.3)

stack(bass, piano, pedal_hat, congas)