Strudelify
Keep It Together cover art

1989 · Like a Prayer

Keep It Together

Madonna

KeyC minorTempo102 bpm
0:00/0:00
// Keep It Together — Madonna
// 102 bpm, 4/4, key C 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: duplicate parts dropped: ch 3 "HALO PAD" pad halo (copy of ch 2 "MELODY" music box)
// note: Full arrangement: all 129 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(102/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, A@4 for four bars: edit a riff to change every repeat.

// bass · slap bass 2 · "SLAPBASS 2"
const bass = note(`<
  A B C B D E F G A B C B D E F G H I J K J L H M N I J K J L H M A B C B D E F G A B H I J K J L H M N I J K J L H M A
  B C B D E F G O ~ P Q R S T U V W X O Y Z D E F G H I J K J L H M P Q R S T U V W A B C B D E F G A B C AA X O Y Z X O
  Y Z A B C B D AB F G O
>`.pickRestart({
  A: "c2 ~ c2 ~@2 c2 c3 ~ c2 ~ c2@3 c2 c3 [c2,g2]", B: "ab1 ~ ab1 ~@2 ab1 ab2@2 ab1 ~ ab1@2 g1 ~ g1 ~",
  C: "c2 ~ c2 ~@2 c2 c3 ~ c2 ~ c2@2 c3 g2 c2 ~", D: "c2 ~ c2 ~@2 c2 c3@2 c2 ~ c2@2 ~ c2 c3 g2",
  E: "ab1 ~ ab1@2 ~ ab1 ab2@2 ab1 ~ ab1 ~ g1 ~ g1 ~", F: "c2 ~ c2@2 ~ c2 c3@2 c2 ~ c2@2 ~ c2 c3 g2",
  G: "ab1 ~ ab1@2 ~ ab1 ab2@2 ab1 ~ ab1@2 bb1 ~ bb1 ~", H: "c2@2 c3@2 ~ c3 g2@2 c2@5 c2 c3@2",
  I: "ab1@2 ab2 ~@2 ab1 ab2 ~ ab1@2 ab2@2 g1@2 g2@2", J: "c2@2 c3 ~@2 c2 g2 [g2,c3] c2@4 ~ c2 c3@2",
  K: "ab1@2 ab2@2 ~ ab1 ab2@2 ab1@2 ab2@2 bb1@2 bb2@2", L: "ab1@2 ab2@3 ab1 ab2 ~ ab1@2 ab2@2 g1@2 g2@2",
  M: "ab1@2 ab2@3 ab1 ab2 ~ ab1@2 ab2@2 bb1@2 bb2 ~", N: "c2@2 c3 ~@2 c3 g2@2 c2@4 ~ c2 c3@2", O: "c2 ~@7",
  P: "ab1@2 ab2@2 ~ ab2 ab1@2 ab2@2 ab1@4 ~@2", Q: "bb2@2 bb1@2 ~ bb1 bb2@2 bb1@4 bb2@3 ~",
  R: "ab2@2 ab1@2 ~ ab1 ab2@2 ab1@4 ab2@2 ab1 ~", S: "bb1@2 bb2@2 ~ bb2 bb1@2 bb2@4 bb1@2 bb2 ~",
  T: "ab1@2 ab2@2 ~ ab2 ab1@2 ab2@4 ab1@2 ab2@2", U: "bb1@2 bb2 ~@2 bb2 bb1@2 bb2@4 bb1@2 bb2 ~",
  V: "ab1@2 ab2@2 ~ ab2 ab1@2 ab2@4 ab1@2 ab2 ~", W: "g2@2 g1@2 ~ g1 g2@2 g1@4 g2@2 ~@2", X: "c2@3 ~@12 c3",
  Y: "c2@2 ~@13 c3", Z: "c2@2 ~@6 c3 [g2,bb2] c2 ~@5", AA: "ab1 ~ ab1 ~@2 ab1 ab2 ~ ab1 ~ ab1 ~ g1 ~ g1 ~",
  AB: "ab1 ~ ab1@2 ~ ab1 ab2@2 ab1!2 ab1@2 g1 ~ g1@2",
})).s("gm_slap_bass_2").gain(0.64)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  A B C D C D C E A B C D C D C E F G H G F I H J F G H G F I H J A B C D C D C E A B F G H G F I H J F G H G F I H J A
  B C D C D C E K L M N M O M N P ~ Q R S@2 C D C E F G H G F I H J M N M O M N P ~ A B C D C D C E A B C D Q R S@2 Q R
  S@2 A B C D C D C E T
>`.pickRestart({
  A: "[c4,eb4,g4]@15 ~, [c3,g3]@3 ~", B: "[ab2,ab3,c4,eb4,g4]@11 ~@5", C: "[c3,g3,c4,eb4,g4]@13 ~@3",
  D: "[ab2,ab3,c4,eb4,g4]@3 ~", E: "[ab2,ab3,c4,g4]@9 ~@3 [bb2,bb3,d4,f4] ~@3, eb4@3 ~@5", F: "[c4,eb4,g4]@7 ~",
  G: "[ab3,c4,eb4,g4]@11 ~@5", H: "[bb3,c4,eb4,g4]@7 ~", I: "[ab3,c4,eb4,g4]@3 ~", J: "[ab3,c4,eb4,g4]@10 ab3 ~@5",
  K: "[c3,g3,c4] ~@15", L: "~@8 [c4,eb4,g4]@3 ~ [bb3,d4,f4]@2 ~@2", M: "[ab2,ab3,c4,eb4,g4]@7 ~",
  N: "[bb2,bb3,d4,f4]@13 ~@3", O: "[bb2,bb3,d4,f4]@3 ~", P: "[ab2,ab3,c4,g4]@15 ~, eb4@13 ~@3",
  Q: "~ c5 c4 ~ c5 ~@2 c5 ~@5 c5 c4 ~", R: "~ c4 c5 ~ c4 ~@2 c4 ~ c4 ~ c4 ~ c4!2 ~",
  S: "~ c5 c4 ~ c4 ~@2 c4 ~ c4 c5 c4 ~ c4 c5 ~", T: "[c3,g3,c4,eb4,g4] ~@15",
})).s("gm_epiano1").gain(0.47)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  A B C D E F G H A B C D E F G H I J K J L M N J O P O P O P O P A B C D E F G H A Q I J K J L M N J O P O P O P O P A
  B C D E F G H ~@2 R S T@2 U V W X ~@2 Y ~ E F G H I J K J L M N J R S T@2 U V W X A B C D E F G H A B C D ~ Z Y AA ~ Z
  Y AA A B C D E F G H AB
>`.pickRestart({
  A: "c3 ~ c3 ~ bb3 ~ c4 bb3 ~@4 c4 [g3,bb3] c3 ~", B: "~ ab2 ab3 ~ ab2 ~@4 bb3 c4 ~ bb3 ab3 ~@2",
  C: "~ g3 c3 ~ bb3 ~ c4 bb3 ~@5 bb3 g3 ~", D: "~@5 ab2 ab3 ~@2 ab2 ab3 ~@5",
  E: "c3 ~ c3 ~@2 bb3 c4 bb3 ~@6 bb3 [c3,g3]", F: "~@5 ab2 ab3 ~ ab2 ~ ab3 ~ bb3 c4 bb3 ~",
  G: "~ c3 g3 ~ g3 ~ bb3 c4 ~ c4 ~ c4 ~ c4 bb3 g3", H: "~ ab2 ab3 ~ ab2@2 ~@3 ab2 ab3@2 bb2 bb3 ~@2",
  I: "[c3,eb3,g3,bb3,c4]@8 ~@2 [c3,eb3,g3,bb3,c4] ~@5", J: "[ab2,eb3,ab3,c4]@5 ~@3",
  K: "[c3,g3,bb3,c4]@8 ~@5 [c3,g3,c4] ~@2", L: "[c3,g3,c4]@11 ~@5", M: "[ab2,ab3,c4] ~",
  N: "[c3,g3,bb3,c4]@10 ~@3 [c3,g3,bb3,c4] ~@2", O: "~@4 [c4,eb4,g4,c5]@2 ~ [c4,eb4,g4,c5] ~@8",
  P: "~@4 [ab3,eb4,g4,bb4,c5]@2 ~ [ab3,eb4,g4,bb4,c5] ~@8", Q: "[c4,eb4,g4]!2 [c4,eb4,g4]@9 ~@5",
  R: "~ bb3 ~@2 bb3 ~@2 bb3 ~ bb3 f3 g3@2 bb3 c4@2", S: "bb3@5 ~@4 bb3 bb2@4 ~@2",
  T: "[~@5 bb3 ~@2 bb3 ~@2 f3@2 g3 c4 bb3@9 ~@2 c4 ~ c4 bb3 ~@2]/2", U: "~@2 ab3@3 bb3 ~@2 ab3@3 g3 ~@4",
  V: "~ c4 bb3 ~ c4@2 bb3@6 ~@4", W: "~@2 ab3 ~@2 ab3 ~@2 ab3@2 ~ ab3@2 bb3 ab3 ~", X: "~@2 [g2,g3]@3 g2 g3@2 g2@3 ~@5",
  Y: "~@7 [gb4,a4,eb5] [g4,bb4,f5] [gb4,a4,eb5] [g4,bb4,f5] ~@5", Z: "~@8 eb3@2 f3 ~ bb2@2 c3 ~",
  AA: "~ eb3 f3 ~ eb3@2 c3 ~ bb2@2 c3 ~@5", AB: "[c3,g3] ~@15",
})).s("gm_electric_guitar_muted").gain(0.72)

// other · glockenspiel · "GLOCKENSPL"
const glockenspiel = note(`<
  ~@4 A@4 B ~@2 C D ~@19 B ~@2 C D ~@3 E@2 ~@16 B ~@2 C D ~@17 A@4 ~@16 B ~@2 C D ~@3 B ~@2 C ~@8 B ~@2 C D ~@4
>`.pickRestart({
  A: "[g6,g7]@2 [eb6,eb7] ~ [f6,f7] ~ [bb6,bb7] ~ [g6,g7] ~ [eb6,eb7] ~ [f6,f7]@2 [c6,c7] ~", B: "g6@3 ~, f6 ~@15",
  C: "~@8 c7@4 bb6@3 ~", D: "c7@3 ~", E: "[f6 ~@3 bb6@3 ~ g6@4 eb6@15 ~@5, g6 ~@3]/2",
})).s("gm_glockenspiel").gain(0.53)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A@8 ~@24 A@8 B@2 ~@16 A@8 ~@2 C D C D C D E@2 ~@4 F@4 ~@8 C D C D C D E@2 A@8 ~@12 G@8 ~
>`.pickRestart({
  A: "[~@16 ab3@15 ~@17 ab3@15 ~@16 ab3@16 ~@17 ab3@15 ~, [c4,eb4,g4]@127 ~]/8", B: "[~@16 ab3@15 ~, [c4,eb4,g4]]/2",
  C: "[ab3,c4,eb4,g4]@15 ~", D: "[f3,bb3,d4,f4]@15 ~", E: "[[ab3,c4,eb4]@16 [g3,b3,d4]@15 ~, g4@31 ~]/2",
  F: "[~@15 ab3@16 ~@17 ab3@15 ~, [c4,eb4,g4]@63 ~]/4", // Cm
  G: "[~@16 ab3@16 ~@16 ab3@15 ~@16 ab3@16 ~@17 ab3@15 ~, [c4,eb4,g4]@127 ~]/8", // Cm
})).s("gm_synth_strings_1").gain(0.39)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C A B A B A B A D A B A B A B A B A B A B A B A B A B A
  B A B A B A D A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B E
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~@3 x ~@4 x", B: "x ~@2 x ~ x!2 ~@2 x!2 ~@4 x", C: "x ~@2 x ~@4 x ~@2 x ~@3 x",
  D: "x ~@2 x ~ x!2 ~@3 x ~@4 x", E: "x",
})).gain(0.78)

// drums · snare
const snare = s("sd").struct(`<
  A@3 B A@3 B A@3 B A@3 B A@7 C A@7 D A@3 B A@3 E A@9 C A@7 C A@3 B A@3 E A F A@7 G A@3 G A@3 B A@7 C A@7 G A@3 B A@3 C
  A@3 B A@3 C A@3 B A@3 B A@3 H I
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2", C: "~@4 x ~@7 x!2 ~@2", D: "~@4 x!2 ~ x ~ x ~@3 x!3", E: "~@4 x ~@4 x ~@4 x!2",
  F: "~ x ~@2 x ~@2 x ~ x ~ x ~ x!2 ~", G: "~@8 x ~ x ~ x!2 ~ x", H: "~ x ~@2 x ~@2 x ~ x ~ x ~ x!3", I: "x",
})).gain(0.78)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@31 A ~@7 B ~@25 B ~ C ~@7 D ~@3 D ~@19 D ~@27 C ~>".pickRestart({
  A: "~@11 x!2 ~@3", B: "~@12 x!2 ~@2", C: "~@2 x ~@2 x ~@6 x ~@3", D: "~@2 x!2 ~@3 x",
})).gain(0.23)

// drums · clap
const clap = s("cp").struct("<A@16 ~@16 A@10 ~@16 A@26 ~@8 A@14 ~@2 A@6 ~@2 A@12 ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.78)

// drums · hihat
const hihat = s("hh").struct("<[x!16]!127 [x!15 ~] ~>").gain(0.23)

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

// drums · cowbell
const cowbell = s("cb").struct(`<
  A B A B A B A B A B A B A B A B ~@16 A B A B A B A B A B ~@16 A B A B A B A B A B A B A B A B A B A B A B A B A B ~@8
  A B A B A B A B A B A B A B ~@2 A B A B A B ~@2 A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@2 x ~@2 x ~@2 x ~@5 x!2", B: "~@2 x ~@2 x ~@2 x ~@2 x ~@3 x",
})).gain(0.78)

// drums · congas
const congas = s("conga:13").struct(`<
  A@16 B C B C B C B C B C B C B C B C A@10 B C B C B C B C B C B C B C B C A@26 B C B C B C B C A@14 B C A@6 B C A@11 D
  ~
>`.pickRestart({
  A: "~@2 x!2 ~ x ~@4 x ~@3 x ~", B: "~@3 x ~@9 x ~@2", C: "~@3 x ~@5 x ~@3 x ~@2", D: "~@2 x!2 ~ x ~@4 x ~ x!3 ~",
})).gain(2.48)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  A@16 B C B C B C B C B C B C B C B C A@10 B C B C B C B C B C B C B C B C A@26 B C B C B C B C A@14 B C A@6 B C A@11 D
  E
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@7 x", C: "~@5 x ~ x", D: "~@6 x ~@8 x", E: "x",
})).gain(2.48)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@16 A@16 ~@10 A@16 ~@26 A@8 ~@14 A@2 ~@6 A@2 ~@13>".pickRestart({
  A: "x!4",
})).gain(3.93)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@16 A@16 ~@10 A@16 ~@26 A@8 ~@14 A@2 ~@6 A@2 ~@13>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(1.18)

stack(
  bass, epiano1, electric_guitar_muted, glockenspiel, synth_strings_1, kick, snare, snare_soft, clap, hihat, crash,
  cowbell, congas, congas_2, cabasa, cabasa_soft
)

More by Madonna