Strudelify

Moonlight Bay

The Beatles

KeyC majorTempo110 bpm
0:00/0:00
// Moonlight Bay — The Beatles
// 110 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 20 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/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 · acoustic bass · "BASS"
const bass = note("<A B C D A E F@2 C G H D H I J K L M ~@2>".pickRestart({
  A: "c2@7 ~@3 c2 ~ g1@7 ~@3 g1 ~", B: "g2@8 ~@2 g2@2 d3@3 ~ g1@2 d2@3 ~@3", C: "c2@8 ~@2 c2 ~ g2@8 ~@2 g2 ~",
  D: "f2@8 ~@2 f2 ~ c3@8 ~@2 c3 ~", E: "c2@7 ~@3 c2@2 g2@6 g1@3 ~@3", F: "g2@7 ~@3 g2 ~ d2@7 ~@3 d2 ~",
  G: "g2@8 ~@2 g2 ~ g2@8 ~@2 g2 ~", H: "c2@8 ~@2 c2 ~ c2@8 ~@2 c2 ~", I: "a1@8 ~@2 a1 ~ e2@8 ~@2 e2 ~",
  J: "d2@8 ~@2 d2 ~ a2@8 ~@2 a2 ~", K: "g2@8 ~@2 g2@2 d3@4 g1@2 d2@3 ~@3", L: "c2@7 ~@3 c2@2 g2@7 ~@3 g2@2",
  M: "c2@3 ~ c1@2 g1@4 c2@6 ~@8",
})).s("gm_acoustic_bass").gain(0.3)

// chords · piano
const piano = note("<A B C D E F G H E I J D J K L M N O ~@2>".pickRestart({
  A: "c4@3 ~ e4@2 g4@4 c5@2 ~@4 c3 ~ [g3,c4,e4]@2 ~@4", B: "~@6 [g3,b3,d4]@3 ~@7 g2 ~ [g3,b3,d4] ~@5",
  C: "~@6 [g3,c4,e4]@3 ~@7 c3 ~ [g3,c4,e4] ~@5", D: "~@6 [a3,c4,f4]@4 ~@6 f4@2 [g#4,a4] ~ c5 ~ f5 ~",
  E: "~@6 [g3,c4,e4]@4 ~@6 c4@2 [d#4,e4] ~ g4 ~ c5 ~", F: "a#3@3 ~ e4@2 g4@4 c5@2 ~@4 c3 ~ [a#3,c4,e4,g4]@2 ~@4",
  G: "g3@3 ~ b3@2 d4@4 g4@2 ~@4 g2 ~ [g3,b3,d4]@2 ~@4", // G
  H: "[b3,d4,f4,g4]@4 [b3,d4,f4,g4] ~@5 [b3,d4,f4,g4]@2 ~@4 g2 ~ [b3,d4,f4,g4] ~@5", // G7
  I: "~@6 [b3,d4,f4,g4]@4 ~@6 f3@2 [a#3,b3] ~ d4 ~ g4 ~", // G7 Bmaj7
  J: "[g3,c4,e4]@4 [g3,c4,e4] ~@5 [g3,c4,e4]@2 ~@4 c3 ~ [g3,c4,e4] ~@5", // C
  K: "[a3,c#4,e4]@2 ~@4 [a3,c#4,e4]@2 ~@8 a2 ~ [a3,c#4,e4] ~@5", L: "~@6 [a3,d4,f4]@4 ~@6 d4@2 f4 ~ a4 ~ d5 ~",
  M: "[g3,b3,d4]@4 [g3,b3,d4] ~@5 [g3,b3,d4]@2 ~@4 g2 ~ [g3,b3,d4] ~@5", N: "~@3 [g3,c4,e4] ~@5 [g3,c4,e4] ~@2",
  O: "~@6 c3@4 [g3,c4,e4]@3 ~@11", // C
})).s("gm_piano").gain(0.36)

// other · tenor sax · "JOHN"
const tenor_sax = note("<~ A B@8 C@4 D E F G ~@2>".pickRestart({
  A: "~@6 c4@3 d4@3 e4@3 d4@2 e4@7",
  B: "[g3@29 g#3@6 a3@5 ~ f4@6 e4@29 ~@2 e4@4 d#4@2 e4@3 d#4@2 e4@4 f4@2 e4@11 ~ d4@19 c#4@5 ~ d4@5 e4@6 g3@31 c4@3 d4@2 e4@4 d4@3 e4@6]/8",
  C: "[g3@28 ~@2 g#3@5 g#3 a3@3 ~@2 f4@6 e4@36 ~ f4@5 ~ e4@6, f3 ~@47]/4", D: "d4 g3 d4 g3", E: "d4 c#4 d4 e4",
  F: "c4@6 g4@6 f#4@5 f4@7", G: "e4@19 ~@5",
})).s("gm_tenor_sax").gain(0.41)

// other · alto sax · "PAUL"
const alto_sax = note("<~ A B@6 C@2 D@4 E@2 F G ~@2>".pickRestart({
  A: "~@6 e4@3 f4@3 g4@3 f4@2 g4@7",
  B: "[e4@29 f4@12 a4@5 ~ g4@29 ~@2 g4@3 f#4@2 ~ g4@3 f#4@2 g4@4 a4@2 g4@12 ~ f4@17 e4@6 f4@6 g4@6 ~]/6",
  C: "[e4@28 ~@2 e4@3 f4@2 g4@4 f4@2 g4@7]/2", D: "[e4@29 f4@5 ~ f4@5 ~ a4@5 ~ g4@36 ~ a4@6 g4@5 ~]/4",
  E: "[f#4@6 d4@6 f#4@6 ~@6 f4@6 e4@5 f4@6 g4@7, ~@18 e4@12 ~@5 e4 ~@12]/2", F: "e4@4 ~@2 e4@5 ~ d#4@4 ~@2 d4@5 ~",
  G: "c4@11 ~",
})).s("gm_alto_sax").gain(0.46)

// other · soprano sax · "GEORGE"
const soprano_sax = note("<~ A@3 B@2 C@4 D@4 E F G H ~@2>".pickRestart({
  A: "[~@6 g3@4 f#3@2 g3@3 f3@2 ~ g3@5 e3@30 f3@5 ~ f3@6 a3@6 ~]/3",
  B: "[g3@29 ~ g3@3 ~ f#3!2 g3@3 f#3@2 g3@3 ~ a3@2 ~]/2",
  C: "[g3@11 ~ f3@17 e3@5 ~ f3@6 g3@6 e3@29 ~@2 e3@3 f3@2 g3@3 ~ f3@2 g3@6 ~]/4",
  D: "[e3@29 f3@5 ~ f3@5 ~ a3@5 ~ g3@36 ~ a3@6 g3@3 ~@3]/4", E: "f#3@6 d3@6 f#3@6 e3@5 ~", F: "f3 e3 f3 g3",
  G: "~ e3@5 e3@4 ~@2 d#3@5 d3@6 ~", H: "c3@2 ~",
})).s("gm_soprano_sax").gain(0.46)

// drums · kick
const kick = s("bd").struct(`<
  [x ~@4 x!2 ~@5]
  [x ~@4 x!2 ~@4 x]
  [x ~@4 x!2 ~@5]!7
  [x ~@4 x!2 ~@4 x]
  [x ~@4 x!2 ~@5]!6
  [x ~@4 x!2 ~@4 x]
  [~@5 x ~@6]
  ~@2
>`).gain(0.35)

// drums · rim
const rim = s("rim").struct("<[~ x ~ x] [~ x ~@2] [~ x ~ x]!14 ~@4>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~ [~@9 x!2 ~] ~@14 [~ x ~ x] x ~@2>").gain(0.45)

// drums · clap
const clap = s("cp").struct("<A B A C D E A F A G H A@2 I J A@2 K L M>".pickRestart({
  A: "~@3 x", B: "~@3 x ~ x!3 ~ x!2 ~ x!3 ~ x!6 ~@2", C: "~ x ~ x!3 ~ x!3 ~ x!3 ~ x!2 ~ x!2 ~@4", D: "~@18 x ~ x!3 ~",
  E: "x!3 ~ x!2 ~ x ~@10 x ~@5", F: "~@3 x ~ x!3 ~ x!3 ~ x!3 ~ x!2 ~ x!2 ~ x", G: "~@3 x ~@12 x ~ x!2 ~ x!3",
  H: "~ x!3 ~ x!2 ~ x!2 ~@8 x ~@5", I: "~@3 x!3 ~ x!3 ~ x!3 ~ x!2 ~ x!3 ~ x ~", J: "x ~@2 x", K: "~@14 x!4 ~ x!4 ~",
  L: "x!3 ~ x!3 ~ x!2 ~ x!3 ~ x!2 ~ x!3 ~ x!2", M: "~ x!2 ~ x!2 ~ x!2 ~ x!2 ~@12",
})).gain(0.35)

// drums · low tom
const low_tom = s("lt").struct("<~@17 [~@2 x!2 ~@8] ~@2>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<A B A C A C@5 A C@3 A@3 ~@3>".pickRestart({
  A: "x ~@2 x ~@2 x ~ x!2 ~@2", B: "x!3 ~", C: "x!4",
})).gain(0.3)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<A B A C A D@2 A D A@2 C@2 D A D A ~@3>".pickRestart({
  A: "~@5 x ~@5 x", B: "~@5 x ~ x ~ x ~@2", C: "~@5 x ~@2 x ~@3", D: "~@5 x ~@6",
})).gain(0.2)

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

// drums · crash
const crash = s("cr").struct("<x!3 ~@13 x [~@5 x ~@6] ~@2>").gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<[~ x ~ x]!16 [x ~ x!2 ~@4 x!2 ~@2] ~@3>").gain(0.4)

stack(
  bass, piano, tenor_sax, alto_sax, soprano_sax, kick, rim, snare, clap, low_tom, hihat, hihat_soft, open_hat, crash,
  tambourine
)

More by The Beatles