Strudelify

Oh No Not My Baby

Cher

KeyA majorTempo100 bpm
0:00/0:00
// Oh No Not My Baby — Cher
// 100 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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 · electric bass finger
const bass = note(`<
  A B A B C D@2 E C D F G H I J I K L K M C D@2 E C D F G H I J I K L K M N O P Q H I J I K L K R S T@2 U S T V W I X Y
  X Z AA Z R I X Y X Z AA Z R I X Y X Z AA Z R AB@2 AC AD@3 ~
>`.pickRestart({
  A: "g1@3 d2@5", B: "a1@3 e2@5", C: "g2@3 d2@3 g2@2", D: "a2@3 e2@5", E: "e2@3 d2@5", F: "e2@3 b1@5",
  G: "a1 b1 c2 d2@5", H: "g1@3 d2@3 g1@2", I: "a1@3 e2@3 a1@2", J: "b1@3 e2@3 b1@2", K: "b1@3 g1@3 b1@2",
  L: "c2@3 g1@3 c2@2", M: "a1 b1 c2 d2", N: "g2 d2 g1 a1@5", O: "g1@3 a1@5", P: "g2 d2 g1 b1@5",
  Q: "a1 ~ a1@2 b1 ~ b1@2 c2 ~ c2@2 d2 ~ d2@2", R: "b1 c#2 d2 e2", S: "a2@3 e2@3 a2@2", T: "b2@3 f#2@5",
  U: "f#2@3 e2@5", V: "f#2@3 c#2@5", W: "b1!3 e2@5", X: "b1@3 f#2@3 b1@2", Y: "c#2@3 f#2@3 c#2@2",
  Z: "c#2@3 a1@3 c#2@2", AA: "d2@3 a1@3 d2@2", AB: "a2 e2 a1 b1@5", AC: "a1@3 b1@5", AD: "a1/3",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · piano
const piano = note(`<
  A B C B D@3 E F G H I J K L K M N M O D@3 E F G H I J K L K M N M O P Q R S J K L K M N M ~ T@3 U V W X Y Z M AA M AB
  AC AB AD Z M AA M AB AC AB AD Z M AA M AB AC AB AD AE@2 AF Z ~@3
>`.pickRestart({
  A: "[g3,b3,d4]@5 ~ [g3,c4,e4]@9 ~", B: "a3 ~ [g3,a3] g3 a3@2 e3@2 g3@2 a3@2 e3@2 g3@2, [c4,e4]@15 ~",
  C: "[g3,b3,d4]@6 [g3,c4,e4]@9 ~", // G C
  D: "[~@12 [g3,b3,d4]@3 ~@23 e3@9 ~, [g3,b3,d4]@11 ~@5 [a3,c4,e4]@16 [a3,c4,e4]@15 ~, ~@6 d3@15 ~ e3@15 ~@11]/3", // G Am
  E: "[e3,g3,b3]@3 [d3,f#3,a3]@5", F: "~@12 [g3,b3,d4]@3 ~, [g3,b3,d4]@11 ~@5, ~@6 d3@9 ~",
  G: "~@6 e3@9 ~, [a3,c4,e4]@15 ~", H: "[e3,g3,b3]@5 ~ [b2,d3,f#3]@9 ~", I: "[c3,e3,g3]@5 ~ [d3,f#3,a3]@9 ~",
  J: "[g3,b3,d4]@15 ~", K: "[a3,c4,e4]@15 ~", L: "[b3,d4,f#4]", M: "[b3,d4,f#4]@15 ~", N: "[c4,e4,g4]",
  O: "[a3,c4,e4]@3 ~ [b3,d4,f#4]@4 [c4,e4,g4]@4 [d4,f#4,a4]@4", P: "[b3,d4,g4]@5 ~ [a3,c4,e4]@9 ~",
  Q: "[b3,d4,g4]@6 [a3,c4,e4]@9 ~", R: "[b3,d4,g4]@6 [b3,d4,g4]@9 ~",
  S: "[a3,c4,e4]@3 ~ [b3,d4,f#4]@3 ~ [c4,e4,g4]@4 [d4,f#4,a4]@3 ~", // Am Bm C D
  T: "[~@12 [a3,c#4,e4]@3 ~@23 f#3@9 ~, [a3,c#4,e4]@11 ~@5 [b3,d4,f#4]@16 [b3,d4,f#4]@15 ~, ~@6 e3@15 ~ f#3@15 ~@11]/3", // A Bm
  U: "[f#3,a3,c#4]@3 [e3,g#3,b3]@5", V: "~@12 [a3,c#4,e4]@3 ~, [a3,c#4,e4]@11 ~@5, ~@6 e3@9 ~",
  W: "~@6 f#3@9 ~, [b3,d4,f#4]@15 ~", X: "[f#3,a3,c#4]@5 ~ [c#3,e3,g#3]@9 ~", Y: "[d3,f#3,a3]@5 ~ [e3,g#3,b3]@9 ~",
  Z: "[a3,c#4,e4]@15 ~", AA: "[c#4,e4,g#4]", AB: "[c#4,e4,g#4]@15 ~", AC: "[d4,f#4,a4]",
  AD: "[b3,d4,f#4]@3 ~ [c#4,e4,g#4]@4 [d4,f#4,a4]@4 [e4,g#4,b4]@4", AE: "[c#4,e4,a4]@5 ~ [b3,d4,f#4]@9 ~",
  AF: "[c#4,e4,a4]@6 [b3,d4,f#4]@9 ~", // A Bm
})).s("gm_piano").gain(0.4).pan(0.7)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~ A B A C D E F G E H I J K L M N O P Q C R S@2 T U V W J K L M N O P X Y Z AA AB AC AD AE AF AG AH AG AI AJ AK AL@2
  AM AN AO AP AQ P AR AS AT AU AV AW AQ P AR AS AT AU AV AW AQ P AR AS AT AU AV AW AX@2 AY AZ@3 ~
>`.pickRestart({
  A: "~@3 [c4,e4]", B: "[b3,d4]@3 ~@5", C: "[g3,b3,d4]", D: "[a3,c4,e4]", E: "[a3,c4,e4]@15 ~",
  F: "[g3,b3,e4]@3 [f#3,a3,d4]@5", G: "[g3,b3,d4]@15 ~", H: "[e4,g4,b4]@5 ~ [b3,d4,f#4]@9 ~",
  I: "[a3,c4,e4] [b3,d4,f#4]@2 [c4,e4,g4]@2 [d4,f#4,a4]@3", J: "[b3,d4,g4]@15 ~", K: "[c4,e4,a4]@15 ~",
  L: "[d4,f#4,b4]", M: "~@4 g4@2 a4 b4, [c4,e4]@15 ~, a4@11 ~@5", N: "[d4,f#4,b4,d5]@15 ~",
  O: "g4@7 ~ g4@4 a4@4, [e4,c5]", P: "[d4,f#4,b4]@15 ~", Q: "[a3,c4,e4] [b3,d4,f#4] [c4,e4,g4] [d4,f#4,a4]",
  R: "e4@7 ~ e4@2 f#4@2 g4@2 a4@2, [a3,c4]", S: "[[a3,e4]@15 ~ [g3,e4]@6 [f#3,d4,a4]@10, b4@11 ~@5]/2",
  T: "[g3,b3,d4,d5]", U: "[a3,c4,c5], e4@7 ~", V: "[e4,g4]@5 ~ [b3,d4,f#4]@9 ~, b4",
  W: "[c4,e4,a4] [d4,f#4,b4]@2 [e4,g4,c5]@2 [f#4,a4,d5]@3", X: "[a3,c4,e4]@4 [b3,d4,f#4]@4 [c4,e4,g4]@4 d4 g4 a4 d5",
  Y: "b4@6 a4 g4", Z: "a4@6 g4 f#4", AA: "g4@2 f#4 e4 f#4@2 d4@2",
  AB: "c5 a4 e4 c5 b4 f#4 d4 b4 a4 e4 c4 e4 a4!2 d4 f#4", AC: "a5@3 g5@3 e5@2, [b3,d4,g4]@15 ~",
  AD: "e5@3 d5@3 e5@2, [c4,e4,a4]@15 ~", AE: "a5@3 g5@3 e5@2, [d4,f#4,b4]", AF: "[c4,e4,a4,b5]",
  AG: "a5@3 g5@3 e5@2, [d4,f#4,b4]@15 ~", AH: "[g4,e5]@3 ~ g4@2 [a4,e5]@2, [e4,c5], ~@3 d5@3 ~@2",
  AI: "[d4,f#4,b4,d5] [e4,g#4,c#5,e5]@2 [f#4,a4,d5,f#5]@2 [g#4,b4,e5,g#5]@3", AJ: "[a3,c#4,e4]",
  AK: "f#4@7 ~ f#4@2 g#4@2 a4@2 b4@2, [b3,d4]", AL: "[[b3,f#4]@15 ~ [a3,f#4]@6 [g#3,e4,b4]@10, c#5@11 ~@5]/2",
  AM: "[a3,c#4,e4,e5]", AN: "[b3,d4,f#4,d5]@15 ~", AO: "[f#4,a4]@5 ~ [c#4,e4,g#4]@9 ~, c#5",
  AP: "[b3,d4,f#4] [b3,d4,f#4]@2 [d4,f#4,a4]@2 [e4,g#4,b4]@3", AQ: "[c#4,e4,a4]@15 ~", AR: "[e4,g#4,c#5]",
  AS: "~@4 a4@2 b4 c#5, [d4,f#4]@15 ~, b4@11 ~@5", AT: "[e4,g#4,c#5,e5]@15 ~", AU: "a4@7 ~ a4@4 b4@4, [f#4,d5]",
  AV: "[e4,g#4,c#5]@15 ~", AW: "[b3,d4,f#4]@4 [c#4,e4,g#4]@4 [d4,f#4,a4]@4 e4 a4 b4 e5", AX: "c#5@6 b4 a4",
  AY: "b4@6 a4 g#4", AZ: "[d4@5 ~ c#4@42, [e4,a4,b4]]/3",
})).s("gm_string_ensemble_1").gain(0.3)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  A B A B C D@2 E C D F ~@9 C D@2 E C D F ~@14 G@2 H I J K L M@2 F N O F P ~@10 Q R@2 S T@2 U@2 V@2 W@2 X@2 Y@2 ~@6
>`.pickRestart({
  A: "b4 a4 g4 a4@3 b4@2", B: "a4@7 ~", C: "~@4 [b3,d4,g4] ~@5 [b3,d4,g4] ~@5", D: "~@4 [c4,e4,a4] ~@5 [c4,e4,a4] ~@5",
  E: "~@4 [d4,g4,b4] ~@5 [d4,f#4,a4] ~@5", F: "~@4 [d4,f#4,b4] ~@5 [d4,f#4,b4] ~@5",
  G: "[~@2 b4 g4 b4 d5 b4 b4@7 ~@2]/2", H: "~@2 [b4,d5]@2 a4@2 g4@2 b3@2 d4@2 g4 [g4,a4] e4@2", I: "a4@3 g4@5",
  J: "~@2 e5@6 d5@2 b4@2 b4 [g4,a4] a4@2", K: "b4@2 a4@9 ~ e5@2 g5@2", L: "e5 g5 f#5 a5 f#5 a5 g#5 b5",
  M: "[~@4 [c#4,e4,a4] ~@5 [c#4,e4,a4] ~@9 [d4,f#4,b4] ~@5 [d4,f#4,b4] ~@5, a5@3 ~]/2", // A Bm
  N: "~@4 [e4,a4,c#5] ~@5 [e4,g#4,b4] ~@5", O: "~@4 [c#4,e4,a4] ~@5 [c#4,e4,a4] ~@5",
  P: "~@4 [e4,g#4,c#5] ~@5 [e4,g#4,c#5] ~@5", Q: "~@8 c#5@2 a4@2 c#5 ~ c#5@2", R: "[a4 b4@22 ~@5 f#4@2 a4@2]/2",
  S: "a4", T: "[~@2 f#5@6 b4@2 a4@2 c#5 ~ a4 b4@14 ~@3]/2", U: "[~ [f#5,a5]@3 c#5 e5 f#5 a5@8 ~]/2",
  V: "[~@2 c#5@2 b4@2 a4@2 c#5 ~ a4 b4@21]/2", W: "[f#3 a3 c#4 e4 f#4 a4 b4 a4@9]/2",
  X: "[~@2 [f#5,a5]@6 b4@2 a4@2 c#5 ~ a4 b4@14 ~@3]/2", Y: "[~ [f#5,a5]@3 c#5 e5 f#5 a5@9]/2",
})).s("gm_overdriven_guitar").gain(0.3).pan(0.3)

// other · overdriven guitar
const overdriven_guitar_2 = note("<[d4 c4 b3 e4@3 g4@2] c4 [d4 c4 b3 e4@3 g4@2] c4 ~@83>")
  .s("gm_overdriven_guitar").gain(0.3).pan(0.7)

// chords · acoustic guitar nylon · Gsus2 Asus2
const acoustic_guitar_nylon = note(`<
  ~@36
  [~@6 d4 e4@9, ~@3 [g4,a4]@5]
  [~@6 d4 e4@9, ~@6 [g4,a4]@9 ~]
  ~@42
  [~@6 e4 f#4@9, ~@3 [a4,b4]@5]!2
  [~@6 e4 f#4@9, ~@6 [a4,b4]@9 ~]
  ~@4
>`).s("gm_acoustic_guitar_nylon").gain(0.3)

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

// drums · snare
const snare = s("sd").struct("<~@11 A B@7 A ~@7 A B@7 C ~@3 A B@7 D ~@7 E B@7 D B@7 D B@7 C ~@2 F ~@4>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@3 x!5", D: "~@2 x!6", E: "~@3 x!4 ~", F: "~@8 x!2 ~@2 x!4",
})).gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@35 A ~@2 B ~@8 C ~@7 A ~@7 C ~@7 C ~@7 A ~@7>".pickRestart({
  A: "x!3 ~@5", B: "~@3 x", C: "x!2 ~@6",
})).gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<A@11 B ~@7 C A@7 B ~@8 D@3 E ~@8 A@7 B ~@24 D@2 F G ~@2 G>".pickRestart({
  A: "~@3 x", B: "~@2 x!4 ~ x", C: "~@3 x!3 ~ x", D: "x ~@2 x ~@2 x!2", E: "x!6 ~ x", F: "x ~@2 x ~ x ~@2", G: "x",
})).gain(0.45)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@11 A ~@7 B ~@7 A ~@27 A ~@31>".pickRestart({
  A: "x!2 ~@6", B: "x!3 ~@5",
})).gain(0.25)

// drums · hihat
const hihat = s("hh").struct("<~@12 A@6 B ~@9 A@6 B ~@5 A@6 B ~@9 A@6 B ~ A@6 B ~ A@6 B ~@8>".pickRestart({
  A: "x!8", B: "x!7 ~",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@36 [~@10 x!2 ~@4]!3 ~@41 [~@10 x!2 ~@4]!2 ~@3 [~@15 x] ~>").gain(0.4)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@39 [x!4 ~@4] ~@47>").gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@85 [~@15 x] ~>").gain(0.4)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@28 A@7 ~@5 A@7 ~@9 A@7 ~ A@7 ~ A@7 ~@8>".pickRestart({
  A: "~ x ~ x",
})).gain(0.45)

stack(
  bass, piano, string_ensemble_1, overdriven_guitar, overdriven_guitar_2, acoustic_guitar_nylon, kick, snare,
  snare_soft, low_tom, low_tom_soft, hihat, mid_tom, open_hat, open_hat_soft, high_tom, crash, tambourine
)

More by Cher