Strudelify

Woman

John Lennon

KeyD majorTempo80 bpm
0:00/0:00
// Woman — John Lennon
// 80 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 17, 4/4 at bar 18, 2/4 at bar 39, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 67 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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.

// chords · acoustic guitar steel · "Guitar"
const acoustic_guitar_steel = note(`<
  A@5 B C D E F G F C D E F H I J K L M J K L M N O P Q R S N O P Q R T U V W X Y Z W X Y AA AB AC AD AE AB AF AG AH AI
  AJ AK AH AI AJ AK AH AI AJ AK
>`.pickRestart({
  A: "[~@4 [d3,a3,d4,g4]!3 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] b3 d4 e4 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] [d3,a3,d4,g4]!3 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] b3 d4 e4 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]!2 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]]/5", // Dsus4 D Dsus4 D
  B: "[e3,g3,b3,e4] [e3,g3,b3,e4]@2 [e3,g3,b3,e4] ~ [f#3,a3,c#4,f#4]@2 [f#3,a3,c#4,f#4]", // Em F#m
  C: "~ [e3,g3,b3,e4]@2 [e3,g3,b3,e4] ~ [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]", // Em D
  D: "~ [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4] ~ [e3,g3,b3,e4]@2 [e3,g3,b3,e4]", // Bm Em
  E: "~ [e3,a3,d4,e4] [e3,a3,c#4,e4]!2 ~ [d3,g3,b3,g4]@2 [d3,g3,b3,g4]", // Dsus2 A G
  F: "~ [e3,g3,b3,e4]@2 [e3,g3,b3,e4] ~ [f#3,a3,c#4,f#4]@2 [f#3,a3,c#4,f#4]", // Em F#m
  G: "~ [e3,a3,d4,e4] [e3,a3,c#4,e4]!2 ~ [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]", H: "~ [e3,a3,d4,e4]!7",
  I: "[e3,a3,c#4,e4]!8", J: "~@2 a3@2 d4@2 f#4@2 e4@2 d4@2 a3@3 ~", K: "~@2 b3@2 d4@2 f#4@2 e4@2 d4@2 a3@3 ~",
  L: "~@2 g3@2 b3@2 e4@2 d4@2 b3@2 g3@3 ~", M: "~ a3 c#4 e4 d4 c#4 b3 a3",
  N: "~ [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] ~ [e3,g3,b3,e4]@2 [e3,g3,b3,e4]", // D Em
  O: "~ [f#3,a3,c#4,f#4]@2 [f#3,a3,c#4,f#4] ~ [e3,g3,b3,e4]@2 [e3,g3,b3,e4]", // F#m Em
  P: "~ [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4] ~ [f#3,b3,d4,f#4]@2 [f#3,b3,d4,f#4]", // D Bm
  Q: "~ [e3,g3,b3,e4]@2 [e3,g3,b3,e4] ~ [e3,a3,d4,e4] [e3,a3,c#4,e4]!2", // Em Dsus2 A
  R: "~ [d3,g3,b3,g4]@2 [d3,g3,b3,g4] ~ [e3,g3,b3,e4]@2 [e3,g3,b3,e4]", // G Em
  S: "~ [f#3,a3,c#4,f#4]@2 [f#3,a3,c#4,f#4] ~ [e3,a3,d4,e4] [e3,a3,c#4,e4]!2", // F#m Dsus2 A
  T: "~ [f#3,a3,c#4,f#4]@2 [f#3,a3,c#4,f#4] ~ [e3,a3,d4,e4]!3", U: "[e3,a3,d4,e4]!4 [e3,a3,c#4,e4]!4",
  V: "[e3,a3,c#4,e4]!4 ~ a3 d4 f#4", W: "e4@2 d4@2 a3@3 ~@3 b3@2 d4@2 f#4@2", X: "e4@2 d4@2 a3@3 ~@3 g3@2 b3@2 e4@2",
  Y: "d4@2 b3@2 g3@3 ~@3 a3@2 c#4@2 e4@2", Z: "d4 c#4 b3 a3 ~ a3 d4 f#4", AA: "d4 c#4 b3 a3 ~ [g3,a#3,d#4,g4]!3",
  AB: "~ [f3,g#3,c4,f4]!3 ~ [g3,a#3,d4,g4]!3", AC: "~ [f3,g#3,c4,f4]!3 ~ [g3,a#3,d#4,g4]!3",
  AD: "~ [g3,c4,d#4,g4]!3 ~ [f3,g#3,c4,f4]!3", AE: "[f3,a#3,d#4,f4]!2 [f3,a#3,d4,f4]!2 ~ [g#3,c4,d#4,g#4]!3",
  AF: "~ [f3,a#3,d#4,f4]!7", AG: "[f3,a#3,d4,f4]!8", AH: "~ a#3 d#4 g4 f4 d#4 a#3 d#4",
  AI: "~@2 c4@2 d#4@2 g4@2 f4@2 d#4@2 a#3@3 ~", AJ: "~@2 g#3@2 c4@2 f4@2 d#4@2 c4@5 ~", AK: "~ a#3 d4 f4 d#4 d4 c4 a#3",
})).s("gm_acoustic_guitar_steel").gain(0.17)

// other · orchestral harp · "Harp"
const orchestral_harp = note("<~@26 A B C D E F G H C I J K ~@29>".pickRestart({
  A: "~ a4 d5!2 ~ b4 e5!2", B: "~ a4 c#5 a5 ~ b4 d5 e5", C: "~ a4 d5 f#5 ~ b4 d5 f#5", D: "~ b4 e5 g5 ~ d5 c#5 e5",
  E: "~ a4 d5 g5 ~ e4 b4 g5", F: "~ a4 c#5 f#5 ~ a4 c#5 a5", G: "~ a4 d5 f#5 ~ b4 e5 g5", H: "~ f#4 a4 a5 ~ e5 d5 g5",
  I: "~ b4 d5 g5 ~ e5!2 a5", J: "~ d5 g5 b5 ~ e5 g5 b5", K: "~ c#5 f#5 c#6 ~@4",
})).s("gm_orchestral_harp").gain(0.29)

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

// bass · electric bass finger · "Bass" · soft notes
const bass_soft = note(`<
  ~@62
  [~@6 c2 a#1]
  [d#2@2 d#2@2 g2@2 a#2@5 ~@5]
  [c2@2 c2@2 d#2@2 g2@5 ~@5]
  [f2@2 f2@2 g#2@2 f3@5 ~@5]
  [a#2@7 ~ a#1@2 a#1@2 c2@2 a#1@2]
>`).s("gm_electric_bass_finger").gain(0.24)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@61 [~@4 x!2 ~@2] [x ~@3 x!2 ~@2]!5>").gain(0.16)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@61 [~ x ~ x]!6>").gain(0.16)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@61 [~ x!7] [x!8] [~ x!7] [x!8]!3>").gain(0.16)

// drums · low tom
const low_tom = s("lt").struct("<~@17 A ~@7 B ~@13 C ~@7 D ~@6 E ~@12>".pickRestart({
  A: "~@11 x!4 ~", B: "~@12 x!3 ~", C: "~@2 x!2 ~@4", D: "~@6 x!2 ~@8", E: "~@7 x",
})).gain(0.37)

// drums · mid tom
const mid_tom = s("mt").struct("<~@17 A ~@7 B ~@12 C D ~@7 E ~@6 F ~@12>".pickRestart({
  A: "~@4 x!3 ~ x ~@7", B: "~@6 x ~ x!4 ~@4", C: "~@10 x ~ x ~@2 x", D: "x ~@2 x ~@12", E: "~ x!2 ~@5",
  F: "~@8 x!3 ~ x!2 ~@2",
})).gain(0.37)

// drums · crash
const crash = s("cr").struct("<A@5 ~@13 B ~@7 B ~@11 A@2 ~@3 A ~@3 A ~@6 C B ~@3 B ~@3 B ~@3>".pickRestart({
  A: "~ x", B: "x", C: "~ x ~@2",
})).gain(0.37)

// drums · ride bell
const ride_bell = s("rd").struct("<[~ x]!5 ~@62>").gain(0.37)

stack(
  acoustic_guitar_steel, orchestral_harp, bass, bass_soft, kick, kick_soft, snare, snare_soft, hihat, hihat_soft,
  low_tom, mid_tom, crash, ride_bell
)

More by John Lennon