Strudelify

Lady Marmalade

LaBelle

KeyG minorTempo119 bpm
0:00/0:00
// Lady Marmalade — LaBelle
// 119 bpm, 4/4, key G 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: Full arrangement: all 97 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(119/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 · fretless bass
const bass = note(`<
  ~ A B A B A B A ~ A B A B C D A B A B A B E@2 F A B A B A B A B C D A B A B A B E@2 F A B A B G H I J K L I J M N A B
  A B C D O@2 A B A B C P Q O A B A B A B R ~@2 S ~ S ~ S ~ S ~ A B A B A B T
>`.pickRestart({
  A: "g2 d2 f2 bb2@2 f2 g2 c2", B: "~@6 c2 ~", C: "c2 ~ c2 ~@3 c2 ~ c2 ~ c2 ~@3 c2@2",
  D: "d2 ~ d2 ~@3 d2 ~ d2 ~ d2 ~@5", E: "[c2 ~@6 g2@4 f2 d2@3 c2]/2", F: "bb1@3 c2 bb1 ~ g1 ~",
  G: "g2@5 ~ f2 ~ d2@5 ~ c2 ~", H: "bb1@5 ~ c2 ~ bb1@3 ~ g1@2 ~@2", I: "eb2@13 ~ eb2 ~", J: "eb2@5 ~ eb2 ~ eb2@8",
  K: "g2@13 ~ g2 ~", L: "g2@5 ~ g2 ~ g2@8", M: "d2@13 ~ d2@2", N: "d3 ~ d3@2 d2@2 d3 ~@5 bb2@3 ~",
  O: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~", P: "d2 ~ d2 ~@3 d2 ~ d2 ~ d2 ~@3 d2@2",
  Q: "~@2 d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~", R: "c2 ~@7", S: "g1 ~@6 c2", T: "g2 d2 f2 ~@5",
})).s("gm_fretless_bass").gain(0.34)

// chords · rock organ
const rock_organ = note(`<
  ~ A@4 B@4 ~ C ~ D ~@3 E ~ F ~ F ~@4 G ~ F ~ G ~ F ~@3 G ~ F ~ F ~@4 G ~ F ~@11 C ~ D H I J@2 ~@4 H I J@2 ~ G ~ F ~ F
  ~@12 G ~ F ~ K ~
>`.pickRestart({
  A: "[gb6 ~@23 c6 bb5 c6 ~@15 bb5 ~ c6 ~ d6@6 c6 bb5 g5@9 ~, g6, ~@28 bb5@13 ~@5 db6 ~@17, ~@16 g5@11 ~@5]/4",
  B: "[g6@61 ~@3, gb6 ~@63]/4", C: "~@10 g5@2 f5@2 d5 ~, ~@10 gb5 ~@5", D: "~@10 [g5,bb5] ~ bb5@2 g5 ~, ~@5 c6 ~@2",
  E: "~@10 [g5,c6]@2 bb5@2 g5 ~, ~@10 bb5 ~@5", F: "~@10 c6@2 bb5@2 g5 ~, ~@10 g5 ~@5", G: "~@10 [g5,c6]@2 bb5@2 g5 ~",
  H: "g4@7 ~", I: "a4@10 d5 ~ c5@2 d5 ~", J: "[~@14 bb5 a5@11 ~@6, d4@3 ~]/2", K: "~@5 [g5,c6] bb5 ~",
})).s("gm_rock_organ").gain(0.17).pan(0.2)

// chords · rock organ · soft notes
const rock_organ_soft = note("<~@61 A B C ~@5 A B C ~@25>".pickRestart({
  A: "[eb4,c5]@15 ~", B: "d5@9 ~@7", C: "a5@7 ~",
})).s("gm_rock_organ").gain(0.08).pan(0.2)

// chords · piano
const piano = note(`<
  A B A B A B A B C D E F G H I J K L M L M N ~@2 J K L M J K L M H I J K L M L M N ~@2 J K L M O P ~@8 D E D E H I Q@2
  D E D E H R@3 J K L M L M N ~@2 S ~ T ~ T ~ T ~ J K L M J K U
>`.pickRestart({
  A: "~@7 [g3,bb3,d4]", B: "~@7 [g3,c4,e4]", C: "~@7 [f3,g3,bb3]",
  D: "[g3,bb3,d4] ~@3 [g3,bb3,d4]@2 ~@2 [g3,bb3,d4]@2 ~@2 [bb3,d4]@2 ~@2, ~@12 g3 ~@3", // Gm Bb
  E: "[c4,e4] ~@3 [c4,e4] ~@3 [g3,e4]@2 ~@2 [g3,c4,e4] ~ d1@2, g3@2 ~@2 g3@2 ~@2 c4 ~@7", // C
  F: "[g3,bb3,d4]@2 ~@2 [g3,bb3] ~@3 [g3,bb3,d4] ~@3 [g3,bb3] ~@3, ~@2 d4 ~@3 d4 ~", // Gm
  G: "[g4,a4,d5,f5] ~ [g4,c5,e5] ~ [g4,d5,f5] ~ [g4,c5,e5] ~ [g4,bb4,d5] ~ [g4,c5,e5] ~ [bb4,d5]@2 g4 ~", // Dm C G7 C Gm C Bb
  H: "[c4,eb4,g4]@15 ~", I: "[d4,f4,a4]@13 ~@3",
  J: "[g4,bb4] ~@3 [g4,bb4] ~@3 [d4,g4,bb4] ~@3 [g4,bb4] ~@3, d4 ~ d4 ~@3 d4 ~", // Gm
  K: "[c4,e4,g4] ~@3 [c4,e4,g4] ~@3 [c4,e4] ~@3 [c4,e4,g4] ~@3, ~@4 g4 ~@3", // C
  L: "[d4,g4,bb4] ~@3 [d4,g4,bb4] ~@3 [d4,g4,bb4] ~@3 [d4,g4,bb4] ~@3", // Gm
  M: "[c4,e4,g4] ~@3 [c4,e4,g4] ~@3 [c4,e4,g4] ~@3 [c4,e4,g4] ~@3", N: "[g3,c4,eb4] ~@15", O: "g3 ~@5 f3 ~ d3 ~@5 c3 ~",
  P: "bb2 ~@5 c3 ~ bb2 ~@3 g2 ~@3",
  Q: "[d3@3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~@13 [gb3,g3,ab3] f3, d2@26 [d5,e5,f5] [g4,a4,b4,c5]@5, d4@7 a4@5 d6@2 [c4,d4,e4,f4,gb5,ab5]@2, a3@6 gb4@23 [a3,b3]@2 ~, ~@6 a3@7 ~ a3@11 [g5,a5,b5,c6]@7]/2", // Dm Cmaj7 Dm7b5 Asus2 Cmaj7
  R: "[[d4,f4,a4]@13 ~ a3@6 d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~@13 [gb3,g3,ab3] f3, ~@14 d2@28 [d5,e5,f5] [g4,a4,b4,c5]@5, ~@7 d4@8 a4@5 d6@2 [c4,d4,e4,f4,gb5,ab5]@2, ~@14 d3@3 ~@5 gb4@23 [a3,b3]@2 ~, ~@22 a3@7 ~ a3@11 [g5,a5,b5,c6]@7]/3", // Dm Cmaj7 Dm7b5 Asus2 Cmaj7
  S: "[g1,g3,d4] ~@6 [c2,e3,g3,c4], bb3 ~@15", T: "[g1,g3,bb3,d4] ~@6 [c2,e3,g3,c4]",
  U: "[d4,g4,bb4] ~@3 [d4,g4,bb4] ~@11", // Gm
})).s("gm_piano").gain(0.27).pan(0.8)

// chords · clavinet
const clavinet = note(`<
  ~@5 A B C D E F G H I J G K L M L N O@2 P Q R Q R A B A B I J Q S Q S L ~ O@2 T Q R Q R U V W@4 X@2 Y ~ Z AA AB AC AD
  AE AF AG Z AA AB AC AD AE AF AG Q S Q S L ~@12 Q S Q S Q S AH
>`.pickRestart({
  A: "~@4 [d5,f5] ~ [d5,f5]@2 ~@4 [d5,f5] ~ [d5,f5] ~", B: "~@4 [c5,e5] ~ [c5,e5] ~@5 [c5,e5]@2 d5@2, ~@14 bb4 ~",
  C: "~@4 [d5,f5] ~ [d5,f5] ~@5 d5@2 [d5,f5] ~, ~@12 f5 ~@3", D: "g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ g3 ~",
  E: "~@4 [bb4,d5] ~ [bb4,d5] ~@5 bb4@2 ~@2, ~@12 d5 ~@3", F: "~@2 c5!2 ~@2 c5 ~, ~@4 e5 ~ e5 ~@5 e5 ~@3",
  G: "~@4 [bb4,d5] ~ [bb4,d5] ~@5 [bb4,d5] ~@3", H: "~@4 [c5,e5] ~ [c5,e5] ~@5 c5@2 ~@2, ~@12 e5 ~@3", I: "c3!2 eb3 g3",
  J: "f3@4 f3@4 a3@4 a3@3 ~", K: "~@2 f4@2 d5 ~ c5@2 ~@2 [c6,f6] ~ [d6,g6] ~ [c6,f6] ~",
  L: "[d6,g6] ~@3 [bb4,d5] ~ [bb4,d5] ~@5 [bb4,d5] ~@3", M: "~@2 f4@2 d5 ~ c5@3 ~ [c6,f6] ~ [d6,g6] ~ [c6,f6] ~",
  N: "~@2 f4@2 d5 ~ c5@3 ~ [bb4,d5] ~@3 [c5,e5] ~", O: "[~@14 g2@7 ~ f2@2 d2@6 c2 ~]/2", P: "bb1@3 c2 bb1 ~ g1 ~",
  Q: "~@4 [bb4,d5] ~ [bb4,d5] ~@5 [bb4,d5] ~ [g4,c5] ~", R: "~@4 [bb4,d5] ~ [g4,c5] ~@3 [g4,c5] ~@3 [bb4,d5] ~",
  S: "~@4 [bb4,d5] ~ [g4,c5] ~@3 [g4,c5,c6,f6] ~ [d6,g6] ~ [bb4,d5,c6,f6] ~", // Bb C5 Csus4 G5 Bb
  T: "[b1,c2] ~@5 c2@2 bb1@2 ~@2 g1@2 ~@2, bb1@3 ~@5", U: "g2@5 ~ f2 ~ d2@5 ~ c2 ~", V: "bb1@5 ~ c2 ~ bb1@3 ~ g1 ~@3",
  W: "[g4@24 bb4@2 a4@2 g4@29 ~ g4@2 a4@3 ~]/4", X: "[bb4@22 ~@2 bb4@2 a4@2 g4@3 ~]/2", Y: "a4@15 ~",
  Z: "~@4 [bb4,d5] ~ [bb4,d5]@2 ~@4 bb4@2 ~@2, ~@12 d5 ~@3", // Bb
  AA: "~@4 [bb4,d5] ~ [c5,e5] ~@3 c5@2 ~@2 [c5,e5]@2, ~@10 e5 ~@5", // Bb C
  AB: "~@4 [bb4,d5]@2 [bb4,d5] ~@5 [bb4,d5] ~ [bb4,d5] ~", // Bb
  AC: "~@4 [d5,f5]@2 c5@2 ~@2 c5@2 ~@2 [c5,e5] ~, ~@6 e5 ~@3 e5 ~@5", AD: "g4@3 bb4", AE: "a4@13 ~@3",
  AF: "~@2 d5 ~ d5@2 ~@4 d5 ~ d5 ~@2 d5", AG: "d5 ~ d5 ~ d5 ~ d5 ~ d5 ~ d5 ~ d5 ~@3", AH: "~@4 [bb4,d5] ~@11",
})).s("gm_clavinet").gain(0.26).pan(0.4)

// other · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~ A B A B A B A ~@5 C D A E A F A F ~@2 G A E A F ~@6 A E A F A F ~ H I A E A F ~@14 J K ~@10 A E A F A F L@2 M ~@8 A
  E A F A E N
>`.pickRestart({
  A: "g3 d3 f3 bb3@2 f3 g3 c3", B: "~@12 c3 ~@3", C: "c4!2 eb4 g4", D: "f4@4 f4@4 a4@4 a4@3 ~",
  E: "~@2 f4 ~ d5 ~ c5@6 c3 ~@3", F: "~@2 f4@2 d5 ~ c5@6 c3 ~@3", G: "~@7 [c3,f3]", H: "~@7 [f3,bb3]",
  I: "[g3,d4]@6 ~ [c3,f3]", J: "~@15 [g3,ab3]", K: "a3@2 g3 ~ f3@2 g3 ~@9", L: "[~@7 g3@4 f3 d3@3 c3, ~@14 gb3 ~@17]/2",
  M: "bb2@6 c3@2 bb2@4 g2@3 ~", N: "g3 d3 f3 bb3@2 ~@3",
})).s("gm_electric_guitar_jazz").gain(0.24).pan(0.7)

// chords · trumpet
const trumpet = note(`<
  ~@21 A@3 ~@3 B ~@4 C D E@2 F G F G A@3 ~@4 H I J@2 K@2 L@2 M N ~@7 O P Q R ~@4 O F G F G ~@4 S ~ G F G F G F G F G F G
  F G F
>`.pickRestart({
  A: "[~@7 [g3,g4]@14 ~@3]/3", B: "~@2 d5 ~@3 d5@10, ~@6 db5 ~@9", C: "c4 eb4", D: "f4 g4 a4@2",
  E: "[[bb4,d5,g5] a4 g4@17 ~@7 [c5,f5] ~ [d5,g5] ~ [c5,f5] ~]/2", F: "[d5,g5] ~@15",
  G: "~@10 [c5,f5] ~ [d5,g5] ~ [c5,f5] ~", H: "d5@5 ~ f5 ~ g5@5 ~ a5 ~", I: "bb5@15 ~",
  J: "[[db4,d4] ~ [c4,c5] ~ [bb3,bb4] ~ [c4,c5]@21 ~ [b3,b4] ~ [c4,c5] ~, d5 ~@15]/2", // Dmaj7 C Bb C B C
  K: "[[d4,d5]@2 [c4,c5] ~ [b3,b4] ~ [d4,d5]@6 [bb3,b3] ~ g4@16 ~@2, db4 ~@5 db4 ~@5 b4@2 g3@13 ~@5]/2", // D C B D Bmaj7
  L: "[[db5,d5] ~ c5 ~ bb4 ~ c5@14 bb4@2 g4@8 ~@2]/2", M: "[a3,a4]@6 [c4,c5]@9 ~",
  N: "d4!2 ~ d5 ~@2 [bb4,bb5] ~, d5 ~ d5 ~@3 d4 ~@9", O: "~@10 [d4,d5]@2 [f4,f5]@2 [gb4,gb5] ~", P: "[g4,g5] ~@15",
  Q: "~@4 f5@2 e5 ~ e5@2 d5 ~ d5@2 e5@2, ~@4 d5 ~@9 eb5 ~", R: "d5 ~@15", S: "[g2,g3,bb3,g4,g5]",
})).s("gm_trumpet").gain(0.31).pan(0.3)

// chords · alto sax
const alto_sax = note(`<
  ~@21 A@3 ~@3 B ~@4 C D E@2 ~@3 F G@3 ~@4 H I J@2 K@2 L@2 M N ~@7 O P Q R ~@4 O S T S T ~@4 U ~ T S T S T S T S T S T S
  T S
>`.pickRestart({
  A: "[~@7 [g2,g3]@14 ~@3]/3", B: "~@2 d5 ~@3 [d4,d5]@10", C: "~ c4 eb4@2", D: "f4 g4 a4@2", E: "[bb4 ~ g4@21 ~@9]/2",
  F: "~@4 d5@2 c5 ~ c5@2 bb4 ~@5", G: "[~@7 [g2,g3,g5]@14 ~@3]/3", H: "g3@5 ~ a3 ~ bb3@5 ~ c4 ~", I: "d4@15 ~",
  J: "[d4@2 c4 ~ bb3 ~ c4@26, db4 ~@31]/2", K: "[d4@2 c4 ~ d4 ~ g4@6 bb3 b3 g3@14 ~@4, db4 ~@31]/2",
  L: "[d4@2 c4 ~ bb3 ~ c4@12 d3@2 bb3@2 g3@8 ~@2, db4 ~@31]/2", M: "a3@6 c4@9 ~",
  N: "d4@2 d4@2 ~@2 d4 ~@5 bb4@2 ~@2, ~@12 bb5 ~@3", O: "~@10 [d4,d5] ~ [f4,f5]@2 [gb4,gb5] ~", P: "[g4,g5] ~@7",
  Q: "~@4 [f4,f5]@2 [e4,e5] ~ [e4,e5]@2 [d4,d5] ~ [d4,d5]@2 [e4,e5]@2, ~@14 eb5 ~", R: "[d4,d5] ~@15",
  S: "[d5,g5] ~@15", T: "~@10 [c5,f5] ~ [d5,g5] ~ [c5,f5] ~", U: "[g2,d4,g4]",
})).s("gm_alto_sax").gain(0.35).pan(0.7)

// chords · epiano1
const epiano1 = note(`<
  ~@13 A B C ~@5 D@3 ~@8 A B C ~@5 D@3 ~@6 E@4 F@2 G ~@5 A B ~@6 A B ~@2 C ~@16 C ~@3 C ~@2
>`.pickRestart({
  A: "[c4,eb4,g4]@12 [c4,eb4,g4]@3 ~", B: "[c4,d4,f4,a4]@12 [c4,d4,f4,a4]@3 ~", C: "[g3,g4]@3 ~",
  D: "[~@7 d5@15 ~@2]/3", E: "[g4@24 bb4@2 a4@2 g4@29 ~ g4@2 a4@3 ~]/4", F: "[bb4@23 ~ bb4@2 a4@2 g4@3 ~]/2",
  G: "[a4,a5]", // A
})).s("gm_epiano1").gain(0.31)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@42 A ~@20 B C ~@7 D ~@16 E ~@7>".pickRestart({
  A: "x ~@2 x ~@7 x ~@4", B: "x!8", C: "x!5 ~@3", D: "x!4 ~@4", E: "~@8 x ~@2 x ~@4",
})).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct("<~@81 [~@3 x] ~@15>").gain(0.46)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A ~@3 A ~@3 A ~@3 B C A ~@8 A ~@3 A ~@3 B C A ~@8 A ~@3 D A ~@7 E A ~@3 B C F G A ~@3 B C F G A ~@16 A ~@3 A ~@2
>`.pickRestart({
  A: "~ x ~@6", B: "~ x ~ x!3 ~ x", C: "~ x ~ x ~ x ~@2", D: "~ x ~ x ~ x ~ x", E: "~ x ~@2 x ~@2 x ~@6 x ~",
  F: "~@3 x!2 ~@2 x", G: "x!2 ~@6",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~ A ~ A ~@3 A ~ A B@2 ~ A ~ A ~ A ~@4 A ~ A ~ A ~ A B@2 ~ A ~ A ~ A ~@4 A ~ A ~ C ~@3 D ~@3 E D A ~ A B F ~ D ~
  A ~ A B F ~ D ~ A ~ A ~ A ~@12 A ~ A ~ A ~
>`.pickRestart({
  A: "~@5 x ~@2", B: "~ x ~ x", C: "~@3 x", D: "~@7 x", E: "x!2 ~ x ~@2 x ~", F: "~@2 x ~@4 x",
})).gain(0.35)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@63 [~ x!2 ~@2 x!2 ~] ~@7 [~ x!2 ~@2 x!2 ~] ~@25>").gain(0.2)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@3 A ~@3 A ~ B@6 C ~@2 B@8 A ~ B@6 C ~@2 B@12 A ~ A D ~@2 A ~ E B A ~@3 A C F G B H B@4 ~@3 A ~ A ~ B@5 H B@3 H
  I
>`.pickRestart({
  A: "x", B: "x!4", C: "~@7 x", D: "~ x ~@6", E: "x ~@2 x ~@4", F: "~@3 x ~@3 x", G: "~ x!7", H: "x ~ x ~ x ~ x!2",
  I: "x!3 ~",
})).gain(0.2)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~ A@7 B A@6 ~@17 A@2 ~@23 A@6 ~@2 A@6 ~@26>".pickRestart({
// … 43 more lines