Strudelify
Imagine cover art

Imagine

Imagine

John Lennon

KeyC majorTempo71 bpm
0:00/0:00
// Imagine — Lennon John
// 71 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 57 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(71/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 · fretless bass · "FRETLESS"
const bass = note(`<
  A B A B A B A B A B A C D E F G A H A H A H A H D E F G I J I J I J I K A H A H A H A H D E F G I J I J I J L M@2
>`.pickRestart({
  A: "c2", B: "f1", C: "f1@15 ~", D: "f2 e2", E: "d2 c2", F: "g1", G: "g1@3 ~", H: "f2", I: "f2 g2", J: "c2 e2",
  K: "c2@7 ~", L: "f1 g1", M: "[c2@7 ~]/2",
})).s("gm_fretless_bass").gain(0.32)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A B A B C D C E C D F G H I J K L M L N O P L Q H I J R S T U V W T W X L M L N O P L Q H I J R S T U V W T W Y@2
>`.pickRestart({
  A: "[c3,g3]@3 a3 g3@4", B: "f3@6 c3@2 f3@7 ~", C: "[c3,g3]@15 ~", D: "f3@4 c4 a3 f3@2", E: "f3@4 c3 f3 a3@2",
  F: "c3@2 g3@5 ~", G: "f3@2 c4 d4 c4@2 a3 g3", H: "f3@8 [e3,a3]@7 ~", I: "[d3,a3]@4 d3 e3 f3 a3", J: "g3@3 c4",
  K: "g3@2 d4@2 g3@3 ~ [g3,b3,f4]@7 ~", L: "[c4,e4]@7 ~ [c4,e4]@2 g3@2 [c4,e4]@4",
  M: "[f3,a3,c4]@7 ~ [a3,c4]@2 f3@2 [a3,c4]@3 ~", N: "[f3,a3,c4]@7 ~ [a3,c4]@2 f3@2 [a3,c4]@4",
  O: "[c4,e4]@4 [c4,e4] g3 [c4,e4]@2", P: "[f3,a3,c4]@4 [a3,c4] f3 [a3,c4]@2",
  Q: "[f3,a3,c4]@7 ~ [a3,c4]@2 f3@2 d3@3 ~", R: "g3@2 d4@2 g3@3 ~ [g3,b3,f4]@8", S: "[f3,a3,c4]@8 [g3,b3,d4]@7 ~",
  T: "[g3,c4,e4]@7 ~ [g#3,d4]@2 e3@2 [g#3,d4]@4", U: "[f3,a3,c4]@7 ~ [f3,g3,b3]@7 ~",
  V: "[g3,c4]@2 e3@2 [g3,c4]@3 ~ [g#3,d4]@2 e3@2 [g#3,d4]@3 ~", W: "[f3,a3,c4]@7 ~ [g3,b3,d4]@7 ~",
  X: "[c4,e4]@7 ~ [d4,f4]@2 a3@2 [d4,f4]@3 ~", Y: "[[c4,e4]@7 ~@5 [c3,e3]@16 ~@4, ~@8 g3@17 ~@7]/2",
})).s("gm_piano").gain(0.38)

// chords · piano · "A.PIANO 1"
const piano_2 = note(`<
  A B A B C D C E F G H I J K L M N O P Q P R S O T U V M W X Y Z AA AB AC AD AE O P Q P R S O T U V M W X Y Z AA AB AC
  AF@2
>`.pickRestart({
  A: "[d4,e4,g4]@2 c4@2 [d4,e4,g4]@6 c4@2 [d4,e4,g4]@3 ~", B: "[d4,f4,a4] c4 [d4,f4,a4]@3 c4 [d4,f4,a4]@2",
  C: "~@2 [e4,g4] ~ [e4,g4] ~ [e4,g4] ~ [e4,g4]@4 [g4,b4]@3 ~", D: "[g4,b4] [f4,a4]@4 ~@3", E: "[g4,b4]@2 [f4,a4]@13 ~",
  F: "~@4 [e4,g4] ~ [e4,g4]@6 [g4,b4]@3 ~", G: "[g4,b4] [f4,a4]@5 ~@2",
  H: "~@6 [e4,g4] ~ [e4,g4] [e4,g4]@3 [g4,b4] ~ [g4,b4]@2", I: "[f4,a4]@15 ~",
  J: "~@2 f4@2 [a4,c5]@2 [f4,a4] ~ [e4,a4,c5]@4 [a4,c5,e5]@3 ~, ~@2 a4 ~@13", K: "e5 d5 [f4,a4]@5 ~, [f4,a4] ~@3",
  L: "[d4,g4,b4] ~ [d4,g4,b4]@5 ~ [d4,g4,b4]@4 [e4,g4,c5]@4", M: "[f4,b4,d5]@8 e5 ~ g5@4 e5 d5",
  N: "c5@4 g4@2 g4!2 g4@3 ~ [g4,b4]@3 ~", O: "[g4,b4] [f4,a4]@7", P: "~@2 g4 ~ g4 ~ g4 ~ g4@3 ~ [g4,b4]@3 ~",
  Q: "[g4,b4] [f4,a4]@6 ~", R: "[g4,b4]@2 [f4,a4]@2 [f4,a4]@9 ~@3", S: "~@2 g4 ~ g4 ~ g4 ~ g4 ~ [g4,b4]@5 ~",
  T: "~ [f4,a4] [a4,c5] a4 [e4,a4,c5]@2 [a4,c5,e5]@2, ~@6 f4 ~@9", // F Am
  U: "e5 d5 ~@2 [f4,a4]@3 ~, [f4,a4]@3 ~@5, ~@2 d5@5 ~", V: "[d4,g4,b4] ~ [d4,g4,b4]@5 ~ [d4,g4,b4]@3 ~ [e4,g4,c5]@3 ~",
  W: "c5@4 [f4,a4] [a4,c5]@3 b4@2 c5 b4 a4@2 a4 b4", X: "d5 c5@4 ~@3",
  Y: "~@4 [f4,a4]@2 [a4,c5]@2 [g4,b4] ~ [g4,b4]@2 f4@2 [f4,a4]@2, ~@12 a4 ~@3", Z: "e4@7 ~",
  AA: "~@2 [f4,a4]@2 [f4,a4]@2 [a4,c5]@2 b4@2 c5 b4 a4@2 g4@2", AB: "c5@2 c5 a4 g4@5 ~@7",
  AC: "~@4 [a4,c5] ~ [a4,c5] ~ [b4,d5]@2 e5 d5 c5@2 d5 ~", AD: "d5 c5@5 ~@2", AE: "~@4 g4@2 g4!2 g4@3 ~ [g4,b4]@3 ~",
  AF: "[e5 c5 c5@12 ~@2]/2",
})).s("gm_piano").gain(0.47).pan(0.6)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@16 A B A B A B A C D@2 E F G@2 H@2 I@2 J@2 K@8 D@2 E F L@2 M@2 N@2 O@3
>`.pickRestart({
  A: "[c4,e4,g4]", B: "[c4,f4,a4]", C: "c4@3 c5, [f4,a4]", D: "[a4,c5,f5]/2", E: "[g4,b4,d5]@3 [c5,e5]",
  F: "[b4,d5,f5]@3 ~", G: "[c4@3 c5 b4@3 d5 c5@4 [g#4,b4]@4, [f4,a4] g4@2 ~, ~ d4 e4@2]/2",
  H: "[a4@2 c5@2 b4@3 d5 c5@4 [g#4,b4]@4, [c4,f4] g4@2 ~, ~ e4]/2", // G#m F5
  I: "[a4@3 c5 b4@3 d5 [e4,c5]@4 [g#4,b4,e5]@4, [c4,f4] g4@2 ~, ~ d4 ~@2]/2", // C E F5
  J: "[[f4,a4,c5]@4 [d4,b4]@4 [e4,c5]@7 ~, ~@4 g4@11 ~]/2", // F G C
  K: "[[e4,g4] [f4,a4] [e4,g4] [f4,a4] [e4,g4] [f4,a4] [e4,g4] [f4,a4], c4@63 ~]/8", // Em F Em F Em F Em F
  L: "[[c4,f4,a4]@2 b4 d5 c5@2 [g#4,b4]@2, ~ g4@2 ~, ~ d4 e4@2]/2", // F G#m
  M: "[a4 c5 b4 d5 c5@2 [g#4,b4]@2, [c4,f4] g4@2 ~, ~ d4 e4@2]/2", // G#m F5
  N: "[a4 c5 b4 d5 [e4,c5]@2 [g#4,b4,e5]@2, [c4,f4] g4@2 ~, ~ d4 ~@2]/2", // C E F5
  O: "[[f4,a4,c5]@2 [d4,b4]@2 [e4,c5]@7 ~, ~@2 g4@9 ~]/3", // F G C
})).s("gm_string_ensemble_2").gain(0.16).pan(0.1)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~@4 A B C D E@2 F G H I J K L M N O P Q R S T I U V W X W Y Z AA AB AC L M N O P Q R S T I U V W X W Y Z AA AB AD@2
>`.pickRestart({
  A: "~ g3 ~ g3 ~@3 c3, c4@6 c3 ~ [c3,c4]@4 c4@4, c3 e4@3, ~@10 g3@5 ~", // C
  B: "c4@2 ~@4 f3 ~@3 a3 ~ a3 a#3 b3 c4, f3 c4@2 ~, ~ a3@3 f3@4, ~@2 f4 ~",
  C: "~ g3 c4 g3 ~@2 b3 [c3,c4], d4@4 ~ g3@2 ~, c3@5 ~ c3 ~ [c3,c4]@5 ~@3", // C
  D: "a3@2 ~@4 f3 ~@3 a3 ~ a3 a#3 b3 c4, f3 c4@2 ~, ~ a3@3 f3@4, ~@2 f4 ~",
  E: "[~@4 c4@2 c3 ~ g3 ~@3 b3@2 c3@2 a3 ~@5 f3 ~@3 a3 ~ a3 a#3 b3 c4, [c3,d4]@5 ~@3 [c3,c4]@5 ~@3 f3@4 c4@8 ~@4, ~@2 g3@5 ~@3 g3@4 c4@4 a3@6 f3@8, ~@6 f4 ~]/2", // Csus2 C
  F: "g3 ~ g3@2 ~@2 g3@2 ~@4 b3@2 c4@2, [c3,d4]@2 c4@3 g3@2 ~, ~@6 c3 ~ c3@8", // Csus2
  G: "f3@4 ~@2 f3 ~@7 f3 ~, a3@2 [f3,f4] c4, ~@4 c4@5 ~ a3@6", H: "~@3 f3 ~@3 e3, f3 c4 e3 c4, ~@2 a3@7 ~ a3@6",
  I: "~@3 d3 c3 e3 f3 a3, d3 a3 ~@2, ~ f3@3 ~@4", J: "~@6 g3 ~@3 b3@2 a3@2 c4@2, g3@2 d4@3 ~@3, ~ b3@3 g3@2 ~@2",
  K: "[g3,b3,d4]@15 ~", L: "~@6 c3 ~ c4@2 ~@4 c3@2, c3 e4@3, ~ g3@4 g3@3, ~@2 c3 c4",
  M: "~@6 f3 ~@3 a3@2 a3 a#3 b3 c4, f3 c4@2 ~, ~ a3@3 [f3,f4]@2 f3@2", // F
  N: "g3!2 ~ [c3,g3] ~@3 [c3,c4], [c3,d4]@4 c4@6 g3@5 ~, ~@2 c3 b3", // C5 C Csus2
  O: "a3@2 ~@4 f3 ~ f4@2 a3 ~ a3 a#3 b3 c4, f3 c4@2 ~, ~ a3@3 f3@4",
  P: "g3 ~ g3@2 ~@2 g3@2 ~@6 [c3,c4]@2, [c3,d4] c4@2 b3, ~@6 c3 ~ c3@5 ~@3, ~@10 g3@5 ~", // C Csus2
  Q: "~@2 a3@2 ~@2 a3@2 ~@2 a3 ~ a3 a#3 b3 c4, f3 c4@2 ~, ~@6 f3 ~ f3@8, ~@2 f4 ~",
  R: "g3!2 ~ g3 ~@3 [c3,c4], [c3,d4] c4@2 b3, ~@6 c3 ~ c3@5 ~@3, ~@5 g3@3", // C Csus2
  S: "~@6 f3 ~@7 [f3,a3]@2, f3@2 c4@3 a3@2 ~, ~ a3@3 f4@4, ~@2 f3 c4", // F
  T: "~@3 f3 ~@3 e3, f3@2 c4@3 a3@3, ~ a3@3 e3@2 c4@2", U: "~@6 g3 ~@3 b3@2 ~@2 c4@2, g3@2 d4@3 ~@3, ~ b3@3 g3@2 a3@2",
  V: "~ d4@15, [g3,b3]@15 ~", W: "~@3 f3 ~@3 g3, f3 c4 g3 d4, ~@2 a3@7 ~ b3@6",
  X: "~@3 e4 d4 ~@2 d4, e4 c4 ~ b3, ~ g3@3 ~ g#3@3", Y: "~@3 [c3,e4] d4 ~@2 g#3, c3@2 c4@2 ~ b3@3, ~ g3@3 g#3@2 d4@2",
  Z: "~ a3 ~ a3 d4 ~@2 g3, c4@4 ~ b3@3, ~ f3 g3 d4",
  AA: "~@3 [c3,e4] ~@3 d4, c3@3 ~@2 g#3@2 ~, e4 c4 d4 b3, ~ g3@3 e3@4", // C
  AB: "c4@2 ~@4 f3@2 d4@2 ~@2 d4@2 g3 ~, f3@4 c4@4 ~@2 b3@5 ~, ~@2 a3@6 g3@5 ~@3", AC: "[c3,g3,c4,e4]@15 ~",
  AD: "[[c3,g3,c4,e4]@7 ~]/2", // C
})).s("gm_acoustic_guitar_nylon").gain(0.14).pan(0.1)

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

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

// drums · hihat
const hihat = s("hh").struct("<~@12 [x!8]!3 x [x!8]!11 x [x!8]!7 x ~@21>").gain(0.25)

// drums · low tom
const low_tom = s("lt").struct("<~@11 A ~@22 B ~@8 B ~@9 B C ~@2>".pickRestart({
  A: "~@11 x ~@2 x ~", B: "~@7 x", C: "~@3 x",
})).gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@11 A ~@11 B ~@10 C ~@19 D ~@2>".pickRestart({
  A: "~@10 x ~@2 x ~@2", B: "~@7 x", C: "~@3 x", D: "~@11 x ~@4",
})).gain(0.23)

// drums · high tom
const high_tom = s("ht").struct("<~@23 [~@11 x!2 ~@3] ~@10 [~@10 x!2 ~@4] ~@19 [~@5 x ~@2] ~@2>").gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@12 A ~@11 A ~@10 A ~@8 A ~@2 A@2 ~@5 A@2 ~>".pickRestart({
  A: "x",
})).gain(0.2)

// drums · ride
const ride = s("rd").struct("<~@15 A ~@11 A@2 ~@7 B C D C D C D@2 C D@2 E B C D C D C B A ~>".pickRestart({
  A: "x", B: "x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~", C: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", D: "x!8", E: "x!5 ~@3",
})).gain(0.25)

stack(
  bass, piano, piano_2, string_ensemble_2, acoustic_guitar_nylon, kick, snare, hihat, low_tom, mid_tom, high_tom, crash,
  ride
)

More by John Lennon