Strudelify
Modern Love cover art

1983 · Let's Dance

Modern Love

David Bowie

KeyC majorTempo180 bpm
0:00/0:00
// Modern Love — David Bowie
// 180 bpm, 4/4, key C major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 11 lead 2 sawtooth (copy of ch 9 lead 1 square)
// note: Full arrangement: all 172 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: The whole transcription plays 10 ms behind the beat; the grid follows it, so its parts stay together.
setcpm(180/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, A@4 for four bars: edit a riff to change every repeat.

// chords · piano
const piano = note(`<
  A@2 B@2 C@2 A@2 D@4 E@2 F@2 G@2 H@2 D@2 E@2 I@2 D@4 E@2 F@2 G@2 H@2 D@2 E@2 I@2 J K L M N O P Q J K L M N O P Q J K L
  M R S T U D@4 E@2 F@2 G@2 H@2 D@2 E@2 I@2 D@4 E@2 F@2 G@2 H@2 D@2 E@2 I@2 J K L M N O P Q J K L M N O P Q J K L M R S
  T U J K L M N O P Q J K L M N O P Q J K L M R S T U J K L M N O P Q A@2 B@2 C@2 V W X Y A@2
>`.pickRestart({
  A: "[[a4,d5,f#5]@5 ~ [b4,e5,g5]@25 ~]/2", B: "[[a4,d5,f#5]@5 ~ [g4,c5,d5,g5]@25 ~]/2",
  C: "[[a4,d5,f#5]@5 ~ [g4,b4,c5,e5]@25 ~]/2", D: "[[c5,e5,g5]@5 ~ [c5,e5,g5]@25 ~]/2",
  E: "[[b4,d5,g5]@5 ~ [b4,d5,g5]@25 ~]/2", F: "[[a4,c5,e5]@5 ~ [a4,c5,e5]@25 ~]/2",
  G: "[[e4,g#4,b4,d5]@5 ~ [e4,g#4,b4,d5]@25 ~]/2", H: "[[f4,a4,c5]@5 ~ [f4,a4,c5]@25 ~]/2",
  I: "[[e4,g4,b4,d5]@5 ~ [e4,g4,b4,e5]@25 ~]/2", // Em7 Em
  J: "~@2 [e4,c5] ~@3 [e4,g4,c5] ~@3 [e4,c5] ~@3 [e4,c5] ~, ~ g4 ~@3 g4 ~ g4", // C
  K: "~@2 [e4,g4] ~@3 [e4,c5] ~ [e4,g4,c5] ~ [e4,g4] ~ [e4,g4,c5] ~ [g4,c5]@2, ~@2 c5@2 ~@2 g4@2 ~@2 c5@2 ~@2 e4 ~", // Em C Em C C5
  L: "~@2 [f#4,a4] ~@3 [f#4,a4,d5] ~@3 [f#4,a4] ~@3 [f#4,a4] ~, ~ d5 ~@3 d5 ~ d5", // F#m D F#m
  M: "~@2 [f#4,d5] ~@3 [f#4,d5] ~ [f#4,a4,d5] ~ [f#4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5]@2, ~ a4 ~ a4 ~ a4 ~@2", // D
  N: "~@2 [e4,b4] ~@3 [e4,g4,b4] ~@3 [g4,b4] ~@3 [g4,b4] ~, ~ g4 ~@3 e4 ~ e4", // E5 Em G
  O: "~@2 [g4,b4] ~@3 [g4,b4] ~ [e4,g4,b4] ~ [e4,g4] ~ [e4,g4,b4] ~ [e4,b4]@2, ~@2 e4@2 ~@2 e4@2 ~@2 b4@2 ~@2 g4 ~", // G Em E5
  P: "~@2 [f4,a4] ~@3 [f4,a4,c5] ~@3 [f4,a4] ~@3 [f4,c5] ~, ~ c5 ~@3 c5 ~ a4", // F F5
  Q: "~@2 [f4,a4] ~@3 [f4,c5] ~ [f4,a4,c5] ~ [f4,a4] ~ [f4,a4,c5] ~ [a4,c5] ~, ~ c5 ~ a4 ~ c5 ~ f4", // F F5 F Am
  R: "~@2 [g4,e5] ~@3 [g4,b4,e5] ~@3 [g4,e5] ~@3 [g4,e5] ~, ~ b4 ~@3 b4 ~ b4", // C Em C
  S: "~@2 [g4,b4] ~@3 [g4,e5] ~ [g4,b4,e5] ~ [g4,e5] ~ [g4,b4,e5] ~ [g4,b4,e5]@2, ~ e5 ~ b4 ~ b4 ~@2", // G C Em C Em
  T: "~@2 [c5,f5] ~@3 [a4,c5,f5] ~@3 [a4,f5] ~@3 [a4,f5] ~, ~ a4 ~@3 c5 ~ c5", // F5 F Dm
  U: "~@2 [c5,f5] ~@3 [a4,f5] ~ [a4,c5,f5] ~ [c5,f5] ~ [a4,c5,f5] ~ [a4,c5,f5]@2, ~ a4 ~ c5 ~ a4 ~@2", V: "[f2,f4]!4",
  W: "[f2,f4,a4]!4", X: "[f2,f4,a4,c5]!4", Y: "[f2,f4,a4,c5,f5]!4",
})).s("gm_piano").gain(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A ~ A ~ A ~ A ~ B@4 C@2 D@2 E@2 F@2 B@2 G@2 H@2 B@4 C@2 D@2 E@2 F@2 B@2 G@2 H@2 I@2 J@2 K@2 L@2 I@2 J@2 K@2 L@2 I@2
  J@2 K@2 L@2 B@4 C@2 D@2 E@2 F@2 B@2 G@2 H@2 B@4 C@2 D@2 E@2 F@2 B@2 G@2 H@2 I@2 J@2 K@2 L@2 I@2 J@2 K@2 L@2 I@2 J@2
  K@2 L@2 I@2 J@2 K@2 L@2 I@2 J@2 K@2 L@2 I@2 J@2 K@2 L@2 I@2 J@2 K@2 L@2 A ~ A ~ A ~ M@4 A ~
>`.pickRestart({
  A: "[d4,f#4]@5 ~ [e4,g4] ~@9", B: "[[c4,e4,g4]@5 ~ [c4,e4,g4]@25 ~]/2", C: "[[b3,d4,g4]@5 ~ [b3,d4,g4]@25 ~]/2",
  D: "[[a3,c4,e4]@5 ~ [a3,c4,e4]@25 ~]/2", E: "[[b3,d4,e4,g#4]@5 ~ [b3,d4,e4,g#4]@25 ~]/2",
  F: "[[a3,c4,f4]@5 ~ [c4,f4,a4]@25 ~]/2", G: "[[b3,d4,g4]@5 ~ [d4,g4,b4]@25 ~]/2",
  H: "[[b3,d4,e4,g4]@5 ~ [b3,e4,g4,b4]@25 ~]/2", I: "[[c3,e3]@5 ~ [c3,e3]@25 ~]/2", J: "[[d3,f#3]@5 ~ [d3,f#3]@25 ~]/2",
  K: "[[e3,g3]@5 ~ [e3,g3]@25 ~]/2", L: "[[f3,a3]@5 ~ [f3,a3]@25 ~]/2", M: "[c3,f3,a3]@3 [f3,a3,c4]@5",
})).s("gm_electric_guitar_clean").gain(0.4)

// other · guitar harmonics
const guitar_harmonics = note("<~@7 [~@4 e2@3 ~ b2@3 ~ e3@3 ~] ~@164>").s("gm_guitar_harmonics").gain(0.27)

// bass · slap bass 2
const bass = note(`<
  A@2 B@2 C@2 A@2 D@2 E@2 F@2 G@2 H@2 I@2 D@2 F@2 H@2 D@2 E@2 F@2 G@2 H@2 I@2 D@2 F@2 H@2 J K L M N O P Q J K L M N O P
  Q J K L M N O P Q D@2 E@2 F@2 G@2 H@2 I@2 D@2 F@2 H@2 D@2 E@2 F@2 G@2 H@2 I@2 D@2 F@2 H@2 J K L M N O P Q J K L M N O
  P Q J K L M N O P Q J K L M N O P Q J K L M N O P Q J K L M N O P Q J K L M N O P Q A@2 B@2 C@2 R@4 A@2
>`.pickRestart({
  A: "[d2@5 ~ e2@25 ~]/2", B: "[d2@5 ~ c2@25 ~]/2", C: "[d2@5 ~ d2@25 ~]/2", D: "[c2@3 ~ g2@2 c2@25 ~]/2",
  E: "[c2@3 ~ g2@2 c2@13 ~ c2 ~ e2 ~ g2@2 e2 ~ c2@2 c2@2]/2", F: "[g1@3 ~ d2@2 g1@25 ~]/2",
  G: "[a1@3 ~ e2@2 a1@21 ~ a1@2 e2 ~]/2", H: "[e1@3 ~ b1@2 e1@25 ~]/2", I: "[f1@3 ~ c2@2 f1@21 ~ f1@2 a1@2]/2",
  J: "c2 ~@3 g2@2 c2 ~@9", K: "c2 ~@3 c2 ~@3 c2@2 ~@2 c2@2 c2 ~", L: "d2 ~@3 a2@2 d2 ~@9",
  M: "d2 ~@3 d2@2 ~@2 d2 ~@3 d2 ~ d2@2", N: "b1 ~@3 e2@2 b1 ~@9", O: "e2 ~@3 e2 ~@3 e2@2 ~@2 e2@2 e2 ~",
  P: "f1 ~@3 c2@2 f1 ~@9", Q: "f1 ~@3 f1 ~@3 f1@2 ~@2 f1@2 f1 ~", R: "f2 ~@2 f2@5",
})).s("gm_slap_bass_2").gain(0.4)

// chords · synth brass 1
const synth_brass_1 = note(`<
  ~@40 A@2 B@2 C@2 D@2 E@2 F@2 C@2 D@2 E@2 F@2 C@2 D@2 E@2 F@2 ~@32 A@2 B@2 ~@68
>`.pickRestart({
  A: "[b4,d5,g5] ~@5 [b4,d5,g5] ~ [b4,d5,g5] ~@5 [d5,g5]@2, ~@14 b4 ~", // G G5
  B: "[e4,g4,b4] ~@5 [e4,g4,b4] ~ [e4,g4,b4] ~@5 [e4,g4,b4] ~", C: "[c4,e4] ~@5 [c4,e4] ~ [c4,e4] ~@7",
  D: "[d4,f#4] ~@5 [d4,f#4] ~ [d4,f#4] ~@7", E: "[e4,g4] ~@5 [e4,g4] ~ [e4,g4] ~@7",
  F: "[f4,a4] ~@5 [f4,a4] ~ [f4,a4] ~@7", // F
})).s("gm_synth_brass_1").gain(0.4)

// other · lead 1 square
const lead_1_square = note("<~@68 A@2 B C D E F C D G H I J K L@2 M@2 ~@86>".pickRestart({
  A: "[a4@27 e4@4 ~]/2", B: "g4@3 g4", C: "f4 e4 d4 c4", D: "d4", E: "e4@2 g4@2 e4 d4 c4@2, ~@12 d4 ~@3",
  F: "d4@4 c4@10 d4 e4", G: "e4 d4 c4 b3", H: "a3", I: "a4", J: "g4@6 g4 ~ g4@4 ~ g4@3",
  K: "~@2 g4@3 ~ g4 ~ g4@3 ~ g4@3 ~", L: "[g4@5 ~ g4 ~ g4@5 ~ g4@4 g4@3 ~ g4@2 a4@3 g4@3 ~@2]/2",
  M: "[g4@5 ~ g4 ~ g4@5 ~ g4@4 g4@3 ~ g4@2 b4@2 a4 ~ g4@3 ~]/2",
})).s("gm_lead_1_square").gain(0.4)

// chords · brass section
const brass_section = note("<~@68 A B A B C D E F G ~@95>".pickRestart({
  A: "[c4,e4] ~@2 [c4,e4]!2 ~@3", B: "[g4,c5] [e4,g4] [d4,f4] [c4,e4]", C: "[g3,b3] ~@2 [g3,b3]!2 ~@3",
  D: "[d4,g4] [b3,d4] [a3,c4] [g3,b3]", E: "[a3,c4] ~@2 [a3,c4]!2 ~@3", F: "[e4,a4] [c4,e4] [b3,d4] [a3,c4]",
  G: "[e4,g#4] ~ [e4,g#4]!2 ~@4", // E
})).s("gm_brass_section").gain(0.2)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@160 [~@12 x!2 ~ x]!2 [~@3 x]!2 [~@15 x]!2 [~@3 x]!4 ~@2>").gain(0.29)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@160 [~@7 x]!2 ~@2 [~@7 x]!2 ~@6>").gain(0.18)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!160 ~@12>").gain(0.36)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@160 [x!4]!4 [x!8]!2 [x!4]!4 ~@2>").gain(0.22)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@160
  [~@8 x!4 ~@4]!2
  [~@7 x!2 ~ x ~@5]!2
  [~@4 x ~@8 x ~@2]!2
  [~@7 x!2 ~ x ~@5]!4
  ~@2
>`).gain(0.32)

// drums · open hat
const open_hat = s("oh").struct("<~@162 [~@7 x]!2 ~@2 [~@7 x]!4 ~@2>").gain(0.32)

// drums · high tom
const high_tom = s("ht").struct("<~@160 [~@4 x!4 ~@8]!2 [~@3 x!3 ~@10]!2 [x ~@2 x]!2 [~@3 x!3 ~@10]!4 ~@2>").gain(0.22)

// drums · crash
const crash = s("cr").struct("<~@162 x!2 [~@7 x ~@8]!2 x!4 ~@2>").gain(0.32)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3
  B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B C@3 D C@3 D C@3 D
  C@3 D ~@12
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2", C: "x!4", D: "x ~ x ~ x ~ x!2",
})).gain(0.36)

stack(
  piano, electric_guitar_clean, guitar_harmonics, bass, synth_brass_1, lead_1_square, brass_section, kick, snare,
  low_tom, low_tom_soft, hihat, hihat_soft, mid_tom, open_hat, high_tom, crash, tambourine
)

More by David Bowie