Strudelify

La Cumbia

Ana Caram

KeyC minorTempo112 bpm
0:00/0:00
// La Cumbia — Ana Caram
// 112 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 94 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(112/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 · acoustic guitar nylon
const acoustic_guitar_nylon = note("<~@58 A@5 ~@31>".pickRestart({
  A: "[~@63 [ab3,c4]@2 ~@15, d4!8 d4!8 eb4!8 eb4!8 ~@8, ~ [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [g3,b3]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 [ab3,c4]@2 ~@17]/5", // Ab G Ab
})).s("gm_acoustic_guitar_nylon").gain(0.32).pan(0.4)

// other · blown bottle
const blown_bottle = note(`<
  ~@2 A B C D ~@24 A B C D A B C D ~@16 A B C D ~@12 A B C D A B C D A B C D A B C D A B C D A B C D
>`.pickRestart({
  A: "~@2 c7 ~ eb7 f7 ~ g7 ~ g7 ~ g7 f7@2 eb7@2", B: "~@2 c7 ~ eb7 f7 ~ g7 ~ g7@2 f7 ab7@2 ~@2",
  C: "~@2 c7 ~ eb7 f7 ~ g7 ~ g7 ~@2 f7@2 eb7 ~, ~@11 g7@2 ~@3", D: "c7 ~ c7 ~ c7 ~ c7@3 ~@7",
})).s("gm_blown_bottle").gain(0.36).pan(0.6)

// bass · acoustic bass
const bass = note(`<
  ~@2 A@3 B A@3 C A@3 B D C D C D C D C A@3 C A@3 B A@3 B A@3 B D C D C D C D C A@3 C A@3 B A@3 B ~@4 D C D C E ~@3 A@3
  B A@3 B A@3 C A@3 B A@3 C A@3 F
>`.pickRestart({
  A: "c2@2 ~ c2 eb2@2 g2@2 g1@2 ~ g1 b1@2 d2@2", B: "c2@3 c2 eb2@2 g2@2 c2@2 ~ c2 eb2@2 g2 ~",
  C: "c2@2 ~ c2 eb2@2 g2@2 c2@2 ~ c2 eb2@2 g2 ~", D: "g1@3 g1 b1@2 d2@2 g1@2 ~ g1 b1@2 d2@2, ~@4 db2 ~@11", E: "c2 ~@7",
  F: "c2 ~ c2 ~ c2 ~ c2@4 ~@6",
})).s("gm_acoustic_bass").gain(0.35)

// chords · accordion
const accordion = note(`<
  ~@2 A B A C A B A C A B A C D@2 E F@3 G H A B A C A B A C A B A C A B A C D@2 E F@3 G H A B A C A B A C A B A C ~@4
  D@2 E I ~@4 A B A C A B A C A B A C A B A C A B A C A B A J
>`.pickRestart({
  A: "~@2 [g4,c5,eb5] [g4,c5,eb5]@2 ~ [g4,c5,eb5]@3 ~ [g4,b4,d5] [g4,b4,d5]@2 ~ [g4,b4,d5]@2", // Cm G
  B: "~@2 [g4,c5,eb5] [g4,c5,eb5]@2 ~ [g4,c5,eb5]@3 ~ [g4,b4,d5,f5] [g4,b4,d5,f5]@2 ~ [g4,b4,d5,f5]@2", // Cm G7
  C: "~@2 [g4,c5,eb5] [g4,c5,eb5]@2 ~ [g4,c5,eb5]@3 ~ [g4,c5,eb5] [g4,c5,eb5]@2 ~ [g4,c5,eb5]@2", // Cm
  D: "[[b3,d4] [c4,eb4], g3]/2", E: "[g3,b3,d4]@15 ~, c4 ~@15",
  F: "[eb4@5 ~ eb4@2 ~@4 eb4@3 ~@13 f4@4 [c4,eb4]@15 ~, g3@47 ~, c4@13 ~@3 [b3,d4]@16 ~@16, ~ g4 ~@4]/3", // Cm Bm
  G: "[g3,b3,d4,f4]@15 ~", H: "[g3,c4,eb4,g4]@15 ~, [b3,f4] ~@15",
  I: "eb4@5 ~ eb4@3 ~@3 eb4@3 ~, g3, c4@13 ~@3, ~@9 g4@7", J: "[c3,c5,eb5,g5]@3 [c3,g4,c5,eb5,g5] ~@4, g4 ~@15",
})).s("gm_accordion").gain(0.23)

// other · piano · C Eb G Eb G B D F …
const piano = note(`<
  ~@66
  [[c3,c5]@2 [eb3,eb5]@2 [g3,g5]@2 [eb3,eb5] [g2,g4]@2 [b2,b4] [d3,d5] [f3,f5] [eb3,eb5]@2 [d3,d5]@2]
  [[c3,c5]@2 [eb3,eb5]@2 [g3,g5]@2 [eb3,eb5] [g2,g4]@2 [b2,b4] [d3,d5] [f3,f5] [eb3,eb5]@3 ~]
  [[c3,c5]@2 [eb3,eb5]@2 [g3,g5]@2 [eb3,eb5] [g2,g4]@2 [b2,b4] [d3,d5] [f3,f5] [eb3,eb5]@2 [d3,d5]@2]
  [[c3,c5]@2 [eb3,eb5]@2 [g3,g5]@2 [c3,c5]@2 ~@3 [g3,g5] [ab3,ab5] [g3,g5] [f3,f5] [eb3,eb5]]
  [[c3,c5]@3 ~@13]
  ~@23
>`).s("gm_piano").gain(0.57).pan(0.6)

// chords · accordion
const accordion_2 = note(`<
  ~@6 A B C D E F E G ~@8 A B C D E F E G A B C D E F E G ~@8 A B C D E F E G A B C D ~@12 A B C D E F E G A B C D E F E
  G A B C D E F E H
>`.pickRestart({
  A: "[c3,eb3,g3] ~@3 [b2,d3,g3] ~@3", B: "[c3,eb3,g3] ~@7 [b2,d3] ~@7, ~@4 g3 ~@3",
  C: "[c3,eb3,g3] ~@7 [b2,f3,g3]@2 ~@6, ~@8 d3 ~@7", D: "[c3,eb3,g3] ~@7 [c3,eb3,g3] ~@7",
  E: "[c3,eb3,g3] ~@7 [b2,d3,g3]@2 ~@6", F: "[c3,eb3,g3] ~@3 [f3,g3] ~@3, ~@8 [b2,d3] ~@7",
  G: "[d3,eb3,gb3,g3] ~@7 [c3,eb3,g3] ~@7, c3 ~@7", H: "[d3,eb3,gb3,g3] ~@15, c3 ~@7",
})).s("gm_accordion").gain(0.3).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@2 [x!4]!91 [x!4 ~@4]>").gain(0.59)

// drums · clap
const clap = s("cp").struct("<~@30 [x!4]!8 ~@16 [x!4]!4 ~@8 [x!4]!27 x>").gain(0.41)

// drums · china
const china = s("cr").struct(`<
  ~@2 A B ~@2 A ~@15 A ~@7 A B ~@2 A B ~@10 A ~@3 A ~@3 A B ~@6 A ~@7 A B ~@2 A B ~@2 A ~@3 A ~@3 A B ~@2 A ~@2 A
>`.pickRestart({
  A: "x", B: "~@7 x",
})).gain(0.41)

// drums · china · soft notes
const china_soft = s("cr").struct("<~@2 A ~@27 A ~@3 A ~@15 A ~@3 A ~@7 A ~@7 A ~@3 A ~@7 A ~@3 A ~@7>".pickRestart({
  A: "x",
})).gain(0.24)

// drums · cowbell
const cowbell = s("cb").struct("<[x!4]!93 x>").gain(0.35)

// drums · congas
const congas = s("conga:33").struct(`<
  ~@2
  [x ~@2 x!4 ~ x ~@2 x!4 ~]!56
  ~@4
  [x ~@2 x!4 ~ x ~@2 x!4 ~]!4
  ~@4
  [x ~@2 x!4 ~ x ~@2 x!4 ~]!23
  [x!4 ~@4]
>`).gain(0.94)

// drums · ht
const ht = s("ht").struct("<~@21 A ~@7 B ~@29 C D E F G H I J ~@2 J ~@11 G ~@7 F ~@3 K>".pickRestart({
  A: "~@8 x ~ x!2 ~ x ~@2", B: "~@12 x!4", C: "x ~ x ~ x ~@2 x ~@2 x!4 ~ x", D: "x ~@8 x ~ x ~@4",
  E: "~ x!4 ~@3 x ~@2 x!2 ~@2 x", F: "~@6 x!4 ~@3 x!3", G: "x!2 ~ x!2 ~ x!4 ~ x!4 ~", H: "x!2 ~ x!3 ~ x!3 ~ x!2 ~ x!2",
  I: "x!2 ~ x!3 ~@2 x ~ x!6", J: "x", K: "x!4 ~@4",
})).gain(0.47)

// drums · ht · soft notes
const ht_soft = s("ht").struct("<~@29 A ~@31 B C ~@2 D ~@23 C ~@4>".pickRestart({
  A: "~@11 x ~@4", B: "~@7 x ~@8", C: "~@3 x ~ x ~@10", D: "~@9 x ~@6",
})).gain(0.29)

// drums · mt
const mt = s("mt").struct(`<
  ~ A ~@3 B ~@7 B ~@7 C ~@3 D ~@3 E ~ F ~ G ~@11 H ~@7 B ~@5 I J K L ~@8 F ~ G ~@2 M N O ~@6 B ~@3 L ~@4
>`.pickRestart({
  A: "~@2 x!14", B: "~@6 x!3 ~ x!2 ~ x!2 ~", C: "~@7 x", D: "~@8 x ~ x ~@2 x ~@2", E: "~@6 x!3 ~@7", F: "~@14 x!2",
  G: "~@2 x!4 ~ x!2 ~ x!2 ~ x!2 ~", H: "~@7 x!9", I: "~@4 x ~@2 x", J: "~@3 x", K: "~@6 x!2 ~ x!3 ~ x!3", L: "x!2 ~@14",
  M: "~@15 x", N: "~ x!2 ~@3 x ~@2 x ~ x!2 ~@2 x", O: "x",
})).gain(0.35)

// drums · mt · soft notes
const mt_soft = s("mt").struct("<[x!16] [x!2 ~@14] ~@59 [~@5 x ~@10] ~@32>").gain(0.12)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@22 [x!16]!16 ~@8 [x!16]!12 ~@12 [x!16]!23 [x!4 ~@4]>").gain(1.49)

// drums · guiro
const guiro = s("guiro:0").struct("<[x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!93 x>").gain(9.96)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@22 x!16 ~@16 x!8 ~@8 x!24>").gain(0.6)

// drums · rim
const rim = s("rim").struct("<[x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!93 x>").gain(0.47)

stack(
  acoustic_guitar_nylon, blown_bottle, bass, accordion, piano, accordion_2, kick, clap, china, china_soft, cowbell,
  congas, ht, ht_soft, mt, mt_soft, cabasa, guiro, woodblocks, rim
)