Strudelify

Blue Moon

The Marcels

KeyG majorTempo134 bpm
0:00/0:00
// Blue Moon — The Marcels
// 134 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 6/4 at bar 2, 4/4 at bar 4, 6/4 at bar 11, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 98 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(134/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.

// chords · piano · "Ac Piano"
const piano = note(`<
  A ~@3 B C D C D C E ~@2 F G F G F G ~@2 B C D C D C H I J K L M N O P M N O P M Q R S T U C D C D C E ~@2 F G F G F G
  V W K@2 M@2 O@2 M@2 O@2 M@2 R@2 X Y F G F G F G ~@2 B C D C D C E ~@5
>`.pickRestart({
  A: "c-1 ~@15", B: "~@10 g5 b5 [d6,g6] ~ d6 ~", C: "~@2 e5 [g5,b5] e6 ~ b5 ~@3 c5 e5 [g5,c6] ~ g5 ~",
  D: "~@2 d5 [f#5,a5] d6 ~ a5 ~@3 g5 b5 [d6,g6] ~ d6 ~", E: "~@2 d5 [f#5,a5] d6 ~ a5 ~@9",
  F: "~@2 g5 b5 [d6,g6] ~ d6 ~@3 e5 [g5,b5] e6 ~ b5 ~", G: "~@2 c5 e5 [g5,c6] ~ g5 ~@3 d5 [f#5,a5] d6 ~ a5 ~",
  H: "~@2 d5 [f#5,a5] d6 ~ a5 ~@3 g5 [b5,d6] g6 ~ d6 ~", I: "~@2 g5 [c6,e6] g6 ~ e6 ~@3 g5 b5 g6 ~ d6 ~",
  J: "~@2 g5 [b5,d6] g6 ~ d6 ~ [g5,c6,e6] ~ [g5,c6,e6] ~@5", // Bm C
  K: "[g5,c6,e6] ~ [g5,c6,e6] ~@5 [g5,c6,e6] ~ [g5,c6,e6] ~@5", // C
  L: "[g5,c6,e6] ~ [g5,c6,e6] ~@5 [g5,b5,d6] ~ [g5,b5,d6] ~@5", // C G
  M: "[g5,b5,d6] ~ [g5,b5,d6] ~@5 [g5,b5,d6] ~ [g5,b5,d6] ~@5", // G
  N: "[g5,b5,d6] ~ [g5,b5,d6] ~@5 [a5,c6,e6] ~ [a5,c6,e6] ~@5", // G Am
  O: "[a5,c6,e6] ~ [a5,c6,e6] ~@5 [a5,c6,e6] ~ [a5,c6,e6] ~@5", // Am
  P: "[a5,c6,e6] ~ [a5,c6,e6] ~@5 [g5,b5,d6] ~ [g5,b5,d6] ~@5", // Am G
  Q: "[g5,b5,d6] ~ [g5,b5,d6] ~@5 [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~", // G A
  R: "[a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~", // A
  S: "[a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,c#6,e6] ~ [a5,f#6] d6 [a5,d6,f#6] ~ [a5,d6,f#6] ~ [a5,d6,f#6] ~", // A D
  T: "[a5,d6,f#6] ~ [a5,d6,f#6] ~ [a5,d6,f#6] ~ [a5,d6,f#6] ~ d6 ~ d6 ~ d6 ~ [d5,d6] ~", // D
  U: "[d5,d6] ~ [d5,d6] ~ [d5,d6] ~ [d5,d6] ~@3 g5 b5 [d6,g6] ~ d6 ~", // D G5
  V: "~@2 g5 [b5,d6] g6 ~ d6 ~@3 g5 [c6,e6] g6 ~ e6 ~", W: "~@2 g5 b5 g6 ~ d6 ~@3 g5 [b5,d6] g6 ~ d6 ~",
  X: "[a5,f#6] d6 [a5,d6,f#6] ~ [a5,d6,f#6] ~ [a5,d6,f#6] ~ [a5,d6,f#6] ~ [a5,d6,f#6] ~ [a5,d6,f#6] ~ [a5,d6,f#6] ~", // D
  Y: "d6 ~ d6 ~ d6 ~ [d5,d6] ~ [d5,d6] ~ [d5,d6] ~ [d5,d6] ~ [d5,d6] ~", // D
})).s("gm_piano").gain(0.19)

// bass · acoustic bass · "Ac Bass"
const bass = note(`<
  ~@2 A B C D E F G H I B J K L M N M O A B C D E F G H P Q R S T U V S T U V S T U W X Y Z AA D E F G H I B J K L M N M
  O AB AC S AD U AE S AD U AE S AD U AE AF AG AH AI K L M N M O A B C D E F G H I B@2 ~@3
>`.pickRestart({
  A: "d2@2 ~@6 d2 ~@7", B: "d2 ~@7 d2 ~@7", C: "d2 ~ c2 ~ b1 ~ a1 ~ g1@3 ~ b1@3 ~", D: "e2@3 ~ e2@3 ~ c2@3 ~ c2@3 ~",
  E: "d2@3 ~ d2@3 ~ g2@3 ~ f#2@3 ~", F: "e2@3 ~ d2@3 ~ c2@3 ~ c2@2 e2 ~", G: "d2@3 ~ d2 ~ f#2 ~ g2@3 ~ f#2@3 ~",
  H: "e2@3 ~ d2@3 ~ c2@3 ~ c2 ~ e2 ~", I: "d2@3 ~ d2 ~ a1 ~ d2@2 ~@6", J: "d2 ~@7 d2 ~ c2 ~ b1 ~ a1 ~",
  K: "g1@3 ~ b1@3 ~ e2@3 ~ e2@3 ~", L: "c2@3 ~ c2@3 ~ d2@3 ~ d2@3 ~", M: "g2@3 ~ f#2@3 ~ e2@3 ~ d2@3 ~",
  N: "c2@3 ~ c2@2 e2 ~ d2@3 ~ d2 ~ f#2 ~", O: "c2@3 ~ c2 ~ e2 ~ d2@3 ~ d2 ~ a1 ~",
  P: "d2@3 ~ d2 ~ a1 ~ g1@3 ~ g1 ~ b1 ~", Q: "c2@3 ~ c2@2 b1 ~ g1@3 ~ g1@3 ~", R: "g1@3 ~ g1@3 ~ c2@3 ~ c2@3 ~",
  S: "c2@3 ~ c2@3 ~ c2@3 ~ c2@3 ~", T: "c2@3 ~ c2 ~ d2 ~ g2@3 ~ g2@3 ~", U: "g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~",
  V: "g2@3 ~ g2@2 ~@2 c2@3 ~ c2@3 ~", W: "g2@3 ~ g2@2 ~@2 a2@3 ~ a2@3 ~", X: "e2@3 ~ e2@3 ~ a1@3 ~ a1@3 ~",
  Y: "e2@3 ~ a1@3 ~ d2@3 ~ d2@3 ~", Z: "a1@3 ~ a1@3 ~ d2@3 ~ c2@3 ~", AA: "b1@2 ~@2 a1@3 ~ g1@3 ~ b1@3 ~",
  AB: "g1@3 ~ g1 ~ b1 ~ c2@3 ~ c2@2 b1 ~", AC: "g1@3 ~ g1@3 ~ g1@3 ~ g1@3 ~", AD: "c2@3 ~ c2@3 ~ c2@3 ~ c2 ~ d2 ~",
  AE: "g2@3 ~ g2@3 ~ g2@3 ~ g2@2 ~@2", AF: "a2@3 ~ a2@3 ~ e2@3 ~ e2@3 ~", AG: "a1@3 ~ a1@3 ~ e2@3 ~ a1@3 ~",
  AH: "d2@3 ~ d2@3 ~ a1@3 ~ a1@3 ~", AI: "d2@3 ~ c2@3 ~ b1@2 ~@2 a1@3 ~",
})).s("gm_acoustic_bass").gain(0.45)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@12 A B C B D E F G@2 H@2 I@2 J@2 K@2 L M@2 N L O@2 P L M@2 N Q@2 R S T@2 I@2 J@2 U@2 V B C B D E W X Y Z AA AB@2 Z
  AA AC@2 Z AA AD@2 AE AF AG AH B C B D E W AI ~ AJ@2 AK@2 AL AM ~@6
>`.pickRestart({
  A: "~@6 d4 b3", B: "d4@15 ~", C: "~@2 c4@2 d4 ~ e4 ~ d4@2 ~ d4@2 ~ c4@2", D: "~@2 a3@2 b3@2 c4@2 b3@2 ~ b3@3 a3 ~",
  E: "b3@3 ~", F: "~@2 g3 ~ a3 ~ b3 ~ g3@2 ~ g3@2 ~ e4@2", G: "[f#4@5 ~ e4 d4@14 ~@11]/2",
  H: "[~@4 d4@2 b3 ~ d4@15 ~@3 c4@2 d4 ~ e4 ~]/2", I: "[d4@2 ~ d4@2 ~ c4@2 d4@15 ~@3 a3@2 b3@2 c4@2]/2",
  J: "[b3@2 ~ b3@3 a3 ~ b3@12 ~@6 g3 ~ a3 ~ b3 ~]/2", K: "[g3@2 ~ g3@2 ~ g3@2 g3@16 ~@8]/2",
  L: "~@2 g3 ~ g3 ~ g3 ~ a3@2 a3@6", M: "[~@4 a3@3 ~ c4@10 ~@2 d4@3 ~ d4@6 b3 a3]/2", N: "g3@5 a3 b3@7 ~@3",
  O: "[~@4 a3@3 ~ c4@10 ~@2 d4@3 ~ a3@5 ~ b3 a3]/2", P: "g3@11 ~@5",
  Q: "[~@2 d4 ~ d4 ~ d4 ~ e4@11 ~ a3@3 ~ e4@3 ~ e4@3 ~]/2", R: "f#4@3 ~ g4@3 ~ f#4@6 e4@2, ~@4 f#4 ~@11",
  S: "d4@7 ~ g4@2 ~@2 f#4@3 ~", T: "[e4@3 ~ f#4@2 b3 ~ d4@15 ~@3 c4@2 d4 ~ e4 ~]/2",
  U: "[g3@2 ~ g3@2 ~ e4@2 f#4@5 ~ e4 d4@14 ~@3]/2", V: "~@12 d4@2 b3 ~", W: "~@2 g3 ~ a3 ~ b3 ~ g3@2 ~ g3@2 ~ g3@2",
  X: "g3", Y: "~@10 g3 ~ g3 ~ g3 ~", Z: "a3@2 a3@7 ~@3 a3@3 ~", AA: "c4@10 ~@2 d4@3 ~",
  AB: "[d4@6 b3 a3 g3@5 a3 b3@7 ~@5 g3 ~ g3 ~ g3 ~]/2", AC: "[a3@5 ~ b3 a3 g3@11 ~@7 g3 ~ g3 ~ g3 ~]/2",
  AD: "[d4@6 b3 a3 g3@5 a3 b3@7 ~@5 d4 ~ d4 ~ d4 ~]/2", AE: "e4@11 ~ a3@3 ~",
  AF: "e4@3 ~ e4@3 ~ f#4@3 ~ g4@3 ~, ~@12 f#4 ~@3", AG: "f#4@6 e4@2 d4@7 ~", AH: "g4@2 ~@2 f#4@3 ~ e4@3 ~ f#4@2 b3 ~",
  AI: "g3@5 ~@11", AJ: "[~@8 [b4,d5]@15 ~@3 [a4,c5]@3 [b4,d5]@3]/2",
  AK: "[[c5,e5]@5 [b4,d5]@2 [a4,c5] [b4,d5]@12 ~@7 [a4,c5]@2 [b4,d5]@3]/2", // C Bm Am Bm Am Bm
  AL: "[c5,e5]@3 [b4,d5]@2 [a4,c5]@3 [b4,d5]@4 [a4,c5]@4", AM: "[g4,b4]@2 ~@2 [a4,d5]@4 [g4,c5]@5 ~@3",
})).s("gm_string_ensemble_1").gain(0.45)

// chords · electric guitar clean · "E Guitar"
const electric_guitar_clean = note(`<
  ~@4 A B C D E D F ~@2 G H G H G H ~@2 I J K J K J K L M N O P Q N O P Q N O P R S T U K J K J K J F ~@2 G H G H V H W
  X N@2 P@2 N@2 P@2 N@2 P@2 S@2 U@2 G H G H G H ~@2 I J K J K J F ~@5
>`.pickRestart({
  A: "~@12 [g3,b3,d4] ~@3", B: "~@4 [g3,b3,e4] ~@7 [a3,c4,e4] ~@3", C: "~@4 [a3,d4,f#4] ~@7 [b3,d4,g4] ~@3",
  D: "~@4 [b3,e4,g4] ~@7 [c4,e4,g4] ~@3", E: "~@4 [d4,f#4,a4] ~@7 [b3,d4,g4] ~@3", F: "~@4 [d4,f#4,a4] ~@11",
  G: "~@4 [d4,g4,b4] ~@7 [e4,g4,b4] ~@3", H: "~@4 [c4,e4,g4] ~@7 [d4,f#4,a4] ~@3", I: "~@12 [d4,g4,b4] ~@3",
  J: "~@4 [e4,g4,b4] ~@7 [c4,e4,g4] ~@3", K: "~@4 [d4,f#4,a4] ~@7 [d4,g4,b4] ~@3",
  L: "~@4 [e4,g4,c5] ~@7 [d4,g4,b4] ~@3", M: "~@4 [d4,g4,b4] ~@7 [c4,e4,a4] ~@3",
  N: "~@4 [c4,e4,a4] ~@7 [c4,e4,a4] ~@3", O: "~@4 [c4,e4,a4] ~@7 [b3,d4,g4] ~@3",
  P: "~@4 [b3,d4,g4] ~@7 [b3,d4,g4] ~@3", Q: "~@4 [b3,d4,g4] ~@7 [c4,e4,a4] ~@3",
  R: "~@4 [b3,d4,g4] ~@7 [c#4,e4,a4] ~@3", S: "~@4 [c#4,e4,a4] ~@7 [c#4,e4,a4] ~@3",
  T: "~@4 [c#4,e4,a4] ~@7 [d4,f#4,a4] ~@3", U: "~@4 [d4,f#4,a4] ~@7 [d4,f#4,a4] ~@3",
  V: "~@4 [d4,g4,a4,b4] ~@7 [e4,g4,b4] ~@3", W: "~@4 [d4,g4,b4] ~@7 [e4,g4,c5] ~@3",
  X: "~@4 [d4,g4,b4] ~@7 [d4,g4,b4] ~@3", // G
})).s("gm_electric_guitar_clean").gain(0.45)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@8 A ~@7 B ~@8 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 B ~@7 B ~@3 B ~@3 B ~@3 B ~@3 B ~@8 A ~@7
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@7 x",
})).gain(0.48)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@4 A B C B D E F ~@2 G H I H J H ~@2 A B C B D E K B K B C B K B C B K B C B K B C B K B C B D E F ~@2 G H I H J H G
  H G H I H G H I H G H I H G H I H G H I H J H ~@2 A B C B D E F ~@5
>`.pickRestart({
  A: "~@6 x!2", B: "x!3 ~ x ~ x!2", C: "x ~@4 x!3", D: "x ~@2 x", E: "x ~ x!3 ~ x!2", F: "x", G: "~@2 x!5 ~",
  H: "x ~ x!3 ~@3", I: "~ x!6 ~", J: "~@2 x ~ x ~ x!2", K: "x ~@5 x!2",
})).gain(0.42)

// drums · pedal hat · soft notes
const pedal_hat_soft = s("hh").struct(`<
  ~@5 A ~ A B C ~@3 B D B D A D ~@3 A ~ A B C ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B C ~@3 B D B D A D B D B D B
  D B D B D B D B D B D B D B D B D A D ~@3 A ~ A B C ~@6
>`.pickRestart({
  A: "~@3 x ~ x ~@2", B: "~@7 x", C: "~ x ~@3 x ~@2", D: "~ x ~@6",
})).gain(0.24)

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

stack(piano, bass, string_ensemble_1, electric_guitar_clean, kick, snare, low_tom, pedal_hat, pedal_hat_soft, crash)