Strudelify
Be My Baby cover art

1963 · Presenting the Fabulous Ronettes Featuring Veronica

Be My Baby

The Ronettes

KeyE majorTempo128 bpm
0:00/0:00
// Be My Baby — The Ronettes
// 128 bpm, 4/4, key E major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/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 guitar jazz · "BASS GTR"
const bass = note(`<
  ~@2 A B C D E F G H I J K L M N O P Q R G S T U V W X Y Z AA AB AC C AD AE AF AG L AH N E AI X AJ AK AL T U AM AN X AO
  AP AQ AR AS C AD AI AS G AT T U AM AU X AV ~@2 C S T U AW AU AX AY G AZ T U AM AU AX AO BA BB BC
>`.pickRestart({
  A: "e1@5 ~ e1 ~ e1@5 ~@3", B: "e1@4 ~@2 e1 ~ e1@4 b1@4", C: "e2@5 ~ e2@2 b1@5 ~ b1@2", D: "e2@5 ~ e2@2 b1@4 e2@3 ~",
  E: "f#1@4 ~@2 f#1@2 c#2@5 ~ c#2@2", F: "b1@5 ~ b1@2 f#1@3 ~ b1@4", G: "e2@5 ~ e2@2 b1@4 ~@2 b1@2",
  H: "e1@5 ~ e1@2 b1@4 e2@4", I: "f#1@5 ~ f#1@2 c#2@7 ~", J: "b1@5 ~ b1@2 f#1@4 b1@4",
  K: "g#1@5 ~ g#1@2 d#1@4 ~@2 d#1@2", L: "g#1@2 ~ g#1 d#1@2 g#1@2", M: "c#2@5 ~ c#2@2 g#1@5 ~ g#1@2, ~@8 c#2 ~@7",
  N: "c#2@5 ~ c#2@2 g#1@4 c#2@4", O: "f#1@5 ~ f#1@2 c#2@5 ~ c#2@2", P: "f#2@5 ~ f#2@2 c#2@4 f#2@3 ~",
  Q: "b1@5 ~ b1@2 f#1@5 ~ f#1@2", R: "b1 ~ b1@3 ~ b1 ~ b1 ~ b1@3 ~ b1 ~", S: "e2@5 ~ e2@2 b1@4 e2@4",
  T: "c#2@5 ~ c#2@2 g#1@4 ~@2 g#1@2", U: "c#2@5 ~ c#2@2 g#1@4 c#2@2 b1@2",
  V: "a1@4 ~@2 a1@2 ~@2 d#2 ~@3 e1@2, ~@8 e1@5 ~@3", W: "a1@5 ~ a1@2 e1@4 a1@3 ~", X: "b1@5 ~ b1@2 f#1@4 ~@2 f#1@2",
  Y: "b1 ~ b1@3 ~ f#1@2 b1 ~ b1@3 ~ b1@2", Z: "e2@5 ~ e2 ~ e2@7 ~", AA: "e2@5 ~ b1@2 e1@5 ~ e1@2",
  AB: "f#1@5 ~ f#1 ~ f#1@4 ~@2 f#1@2", AC: "b1@4 ~@2 b1@2 f#1@4 b1@3 ~", AD: "e1@5 ~ e1@2 b1@4 e1@4",
  AE: "f#1@5 ~ f#1 ~ f#1@5 ~ f#1@2", AF: "b1@5 ~ b1 ~ b1@5 ~ b1@2", AG: "g#1@4 ~@2 g#1@2 d#1@5 ~ d#1@2",
  AH: "c#2@5 ~ c#2 ~ c#2@7 ~", AI: "f#1@2 ~ f#1 c#2@2 f#1@2", AJ: "b1 ~ b1@4 f#1@2 b1 ~ b1@3 ~ b1@2",
  AK: "e1@4 ~@2 e1@2 b1@5 ~ b1@2", AL: "e2@4 ~@2 e2@2 b1@5 ~ b1@2", AM: "a1@5 ~ a1@2 e1@4 ~@2 e1@2",
  AN: "a1@4 ~@2 a1@2 e1 ~ e1@2 a1@2 e1@2", AO: "b1 ~ b1@3 ~ b1 ~ b1 ~ b1@3 ~ b1@2", AP: "e2@5 ~ e2 ~ e2@6 b1@2",
  AQ: "e1@5 ~ e1 ~ e1@5 ~ e1@2", AR: "f#1@4 ~@2 f#1 ~ f#1@4 ~@2 f#1@2", AS: "b1@4 ~@2 b1 ~ b1 ~ b1@3 ~ b1@2",
  AT: "e2@4 ~@2 e2@2 b1 ~ [b1,c#2]@2 e2@2 b1@2", AU: "a1@4 ~@2 a1@2 e1@4 a1@3 ~", AV: "b1 ~ b1@3 ~ b1 ~ b1 ~ b1@4 ~@2",
  AW: "a1@5 ~ a1@2 e1@5 ~ e1@2", AX: "b1@5 ~ b1 ~ b1@6 f#1@2", AY: "b1 ~ b1@3 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1@2",
  AZ: "e2@5 ~ e2@2 b1@4 e2@2 b1@2", BA: "e1@4 ~@2 e1 ~ e1@4 ~@4", BB: "e1@4 ~@2 e1 ~ e1@5 ~@3", BC: "e1@7 ~@9",
})).s("gm_electric_guitar_jazz").gain(0.5)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@2 A@4 B@4 C@6 D@4 E@6 F@2 G@2 H@2 G@2 C@6 I@4 J@6 F@2 K@2 L@4 M@2 N@4 O@2 F@2 ~@2 E@6 F@2 N@4 P@2 F@2 Q@3
>`.pickRestart({
  A: "[[b3,e4], g#3@31 ~]/4", B: "[[a3,c#4]@16 d#4@13 ~@3 e4@32, f#4@16 g#3@15 ~, ~@8 b3@23 ~]/4",
  C: "[c#4@8 b3@7 ~ c4@15 ~ [c#4,f4]@16, f#4@32 g#4@63 ~, a3@15 ~ d#4@47 ~@33]/6", // C#
  D: "[[a#3,c#4]@32 [b3,d#4]@31 ~, f#4@63 ~]/4", E: "[b3@32 ~@32 a3@31 ~, e4@95 ~, g#3@31 ~@17, ~ c#4@2]/6",
  F: "[[b3,d#4,f#4]@31 ~]/2", G: "[[g#3,b3,e4]@31 ~]/2", H: "[[a3,c#4]@16 [b3,d#4]@15 ~, f#4]/2",
  I: "[a#3@15 ~ [b3,d#4]@15 ~, f#4@31 ~, c#4 ~@63]/4", J: "[b3@32 ~@32 a3@31 ~, e4@95 ~, g#3@21 ~@11, ~@32 c#4@63 ~]/6",
  K: "[g#3,b3,e4]/2", L: "[c#4@16 d#4@15 ~ [g#3,e4]@31 ~, f#4@31 ~@33, a3@14 ~@2 b3@47 ~]/4",
  M: "[[a3,c#4]@16 [b3,d#4]@15 ~, f#4@31 ~]/2", N: "[b3@32 c#4@31 ~, [g#3,e4]@63 ~]/4", O: "[[c#4,e4], a3@15 ~]/2",
  P: "[a3,c#4,e4]/2", Q: "[[g#3,b3,e4]@3 ~]/3",
})).s("gm_string_ensemble_2").gain(0.35)

// other · vibraphone
const vibraphone = note(`<
  ~@20 A B C D C E F@2 ~@16 C G H I J K L M ~@8 C E C N H O P Q ~@2 R S C E T U V W X U X U X U V Y ~@3
>`.pickRestart({
  A: "~@4 e5@3 ~ d#5@6 ~@2", B: "c#5 ~ c#5@2 ~@2 d#5@3 ~@3 e5@2 ~@2", C: "~@4 e5@2 ~@2 d#5@5 ~@3",
  D: "c#5 ~ c#5 ~@5 d#5 ~@3 e5@2 ~@2", E: "c#5 ~ c#5@2 ~@4 d#5 ~@3 e5@2 ~@2",
  F: "[~@4 f#5@2 ~@2 f#5@3 ~@3 f#5@8 ~@2 g#5@2 ~@2 f#5@2 ~@2]/2", G: "c#5 ~ c#5@3 ~@3 d#5 ~@3 e5 ~@3",
  H: "~@4 e5 ~@3 d#5@5 ~@3", I: "c#5 ~ c#5@2 ~@4 d#5@3 ~ e5@3 ~", J: "~@2 e5 ~ d#5@2 ~@2",
  K: "c#5 ~ c#5@2 ~@4 d#5 ~@3 e5 ~@3", L: "~@4 f#5 ~@3 f#5@4 ~@2 f#5@2", M: "~@2 f#5@2 ~@4 g#5 ~@3 f#5@2 ~@2",
  N: "c#5 ~ c#5@3 ~@3 d#5@3 ~ e5@3 ~", O: "c#5 ~ c#5@2 ~@4 d#5@2 ~@2 e5@2 ~@2", P: "~@2 f#5 ~ f#5 ~@3",
  Q: "f#5 ~ f#5@2 ~@2 f#5 ~ g#5 ~@3 f#5 ~@3", R: "~@4 e5@3 ~ d#5@5 ~@3", S: "c#5 ~ c#5 ~@3 d#5 ~@5 e5 ~@3",
  T: "~@4 e5 ~@3 d#5@3 ~@5", U: "c#5 ~ c#5 ~@5 d#5 ~@3 e5 ~@3", V: "~@4 f#5 ~@3 f#5 ~@5 f#5 ~",
  W: "f#5 ~ f#5 ~@5 g#5 ~@3 f#5 ~@3", X: "~@4 e5 ~@3 d#5 ~@7", Y: "f#5 ~ f#5 ~@3 f#5 ~ g#5 ~@3 f#5 ~@3",
})).s("gm_vibraphone").gain(0.4)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@43 A B@2 C@2 D@2 E@2 F G H I F G H J B@2 C@2 D@2 E@2 ~@2 K@2 L@2 M@2 N O K@2 P@2 M@2 N Q R ~@2
>`.pickRestart({
  A: "f#4 g#4 a4 b4 g#4 a4 b4 c#5 a4 b4 c#5 d#5 b4 c#5 d#5 f#5", B: "[[e4,e5]@6 [g#4,g#5] [b4,b5]]/2",
  C: "[[c#4,c#5]@24 [e4,e5]@4 [g#4,g#5]@3 ~]/2", D: "[[a3,a4]@6 [c#4,c#5] [e4,e5]]/2", E: "[[f#4,f#5]@31 ~]/2",
  F: "~@4 [e4,e5]@3 ~ [e4,e5]@4 [d#4,d#5]@3 ~", G: "[d#4,d#5] [c#4,c#5] [d#4,d#5] [e4,e5]",
  H: "~@4 [f#4,f#5]@3 ~ [f#4,f#5]@4 [e4,e5]@4", I: "[d#4,d#5]@13 ~@3", J: "[d#4,d#5]@7 ~",
  K: "[[e5,e6]@6 [g#5,g#6] [b5,b6]]/2", L: "[[c#5,c#6]@23 [e5,e6]@4 ~ [g#5,g#6]@4]/2",
  M: "[[a4,a5]@6 [c#5,c#6] [e5,e6]]/2", N: "[f#5,f#6]",
  O: "b6@2 ~@2 [a5,a6] ~@3 g#5@2 ~@2 f#5@2 ~@2, b5 ~@7 g#6 ~@3 f#6 ~@3", P: "[[c#5,c#6]@6 [e5,e6] [g#5,g#6]]/2",
  Q: "[b5,b6] ~ a6 ~ g#5 ~ [f#5,f#6] ~, ~@4 a5 ~@3 g#6 ~@7", R: "[e5,e6]@3 ~@13",
})).s("gm_string_ensemble_1").gain(0.35)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x!2 ~@3]!88 x>").gain(0.51)

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

// drums · clap
const clap = s("cp").struct("<A@19 ~ B@8 A@15 ~ B@8 A@8 B@8 A@2 B@16 A@2 ~>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.51)

// drums · low tom
const low_tom = s("lt").struct("<A@2 ~@17 B ~@7 B ~@15 B ~@7 B ~@15 B ~@9 B ~@7 B ~ C ~>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "~@15 x", C: "~@5 x!3",
})).gain(0.46)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 A ~@7 A ~@15 A ~@7 A ~@15 A ~@9 A ~@7 A ~@3>".pickRestart({
  A: "~@7 x",
})).gain(0.51)

// drums · high tom
const high_tom = s("ht").struct("<~@19 A ~@7 A ~@15 A ~@7 A ~@15 A ~@9 A ~@7 A ~@3>".pickRestart({
  A: "~@12 x!2 ~@2",
})).gain(0.51)

// drums · crash
const crash = s("cr").struct("<~@2 A ~@17 A ~@7 A ~@15 A ~@7 A ~@7 A ~@9 A ~@7 A ~@7 A ~ A>".pickRestart({
  A: "x",
})).gain(0.41)

// drums · tambourine
const tambourine = s("tb").struct("<A@19 ~ B@8 A@15 ~ B@8 A@8 B@8 A@2 B@16 A@2 ~>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.46)

stack(
  bass, string_ensemble_2, vibraphone, string_ensemble_1, kick, snare, clap, low_tom, hihat, mid_tom, high_tom, crash,
  tambourine
)