Strudelify

Read My Lips

Jimmy Somerville

KeyE♭ majorTempo130 bpm
0:00/0:00
// Read My Lips — Jimmy Somerville
// 130 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 154 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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 brass 1 · "Ch  2"
const synth_brass_1 = note("<A@2 ~@152>".pickRestart({
  A: "[eb2,eb3]/2", // Eb
})).s("gm_synth_brass_1").gain(0.5)

// chords · synth strings 2 · "Ch  2"
const synth_strings_2 = note(`<
  ~@3 A B C D A B C E@3 F@2 G H I@2 G J F@2 G H I@2 A B C D A B C K@3 G J F@2 G H I@2 G J F@2 G H I@2 A B C D A B C D A
  B C D A B C L@3 M N O P Q@2 R@2 S N O T Q@2 ~@2 G J F@2 G H I@2 A B C D A B C D A B C D A B C D A B C D A B C L@3 M N
  O P Q@2 U@2 M N O P Q@2 U@2 M N O P Q@2 R@2 S N O T Q@2 ~@2 V
>`.pickRestart({
  A: "[eb4,g4,bb4]!2", B: "[d4,g4,bb4]!2", C: "[eb4,ab4,c5]!2", D: "[f4,bb4,d5]!2",
  E: "[[f4,bb4,d5]@2 [f4,d5]@2 [c4,eb4,g4]@2 [c4,eb4,g4]@2 [c4,eb4,g4]@2 [c4,eb4,g4] [c4,eb4,f4], ~ bb4@4 ~]/3", // Bb Dm Cm F7
  F: "[bb3,eb4,g4]!2", G: "[c4,eb4,g4]!2", H: "[c4,eb4,g4]@2 [c4,eb4,g4] [ab3,c4,eb4]", I: "[bb3,d4,f4]!2",
  J: "[c4,eb4,g4]@2 [c4,eb4,g4] [c4,eb4,f4]", K: "[[f4,bb4,d5] [f4,d5] ~@4, ~ bb4@4 ~]/3",
  L: "[[f4,bb4,d5]@8 [f4,d5]@8 ab4@26 c5@3 ~ eb5@2, ~ bb4@4 ~]/3", M: "eb5@5 db5@2 c5", N: "~ ab4@15",
  O: "c5@3 bb4@3 ab4@2 ~ ab4@7", P: "c5@3 bb4@3 ab4 ~ ab4@7 ~", Q: "[ab4@31 ~]/2", R: "[ab4@26 c5@3 eb5@2 ~]/2",
  S: "~ eb5@9 db5@4 c5@2", T: "c5@3 bb4@3 ab4@2 ab4@7 ~", U: "[ab4@26 c5@3 ~ eb5@2]/2", V: "[ab4,c5,eb5] ~",
})).s("gm_synth_strings_2").gain(0.4)

// chords · piano · "Ch  4"
const piano = note(`<
  ~@3 A B C D A B C D ~@16 B E C F B E C F ~@18 B E C F B E C F B E C F B E C F G H I J G H I J G H I J G H I J K ~@9 B
  E C F B E C F B E C F B E C F B E C F B E C F G H I J G H I J G H I J G H I J G H I J G H I J G H I J G H I J K ~ L
>`.pickRestart({
  A: "[bb4,eb5,g5]@7 ~ g5@2 ~ bb5@2 ~ [bb4,eb5] ~, ~@8 [bb4,eb5]@5 ~ g5@2", // Eb Eb5
  B: "[bb4,eb5,g5]@7 ~ g5@2 ~ bb5@2 ~ [bb4,g5] ~, ~@4 [bb4,eb5]@3 eb5", C: "[c5,eb5,ab5]@7 ~ [c5,eb5,ab5]@2 ~@6",
  D: "[bb4,d5,f5,bb5]@4 ~@4 [d5,f5,bb5]@2 ~ [f5,bb5]@2 ~ [bb4,d5,f5,bb5] ~, ~@8 bb4 ~@2 [bb4,d5] ~@4", // Bb Bb5 Bb
  E: "[bb4,eb5,g5]@7 ~ g5@2 ~ bb5 ~@2 [eb5,g5]@2, ~@8 [bb4,eb5]@5 ~ bb4 ~", // Eb Eb5
  F: "[bb4,d5,f5,bb5]@4 ~@4 [d5,f5,bb5]@2 ~ [d5,f5,bb5]@2 ~ [bb4,d5,f5,bb5] ~, ~@8 bb4 ~@2 bb4 ~@4", G: "ab3 ~",
  H: "gb3 ~", I: "f3 ~", J: "e3 eb3", K: "eb3!3 ~@13", L: "[ab2,ab3] ~",
})).s("gm_piano").gain(0.64)

// other · synth bass 1 · "Ch  5"
const synth_bass_1 = note("<~@35 A@2 ~@117>".pickRestart({
  A: "[~ [ab4,ab5]@2 [ab4,ab5]@2 [ab4,ab5]@2 [ab4,ab5]@2 [ab4,ab5]@2 [ab4,ab5]@2 [ab4,ab5]@2 [ab4,ab5]@2 [ab4,ab5]@2 [ab4,ab5]@4 ~@9]/2", // Ab
})).s("gm_lead_8_bass_lead").gain(0.42)

// bass · synth bass 1 · "Ch  7"
const bass = note(`<
  ~@2 A B C D E B C D E F G H@2 F I E@2 F G H@2 F I E@2 B C D E B C D E ~@2 F G H@2 F I E@2 F G H@2 F I E@2 B C D E B C
  D E B C D E B C D E D J K L D J K L D J K L D J K L M ~ F G H@2 F I E@2 B C D E B C D E B C D E B C D E B C D E B C D
  E D J K L D J K L D J K L D J K L D J K L D J K L D J K L D J K L M ~ N
>`.pickRestart({
  A: "ab1!3 ~@3 ab1!2 ~@3 ab1!2 ~@3", B: "eb1!2 eb2!2 eb1!2 eb2!2 eb1!2 eb2!2 eb1!2 eb2!2",
  C: "g1!2 g2!2 g1!2 g2!2 g1!2 g2!2 g1!2 g2!2", D: "ab1!2 ab2!2 ab1!2 ab2!2 ab1!2 ab2!2 ab1!2 ab2!2",
  E: "bb1!2 bb2!2 bb1!2 bb2!2 bb1!2 bb2!2 bb1!2 bb2!2", F: "c2!2 c3!2 c2!2 c3!2 c2!2 c3!2 c2!2 c3!2",
  G: "c2!2 c3!2 c2!2 c3!2 c2!2 c3!2 d2!2 d3!2", H: "eb2!2 eb3!2 eb2!2 eb3!2 eb2!2 eb3!2 eb2!2 eb3!2",
  I: "c2!2 c3!2 c2!2 c3!2 c2!2 c3!2 ab1!2 ab2!2", J: "gb1!2 gb2!2 gb1!2 gb2!2 gb1!2 gb2!2 gb1!2 gb2!2",
  K: "f1!2 f2!2 f1!2 f2!2 f1!2 f2!2 f1!2 f2!2", L: "e1!2 e2!2 e1!2 e2!2 eb1!2 eb2!2 eb1!2 eb2!2",
  M: "[eb1,eb2]!3 ~@3 [eb1,eb2] ~@4 [eb1,eb2]!2 ~@3", N: "[ab1,ab2] ~",
})).s("gm_synth_bass_1").gain(0.71)

// other · synth strings 1 · "Ch  1"
const synth_strings_1 = note("<~@36 A@2 ~@116>".pickRestart({
  A: "[ab4@19 ~@13]/2",
})).s("gm_synth_strings_1").gain(0.3)

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

// drums · rim
const rim = s("rim").struct("<~@3 [~@3 x!5 ~@3 x!5]!82 ~@2 [~@3 x!5 ~@3 x!5]!64 ~@3>").gain(0.72)

// drums · snare
const snare = s("sd").struct(`<
  ~@3 A@11 B A@7 B A@3 C A@8 ~@2 A@3 B A@7 B A@3 C A@19 B A@3 B A@3 B A@3 D E ~ A@3 B A@3 C A@27 B A@3 B A@3 B A@3 B A@3
  B A@3 B A@3 B A@3 D E ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~@2 x", C: "~@4 x ~@5 x!3 ~@2 x", D: "~@4 x ~ x ~ x ~ x ~ x!4",
  E: "x!3 ~@3 x!2 ~@3 x!2 ~@3",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<~@3 [x!16]!81 [x!8 ~@8] ~@2 [x!16]!63 [x!8 ~@8] ~@3>").gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~@11 A ~@15 A ~@3 A ~@5 A ~@15 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@8 A ~@8 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A
  ~@7 A ~@7 A ~@8 A@2
>`.pickRestart({
  A: "x",
})).gain(0.72)

// drums · shaker
const shaker = s("sh").struct("<~@86 [~ x!15] ~@65 [~ x!15] ~>").gain(0.72)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@86 x ~@65 x ~>").gain(0.48)

stack(
  synth_brass_1, synth_strings_2, piano, synth_bass_1, bass, synth_strings_1, kick, rim, snare, hihat, crash, shaker,
  shaker_soft
)