Strudelify

P. S. I Love You

The Beatles

KeyD majorTempo120 bpm
0:00/0:00
// P. S. I Love You — The Beatles
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 68 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · rock organ · "Organ 3"
const rock_organ = note(`<
  A B C D A B E F G H@2 I J K L@2 M ~ G H@2 I J K L@2 M ~ N O N P N Q E F G H@2 I J K L@2 M ~ N R N S N T E F U V W X J
  Y Z@2 AA@2 AB@2 AC@2
>`.pickRestart({
  A: "b4@2 b4@2 b4@3 c#5", B: "b4 a4@3 ~@4", C: "b4@2 b4@2 b4@3 b4", D: "a4@2 ~@5 a4",
  E: "[a3,a4]@2 [a3,a4]@2 [a3,e4]@2 [a3,f#4] [a3,e4]", F: "[a3,d4] ~", G: "[d4,f#4,a4]!2 b4 d5",
  H: "[[g4,b4,e5]@3 d5 c#5@2 b4 ~ [d4,f#4]@2 [d4,f#4,a4]@2 ~@3 b4, ~@7 b4@3 ~@6]/2", I: "[e4,g4,a4]@3 g4 f#4@2 e4@2",
  J: "[e4,f#4,b4] [d4,f#4,b4] ~@2", K: "f#4@2 e4@2 ~ d4 e4@2", L: "[[a#3,d4]@12 d5 c5 a#4 c5, ~@6 a#3 c4]/2",
  M: "[d4,d5]", N: "[g4,b4,d5]@2 [g4,b4,d5]@2 [g4,b4,d5]@3 [d4,g4,b4]", O: "[g4,b4,d5] [f#4,a4,d5] ~@6",
  P: "[f#4,a4,d5]@2 ~@5 [g4,b4,e5]", Q: "[f#4,a4,d5]!2 ~@6", R: "[g4,b4,d5] [f#4,a4,d5] ~ f#5@2 e5 d5@2",
  S: "~ a5!3 f#5 e5 d5 [g4,b4,e5], [f#4,a4,d5] ~@3", T: "[f#4,a4,d5]!2 ~ d5@2 b4 a4@2",
  U: "[d4,f#4,a4]!2 [f#4,a4,b4] [f#4,a4,d5]", V: "e5@3 d5 c#5@2 [e4,g4,b4]@2, [g4,b4]@3 ~",
  W: "[e4,g4,b4]@2 [d4,f#4,a4]@2 ~@3 b4", X: "[e4,a4]@3 [e4,g4,a4] [e4,f#4,a4]@2 [e4,a4]@2", Y: "f#4@2 e4@2 ~@2 d4 e4",
  Z: "[[a#3,d4,a#4]@12 d5 c5 [a#4,c5] c5, ~@6 [a#3,a#4] c4]/2", // A# A#sus2 A#
  AA: "[[d4,a4,d5]@12 d5 c5 [a#4,c5] c5, ~@6 [a#3,a#4] c4]/2", AB: "[[d4,a4,d5]@6 [a#3,a#4,d5] [c4,c5,e5]]/2",
  AC: "[[a4,d5,f#5]@9 ~@7]/2", // D
})).s("gm_rock_organ").gain(0.45)

// bass · fretless bass
const bass = note(`<
  A B A B A B C D B E B F G F H I J D B E B F G F H I J D K B K B K D@3 B E B F G F H I J D K B K B K D@3 B E B F G F H
  L J M J M N O
>`.pickRestart({
  A: "g2@3 g2 c#2@3 c#2", B: "d2@3 d2 a2@2 d2@2", C: "d2@3 d2 a2@3 a2", D: "d2@3 d2 a2@2 a1@2", E: "e2@3 e2 b2@2 e2@2",
  F: "a2@3 a2 e2@2 a2@2", G: "b2@3 b2 f#2@2 b2@2", H: "a#2@3 a#2 f2@2 a#2@2", I: "a#2@3 a#2 a#2@2 c3@2",
  J: "d2@3 d2 a2@2 a1 c#2", K: "g2@3 g2 d2@2 g2@2", L: "a#2@3 a#2 a#1@2 c2@2", M: "d2!2 a#1 c2", N: "d2@6 a2@9 ~",
  O: "d2 ~@7",
})).s("gm_fretless_bass").gain(0.49).pan(0.6)

// chords · acoustic guitar nylon · "Rythm Gtr"
const acoustic_guitar_nylon = note(`<
  A B A B A B C B@2 D B E F E G H B@3 D B E F E G H B@2 I B I B I B C B@2 D B E F E G H B@2 I B I B I B C B@2 D B E F E
  G H B J B J B K
>`.pickRestart({
  A: "[g3,b3,d4,g4]@2 [g3,b3,d4,g4]!2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]@2 [e3,g3,c#4,e4]@2 [e3,g3,c#4,e4]@2 [e2,a#2,e3,g3,c#4,e4]@2 [e2,a#2,e3,g3,c#4,e4]@2, [g2,d3]!2 [e2,a#2] ~", // G C#dim Edim G5 Edim
  B: "[a3,d4,f#4]@2 [a3,d4,f#4]!2 [a3,d4,f#4]@2 [a3,d4,f#4]@2 [a3,d4,f#4]@2 [a3,d4,f#4]@2 [a2,d3,a3,d4,f#4]@2 [a2,d3,a3,d4,f#4]@2, [a2,d3]!3 ~", // D D5
  C: "[a3,d4,f#4]@2 [a3,d4,f#4]!2 [a3,d4,f#4]@2 [a3,d4,f#4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e2,a2,e3,a3,c#4,e4]@2 [e2,a2,e3,a3,c#4,e4]@2, [a2,d3]!2 [e2,a2] ~", // D A D5 A5
  D: "[e3,g3,b3,e4]@2 [e3,g3,b3,e4]!2 [e3,g3,b3,e4]@2 [e3,g3,b3,e4]@2 [e3,g3,b3,e4]@2 [e3,g3,b3,e4]@2 [e2,b2,e3,g3,b3,e4]@2 [e2,b2,e3,g3,b3,e4]@2, [e2,b2]!3 ~", // Em E5
  E: "[e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]!2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e2,a2,e3,a3,c#4,e4]@2 [e2,a2,e3,a3,c#4,e4]@2, [e2,a2]!3 ~", // A A5
  F: "[b3,d4,f#4]@2 [b3,d4,f#4]!2 [b3,d4,f#4]@2 [b3,d4,f#4]@2 [b3,d4,f#4]@2 [b3,d4,f#4]@2 [b2,f#3,b3,d4,f#4]@2 [b2,f#3,b3,d4,f#4]@2, [b2,f#3]!3 ~", // Bm B5
  G: "[a#3,d4,f4]@2 [a#3,d4,f4]!2 [a#3,d4,f4]@2 [a#3,d4,f4]@2 [a#3,d4,f4]@2 [a#3,d4,f4]@2 [a#2,f3,a#3,d4,f4]@2 [a#2,f3,a#3,d4,f4]@2, [a#2,f3]!3 ~", // A# A#5
  H: "[a#3,d4,f4]@2 [a#3,d4,f4]!2 [a#3,d4,f4]@2 [a#3,d4,f4]@2 [a#2,f3,a#3,d4,f4]@4 [c3,g3,c4,e4,g4]@4, [a#2,f3]!2 ~@2", // A# C A#5
  I: "[g3,b3,d4,g4]@2 [g3,b3,d4,g4]!2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]@2 [g2,d3,g3,b3,d4,g4]@2 [g2,d3,g3,b3,d4,g4]@2, [g2,d3]!3 ~", // G G5
  J: "[a3,d4,f#4]@2 [a3,d4,f#4]!2 [a3,d4,f#4]@2 [a3,d4,f#4]@2 [a#2,f3,a#3,d4,f4]@4 [c3,g3,c4,e4,g4]@4, [a2,d3]!2 ~@2", // D A# C D5
  K: "[a2,d3,a3,d4,f#4] ~@7", // D
})).s("gm_acoustic_guitar_nylon").gain(0.33).pan(0.3)

// drums · kick
const kick = s("bd").struct("<A B A B A B A B@9 A B@9 A B@17 A B@17 A C A C D E>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x!2 ~@3", C: "x!2", D: "x ~@2 x ~@4", E: "x",
})).gain(0.35)

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

// drums · hihat
const hihat = s("hh").struct("<[x!8]!7 [x!7 ~] [x!8]!59 x>").gain(0.4)

stack(rock_organ, bass, acoustic_guitar_nylon, kick, rim, hihat)

More by The Beatles