Strudelify

She Blinded Me With Science

Thomas Dolby

KeyF minorTempo135 bpm
0:00/0:00
// She Blinded Me With Science — Thomas Dolby
// 135 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 150 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(135/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 · synth bass 2 · "SYNBASS 2"
const bass = note(`<
  ~@10 A B C B D B A B A B A B E B D F C B C G H B I@2 J I@3 K I L M N@3 O A B A B A B A B A B A P D B A B I@2 J I@3 K I
  L M N@3 Q B C B A B C B A B A B A B A P A B I@2 J I@3 K I L M N@3 ~@5 R I@5 S T U V W T U X Y B I@2 J I@3 K I L M N@3
  Z ~@9
>`.pickRestart({
  A: "~@6 c3 ~ c3@4 eb3@4", B: "f3 ~@5 eb3 ~ f3@5 ~ f3 ~", C: "~@6 c3 ~ c3@3 ~ eb3@3 ~", D: "~@6 c3 ~ c3@4 eb3@3 ~",
  E: "~@6 c3 ~ c3@3 ~ eb3@4", F: "f3 ~@5 eb3 ~ f3@6 f3 ~", G: "f3 ~@5 eb3 ~@7 f3 ~, ~@4 f3@5 ~@7",
  H: "~@6 c3 ~ eb3 ~ f3@2 g3 ~ ab3 ~", I: "~@6 eb3 ~ f3@5 ~ f3 ~", J: "~@6 c3 ~ eb3@6 f3 ~",
  K: "~@6 c3 ~ eb3@2 f3 ~ g3 ~ ab3 ~", L: "~@6 eb3 ~ f3@5 ~ bb2@2", M: "~@6 bb2 ~ [a3,bb3] ~ bb3 ~ a3 ~ ab3 ~",
  N: "[~@6 c4 ~ eb4@2 f4 ~ ab4 ~ f5@6 eb5 ~@3 c5@2 bb4@2 ab4 ~ f4@6 eb4@2 ~@2 c4@2 bb3@2 ab3@2 f3@2, ~@24 bb4 ~@23]/3",
  O: "~@6 eb3 ~ f3@6 f3 ~", P: "f3@2 ~@4 eb3 ~ f3@5 ~ f3 ~", Q: "~@10 eb3@2 e3@2 f3 ~", R: "~@10 eb3 ~ e3 ~ f3@2",
  S: "~@2 f3 ~@3 f3@2 ~@2 f3@2 f3 ~ f3 ~", T: "ab3@2 bb3 ~@11 ab3 ~", U: "ab3 ~ bb3 ~@11 ab3 ~",
  V: "ab3 ~ bb3 ~@9 bb3@2 ab3 ~", W: "~@2 ab3 ~@3 ab3 ~@3 ab3 ~ g3 ~ f3 ~", X: "ab3 ~ bb3 ~@5 bb3 ~ ab3 ~@5",
  Y: "c4 ~@3 c4 ~@3 c3@2 eb3 ~ f3@2 g3@2", Z: "~@6 eb3 ~ f3@2 ~@4 f3 ~",
})).s("gm_synth_bass_2").gain(0.4)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@14 A B C D ~@4 A B A D E B A F G ~@17 C H C D ~@4 C B A I G ~@18 C B J D ~@4 E B C F ~@59
>`.pickRestart({
  A: "~@2 f4 gb4", B: "eb5@14 c5 ~", C: "~@8 f4@4 gb4@3 ~", D: "eb4@14 f4 ~", E: "~@8 f4@3 ~ gb4@3 ~",
  F: "~@6 db4@8 [c4,f4] ~, eb4@7 ~", G: "~@2 [c4,f4] ~@13", H: "eb5@13 ~ c5 ~", I: "~@3 db4@4 [c4,f4], eb4@7 ~",
  J: "~@8 f4@3 ~ gb4@4",
})).s("gm_string_ensemble_1").gain(0.4)

// chords · lead 5 charang · "CHARANG"
const lead_5_charang = note(`<
  A@7 ~@31 B@2 C D@4 ~@23 B@2 C D@4 ~@24 B@2 C E@5 F@3 ~@8 G@2 H I J@2 K L ~@7 B@2 C D@4 M ~@9
>`.pickRestart({
  A: "[~@14 [c5,f5,a5]@5 ~ [bb4,eb5,g5] ~@3 [c5,f5,ab5] ~@5 [c5,f5,ab5]@5 ~ [eb5,g5,bb5] ~@3 [eb5,ab5,c6] ~@5 [f4,c5,f5,a5]@5 ~ [g4,bb4,eb5,g5] ~@3 [ab4,c5,f5,ab5] ~@5 [ab4,c5,f5,ab5]@5 ~ [bb4,eb5,g5,bb5] ~@3 [c5,eb5,ab5,c6] ~@5 [f4,c5,f5,a5]@5 ~ [g4,bb4,eb5,g5] ~@3 [ab4,c5,f5,ab5] ~@5 [ab4,c5,f5,ab5]@5 ~ [bb4,eb5,g5,bb5] ~@3 [c5,eb5,ab5,c6] ~@5 [f4,c5,c6] ~, ~@55 [f5,f6]]/7", // F Eb Fm Eb Ab F Eb Fm …
  B: "[~@14 [f5,ab5,bb5,c6,d6]@5 ~ [f5,ab5,bb5,c6,d6] ~@3 [f5,ab5,bb5,c6,d6] ~ [f5,ab5,bb5,c6,d6] ~@3 [f5,ab5,bb5,c6,d6] ~]/2", // Bb7
  C: "~@2 [f5,ab5,bb5,c6,d6] ~ [f5,ab5,bb5,c6,d6] ~@3 [f5,ab5,bb5,c6,d6] ~@5 [f5,ab5,bb5,f6] ~", // Bb7
  D: "[~@8 [f5,ab5,bb5,d6] ~ [f5,ab5,bb5,d6] ~ [ab5,bb5]@2 [ab5,bb5,c6]@4 ~@12 [f4,c5,f5,a5]@5 ~ [bb4,eb5,g5] ~@3 [ab4,c5,f5,ab5] ~@5 [ab4,c5,f5,ab5]@5 ~ [bb4,eb5,g5,bb5] ~@3 [c5,f5,ab5,c6] ~@5 [f5,c6,f6]@2, ~@12 f5@6 ~@18 g4@2 ~@24 [f4,c5,b5] ~, ~@12 db6 ~@51]/4", // Bb7 Absus2 Ab F Eb Fm Eb Fm …
  E: "[~@8 [f5,ab5,bb5,d6] ~ [f5,ab5,bb5,d6] ~ [ab5,bb5]@2 [ab5,bb5,c6]@4 ~@12 [f4,c5,f5,a5]@5 ~ [bb4,eb5,g5] ~@3 [ab4,c5,f5,ab5] ~@5 [ab4,c5,f5,ab5]@5 ~ [bb4,eb5,g5,bb5] ~@3 [c5,f5,ab5,c6] ~@5 [f4,c5,f5,a5]@5 ~ [bb4,eb5,g5,bb5] ~@3 [c5,f5,ab5,c6] ~@3 [bb4,eb5,g5,bb5] ~@3, ~@6 f5@3 ~@9 g4 ~@21, ~@12 db6 ~@67]/5", // Bb7 Absus2 Ab F Eb Fm Eb Fm …
  F: "[[c5,f5,ab5,c6] ~@3 [bb4,eb5,g5,bb5] ~@3 [c5,f5,ab5,c6] ~@5 [f4,c5,f5,a5]@5 ~ [g4,bb4,eb5,g5] ~@3 [ab4,c5,f5,ab5] ~@5 [ab4,c5,f5,ab5]@6 [bb4,eb5,g5,bb5] ~@3 [c5,f5,ab5,c6] ~@5 [f5,c6,f6]@2, ~@46 [f4,c5,b5] ~]/3", // Fm Eb Fm F Eb Fm Eb Fm …
  G: "[eb5,ab5,c6]@2 [f5,bb5,d6] ~@11 [eb5,ab5,c6] ~", // Ab Bb Ab
  H: "[ab5,c6]@2 [f5,bb5,d6] ~@9 [f5,bb5] ~ [eb5,ab5,c6] ~, eb5 ~@11 d6@2 ~@2", // Ab Bb Bb5 Ab
  I: "~@2 [eb5,ab5,c6] ~@3 [eb5,ab5,c6] ~@3 [eb5,ab5,c6] ~ [eb5,g5,bb5] ~ [d5,f5,bb5] ~", // Ab Eb Bb
  J: "[ab5,c6]@2 [f5,bb5,d6] ~@11 [eb5,ab5,c6] ~, eb5 ~@15", // Ab Bb Ab
  K: "[eb5,ab5,c6]@2 [f5,bb5,d6] ~@5 [f5,bb5] ~ [eb5,ab5,c6] ~@5, ~@4 d6 ~@3", // Ab Bb Bb5 Ab
  L: "[e5,bb5,eb6] ~@3 [c5,e5,bb5,eb6]@2 ~@10, c5 ~@7", M: "~@7 [f5,c6,f6], ~@14 [f4,c5] ~",
})).s("gm_lead_5_charang").gain(0.45).pan(0.4)

// chords · lead 1 square · "SQUAREWAVE"
const lead_1_square = note("<A@7 ~@143>".pickRestart({
  A: "[~@14 [c5,f5,a5]@5 ~ [bb4,eb5,g5] ~@3 [c5,f5,ab5] ~@5 [c5,f5,ab5]@5 ~ [eb5,g5,bb5] ~@3 [eb5,ab5,c6] ~@5 [f4,c5,f5,a5]@5 ~ [g4,bb4,eb5,g5] ~@3 [ab4,c5,f5,ab5] ~@5 [ab4,c5,f5,ab5]@5 ~ [bb4,eb5,g5,bb5] ~@3 [c5,eb5,ab5,c6] ~@5 [f4,c5,f5,a5]@5 ~ [g4,bb4,eb5,g5] ~@3 [ab4,c5,f5,ab5] ~@5 [ab4,c5,f5,ab5]@5 ~ [bb4,eb5,g5,bb5] ~@3 [c5,eb5,ab5,c6] ~@5 [f4,c5,c6] ~, ~@55 [f5,f6]]/7", // F Eb Fm Eb Ab F Eb Fm …
})).s("gm_lead_1_square").gain(0.25).pan(0.6)

// other · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@14 A B A C ~@4 A B A C D B A E F ~@8 G H ~@7 I J I C ~@4 I B A K F ~@8 G H ~@8 I B L C ~@4 D B I E ~@9 G H ~@32 G H
  ~@14
>`.pickRestart({
  A: "~@2 f4 gb4", B: "eb5@14 c5 ~", C: "eb4@14 f4 ~", D: "~@8 f4@3 ~ gb4@3 ~", E: "~@6 db4@8 [c4,f4] ~, eb4@7 ~",
  F: "~@2 [c4,f4] ~@13", G: "~@8 g5@3 ~ d5@3 ~", H: "ab4@5 ~@11", I: "~@8 f4@4 gb4@3 ~", J: "eb5@13 ~ c5 ~",
  K: "~@3 db4@4 [c4,f4], eb4@7 ~", L: "~@8 f4@3 ~ gb4@4",
})).s("gm_electric_guitar_clean").gain(0.4)

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

// drums · rim
const rim = s("rim").struct("<~@6 A ~@10 B ~@33 B ~@30 B ~@24 A ~ A ~@15 C ~@14 A ~ A D A ~ A D A ~>".pickRestart({
  A: "~@7 x", B: "~@5 x!3", C: "~@4 x!3 ~", D: "x ~@6 x",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  ~@3 A@7 B A@6 C A@11 C D A@20 C A@6 E C A@15 F A G A@4 C A@23 ~ H A@2 ~ F A@13 I A@14 I ~ J H J ~ J H J ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!3", C: "~@2 x ~@3 x!2", D: "~ x ~@3 x!3", E: "x!3 ~@3 x!2", F: "~@5 x!3", G: "~ x ~@2",
  H: "~@7 x", I: "~ x", J: "~@3 x",
})).gain(0.5)

// drums · clap
const clap = s("cp").struct(`<
  ~@5 A B ~@24 A@14 ~@16 A@14 C ~@2 D ~@13 A@14 ~@2 A B ~ C ~@3 C ~@9 E A@14 D ~ D@3 C D@3 C
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2", C: "~@5 x!3", D: "~@7 x", E: "~ x ~@5 x",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@77 [~@5 x ~@2] ~@72>").gain(0.35)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@4 A ~ B ~@3 C ~@6 D ~@12 E ~@13 F ~@6 D ~@6 G ~ H ~@13 F D ~ I J A ~@2 D ~@22 F C G ~ B ~ D ~ K ~ D ~ L M N M N M N
  ~ O ~@13 F P ~ Q R Q S Q R Q S
>`.pickRestart({
  A: "~ x!2 ~@5", B: "~@3 x!4 ~", C: "~@7 x", D: "~@5 x!3", E: "~@6 x!2", F: "~ x!3 ~@4", G: "x!3 ~@5", H: "~@4 x!3 ~",
  I: "~@5 x ~@2", J: "~ x!2 ~@2 x!2 ~", K: "~@3 x", L: "~@6 x!3 ~@7", M: "~@5 x!2 ~", N: "~@10 x!3 ~@3",
  O: "~ x ~ x!2 ~@3", P: "~@3 x!2 ~@2 x", Q: "~@2 x ~ x!2 ~@2", R: "~@2 x ~@3 x ~ x!3 ~@5",
  S: "~@2 x ~@3 x ~ x!3 ~ x ~ x ~",
})).gain(0.45)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@4 A ~ B ~@3 C ~@6 D ~@26 D ~@6 D ~@8 D ~@13 D@2 ~ E F G ~@2 D ~@22 D ~ A ~ B ~ D ~ H ~ I ~ J H K H K H K ~ L ~@13 D
  M ~ N O N P N O N P
>`.pickRestart({
  A: "~@3 x!5", B: "~@7 x", C: "~@5 x!2 ~", D: "~@5 x!3", E: "~@5 x ~@2", F: "~@3 x!2 ~@2 x", G: "~@3 x!4 ~",
  H: "~@10 x!2 ~@4", I: "~@6 x!2", J: "~@10 x ~ x!3 ~", K: "~@10 x!3 ~@3", L: "~@2 x ~@2 x!3", M: "~ x",
  N: "~ x ~ x ~@2 x!2", O: "~ x!2 ~@3 x!2", P: "~ x!2 ~@2 x!3",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@26 [~ x!2 ~ x!2 ~ x] ~@91 [~@3 x!3 ~@2]!6 ~ [~@3 x] ~@16 [~@7 x]!8>").gain(0.3)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@5 A@5 B A@19 C A@27 D A B A@14 ~@5 A@26 ~@2 A@2 ~@2 A@3 B A@2 E@6 ~@2 A@14 ~@5 F ~@3 F
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~ x ~@6", D: "~@3 x ~ x ~ x", E: "~ x ~ x!3 ~@2", F: "x",
})).gain(0.4)

stack(
  bass, string_ensemble_1, lead_5_charang, lead_1_square, electric_guitar_clean, kick, rim, snare, clap, open_hat,
  mid_tom, high_tom, tambourine, cowbell
)

More by Thomas Dolby