Strudelify

Kalimba De Luna

Boney M.

KeyD majorTempo118 bpm
0:00/0:00
// Kalimba De Luna — Boney M.
// 118 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(118/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 · electric guitar muted · "Kalimba de"
const electric_guitar_muted = note(`<
  A@8 B C B C A@8 B C B C A@8 B C B C B C B C D E F G D E D G A@12 B C B C B C B C ~@4 D E F G D E D G D E F G D E D G D
  E F G D E D G D E F G D E D G ~
>`.pickRestart({
  A: "d4 ~ d4!2 a3!3 ~ c4!4 g3!3 ~", B: "d4 ~ d4!2 a3!3 ~ a#3!4 f3!3 ~", C: "d4 ~ d4!2 a3!3 ~ b3!7 ~",
  D: "~@4 b3!2 a3!2 b3!2 ~@6", E: "~@2 a3!2 b3!2 a3!2 d4!2 b3 ~@5", F: "~@2 a3!2 b3!2 a3!2 b3!2 ~@6",
  G: "~@2 a3!2 b3!2 a3!2 e4!2 d4 ~@5",
})).s("gm_electric_guitar_muted").gain(0.29).pan(0.9)

// other · shamisen
const shamisen = note("<A@8 B C B C A@8 B C B C A@8 B C B C B C B C ~@8 A@12 B C B C B C B C ~@37>".pickRestart({
  A: "d4 ~ d4!2 a3!3 ~ c4!4 g3!3 ~", B: "d4 ~ d4!2 a3!3 ~ a#3!4 f3!3 ~", C: "d4 ~ d4!2 a3!3 ~ b3!7 ~",
})).s("gm_shamisen").gain(0.24).pan(0.4)

// chords · pad poly
const pad_poly = note("<~@3 A B ~@14 C D E B F ~@7 C D E B F D E B F ~@19 C B E B F B E B F ~@35 G H>".pickRestart({
  A: "~@11 [a4,d5,f5] [c5,e5]@2 [a4,d5,f5] ~, ~@12 g4 ~@3", B: "~@2 [d5,f5,a5] ~@5",
  C: "~@11 [a4,d5,f5] [g4,c5,e5]@2 [a4,d5,f5] ~", D: "~@2 [f5,a5,d6] ~@5", E: "~@12 [b4,e5,g5]@3 ~",
  F: "~@6 [b4,e5,g5] ~", G: "~@14 a3 ~", H: "b3@3 ~@13",
})).s("gm_pad_poly").gain(0.38).pan(0.6)

// bass · electric bass finger
const bass = note(`<
  ~@4 A B A C D E D F A B A C A B A C G H I J A B A C A B A C G H I J G H I J K L M L N O P Q R S R T A B A C A B A C G
  H I J G H I J ~@4 K L M L N O P U K L M L N O P Q K L M L N O P U K L M L N O P V ~
>`.pickRestart({
  A: "d2@3 d2 a1@3 ~ d2@3 ~ a1@3 ~", B: "c2@3 c2 g1@3 ~ c2@3 ~ g1@3 ~", C: "c2@3 c2 g1@3 ~ c2@4 g1@2 ~ g1",
  D: "d2@4 a1@4 a#1@4 f1@3 ~", E: "d2 a1 e2 b1", F: "d2@4 a1@4 e2@4 b1@3 ~", G: "d2@3 ~ a1@2 ~ a1 a#1@3 ~ f1@2 ~ f1",
  H: "d2@3 ~ a1@2 ~ a1 g2@3 ~ e2@3 e2", I: "d2@3 ~ a1@2 ~ a1 a#1@2 ~@2 f1@2 ~ f1", J: "d2@4 a1@2 ~ a1 g2@4 e2@3 e2",
  K: "b1@4 f#1@3 ~ b1@4 f#2@4", L: "e2@2 b1@2 a1@2 e2 a1", M: "b1@4 f#2@3 ~ b1@4 f#2@3 ~",
  N: "b1@3 ~ f#2@4 b1@3 b1 f#2@3 d2", O: "e2@4 b1@3 ~ a1@4 e2@3 ~", P: "b1@4 f#2@3 ~ b1@3 ~ f#2@3 ~",
  Q: "e2@3 ~ b1@3 ~ a1@4 e2@2 ~ a1", R: "d2@2 a1 ~@4 a1 d2@2 a1 ~@4 d2", S: "c2@2 g1 ~@4 g1 c2@2 g1 ~@4 g1",
  T: "c2@2 g1 ~@4 g1 c2@2 c2 g2 c3@3 ~", U: "e2@3 ~ b1@3 ~ a1@4 e2@4", V: "e2@3 ~ b1@3 ~ a1@4 e2@2 a1 ~",
})).s("gm_electric_bass_finger").gain(0.72)

// chords · synth brass 1
const synth_brass_1 = note(`<
  ~@4 A B A B C D C D A B A B A B A B C D C D A B A B A B A B C D C D C D C D E F E F E F E F A B A B A B A B A B A B C
  D C D C D C D ~@4 E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F ~
>`.pickRestart({
  A: "~@2 [a3,d4,f4] ~@3 [a3,d4,f4] ~@3 [a3,d4,f4] ~@2 [a3,d4,f4] ~@2", // Dm
  B: "~@2 [g3,c4,e4] ~@3 [g3,c4,e4] ~@3 [g3,c4,e4] ~@2 [g3,c4,e4] ~@2", // C
  C: "~@2 [a3,d4,f4] ~@3 [a3,d4,f4] ~@3 [a#3,d4,f4] ~@2 [a#3,d4,f4] ~@2", // Dm A#
  D: "~@2 [a3,d4,f4] ~@3 [a3,d4,f4] ~@3 [b3,e4,g4] ~@2 [b3,e4,g4] ~@2", // Dm Em
  E: "~@2 [b3,d4,f#4] ~@3 [b3,d4,f#4] ~@3 [b3,d4,f#4] ~@3 [b3,d4,f#4] ~", // Bm
  F: "~@2 [b3,e4,g4] ~@3 [b3,e4,g4] ~@3 [c#4,e4,a4] ~@2 [c#4,e4,a4] ~@2", // Em A
})).s("gm_synth_brass_1").gain(0.23).pan(0.1)

// other · brass section
const brass_section = note(`<
  ~@19 A B C B C ~ D ~@3 E ~ A B C B C B C B C F G F H F I F J ~@5 D ~@3 E ~ A B C B C B C B C ~@4 F G F H F I F J F G F
  H F I F J F G F H F I F J F G F H F I F K L
>`.pickRestart({
  A: "~@11 [d5,f5] [c5,e5]@2 [d5,f5] ~", B: "~@2 [d5,f5] ~@5", C: "~@6 [e5,g5] ~",
  D: "[d3,d4]@3 ~ [a2,a3]@4 [c3,c4]@3 ~ [g2,g3]@3 ~", E: "[d3,d4]@4 [a2,a3]@4 [c3,c4]@4 [g2,g3]@3 ~",
  F: "b3@2 ~@8 f#4 ~ f#4 ~ f#4 ~", G: "f#4@2 ~ e4 ~@10 a3 ~", H: "f#4@3 e4@2 ~@3 a4@2 ~@4 a3 ~",
  I: "f#4@3 e4 ~@10 a3 ~", J: "f#4@2 ~ e4@2 ~@11", K: "f#4@2 ~ e4@2 ~@9 [a3,a4] ~", L: "[b3,b4] ~@7",
})).s("gm_brass_section").gain(0.29)

// other · lead 3 calliope
const lead_3_calliope = note("<~@36 A B C D ~@8 E@2 F ~@9 A B C D A B C D ~@37>".pickRestart({
  A: "~ [d5,c#6,d6] ~ [d5,d6] [a4,a5] ~ [f4,f5] ~ [g4,g5]@3 [a4,a5] ~@4", // Dmaj7 D A F G A
  B: "~ [d5,c#6,d6] ~ [d5,d6] [a4,a5] ~ [f4,f5] ~ [b4,a#5,b5] ~ [g4,g5] [e4,e5] ~@4", // Dmaj7 D A F Bmaj7 G E
  C: "~ d5 d6 [d5,d6] [a4,a5] ~ [f4,f5] ~ [g4,g5]@2 [a4,g5,a5] [f4,f5] ~@4", // D A F G A7 F
  D: "~ [d5,d6] ~ [d5,d6] [a4,a5] ~ [f4,f5] ~ [g4,g5]!2 [e4,e5]!2 [b3,b4] ~@3", // D A F G E B
  E: "[~@8 [c4,c5,c#5] d5@20 ~ [c4,d4] a3, ~@9 c#4 ~@22]/2", F: "g3@2 [c4,d4,c5,d5] [a3,a4] ~@12",
})).s("gm_lead_3_calliope").gain(0.33)

// other · lead 3 calliope · soft notes
const lead_3_calliope_soft = note("<~@36 A ~ B C ~@8 D@2 E ~@9 A ~ B C A ~ B C ~@37>".pickRestart({
  A: "~ c#5 ~@14", B: "~@11 g4 ~@4", C: "~ c#6 ~@14", D: "[~@10 d4@19 ~@3]/2",
  E: "~@4 g4 ~ g4 ~ g4 ~ g4 ~@5, ~@3 g3@3 ~@10",
})).s("gm_lead_3_calliope").gain(0.22)

// chords · rock organ
const rock_organ = note(`<
  ~@40 A@2 B@2 C@2 D@2 ~@24 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~
>`.pickRestart({
  A: "[[d5,f#5,a5]@16 [e5,g5]@7 ~ [c#5,e5,a5]@8, b4@23 ~@9]/2", // D Em A
  B: "[[d5,f#5,a5]@15 ~ [e5,g5]@7 ~ [c#5,e5,a5]@7 ~, b4@23 ~@9]/2", // D Em A
  C: "[[d5,f#5,a5]@2 g5 [c#5,a5], b4@3 ~, ~@16 e5@15 ~]/2", D: "[[d5,f#5,a5]@15 ~ g5@8 c#5@8, b4@23 ~@9, ~ e5]/2",
})).s("gm_rock_organ").gain(0.25).pan(0.9)

// chords · rock organ · soft notes
const rock_organ_soft = note("<~@47 A ~@25 B ~@5 A ~ B ~@5 A ~ B ~@5 A ~ B ~@5 A ~>".pickRestart({
  A: "~ a5", B: "~@8 g#5 ~@7",
})).s("gm_rock_organ").gain(0.12).pan(0.9)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@40 A B C D A E A F ~@24 G H I J G K G L A B C D A E A F A B C D A E A F G H I J G K G L ~
>`.pickRestart({
  A: "b2@2 ~@8 f#3 ~ f#3 ~ f#3 ~", B: "f#3@3 e3 ~@10 [a2,a3] ~", C: "[b2,b3]@2 ~@8 f#3 ~ f#3 ~ f#3 ~",
  D: "f#3@2 ~ e3@2 ~@3 a3@2 ~@4 a2 ~", E: "f#3@3 e3 ~@10 a2 ~", F: "f#3@2 ~ e3@3 ~@10", G: "b3@2 ~@8 f#4 ~ f#4 ~ f#4 ~",
  H: "f#4@3 e4 ~@10 [a3,a4] ~", I: "[b3,b4]@2 ~@8 f#4 ~ f#4 ~ f#4 ~", J: "f#4@2 ~ e4@2 ~@3 a4@2 ~@4 a3 ~",
  K: "f#4@3 e4 ~@10 a3 ~", L: "f#4@2 ~ e4@3 ~@10",
})).s("gm_string_ensemble_1").gain(0.52)

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

// drums · snare
const snare = s("sd").struct("<~@3 A ~@36 B@8 ~@11 C ~@12 B@32 ~>".pickRestart({
  A: "~@5 x ~@2", B: "~ x ~ x", C: "~@3 x",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<~@2 [~ x ~ x ~ x ~ x] [~@2 x ~@3 x ~@3 x ~@2 x!2 ~] [x!16]!100 ~>").gain(0.48)

// drums · low tom
const low_tom = s("lt").struct("<~@3 [~@13 x ~@2] ~@55 [~ x ~@6] ~@43 [~@7 x] ~>").gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 A ~@55 B ~@9 C ~ D ~@31 E ~>".pickRestart({
  A: "~@5 x ~@2", B: "~@5 x ~@2 x ~@7", C: "~ x ~@11 x ~@2", D: "~@2 x!3 ~ x!3 ~@4 x!2 ~", E: "~@9 x ~@3 x!2 ~",
})).gain(0.72)

// drums · high tom
const high_tom = s("ht").struct("<~@68 [~@15 x] [x ~@8 x ~ x!2 ~@3] [~@9 x!4 ~@3]!2 ~@31 [~@9 x ~ x!2 ~ x ~] ~>")
  .gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 A ~@3 A ~@7 B ~@3 A ~@7 B ~@3 B ~@3 A ~@3 A ~@3 A ~@3 A ~@7 B ~@3 B ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~ A C ~
>`.pickRestart({
  A: "x", B: "~ x ~@2", C: "~@7 x",
})).gain(0.56)

// drums · ride
const ride = s("rd").struct("<~@40 [~ x ~ x ~ x ~ x]!8 ~@24 [~ x ~ x ~ x ~ x]!32 ~>").gain(0.56)

// drums · tambourine
const tambourine = s("tb").struct("<~@68 [~ x ~ x ~ x ~ x]!4 ~@33>").gain(0.72)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@3 [~@3 x] ~@32 [~ x ~@2] ~@27 [~ x ~@2] ~@40>").gain(7.52)

// drums · bongos
const bongos = s("bongo:4").struct("<A B C D ~@44 E A F G ~@16 H@4 ~@33>".pickRestart({
  A: "~@13 x ~@2", B: "~@11 x ~@4", C: "x ~@8 x ~ x ~@2 x ~", D: "~@5 x ~@4 x ~@5", E: "x ~@4 x ~@10",
  F: "x ~@8 x ~ x!2 ~@3", G: "~@9 x ~@5 x", H: "x ~@4 x ~@4 x ~@3 x ~",
})).gain(1.68)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<A B C ~@45 D E F G ~@16 H@4 ~@33>".pickRestart({
  A: "~@7 x", B: "~@15 x", C: "~@13 x ~@2", D: "~ x ~ x", E: "~@3 x", F: "~ x", G: "~@5 x ~ x", H: "~@4 x ~@8 x ~@2",
})).gain(1.68)

// drums · congas
const congas = s("conga:13").struct("<A B C D ~@44 E F G H ~@7 I ~@8 J@4 ~@33>".pickRestart({
  A: "~@15 x", B: "~@7 x", C: "~@3 x", D: "~@3 x ~@4", E: "~@3 x ~@7 x ~@4", F: "~@3 x ~ x ~@5 x ~@2 x!2",
  G: "~@7 x ~@5 x ~@2", H: "~@4 x ~@6 x ~ x ~@2", I: "~@5 x ~ x", J: "~@3 x ~@4 x ~@3 x ~@3",
})).gain(2.3)

// drums · congas
const congas_2 = s("conga:18").struct("<~ A B C ~@44 D E F G ~@7 H ~@8 I@4 ~@33>".pickRestart({
  A: "x ~@8 x ~@3 x ~@2", B: "~@15 x", C: "~ x", D: "~ x ~@3 x ~@2", E: "~@2 x ~@2 x ~@2", F: "~@5 x ~@8 x ~",
  G: "~@3 x ~@8 x ~@3", H: "~@13 x ~@2", I: "x ~ x ~@4 x ~@3 x ~@4",
})).gain(2.3)

// drums · congas
const congas_3 = s("conga:33").struct("<~ A ~ B ~@44 C D E F ~@7 A ~@8 G@4 ~@33>".pickRestart({
  A: "~@3 x", B: "~@11 x ~ x ~@2", C: "~@9 x ~@6", D: "~ x ~@7 x ~@6", E: "~@15 x", F: "x!2 ~@6", G: "~@6 x ~@8 x",
})).gain(2.3)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@40 A B C D A E C D ~@24 A B C D A B C D 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: "x ~ x ~ x ~@2 x ~@2 x ~ x!3 ~", B: "x ~@3 x!3 ~@3 x!4 ~@2", C: "x ~ x!5 ~ x ~ x!6", D: "x ~ x ~ x!3 ~ x!8",
  E: "x ~@4 x!2 ~@3 x!4 ~@2",
})).gain(1.62)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@40 A B ~@2 A B ~@26 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@3
>`.pickRestart({
  A: "~@3 x ~@4", B: "~ x ~@5 x",
})).gain(1.22)

// drums · shaker
const shaker = s("sh").struct("<~@4 [x ~ x!8 ~ x!5]!67 [x ~ x!14] [x ~ x!8 ~ x!5]!32 ~>").gain(0.32)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@4 [~@5 x ~@2]!67 ~ [~@5 x ~@2]!32 ~>").gain(0.16)

// drums · rim
const rim = s("rim").struct("<~@68 [x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x]!4 ~@33>").gain(0.8)
// … 6 more lines

More by Boney M.