Strudelify

Dear Prudence

The Beatles

KeyD majorTempo72 bpm
0:00/0:00
// Dear Prudence — The Beatles
// 72 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(72/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// other · overdriven guitar · "Guitar 1"
const overdriven_guitar = note("<~@31 A@2 B C D C E ~ F ~ G H G H G H G H I J K L M ~@22>".pickRestart({
  A: "[~ [d3,f#3,a3,d4]@2 ~]/2", B: "~@14 f4 g4", C: "f4 d4 ~@2 f4 g4 g#4 g4", D: "~@2 f4@2 g3 f3 d3@2 ~@6 f4 g4",
  E: "~@2 f4@2 g3 f3 d3@2 ~@8", F: "[d2,a2,d3] ~", G: "~@3 [f#4,g4] ~ f#4 d4@2", H: "~@6 f#4 g4 f#4@2 ~ b3 f#3 g3@3",
  I: "~@5 f#4 g4@2 f#4@4 ~@2 f#4@2", J: "~@4 f4 ~ e4 ~", K: "~@3 [f#4,g4] ~ f#4 ~ f#4", L: "e4@2 e4 ~ g4 a4 b4@2",
  M: "a4 ~@3",
})).s("gm_overdriven_guitar").gain(0.48)

// other · acoustic guitar nylon · "Guitar 2"
const acoustic_guitar_nylon = note(`<
  A B C D E F E F E F E F E F E F G H E F E F E F E F E F E F G I J K J K J L M N O N O N O N O N O N O N P Q R Q R Q R
  Q R Q R S T U V W X Y Z AA AB AC@3
>`.pickRestart({
  A: "[a2,e5]@2 d3 f#4 d2 a4 d3@2 [a2,d5]@2 d3 f#4 d2 a4 d3@2", // A5 D5
  B: "[a2,c5]@2 d3 e4 d2 g4 d3@2 [a2,b4]@2 d3 d4 d2 g4 d3@2", // Am Asus2
  C: "[a2,a4]@2 d3 c#4 d2 e4 d3@2 [a2,g4]@2 d3 c4 d2 e4 d3@2", // A A7
  D: "[a2,g4]@2 d3 c4 d2 e4 d3@2 [a2,f#4]@2 d3 d4 d2 d4 d3@2", // A7 D
  E: "[c3,f#4]@2 d3 d4 d2 d4 d3@2 [b2,f#4]@2 d3 d4 d2 d4 d3@2", // Cdim B5
  F: "[a#2,f#4]@2 d3 d4 d2 d4 d3@2 [a2,f#4]@2 d3 d4 d2 d4 d3@2", // D#m D
  G: "[c3,f#4]@2 d3 d4 d2 d4 d3@2 [c3,e4]@2 e3 g3 c3 c4 e3@2", // Cdim C
  H: "[b2,g4]@2 d3 g3 d2 d4 d3@2 [a2,f#4]@2 d3 d4 d2 d4 d3@2", // Em D
  I: "[b2,g4]@2 d3 g3 d2 d4 d3@2 [a2,f#4]@2 d3 a3 d2 d4 d3@2", // Em D
  J: "[a2,g4]@2 d3 b3 d2 d4 d3@2 [a2,a4]@2 d3 c#4 d2 e4 d3@2", // A7 A
  K: "[a2,g4]@2 d3 b3 d2 d4 d3@2 [a2,f#4]@2 d3 a3 d2 d4 d3@2", // A7 D
  L: "[a2,g4]@2 d3 b3 d2 d4 d3@2 [c3,f4]@2 f3 a3 c3 c4 f3@2", // A7 F5
  M: "[d#3,g#4]@2 g#3 c4 d#3 d#4 g#3@2 [d3,g4]@2 g3 b3 d3 d4 g3@2", // G#5 G5
  N: "[a2,f#4]@2 d3 d4 d2 d4 d3@2 [c3,f#4]@2 d3 d4 d2 d4 d3@2", // D Cdim
  O: "[b2,f#4]@2 d3 d4 d2 d4 d3@2 [a#2,f#4]@2 d3 d4 d2 d4 d3@2", // B5 D#m
  P: "[c3,e4]@2 e3 g3 c3 c4 e3@2 [b2,g4]@2 d3 g3 d2 d4 d3@2", Q: "d3!2 [d3,f#3,a3,d4]@2 c3!2 [c3,e3,g3,c4]@2",
  R: "b2!2 [b2,d#3,f#3,b3]@2 a#2!2 [a#2,d3,f3,a#3]@2", S: "[d3,f#3,a3,d4]!8", T: "[c3,e3,g3,c4]!8",
  U: "[b2,d#3,f#3,b3]!8", V: "[a#2,d3,f3,a#3]!8",
  W: "[d3,f#3,a3,d4]!2 [d3,f#3,a3,d4]@2 [d3,f#3,a3,c4,d4]!2 [d3,f#3,a3,c4,d4]@2", // D D7
  X: "[c3,e4]@2 e3 g3 c3 c4 c3@2 [b2,g4]@2 d3 g3 d2 d4 d3@2", // C Em
  Y: "[a2,f#4]@2 d3 d4 d2 d4 d3@2 [a2,f#4]@2 d3 d4 d2 d4 d3@2", // D
  Z: "[a2,f#5]@2 d3 a4 d2 d5 d3@2 [a2,e5]@2 d3 g4 d2 a4 d3@2", // D A5
  AA: "[a2,d5]@2 d3 f#4 d2 a4 d3@2 [a2,c5]@2 d3 e4 d2 g4 d3@2", // D5 Am
  AB: "[a2,b4]@2 d3 d4 d2 g4 d3@2 [a2,a4]@2 d3 c#4 d2 e4 d3@2", // Asus2 A
  AC: "[a2,g4]@2 d3 c4 d2 e4 d3@2 [a2,g4]@2 d3 c4 d2 e4 d3@2", // A7
})).s("gm_acoustic_guitar_nylon").gain(0.54)

// other · acoustic guitar nylon · "Guitar 3"
const acoustic_guitar_nylon_2 = note(`<
  ~@5 A@8 B@4 ~@2 A@8 C@4 D E@5 F ~@3 G@3 H G H G H G@3 I ~@2 J@8 ~@13
>`.pickRestart({
  A: "[~@8 d3@16 d3@16 d3@16 d3@10 a3@2 f#4@2 f#4!2 d3@16 d3@10 a3@2 f#4@2 f#4!2 d3@16 d3@8]/8",
  B: "[~@2 a3@2 f#4@2 f#4!2 d3@16 d3@16 d3@16 ~@8]/4", C: "[~@2 a3@2 f#4@2 f#4!2 d3@16 d3@16 d3@16 [c3,e3,g3,c4]@8]/4",
  D: "[g2,b2,d3,g3]@4 a3 d4 d3 d4", E: "a3 d4 d3 d4 a3 d4 d3 d4", F: "a3 d4 d3 d4 ~@4", G: "d3",
  H: "d3@10 a3@2 f#4@2 f#4!2", I: "[c3,e3,g3,c4] [g2,b2,d3,g3]", J: "a2 d3 d2 d3 a2 d3 d2 d3",
})).s("gm_acoustic_guitar_nylon").gain(0.45)

// other · distortion guitar · "Guitar 4"
const distortion_guitar = note("<~@55 A@7 B@5 C D ~@7>".pickRestart({
  A: "[[f#3,f#4]@2 ~@2 [f#3,f#4] [g3,g4] [a3,a4] [b3,b4]@2 [d3,d4] ~@2 [d4,d5] [e4,e5] [d4,d5] [a3,a4]@3 ~@2 [f#3,f#4] [g3,g4] [a3,a4] [b3,b4]@2 [d3,d4] ~@2 [d4,d5] [e4,e5] [d4,d5] [a3,a4]@3 ~@2 [f#3,f#4] [g3,g4] [a3,a4] [b3,b4]@2 [d3,d4] ~@2 [d4,d5] [e4,e5] [d4,d5] [a3,a4]@3 ~@2 [f#3,f#4] [g3,g4] [a3,a4] [b3,b4]]/7", // F# G A B D E D A …
  B: "[~ [d3,d4] ~@2 [d4,d5] [e4,e5] [d4,d5] [a3,a4]@3 ~@2 [f#2,f#3] [g2,g3] [a2,a3] [d3,d4]@3 ~ [f#2,f#3] [a2,a3] [b2,b3] [d3,d4] [f#3,f#4]@3 ~ [a2,a3] [d3,d4] [e3,e4] [f#3,f#4] [a3,a4]@3 ~ [e3,e4] [f#3,f#4] [g3,g4] [a3,a4] [d4,d5]]/5", // D E D A F# G A D …
  C: "[d4,d5]", D: "~@5 d5!3 ~ d5!3 ~ d5!3",
})).s("gm_distortion_guitar").gain(0.45)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@6 A@7 B C D E F@2 G H I H I H I H J K L M N@2 O P@3 Q R S ~ T U T U T U T U V W X Y Z AA AB AC AD AE AF AG AF AE AH
  AI AJ AK AL AM AN ~@6
>`.pickRestart({
  A: "d3 ~", B: "d3@4 a2@2 d2 d3", C: "c3@2 d2 c3 b2@2 d2 b2", D: "a#2@2 d2 a#2 a2@2 d2 d3", E: "c3@2 d2 c#2 g2@2 g2 ~",
  F: "[b2 c#3 d3@2 d3@8 ~@4]/2", G: "~@4 a2!2 d2 d3", H: "c3!2 d2 c3 b2!2 d2 b2", I: "a#2!2 d2 a#2 a2!2 d2 d3",
  J: "a#2!2 d2 a#2 d2!2 ~ d2", K: "c2!2 ~ c2 b1!2 ~ b1", L: "a#1!2 ~ c2 d2!3 e2", M: "f#2 d2 e2 d2 c2 d2 e2 c2",
  N: "[b1 g1 a1 b1 d2@8 ~@2 d2 ~]/2", O: "~@4 a2 d3 d2 d3", P: "a2 d3 d2 d3 a2 d3 d2 d3", Q: "a2 d3 d2 d3 f2!2 f2@2",
  R: "g#2!2 g#2@2 g2!3 a2", S: "d2", T: "a2!2 d2 d3 c3!2 d2 c3", U: "b2!2 d2 b2 a#2!2 d2 a#2", V: "d2!2 ~ d2 c2!2 ~ c2",
  W: "b1!2 ~ b1 a#1!2 ~ c2", X: "d2!3 e2 f#2 d2 e2 d2", Y: "c2 d2 e2 c2 b1 g1 a1 b1", Z: "d2@2 ~@2 c2!2 ~ c2",
  AA: "b1@2 ~ b1 a#1!3 c2", AB: "d2@2 ~ d2 c2!2 ~@2", AC: "b1@2 ~ b1 a#1!2 ~ c2", AD: "d2@2 ~ d2 c2!2 ~ c2",
  AE: "b1@2 b1@2 a#1!2 ~ c2", AF: "d2@2 d2@2 c2!2 ~ c2", AG: "b1@4 b1@4 a#1!2 ~ a#1!3 c2@2",
  AH: "d2@2 d2@2 d2@2 d2@2 d2@2 d2@2 d2 a1 d2 c#2", AI: "c2!3 f#1 g1 a1 c2@2", AJ: "b1!3 f#1 g1 a1 b1 g1",
  AK: "a#1!3 f#1 g1 a1 a#1 c2", AL: "d2@2 d2@2 d2@2 f#1@2 g1@2 a1@2 ~ c2 d2@2", AM: "c2 b1",
  AN: "~@6 d2!2 d2@4 a2!2 b2@2",
})).s("gm_fretless_bass").gain(0.45)

// chords · piano
const piano = note("<~@57 A B@3 ~ C D E F G H I J ~@6>".pickRestart({
  A: "~@10 [f#5,a5] [a4,d5] [f#5,a5] [a4,d5] [f#5,a5] [a4,d5]", // F#m D5 F#m D5 F#m D5
  B: "[f#5,a5] [a4,d5] [f#5,a5] [a4,d5] [f#5,a5] [a4,d5] [f#5,a5] [a4,d5] [f#5,a5] [a4,d5] [f#5,a5] [a4,d5] [f#5,a5] [a4,d5] [f#5,a5] [a4,d5]", // F#m D5 F#m D5 F#m D5 F#m D5 …
  C: "~@14 [a3,b3,c4,d4,e4,f4,g4,a4,b4,c5,d5] [b2,c3,d3,e3,f3,g3]", D: "[d4,f#4,a4]!8", E: "[c4,f#4,a4]!8",
  F: "[b3,d4,f#4,a4]!8", G: "[a#3,d4,f#4,a4]!8", H: "[d4,f#4,a4]!4 [c4,f#4,a4]!2 ~ [c4,f#4,a4]",
  I: "[g3,c4,e4]!2 [b3,d4,g4]!2", J: "[c4,f#4,a4]",
})).s("gm_piano").gain(0.36)

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

// drums · snare
const snare = s("sd").struct("<~@13 A B@3 C ~ A B@11 C ~ D E@5 ~@2 B@11 F G H I J K L M N O P E@5 ~@8>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2", D: "~@2 x!2", E: "x!4", F: "~@10 x ~ x!3 ~", G: "~@4 x!6 ~ x!5",
  H: "~@4 x!4 ~@8", I: "~@4 x!3 ~ x!3 ~@5", J: "~@4 x!2 ~ x!2 ~@3 x ~@3", K: "~@2 x!3 ~ x!4 ~@2 x ~ x!2",
  L: "x ~@3 x!2 ~@10", M: "~@2 x!5 ~@2 x ~@4 x!2", N: "x ~ x ~@4 x ~@8", O: "~@3 x!2 ~ x!3 ~@3 x!2 ~@2",
  P: "~@2 x!2 ~@4 x ~@2 x!4 ~",
})).gain(0.4)

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

// drums · hihat
const hihat = s("hh").struct("<~@13 A B@3 C ~ D E@7 F B@3 C ~@9 E@8 B@3 G ~ H ~@8 E@5 ~@8>".pickRestart({
  A: "~@8 x!8", B: "x!16", C: "x!8 ~@8", D: "~@4 x!4", E: "x!8", F: "x ~ x ~ x ~ x ~ x!8", G: "x!4 ~@12", H: "x!2 ~@6",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@60 [~@12 x!3 ~] [~@15 x] [x!2 ~@5 x ~@8] ~@13>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@33 A B@5 ~@19 C ~ D E F ~@13>".pickRestart({
  A: "~@4 x!4", B: "x!8", C: "~@8 x!7 ~", D: "~@5 x ~@4 x ~@5", E: "~@11 x ~@4", F: "~@5 x ~@10",
})).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct("<~@17 [~ x] ~@13 [~ x] ~@44>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@52 A ~ B C D E ~ F G H I ~@13>".pickRestart({
  A: "~ x!2 ~", B: "~@8 x!8", C: "~@12 x!3 ~", D: "~@9 x!3 ~ x!2 ~", E: "~@10 x ~@2 x ~@2", F: "~@8 x ~@2 x!3 ~@2",
  G: "~@4 x ~@3 x!2 ~@6", H: "~@5 x ~@4 x ~@5", I: "~ x ~@2",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@39 A ~@13 A ~ A B A ~ A ~ A ~@6 A ~@7>".pickRestart({
  A: "x", B: "x!2 ~@6",
})).gain(0.4)

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

stack(
  overdriven_guitar, acoustic_guitar_nylon, acoustic_guitar_nylon_2, distortion_guitar, bass, piano, kick, snare, clap,
  hihat, low_tom, mid_tom, open_hat, high_tom, crash, tambourine
)

More by The Beatles