Strudelify
KeyA♭ majorTempo48 bpm
0:00/0:00
// closer — The Chainsmokers
// 48 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "Piano" named as a piano, played on piano (its synth bass 1 patch is not one); ch 2 "Violoncello" named as a string part, played on cello (its synth bass 2 patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/3065621; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 48 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(48/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
const piano = note("<A B ~@8 A B A C D E F G ~@8 A B A C D E F H A B A B A B A B I J K L A B>".pickRestart({
  A: "[db2,ab2,eb3,ab3]@5 [eb2,bb2,eb3,g3,ab3]@3 [f2,c3,eb3,ab3]@5 [eb2,bb2,eb3,g3,ab3]@3", // Dbsus2 Eb Fm7 Eb
  B: "[db2,ab2,eb3,f3,ab3]@5 [eb2,bb2,eb3,g3,ab3]@3 [f2,c3,eb3,ab3,c4]@5 [eb2,bb2,eb3,g3,ab3,bb3]@3", // Db Eb Fm7 Eb
  C: "[db2,ab2,eb3,f3,ab3]@5 [eb2,bb2,eb3,g3,ab3]@3 [f2,c3,eb3,ab3,c4]@5 ab3 [ab3,ab4] [bb3,bb4], ~@13 [eb2,bb2,eb3,g3,bb3]@3", // Db Eb Fm7 Ab Bb Eb
  D: "[bb3,bb4] [ab3,ab4]!2 [bb3,bb4]!2 [ab3,ab4]!2 [c4,c5]!2 [ab3,ab4]!2 [bb3,bb4]!2 [ab3,ab4]!2 [bb3,bb4]", // Bb Ab Bb Ab C Ab Bb Ab …
  E: "[bb3,bb4] [ab3,ab4]!2 [bb3,bb4] [bb3,bb4]@2 [ab3,ab4] [c4,c5]!2 [ab3,ab4]!2 [bb3,bb4]!2 [c4,c5] [ab3,ab4] [bb3,bb4]", // Bb Ab Bb Ab C Ab Bb C …
  F: "[bb3,bb4] [c4,c5] [ab3,ab4] [bb3,bb4]!2 [ab3,ab4]!2 [c4,c5]!2 [ab3,ab4]!2 [bb3,bb4]!2 [ab3,ab4]!2 [bb3,bb4]", // Bb C Ab Bb Ab C Ab Bb …
  G: "[bb3,bb4] [ab3,ab4]!2 [bb3,bb4] [bb3,bb4]@2 [ab3,ab4] [c4,c5]!2 [ab3,ab4]!2 [bb3,bb4]!2 [ab3,ab4]@2 ~", // Bb Ab Bb Ab C Ab Bb Ab
  H: "[bb3,bb4] [ab3,ab4]!2 [bb3,bb4] [bb3,bb4]@2 [ab3,ab4] [c4,c5]!2 [ab3,ab4]!2 [bb3,bb4]!2 [ab3,ab4] ~@2", // Bb Ab Bb Ab C Ab Bb Ab
  I: "[ab3,bb3,bb4] [ab3,ab4]!2 [bb3,bb4]!2 [ab3,ab4]!2 [c4,c5] [ab3,c4,c5] [ab3,ab4]!2 [bb3,bb4]!2 [ab3,ab4]!2 [bb3,bb4], [db2,ab2,eb3]@5 [eb2,bb2,eb3,g3]@3 [f2,c3,eb3]@5 [eb2,bb2,eb3,g3]@3", // Absus2 Ab Bb Ab C Ab Bb Ab …
  J: "[ab3,bb3,bb4] [ab3,ab4]!2 [bb3,bb4] ~ ab3 [ab3,ab4] [c4,c5] [ab3,c5] [ab3,ab4]!2 [bb3,bb4]!2 [ab3,c4,c5] [ab3,ab4] [bb3,bb4], [db2,ab2,eb3,f3]@2 [bb3,bb4] ~@5, ~@5 [eb2,bb2,eb3,g3]@3 [f2,c3,eb3,c4]@5 [eb2,bb2,eb3,g3,bb3]@3", // Absus2 Ab Bb Ab C Ab Bb Ab …
  K: "[bb3,bb4] [c4,c5] [ab3,ab4] [bb3,bb4]!2 [ab3,ab4]!2 [c4,c5] [ab3,c4,c5] [ab3,ab4]!2 [bb3,bb4]!2 [ab3,ab4]!2 [bb3,bb4], [db2,ab2,eb3]@5 [eb2,bb2,eb3,g3]@3 [f2,c3,eb3]@5 [eb2,bb2,eb3,g3]@3, ab3 ~@7", // Bb C Ab Bb Ab C Ab Bb …
  L: "[ab3,bb3,bb4] [ab3,ab4]!2 [bb3,bb4] ~ ab3 [ab3,ab4] [c4,c5] [ab3,c5] [ab3,ab4]!2 [bb3,bb4]!2 [eb2,bb2,eb3,g3,ab3,bb3]@3, [db2,ab2,eb3,f3]@4 [bb3,bb4]@2 ~@7 ab4 ~@2, ~@5 [eb2,bb2,eb3,g3]@3 [f2,c3,eb3,c4]@5 ~@3", // Absus2 Ab Bb Ab C Ab Bb Eb …
})).s("gm_piano").gain(0.45)

// other · cello · "Violoncello"
const cello = note("<~@18 A B A C D@2 E F G H I J ~ K ~ L ~@4 L K@2 M@3 N@2 ~@2>".pickRestart({
  A: "eb4@2 ~@4 eb4!3 c4!2 bb3!2 ab3 c4 eb4", B: "f4 eb4!2 c4 bb3 [eb3,c4]!2 bb3 ~@8",
  C: "f4 eb4!2 c4 bb3 c4!2 bb3@2 ~@7", D: "~@3 ab4!2 bb4 bb4@2 ab4!5 bb4!2 ab4",
  E: "bb4 ~ [bb4,c5] ~ eb4@2 c5 ~ bb4 ~@6 ab4, ~@4 ab4 ~@11", // Bbsus2
  F: "bb4 ~ [bb4,c5] ~ eb4@2 c5 ~ ab4@3 ~@4 bb4, ~@4 ab4 ~@3 bb4 ~@7", // Bbsus2
  G: "bb4 c5 ab4 bb4!2 c5 ab4 bb4!2 c5 ab4 bb4!2 ab4!2 bb4", H: "bb4 ab4!2 bb4 bb4@2 ab4 bb4!2 c5 ab4 bb4!2 ab4!2 bb4",
  I: "bb4 c5 ab4 bb4!2 c5 ab4 bb4!2 c5 ab4 bb4 bb4@2 ab4 bb4", J: "bb4 ab4!2 bb4!2 ab4!2 c5!2 ab4!2 bb4!2 ab4 ~@2",
  K: "~@6 ab4 c5!2 ab4!2 bb4!2 c5 ~@2", L: "~@6 ab4 c5!2 ab4!2 bb4!2 ab4 ~@2",
  M: "[~@6 ab4 c5!2 ab4!2 bb4!2 c5!2 c5@2 bb4@3 ~@9 c5!2 c5@2 bb4@3 ~@2 ab4 c5!2 ab4!2 bb4!2 c5 ~@2]/3",
  N: "[~@13 c5!2 c5@2 bb4@3 ~@2 ab4 c5!2 ab4!2 bb4!2 ab4@3]/2",
})).s("gm_cello").gain(0.3)

// other · piccolo
const piccolo = note("<A@2 B ~@7 C D E F ~@12 C D E F ~@12 G@4 ~@2>".pickRestart({
  A: "bb6 ab6!3 bb6 ab6!2 c7!2 ab6!3 bb6 ab6!3", B: "bb6 ~@15",
  C: "bb5 c6 ab5 bb5!2 c6 ab5 bb5!2 c6 ab5 bb5!2 ab5!2 bb5", D: "bb5 ab5!2 bb5 bb5@2 ab5 bb5!2 c6 ab5 bb5!2 ab5!2 bb5",
  E: "bb5 c6 ab5 bb5!2 c6 ab5 bb5!2 c6 ab5 bb5 bb5@2 ab5 bb5", F: "bb5 ab5!2 bb5!2 ab5!2 c6!2 ab5!2 bb5!2 ab5!2 bb5",
  G: "ab5 [ab5,bb5] ab5!2 bb5 ab5!2 c6!2 ab5!3 bb5 ab5!2 bb5", // Absus2
})).s("gm_piccolo").gain(0.2)

// other · acoustic guitar nylon · "Classical Guitar"
const acoustic_guitar_nylon = note(`<
  ~@6
  [bb4 ab4!2 bb4!2 ab4!2 c5!2 ab4!2 bb4!2 ab4!2 bb4]!8
  ~@8
  [bb4 ab4!2 bb4!2 ab4!2 c5!2 ab4!2 bb4!2 ab4!2 bb4]!8
  ~@18
>`).s("gm_acoustic_guitar_nylon").gain(0.15)

// other · harmonica
const harmonica = note("<~@5 [~@8 bb4 ab4!2 bb4!2 ab4!2 bb4] ~@15 [~@8 bb4 ab4!2 bb4!2 ab4!2 bb4] ~@26>")
  .s("gm_harmonica").gain(0.3)

// bass · contrabass
const bass = note("<~@6 A@4 ~@4 B@4 ~@4 A@4 ~@4 B@3 C A@4 D@4 A@4 ~@2>".pickRestart({
  A: "db2@5 eb2@3 f2@5 eb2@3", B: "db2 ~@4 eb2!2 ~ f2 ~@4 f2 eb2!2", C: "db2 ~@4 eb2!2 ~ f2 ~@4 f2 ~@2",
  D: "db2!5 eb2!3 f2!5 eb2!3",
})).s("gm_contrabass").gain(0.3)

// bass · synth bass 1 · "Bass Synthesizer"
const bass_2 = note("<~@2 A B A C A C A C ~@4 D C D C A C A C A C A C ~@4 D C D C ~@8 D C E F ~@2>".pickRestart({
  A: "[db2,ab2,eb3] ~@4 [eb2,bb2,c3,g3]!2 ~ [f2,c3,eb3] ~@4 [f2,c3,ab3] [eb2,bb2,g3]!2", // Dbsus2 Cm7 F7 Fm Eb
  B: "[db2,ab2,eb3,f3] ~@4 [eb2,bb2,c3,ab3]!2 ~ [f2,c3,eb3] ~@4 [f2,c3,ab3] [eb2,bb2,g3]!2", // Db Ab F7 Fm Eb
  C: "[db2,ab2,eb3,f3] ~@4 [eb2,bb2,c3,g3]!2 ~ [f2,c3,eb3,ab3] ~@4 [f2,c3,ab3] [eb2,bb2,g3]!2", // Db Cm7 Fm7 Fm Eb
  D: "[db2,ab2,eb3,ab3] ~@4 [eb2,bb2,c3,g3,bb3]!2 ~ [f2,c3,eb3,c4] ~@4 [f2,c3,ab3,bb3] [eb2,bb2,g3,bb3]!2", // Dbsus2 Cm7 F7 Fm Eb
  E: "[db2,ab2,eb3,ab3] ~@4 [eb2,bb2,c3,g3,bb3]!2 ~ [f2,c3,eb3,c4] ~@4 [f2,c3,ab3,c4] [eb2,bb2,g3,bb3]!2", // Dbsus2 Cm7 F7 Fm Eb
  F: "[db2,ab2,eb3,f3,ab3] ~@4 [eb2,bb2,c3,g3,bb3]!2 ~ [f2,c3,eb3,ab3,c4] ~@4 [f2,c3,ab3,bb3] ~@2", // Db Cm7 Fm7 Fm
})).s("gm_synth_bass_1").gain(0.45)

// other · viola
const viola = note("<~@6 A@4 B@4 ~@8 A@4 B@4 ~@4 B@8 C@4 ~@2>".pickRestart({
  A: "ab3@5 bb3@3 c4@5 bb3@3", B: "ab3/2", C: "ab4/4",
})).s("gm_viola").gain(0.25)

// other · french horn · "Horn in A♭"
const french_horn = note("<~@39 [bb4 ab4!3 bb4 ab4!2 c5!2 ab4!3 bb4 ab4!3]!7 [bb4 ~@15] ~>")
  .s("gm_french_horn").gain(0.25)

// other · french horn · "Horn in A♭" · soft notes
const french_horn_soft = note("<~@37 [~@14 ab4!2] [bb4 ab4!3 bb4 ab4!2 c5!2 ab4!3 bb4 ab4!3] ~@9>")
  .s("gm_french_horn").gain(0.15)

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

// drums · rim
const rim = s("rim").struct("<~@2 A@8 ~@4 A@12 ~@4 A@3 B ~@8 A@4 ~@2>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  ~@13
  [x ~ x!4 ~ x!2 ~ x!5 ~]
  ~@15
  [x ~ x!4 ~ x!2 ~ x!5 ~]
  ~@11
  [x ~ x!4 ~ x!2 ~ x!5 ~]
  ~@6
>`).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@2 B@2 C D ~@4 B@2 C@2 ~@2 A@2 B@2 C D ~@4 B@2 C E ~@8 B@2 C@2 ~@2>".pickRestart({
  A: "x ~ x!2 ~@4 x ~ x!2 ~@4", B: "~ x!15", C: "x!16", D: "x!15 ~", E: "x!14 ~@2",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@6 A@2 B@2 ~@4 A@2 B@2 ~@4 A@2 B@2 ~@4 A@2 B@2 ~@8 A@2 B@2 ~@2>".pickRestart({
  A: "x", B: "x!2",
})).gain(0.45)

stack(
  piano, cello, piccolo, acoustic_guitar_nylon, harmonica, bass, bass_2, viola, french_horn, french_horn_soft, kick,
  rim, snare, hihat, open_hat
)