Strudelify

Doctor Doctor

Thompson Twins

KeyC minorTempo65 bpm
0:00/0:00
// Doctor Doctor — Thompson Twins
// 65 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 6 "piano" epiano1 (copy of ch 9 "piano2" piano)
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(65/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.

// other · synth strings 2 · "synth2"
const synth_strings_2 = note(`<
  ~@3 A B@2 C D E ~@9 F G@2 H ~@7 I ~@3 J ~@7 I ~@3 J ~@8 K@3 L ~@8 M@2 ~ J ~@8 N O P Q P Q R Q L S C ~
>`.pickRestart({
  A: "eb6@3 d6@2 bb5@2 f5@7 ~@2", B: "[eb6@3 d6@2 bb5@2 f6@11 ~@10 bb4@2 a4 ~]/2", C: "g4 ~@3", D: "~@12 bb4 ~ a4 ~",
  E: "g4@3 ~@13", F: "eb5@3 d5@2 bb4@2 f4@2 eb4@2 d4 bb4@2 ~@2", G: "eb5@3 d5@2 bb4@2 f4@2 eb4@2 d4 bb4 ~@3",
  H: "eb5@3 d5@2 bb4@2 f4@2 eb4@2 d4 bb4@4", I: "~@5 d5 eb5 bb5 a5 f5 c5 bb4 ~@4",
  J: "~@5 g4 c5 d5 eb5 f5 d5 eb5 c5 bb4 a4 g4", K: "eb6@3 d6@2 bb5@2 f5@2 eb5@2 d5 bb5@2 ~@2",
  L: "eb6@3 d6@2 bb5@2 f5@2 eb5@2 d5 bb5@3 ~", M: "[c6@3 bb5 a5@2 ~@7 d6@2 c6@2 bb5@2 a5 ~@12]/2",
  N: "eb6@3 d6@2 bb5@2 f5@6 ~@3", O: "eb6@3 d6@2 bb5@2 f6@6 ~@3", P: "eb6@3 d6@2 bb5@2 f5@5 ~@4",
  Q: "eb6@3 d6@2 bb5@2 f6@5 ~@4", R: "eb6@3 d6@2 bb5@2 f5@4 ~@5", S: "eb6@2 ~ d6@2 bb5 ~ f6@5 bb4@2 a4@2",
})).s("gm_synth_strings_2").gain(0.64).pan(0.2)

// other · dulcimer · "fill"
const dulcimer = note(`<
  ~@10 A@2 B@2 C D E D F G F G H@8 I@2 H@2 J K J K H@4 I@2 H@2 E D E D L D E M N O P O Q@8 I@2 H@2 R D L D H@13 S@2 ~
>`.pickRestart({
  A: "f2/2", B: "c3/2", C: "ab2@3 ~ f2@4", D: "bb2 g2", E: "ab2 f2", F: "ab2", G: "bb2", H: "c2@5 ~ c3@4 ~@6",
  I: "f2@5 ~ f1@4 ~@6", J: "ab3 f3", K: "bb3 g3", L: "ab2@7 ~ f2@8", M: "bb2@8 c3@4 b2@3 ~", N: "ab1", O: "bb1",
  P: "ab1@15 ~", Q: "[c2@127 ~]/8", R: "ab2@8 f2@7 ~", S: "[c2@5 ~ c3@26]/2",
})).s("gm_dulcimer").gain(0.21).pan(0.2)

// bass · electric bass finger · "bass synth"
const bass = note(`<
  A@10 B@2 A@2 C D C D E F E F A@8 B@2 A@2 C D C D A@4 B@2 A@2 C D C D C D G H I J K L M@8 B@2 A@2 C D C D A@14 ~@2
>`.pickRestart({
  A: "c2!2 bb2 c3 c2 c3 bb2 c3 c2!2 bb2 c3 c2 c3 bb2 c3", B: "f2!2 eb3 f3 f2 f3 eb3 f3 f2!2 eb3 f3 f2 f3 eb3 f3",
  C: "ab2!2 ~@2 ab2!2 ~@2 f2!2 ~@2 f2!2 ~@2", D: "bb2!2 ~@2 bb2!2 ~@2 g2!2 ~@2 g2!2 ~@2", E: "ab2", F: "bb2",
  G: "ab2 ab2@3 ab2 ab2@3 f2!2 ~@2 f2!2 ~@2", H: "bb2 bb2@3 bb2!2 ~@2 g2!2 ~@2 g2!2 ~@2", I: "[ab1,ab2]@3 ~",
  J: "[bb1,bb2]@3 ~", K: "[ab1,ab2]", L: "[bb1,bb2]@7 ~", M: "c2!2",
})).s("gm_electric_bass_finger").gain(0.64).pan(0.6)

// other · english horn · "oboe fill"
const english_horn = note(`<
  ~@3 A B ~ C D ~ D ~@3 E ~@12 F D ~@5 E ~@4 F D ~@5 G ~@16 H I J@2 ~ K L@2 M N O P ~@5 B ~ B ~ B ~ B ~@4
>`.pickRestart({
  A: "~@9 d4 eb4 bb4 a4@4", B: "~@9 d4 eb4 bb4 a4 f4 c4 bb3", C: "~@5 d4 eb4 bb4 a4@4 ~@4",
  D: "~@5 d4 eb4 bb4 a4 f4 c4 bb3 ~@4", E: "~@5 g4 c5 d5 eb5 f5 d5 eb5 c5 bb4 a4 g4", F: "~@5 d4 eb4 bb4 a4@3 ~@5",
  G: "~@5 g3 c4 d4 eb4 f4 d4 eb4 c4 bb3 a3 g3", H: "g4@3 f4 e4@8 c4 ~ a4 ~", I: "g4@3 f4 e4@7 ~@5",
  J: "[~ g4 c5 d5 e5@2 c5 f5@5 ~ g5 ~ e5@2 d5 c5@3 ~@11]/2", K: "~@5 g3 a3 c4 f4 g4 a4 c5 f5 a5 g5 f5",
  L: "[e5 g4 c5 d5 e5!2 c5 f5@6 g5@2 e5@2 d5 c5@2 ~ g4 c5 d5 eb5 f5 d5 eb5 c5 bb4 a4 g4]/2",
  M: "eb4@2 c4 eb4@2 c4@2 ~@4 eb4 ~ eb4 f4 eb4", N: "d4@2 bb3 d4@2 bb3@3 ~@3 d4@4 ~",
  O: "eb4 ~ c4 eb4@2 c4 ~@5 eb4 ~ eb4 f4 eb4", P: "d4@7 ~ d4@3 ~ d4@4",
})).s("gm_english_horn").gain(0.38)

// chords · piano · "piano2"
const piano = note(`<
  ~@5 A B C B D E@2 F ~ G H I J ~@7 K L C L M N A L ~ I O G P ~ A L A Q A L ~ R O G S G O G T U@4 ~@5 V W X Q M B Y I H
  G Z ~ AA L X AB@2 ~@7 AA AC ~
>`.pickRestart({
  A: "~@12 [bb4,eb5] ~ [a4,d5] ~, ~@6 c5!2", B: "[g4,c5]@3 ~@13", C: "~@12 [bb4,eb5] ~ [c5,d5]@2, ~@12 c5@2 a4 ~",
  D: "~@12 [bb4,c5]@2 [a4,c5,d5] ~, ~@12 eb5 ~@3", E: "[[f4,c5]@5 ~@23 [bb4,eb5] ~ [a4,d5] ~, f3@12 ~@2 c5!2]/2",
  F: "[g4,c5] ~@3", G: "[eb4,ab4,c5]@8 [f4,ab4,c5]@7 ~", H: "[f4,bb4,d5]@8 [g4,bb4,d5]@7 ~",
  I: "[eb4,ab4,c5]@7 ~ [f4,ab4,c5]@7 ~", J: "[f4,bb4,d5]@7 ~ [g4,bb4,c5]@4 [d4,g4,b4]@3 ~",
  K: "~@12 [bb4,eb5] ~ [a4,c5,d5] ~, ~@6 c5 ~", L: "[g4,c5] ~@7", M: "~@12 [bb4,c5,eb5]@2 [a4,d5] ~, ~@7 c5",
  N: "[f4,c5]@7 ~@9", O: "[f4,bb4,d5]@7 ~ [g4,bb4,d5]@6 ~@2", P: "[g4,bb4,d5]@7 ~ [g4,bb4,c5]@4 [d4,g4,b4]@3 ~",
  Q: "[f4,c5]@5 ~@11", R: "[eb4,ab4,c5]@6 ~@2 [f4,ab4,c5]@7 ~", S: "[f4,bb4,d5]@4 [g4,bb4,c5]@2 [g4,b4] ~",
  T: "[f4,bb4,d5]@8 [g4,bb4,c5]@4 [d4,g4,b4]@3 ~", U: "[~@13 f3 g3 bb3@11 ~@3 f3 g3 bb3@10 ~@4 f3 g3 bb3@13 ~@4]/4",
  V: "~@6 [bb4,c5,eb5] [c5,d5], ~@14 a4 ~", W: "[g4,c5]@5 ~@11", X: "~@12 [bb4,c5]@2 [a4,d5] ~, ~@12 eb5 ~ c5@2",
  Y: "~@12 [bb4,c5,eb5] ~ [a4,c5,d5] ~", Z: "[f4,bb4,d5]@6 ~@2 [d4,g4,c5]@4 [d4,g4,b4]@3 ~",
  AA: "~@6 [bb4,c5] [c5,d5], ~@12 eb5 ~ a4 ~", AB: "[g4@5 ~@3, c5@7 ~@9]/2", AC: "[g4,c5,d5]@3 ~@13",
})).s("gm_piano").gain(0.48).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~@12 A B C@4 D@2 E F G H@2 I C J A@2 K L A M C@5 N K O K P K L C Q O R O G O@2 S@9 T S@2 J O@3 C Q@2 U C O@2 Q J N J O
  J M O@2 J L V ~
>`.pickRestart({
  A: "x!2 ~@2 x ~@3 x!2 ~@2 x ~@3", B: "x!2 ~ x!2 ~@3 x!8", C: "x ~@3 x!2 ~@2 x ~@3 x!2 ~@2", D: "x ~@6 x!2 ~@3 x ~@3",
  E: "x ~@2 x!2 ~@3 x ~@2 x!2 ~@3", F: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~ x!2", G: "x!2 ~@2 x ~@3 x ~@3 x!2 ~@2",
  H: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x ~@3", I: "x!2 ~@2 x ~@3 x!2 ~@2 x!2 ~ x", J: "x ~@3 x!2 ~@2 x!2 ~@2 x!2 ~@2",
  K: "x ~@3 x!2 ~@2 x!2 ~@2 x ~@3", L: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~ x", M: "x!2 ~@2 x ~@3 x!2 ~@2 x!2 ~@2",
  N: "x ~@3 x!2 ~@2 x!2 ~@2 x!2 ~ x", O: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", P: "x!2 ~@2 x!2 ~@2 x ~@2 x!3 ~ x",
  Q: "x!2 ~@2 x!2 ~@2 x ~@3 x!2 ~@2", R: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!4", S: "x!4", T: "x ~@3 x ~@3 x ~@3 x!4",
  U: "x ~@3 x!2 ~@2 x ~@3 x!4", V: "x",
})).gain(0.56)

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

// drums · low tom
const low_tom = s("lt").struct("<~@59 A ~ A ~ A ~ A ~@13 B ~ B ~ B ~ B ~ B ~@2>".pickRestart({
  A: "x ~@3 x ~@2 x", B: "x ~@7 x ~@6 x",
})).gain(0.64)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@58 [x!8] x ~@30>").gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 A B ~@35 C D C D C D C D ~@12 E F E F E F E F E F ~@2>".pickRestart({
  A: "~@11 x!5", B: "x", C: "~@4 x!2 ~@2 x ~@3 x!3 ~", D: "~@3 x!4 ~@4 x!2 ~@3", E: "~@4 x ~@3 x ~@3 x!3 ~",
  F: "~@3 x!4 ~@2 x!4 ~@3",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@53 [x!8] [x ~@11 x!4] x ~@34>").gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@21 A B ~@35 C D C D C D C D ~@12 E D E D E D E D E D ~@2>".pickRestart({
  A: "~@12 x!4", B: "x", C: "~@2 x!2 ~@3 x ~@3 x ~@4", D: "~ x!3 ~@8 x!2 ~@2", E: "~@2 x!2 ~ x ~ x ~@3 x ~@4",
})).gain(0.56)

stack(
  synth_strings_2, dulcimer, bass, english_horn, piano, kick, snare, low_tom, pedal_hat, mid_tom, open_hat, high_tom
)

More by Thompson Twins