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: edit a riff to change every repeat.

// bass · slap bass 2 · "SLAPBASS 2"
const bass = note(`<
  A B C D E F G H A B C D I J G H K L M N M O P Q K L M N M O P Q A B C D I J G H A B K L M N M O P Q R L M N M O P Q A
  B C D S J G H T ~ U V W X Y Z AA AB AC AD AE AF I F G H R L M AG M O AH Q AI V W X AJ Z AK AL A B C D I F G H A B C D
  AC AD AE AF AC AD AE AF A B AM D S AN G H AD
>`.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: "ab1 ~ ab1 ~@2 ab1 ab2 ~ ab1 ~ ab1 ~ g1 ~ g1 ~",
  E: "c2 ~ c2 ~@2 c2 c3@2 c2 ~ c2@3 c2 c3 g2", F: "ab1 ~ ab1@2 ~ ab1 ab2@2 ab1 ~ ab1 ~ g1 ~ g1 ~",
  G: "c2 ~ c2@2 ~ c2 c3@2 c2 ~ c2@2 ~ c2 c3 g2", H: "ab1 ~ ab1@2 ~ ab1 ab2@2 ab1 ~ ab1@2 bb1 ~ bb1 ~",
  I: "c2 ~ c2 ~@2 c2 c3@2 c2 ~ c2@2 ~ c2 c3 g2", J: "ab1 ~ ab1@2 ~ ab1 ab2@2 ab1 ~ ab1@2 g1 ~ g1 ~",
  K: "c2@2 c3 ~@2 c3 g2@2 c2@4 ~ c2 c3@2", L: "ab1@2 ab2 ~@2 ab1 ab2 ~ ab1@2 ab2@2 g1@2 g2@2",
  M: "c2@2 c3 ~@2 c2 g2 [g2,c3] c2@4 ~ c2 c3@2", N: "ab1@2 ab2@2 ~ ab1 ab2@2 ab1@2 ab2@2 bb1@2 bb2@2",
  O: "ab1@2 ab2@3 ab1 ab2 ~ ab1@2 ab2@2 g1@2 g2@2", P: "c2@2 c3@2 ~ c3 g2@2 c2@5 c2 c3@2",
  Q: "ab1@2 ab2@3 ab1 ab2 ~ ab1@2 ab2@2 bb1@2 bb2 ~", R: "c2@2 c3 ~@2 c3 g2@2 c2@5 c2 c3@2",
  S: "c2 ~ c2 ~@2 c2 c3 ~ c2 ~ c2@2 ~ c2 c3 g2", T: "c2 ~@15", U: "ab1@2 ab2@2 ~ ab2 ab1@2 ab2@2 ab1@4 ~@2",
  V: "bb2@2 bb1@2 ~ bb1 bb2@2 bb1@4 bb2@3 ~", W: "ab2@2 ab1@2 ~ ab1 ab2@2 ab1@4 ab2@2 ab1 ~",
  X: "bb1@2 bb2@2 ~ bb2 bb1@2 bb2@4 bb1@2 bb2 ~", Y: "ab1@2 ab2@2 ~ ab2 ab1@2 ab2@4 ab1@2 ab2@2",
  Z: "bb1@2 bb2 ~@2 bb2 bb1@2 bb2@4 bb1@2 bb2 ~", AA: "ab1@2 ab2@2 ~ ab2 ab1@2 ab2@4 ab1@2 ab2 ~",
  AB: "g2@2 g1@2 ~ g1 g2@2 g1@4 g2@2 ~@2", AC: "c2@3 ~@12 c3", AD: "c2 ~@7", AE: "c2@2 ~@13 c3",
  AF: "c2@2 ~@6 c3 [g2,bb2] c2 ~@5", AG: "ab1@2 ab2@2 ~ ab1 ab2@2 ab1@2 ab2@2 bb1@2 bb2 ~",
  AH: "c2@2 c3@2 ~ c3 g2@2 c2@5 c2 c3 ~", AI: "ab1@2 ab2@2 ~ ab2 ab1@2 ab2@2 ab1@3 ~@3",
  AJ: "ab1@2 ab2 ~@2 ab2 ab1@2 ab2@4 ab1@2 ab2@2", AK: "ab1@2 ab2 ~@2 ab2 ab1@2 ab2@4 ab1@2 ab2 ~",
  AL: "g2@2 g1@3 g1 g2@2 g1@4 g2@2 ~@2", AM: "c2 ~ c2 ~@2 c2 c3 ~ c2 ~ c2@2 ~ g2 c2 ~, ~@6 c3 ~",
  AN: "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 E D F G A B C D E D F G H I J K H L J M H I J K H N J M A B C D E D F G A B H I J K H L J M H I J K H L J M A
  B C D E D F G O P Q R S T Q R Q ~ U V W@2 E D F G H I J K H L J M Q R S T Q R Q ~ A B C D E D F G A B C D U V W@2 U V
  W@2 A B C D E D F G X
>`.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: "[c3,g3,c4,eb4,g4]@7 ~", F: "[c3,g3,c4,eb4,g4]@3 ~",
  G: "[ab2,ab3,c4,g4]@9 ~@3 [bb2,bb3,d4,f4] ~@3, eb4@3 ~@5", H: "[c4,eb4,g4]@7 ~", I: "[ab3,c4,eb4,g4]@11 ~@5",
  J: "[bb3,c4,eb4,g4]@7 ~", K: "[ab3,c4,eb4,g4]@5 ~@3", L: "[ab3,c4,eb4,g4]@3 ~", M: "[ab3,c4,eb4,g4]@10 ab3 ~@5",
  N: "[ab3,c4,eb4,g4]@13 ~@3", O: "[c3,g3,c4] ~@15", P: "~@8 [c4,eb4,g4]@3 ~ [bb3,d4,f4]@2 ~@2",
  Q: "[ab2,ab3,c4,eb4,g4]@7 ~", R: "[bb2,bb3,d4,f4]@13 ~@3", S: "[ab2,ab3,c4,g4]@15 ~, eb4@13 ~@3",
  T: "[bb2,bb3,d4,f4]@3 ~", U: "~ c5 c4 ~ c5 ~@2 c5 ~@5 c5 c4 ~", V: "~ c4 c5 ~ c4 ~@2 c4 ~ c4 ~ c4 ~ c4!2 ~",
  W: "~ c5 c4 ~ c4 ~@2 c4 ~ c4 c5 c4 ~ c4 c5 ~", X: "[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 O P Q R Q R Q R Q A B C D E F G H A S I J K J T M N O P Q R Q R Q R Q A
  B C D E F G H ~@2 U V W@2 X Y Z AA ~@2 AB ~ E F G H I J K J L M N O U V W@2 X Y Z AA A B C D E F G H A B C D ~ AC AB
  AD ~ AC AB AD A B C D E F G H AE
>`.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: "[ab2,eb3,ab3,c4]@9 ~@7",
  P: "~@4 [c4,eb4,g4,c5]@3 [c4,eb4,g4,c5] ~@8", Q: "~@4 [ab3,eb4,g4,bb4,c5]@2 ~ [ab3,eb4,g4,bb4,c5] ~@8",
  R: "~@4 [c4,eb4,g4,c5]@2 ~ [c4,eb4,g4,c5] ~@8", S: "[c4,eb4,g4]!2 [c4,eb4,g4]@9 ~@5", T: "[c3,g3,c4]@5 ~@3",
  U: "~ bb3 ~@2 bb3 ~@2 bb3 ~ bb3 f3 g3@2 bb3 c4@2", V: "bb3@5 ~@4 bb3 bb2@4 ~@2",
  W: "[~@5 bb3 ~@2 bb3 ~@2 f3@2 g3 c4 bb3@9 ~@2 c4 ~ c4 bb3 ~@2]/2", X: "~@2 ab3@3 bb3 ~@2 ab3@3 g3 ~@4",
  Y: "~ c4 bb3 ~ c4@2 bb3@6 ~@4", Z: "~@2 ab3 ~@2 ab3 ~@2 ab3@2 ~ ab3@2 bb3 ab3 ~",
  AA: "~@2 [g2,g3]@3 g2 g3@2 g2@3 ~@5", AB: "~@7 [gb4,a4,eb5] [g4,bb4,f5] [gb4,a4,eb5] [g4,bb4,f5] ~@5",
  AC: "~@8 eb3@2 f3 ~ bb2@2 c3 ~", AD: "~ eb3 f3 ~ eb3@2 c3 ~ bb2@2 c3 ~@5", AE: "[c3,g3] ~@15",
})).s("gm_electric_guitar_muted").gain(0.72)

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

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