Strudelify
Say You, Say Me cover art

Dancing On The Ceiling

Say You, Say Me

Lionel Richie

KeyA♭ majorTempo64 bpm
0:00/0:00
// Say You, Say Me — RICHIE LIONEL
// 64 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 9 "CELESTA" celesta (copy of ch 15 "CELESTA" celesta, 0.073 beats early)
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(64/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.

// chords · piano · "A.PIANO 2"
const piano = note(`<
  A B C D E F G H E F G I E J K L E J K M@2 A B C A@2 B C D A B N O A B P Q R A B C A@2 B C S ~@6 T U V W X Y Z W X Y AA
  AB@3 ~@6
>`.pickRestart({
  A: "[ab3,c4,eb4]!2 [g3,bb3,eb4]!2", B: "[f3,ab3,c4]!2 [eb3,ab3,c4] [eb3,g3,c4]", C: "[ab3,db4,f4]!2 [bb3,db4,f4]!2",
  D: "[ab3,c4,eb4]!4", E: "[ab3,c4,eb4]@2 ~ ab2 [g3,bb3,eb4]@2 ~ g2, ab2@3 ~ g2@3 ~, ~ [ab3,c4,eb4] ~ [g3,bb3,eb4]",
  F: "[f3,ab3,c4]@2 ~ f2 [eb2,eb3,ab3,c4]@2 [eb2,eb3,g3,c4]@2, f2@3 ~@5, ~ [f3,ab3,c4] ~@2", // Fm Ab Cm Fm
  G: "[ab3,db4,f4]@2 ~ db3 [bb3,db4,f4]@2 [bb3,db4,f4]@2, db3@3 ~ eb3@4, ~ [ab3,db4,f4] ~@2", // Db Bbm Db
  H: "[ab3,c4,eb4]!4, ab2@15 ~", I: "[ab3,c4,eb4]!3 [eb2,ab3,c4,eb4], ab2@3 ~",
  J: "[f3,ab3,c4]!2 [eb3,ab3,c4] [c3,eb3,g3,c4], f2 ~", K: "[f3,ab3,bb3,db4]!3 [ab2,eb3,ab3,c4], bb2@3 ~",
  L: "[gb3,bb3,db4]!3 [eb2,eb3,g3,bb3,db4], gb2@3 ~", // Gb Eb7
  M: "[[gb3,bb3,db4]!4 [gb3,bb3,db4]!3 [eb2,eb3,g3,bb3,db4], gb2@7 ~]/2", // Gb Eb7
  N: "[f3,ab3,bb3,db4]@4 [f3,ab3,bb3,db4]@4 [f3,ab3,bb3,db4]@2 ~ [bb3,db4] [eb3,ab3,c4]@4, ~@5 f3 ~@2", // Bbm7 Bbm Ab
  O: "[gb3,bb3,db4]!3 [eb3,g3,bb3,db4]", P: "[f3,ab3,bb3,db4]!3 [eb3,ab3,c4]", Q: "[gb3,bb3,db4]!4",
  R: "[eb3,g3,bb3,db4]!2 [f3,ab3,db4] [g3,bb3,eb4]", S: "[ab3,c4,eb4]@2 [ab3,c4,eb4]!6", T: "[gb3,b3,eb4]!4",
  U: "[f3,ab3,db4]!3 [g3,bb3,eb4]", V: "[g3,bb3,eb4]!3 [ab3,c4,eb4]", W: "[ab3,c4,eb4] [g3,bb3,eb4]!2 [f3,ab3,c4]",
  X: "[f3,ab3,c4] [eb3,ab3,c4] [eb3,g3,c4] [ab3,db4,f4]", Y: "[ab3,db4,f4] [bb3,db4,f4]!2 [ab3,c4,eb4]",
  Z: "[ab3,c4,eb4] [g3,bb3,eb4]!2 [ab3,c4,eb4]", AA: "[ab3,c4,eb4] [g3,bb3,eb4]!2 [ab3,db4,f4]",
  AB: "[[ab3,c4,eb4]@4 [f3,bb3,db4]@4 [f3,ab3,db4]@4 ~ eb2 ~ ab2 bb2@2 ~@2 eb3@2 ab3@2 bb3@4 [ab3,c4,eb4]@16 ~@4, ~ c4 ~@2, ~@6 ab3@5 ~@13, ~@3 eb3@2 ~@7, ~@9 c3@4 ~@11]/3", // Ab Bbm Db Ab
})).s("gm_piano").gain(0.16).pan(0.4)

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@11 A B C D E B C D F@2 G H I J K L I M K N O P K Q R S T U V I J K L W X Y Z Y AA Y Z AB AC@2 AD AE@6 AF AG@8 ~
>`.pickRestart({
  A: "~@3 eb1", B: "ab1@3 ab1 g1@3 g1", C: "f1@2 eb2 c2", D: "bb1@3 ab1", E: "gb1@3 eb1", F: "[gb1@7 eb1]/2",
  G: "ab1@5 ~ ab2@2 g2@5 ~ g2@2", H: "f2@5 ~ f2@2 eb2@4 c2@4", I: "db2@3 db2 eb2@2 eb1@2", J: "ab1@3 ab1!3 eb1!2",
  K: "ab1@3 ab2 g2@3 g2", L: "f2@3 f2 eb2@2 c2@2", M: "ab1@11 ~ eb2@3 ~", N: "f2@6 f2@2 eb2@4 eb2@3 ~",
  O: "bb1@5 ~ f1@2 bb1@4 ab1@4", P: "gb1@6 gb1@2 gb1@4 eb1@3 ~", Q: "f2@3 f2 eb2@2 eb1@2", R: "bb1@3 f1 bb1@2 ab1@2",
  S: "gb1@14 gb1 ~", T: "eb1!4 f1!2 g1!2", U: "ab1@6 ab2@2 g2@5 ~ g2@2", V: "f2@3 f2 eb2@2 eb2@2",
  W: "db2@6 db2@2 eb2@4 eb1@3 ~", X: "ab1!8", Y: "b1!2 ~ gb1!2 ab1 bb1 b1",
  Z: "db2@2 db2@3 ~ ab1@2 ab1@2 eb1@2 b1 ~ eb1 ~", AA: "d2@2 d2@2 eb2 bb1 eb2@2 gb2@2 eb2@2 gb2!2 eb2@2", AB: "b1",
  AC: "[db2@3 eb2@4 ab1]/2", AD: "~@2 ab2@2 g2@5 ~ g2@2 f2@4",
  AE: "[~ f2 eb2@2 c2@2 db2@3 db2 eb2@2 eb1@2 ab1@3 ab1!3 eb1!2 ab1@3 ab2 g2@3 g2 f2@3 f2 eb2@2 c2@2 db2@3 db2 eb2@2 eb1@2 ab1@2]/6",
  AF: "~@2 ab1@2 ab1@4 eb1@3 ~ db2@4", AG: "[c2 bb1 eb2 ab1@29]/8",
})).s("gm_synth_bass_1").gain(0.42)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A@2 B@3 ~@15 C D E F G H E F I ~ J K L M J N O@2 ~@3 P Q R S T ~@6 U V@2 ~ W@3 ~ X@3 Y@3 ~@6
>`.pickRestart({
  A: "eb6/2", B: "[db6@2 eb6@3 ~, ab6@5 ~]/3", C: "[gb3,bb3,db4]@3 [g3,bb3,eb4]", D: "[ab3,c4] g3", E: "f3 eb3",
  F: "db3 eb3", G: "ab3@2 g3 eb3", H: "ab3 g3", I: "ab3", J: "~@5 ab4 g4 eb4, ~ c4", K: "[db4,f4]@3 [c4,eb4]",
  L: "[bb3,db4]@12 bb5 c6 db6 f6", M: "eb6 ~", N: "~@10 db6@2 c6@2 bb5 ab5, [db4,f4]@3 [c4,eb4]",
  O: "[bb5@5 ab5 gb5 f5 eb5@4 [db4,f5]@2 [eb4,g5]@2, [bb3,db4]@3 ~]/2", P: "~ [eb4,g4]", Q: "[eb4,ab4] [eb4,g4]",
  R: "[c4,f4] [c4,eb4]", S: "[db4,f4]", T: "[c4,eb4]", U: "eb5@3 eb5@2 f5 gb5@9 ~, [gb3,b3,eb4]",
  V: "[f5@3 f5@2 gb5 ab5@6 [eb4,bb5,eb6]@16 ~@4, [ab3,db4,f4]@3 ~@5]/2", // Eb5 Db
  W: "[~ [eb4,ab4] [eb4,g4] [db4,f4]@2 [db4,eb4]@2 c4@2 bb3@2 ~, ~@7 eb4@4 ~]/3", // Ab5 Eb Db Dbsus2
  X: "[~ [eb4,ab4] [eb4,g4] [db4,f4,f5]@2 ab5 bb5 ~ ab6 g6 eb6 [db4,f4,f5,f6], ~@5 [db4,eb4]@2 [eb4,ab5]@4 ~, ~@7 c4@2 bb3@2 ~]/3", // Ab5 Eb Db Dbsus2 Ab5
  Y: "[[c4,eb4,eb5,eb6] [db4,f4,f5,f6] [db4,f4] [c4,eb4]@9, ~ [ab5,ab6]@5]/3", // Cm Db Cm Ab
})).s("gm_string_ensemble_1").gain(0.16).pan(0.4)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@21 A B C D A E F G A H I J A H I K L A M F D A M C ~@9 N O P Q R O S Q T ~@9
>`.pickRestart({
  A: "~ eb4 ~ eb4 ~ eb4 ~ eb4, [ab4,c5]!2 [g4,bb4]!2", B: "~@2 c4@2 ~@2 c4@2 ~@2 c4@2 ~@2 c4 ~, [f4,ab4]!2 [eb4,ab4]!2",
  C: "~@2 ab3@2 ~@2 ab3@2 ~@2 ab3@2 ~@2 ab3 ~, [db4,f4]!4", // Db
  D: "~@2 ab3@2 ~@2 ab3@2 ~@2 bb3@2 ~@2 bb3 ~, [eb4,ab4]!2 [eb4,g4]!2", // Ab5 Eb
  E: "~@2 c4@2 ~@2 c4@2 ~@2 c4@2 ~@2 c4 ~, [f4,ab4]!2 [eb4,ab4] [eb4,g4]", F: "~ ab3 ~ ab3 ~ ab3 ~ ab3, [db4,f4]!4",
  G: "~@2 ab3@2 ~@2 ab3@2 ~@2 ab3@2 ~@2 bb3 ~, [eb4,ab4]!3 [eb4,g4]", H: "~ c4 ~ c4 ~ c4 ~ c4, [f4,ab4]!2 [eb4,ab4]!2",
  I: "~ bb3 ~ bb3 ~ bb3 ~ ab3, [db4,f4]!3 [c4,eb4]", J: "~@2 gb3@2 ~@2 gb3@2 ~@2 gb3@2 ~@2 g3 ~, [bb3,db4]!3 [bb3,eb4]",
  K: "~ gb3 ~ gb3 ~ gb3 ~ gb3, [bb3,db4]!4", L: "~ g3 ~ g3 [db4,f4]@2 [eb4,g4]@2, [bb3,eb4]!2 ~@2",
  M: "~ c4 ~ c4 ~ c4 ~ c4, [f4,ab4]!2 [eb4,ab4] [eb4,g4]", N: "~@7 eb4, ~@3 [ab4,c5]",
  O: "~ eb4 ~ eb4 ~ eb4 ~ c4, [ab4,c5] [g4,bb4]!2 [f4,ab4]", P: "~ c4 ~ c4 ~ c4 ~ ab3, [f4,ab4] [eb4,ab4]!2 [db4,f4]",
  Q: "~ ab3 ~ ab3 ~ ab3 ~ ab3, [db4,f4]!3 [eb4,ab4]", R: "~ ab3 ~ bb3 ~ bb3 ~ eb4, [eb4,ab4] [eb4,g4]!2 [ab4,c5]",
  S: "~ c4 ~ c4 ~ c4 ~ ab3, [f4,ab4] [eb4,ab4] [eb4,g4] [db4,f4]", T: "~ ab3 ~ bb3 ~ bb3 ~@2, [eb4,ab4] [eb4,g4]!2 ~",
})).s("gm_acoustic_guitar_steel").gain(0.17).pan(0.3)

// chords · electric guitar clean · "CLEAN GTR" · Bmaj7 Fm Ab Fm
const electric_guitar_clean = note(`<
  ~@28
  [~@12 eb3 f3 ab3 bb3]
  [[bb3,b3] c4@5 ~@10]
  [~@4 [f3,ab3]!4 ~@8]
  ~@2
  [[ab3,c4] [ab3,c4]@7 ~@8]
  [~@4 [f3,ab3]!4 ~@8]
  ~@37
>`).s("gm_electric_guitar_clean").gain(0.15).pan(0.6)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@37 A B ~@6 C D E D F G H I J@2 ~@17>".pickRestart({
  A: "~@8 bb4 ~ bb4 ~ bb4@2 ab4@2", B: "bb4", C: "[eb3,ab3]@2 ~@6 ab3 ~ [eb3,ab3] ~ [eb3,ab3] ~ [eb3,ab3] ~",
  D: "~@2 [b2,gb3,b3]@2 ~@4 [db3,gb3,bb3]@5 ~@3", E: "~@2 [db3,ab3,db4]@2 ~@4 [eb3,ab3,c4]@5 ~@3",
  F: "[d3,a3,d4]@2 ~@2 e4 eb4 ab3 gb3", G: "[b2,gb3] ~ [b2,gb3]@2 d3 eb3 gb3 ~ [gb2,db3] ~ [gb2,db3]@2 a2 bb2 db3 ~",
  H: "[db3,ab3] ~ [db3,ab3]@2 eb3 f3 ab3 ~ [ab2,eb3] ~ [ab2,eb3]@2 b2 c3 eb3 ~", I: "[b2,gb3,b3]@15 ~",
  J: "[[db3,ab3,db4]@11 ~ [eb3,bb3]@16 ~@4]/2", // Db5 Eb5
})).s("gm_overdriven_guitar").gain(0.1).pan(0.4)

// chords · overdriven guitar · "OVERDRIVE" · soft notes · Ab5
const overdriven_guitar_soft = note("<~@45 [~@2 eb3 ~ [eb3,ab3] ~ [eb3,ab3] ~ eb3 ~@7] ~@26>")
  .s("gm_overdriven_guitar").gain(0.05).pan(0.4)

// chords · clavinet · Eb5 Cm
const clavinet = note("<~@2 [~@3 [bb3,eb4]] [[c4,eb4] ~] ~@68>").s("gm_clavinet").gain(0.14).pan(0.4)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar = note("<~@46 A B A C D E F ~@19>".pickRestart({
  A: "~@2 [b2,gb3,b3]@2 ~@4 [db3,gb3,bb3]@5 ~@3", B: "~@2 [db3,ab3,db4]@2 ~@4 [eb3,ab3,c4]@5 ~@3",
  C: "[d3,a3,d4]@2 ~@2 e4 eb4 ab3 gb3", // D5
  D: "[b2,gb3,b3]@2 [e3,f3,a3,bb3] [c3,db3,d3,eb3,f3,gb3,g3,ab3] [ab2,a2,bb2,b2,db3,d3,eb3,e3] ~@7 [db3,gb3]@4", // B5 Fmaj7 Gb5
  E: "[db3,ab3,db4]@2 [gb3,g3,b3,c4] [d3,eb3,e3,f3,g3,ab3,a3,bb3] [bb2,b2,c3,db3,eb3,e3,f3,gb3] ~@7 [eb3,ab3]!2 [ab2,eb3]@2", // Db5 Cmaj7 Ab5
  F: "b2@15 ~",
})).s("gm_distortion_guitar").gain(0.13).pan(0.8)

// other · clarinet
const clarinet = note("<~@14 A B C ~ D E F ~@51>".pickRestart({
  A: "~@10 bb4 [db5,ab5] [bb5,f6] [ab6,bb6] [db7,f7] [ab7,bb7]", // Db5 Bb5 Absus2 Db Absus2
  B: "[db7,ab7] [bb7,db8] [db7,ab7] [bb7,db8] ~@4 g5 [ab5,bb5] [db6,eb6] [gb6,ab6] [bb6,bb7] [db8,eb8] [eb7,bb7] [db8,eb8]", // Db5 Bbm Db5 Bbm Absus2 Dbsus2 Gbsus2 Bb …
  C: "[eb7,bb7] [db8,eb8] [eb7,bb7] [db8,eb8] [eb7,bb7] db8 eb7 ~@9", // Eb5 Dbsus2 Eb5 Dbsus2 Eb5
  D: "~@8 bb7 [f7,ab7] [bb6,db7] [f6,bb6] [db7,f7] [ab7,bb7] [bb7,db8] [f7,ab7]", // Fm Bbm Bb5 Db Absus2 Bbm Fm
  E: "[db7,db8] [ab7,bb7] [f7,db8] [ab7,bb7] [f7,db8] bb7 ~@2 gb6 [ab6,bb6] [db7,eb7] [gb7,ab7] [gb7,ab7,bb7] [bb6,db7,eb7] [ab6,bb6,db7] [eb7,gb7,ab7]", // Db Absus2 Db Absus2 Db Absus2 Dbsus2 Gbsus2 …
  F: "[ab7,bb7,db8] [db7,eb7,gb7] [bb6,ab7,bb7] [db7,eb7,gb7] [bb6,ab7,bb7] [db7,eb7,gb7] [bb6,ab7,bb7] [db7,eb7,gb7] [bb6,ab7,bb7] [eb7,gb7] ~@6", // Bbm7 Ebm7 Bb7 Ebm7 Bb7 Ebm7 Bb7 Ebm7 …
})).s("gm_clarinet").gain(0.11)

// other · clarinet · soft notes · Db5 Bbm Db Absus2 Db Absus2
const clarinet_soft = note(`<
  ~@15
  [~@4 [db7,ab7] [bb7,db8] db7 ~@9]
  [~@5 eb8 ~@10]
  ~@2
  [~@5 ab7 [f7,db8] [ab7,bb7] [f7,db8] [ab7,bb7] ~@6]
  ~@52
>`).s("gm_clarinet").gain(0.05)

// other · celesta · Db5
const celesta = note(`<
  [~@2 eb6 ~ ab5 ~ g5@2 ~@2 eb6 ~ ab5 ~ f5 ~]
  [~@2 eb6 ~ ab5 ~ eb5 ~@3 eb6 ~ bb5 ~ eb5 ~]
  [[ab5,db6] ~@15]
  ~@69
>`).s("gm_celesta").gain(0.37).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~@11 A B@2 C D B C D E ~ B C@2 D C@2 D C B@2 D@2 B C D C F B C@2 D C@2 D F@6 G E@2 A H I@2 J I@2 J K ~@9
>`.pickRestart({
  A: "~@3 x", B: "x ~@2 x!2 ~@2 x", C: "x ~@2 x!2 ~@3", D: "x ~@2 x!2 ~ x ~", E: "x", F: "x!4", G: "x!3 ~",
  H: "~ x!2 ~@2 x!2 ~", I: "~ x!2 ~@3 x ~", J: "~ x!2 ~ x ~ x ~", K: "~ x!2 ~@5",
})).gain(0.3)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@37 [x!2 ~@6] ~@7 [x!3 ~@5] ~@26>").gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<~@20 A ~@7 B ~@8 C ~@13 B@2 ~@19>".pickRestart({
  A: "~ x ~@5 x ~@7 x", B: "~@7 x", C: "x!8",
})).gain(0.3)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@20 [x!2 ~@4 x!2 ~@4 x!4] ~@30 [~@3 x] [~@11 x!2 ~@3] ~@19>").gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~@47 [~@7 x] ~@24>").gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@20 [x ~@5 x ~@5 x!4] ~@30 [~@5 x ~@2] ~@20>").gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@21 A ~@16 A ~@7 A ~@3 A ~ A B ~@18>".pickRestart({
  A: "x", B: "x ~@2 x",
})).gain(0.3)

// drums · ride
const ride = s("rd").struct("<~@52 [~ x!2 ~]!2 ~@18>").gain(0.3)

// drums · shaker
const shaker = s("sh").struct("<~@46 [~@14 x!2] ~ [~@14 x!2] ~ [~@14 x!2] ~@21>").gain(0.3)

stack(
  piano, bass, string_ensemble_1, acoustic_guitar_steel, electric_guitar_clean, overdriven_guitar,
  overdriven_guitar_soft, clavinet, distortion_guitar, clarinet, clarinet_soft, celesta, kick, snare, snare_soft,
  low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride, shaker
)

More by Lionel Richie