Strudelify

Nice & Slow

Usher

KeyF minorTempo61 bpm
0:00/0:00
// Nice & Slow — Usher
// 61 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 8 drawbar organ (copy of ch 2 fretless bass)
// note: Full arrangement: all 57 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(61/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 · recorder
const recorder = note("<A B@8 ~@7 A B@8 ~@11 A B@8 ~@12>".pickRestart({
  A: "~@36 bb4 ~@11",
  B: "[eb5@36 ab4@3 bb4@3 c5@3 f5@39 ab4@3 bb4@3 c5@3 eb5@9 c5@3 bb4@27 c5@21 ~ ab4 f4 eb4@22 ~@2 ab4@3 bb4@3 c5@3 eb5@39 ab5@3 g5@3 eb5@3 f5@17 ~@2 bb4@2 ab4@2 f4@16 ab4@3 bb4@3 c5@3 eb5@9 c5@3 bb4@25 ~ c5@22 ~ ab4 f4 eb4@26 ~@10, ~@153 bb4@2 ~@99 eb5@2 ~@128, ~@255 c5@2 ~@88 bb4@2 ~@37]/8",
})).s("gm_recorder").gain(0.3).pan(0.4)

// bass · fretless bass
const bass = note(`<
  ~@9 A B C D A E C F A B C D A E C G A B H D A E C F A B C D A B C I A B C J A E C F A B C D A E C F
>`.pickRestart({
  A: "f2 ~@2 c2 ~@2 c2@2", B: "db2@5 ~@13 ab1@6 ~@12 eb2@12", C: "f2@5 ~@13 c2@6 ~@12 c2@12",
  D: "db2@4 ~@14 ab1@6 ~@21 eb2@3", E: "db2 ~@2 ab1 ~@2 eb2@2", F: "db2@6 ~@12 ab1@6 ~@12 eb2@2 ~ eb2@3 eb2@6",
  G: "db2@6 ~@12 ab1@6 ~@12 eb2@2 ~@2 eb2@3 ~ eb2@4", H: "f2!3 ~@3 c2@2 ~@4 c2@4",
  I: "db2@6 ~@12 ab1@6 ~@12 eb2@2 ~ eb2@3 eb2@3 eb2@3", J: "db2@6 ~@12 ab1@6 ~@12 eb2@2 ~@2 eb2@3 ~ eb2 eb2@3",
})).s("gm_fretless_bass").gain(0.64)

// other · string ensemble 2
const string_ensemble_2 = note("<A@8 ~@8 B@8 C@3 D@24 E@6>".pickRestart({
  A: "[~@47 [ab3,c4]@48 [bb3,eb4]@48 [ab3,c4]@48 [bb3,eb4]@48 [ab3,c4]@48 [bb3,eb4]@48 [ab3,c4]@48 [bb3,eb4]]/8", // Ab Eb5 Ab Eb5 Ab Eb5 Ab Eb5
  B: "[~@47 c4@48 bb3@48 c4@48 bb3@48 c4@48 bb3@48 c4@48 bb3]/8", C: "[~@47 c4@48 bb3@48 ~]/3",
  D: "[~@47 bb3@48 c4@48 bb3@48 c4@48 bb3@48 c4@48 bb3@48 c4]/8", E: "[~@47 bb3@48 c4@48 bb3@48 c4@48 bb3@48 ~]/6",
})).s("gm_string_ensemble_2").gain(0.19)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~ A B C D E F E G A B C D E F E G A B C D E F E G A B H D E F E G A B C D E I E J K I E J E F E G A B C D E F E G
>`.pickRestart({
  A: "~@12 ab4@4 ~@2 ab4@5 ~@13 ab4@6 ~@6",
  B: "~@12 [f3,f4]@2 ~@2 [f3,c4,f4]@2 ~@2 [f3,c4,f4]@2 ~@3 f4@23, ~@11 [db3,ab3,c4]@2 ~@2 [db3,ab3]@2 ~@2 [db3,ab3]@2 ~@2 db3@24 ~, ~@24 [f3,ab3,c4]@23 ~", // F F5 Dbmaj7 Db5 Fm
  C: "~@6 ab4@2 ~ ab4@2 ~@7 ab4@2 ~@4",
  D: "~@13 f4@2 ~ [db3,f3,ab3,c4,f4]@2 ~@3 f4 ~@3 f4@14 ~@9, ~@11 [db3,ab3]@3 ~@6 [db3,f3,ab3,c4]@2 ~@2 [db3,f3,ab3,c4]@15 ~@9, ~@6 [f3,c4] ~@17", // Dbmaj7 Db5 Dbmaj7 F5
  E: "~@12 ab4@4 ~@2 ab4@4 ~@14 ab4@5 ~@7",
  F: "~@13 f4@2 ~@2 f4@2 ~ [db3,f3,ab3] [c4,f4]@2 ~@2 f4@21 ~@2, ~@12 [db3,f3,ab3,c4]@2 ~@2 [db3,f3,ab3,c4]@2 ~@6 [db3,f3,ab3,c4]@21 ~@3", // Db F5 Dbmaj7
  G: "~@12 f4@2 ~@2 [f3,c4,f4]@2 ~@2 [db3,f3,ab3,c4,f4]@2 ~@2 [db3,f3,ab3,c4,f4]@19 ~@5, ~@11 [db3,f3,ab3,c4]@2 ~@2 [db3,ab3]@2 ~@31", // F5 Dbmaj7 Db5
  H: "~@3 ab4 ~@5 ab4 ~@2",
  I: "~@11 [db3,ab3,c4] ~ f4@2 [db3,ab3] ~ f4@2 [db3,ab3] [db3,f3,ab3,c4,f4] [c4,f4]@2 db3 ~ f4@23, ~@12 [db3,f3,ab3,c4,f4]@2 ~@2 [db3,f3,ab3,c4,f4]@2 ~@6 [db3,f3,ab3,c4]@23 ~", // Dbmaj7 Db5 Dbmaj7 F5 Dbmaj7
  J: "~@11 [f3,c4] ~ f4@2 [db3,ab3] [db3,f3,ab3,c4,f4]@2 ~@3 f4 ~@2 f4 f4@17 ~@6, ~@11 [db3,ab3]@3 ~@6 [db3,f3,ab3,c4,f4]@2 ~@2 [db3,f3,ab3,c4]@19 ~@5, ~@6 [f3,c4,f4] ~@17", // F5 Db5 Dbmaj7 Db5 Dbmaj7 F5
  K: "~@6 ab4@2 ~ ab4@2 ~@7 ab4@3 ~@3",
})).s("gm_acoustic_guitar_nylon").gain(0.3).pan(0.6)

// chords · epiano1
const epiano1 = note(`<
  ~ A B C D E F G@2 H I J K J L J M N I J K J L J M N I O K J L J M N I J K J L J P J L J P J L J M N I J K J L J M
>`.pickRestart({
  A: "[f3,c4,eb4,ab4]@3 [c3,g3,bb3,eb4]", B: "[db3,ab3,c4,f4]@3 [eb3,bb3,eb4,g4]",
  C: "~ ab4@34 ~ [c3,bb3,eb4]@12, [f3,c4,eb4]@35 g3@13", D: "[db3,ab3,c4,f4]@35 ~ [eb3,g4]@12, ~@35 [bb3,eb4]@13",
  E: "~ ab4@35 [c3,g3,bb3,eb4]@12, [f3,c4,eb4]@37 ~@11", F: "~ f4@35 [eb3,bb3,eb4,g4]@12, [db3,ab3,c4]@37 ~@11",
  G: "[[f3,c4,eb4,ab4]@36 [c3,g3,bb3,eb4]@11 ~ [db3,c4,f4]@36 ~ g4@11, ~@47 ab3@37 [eb3,bb3,eb4]@12]/2", // Fm7 Cm7 Dbmaj7 Eb5
  H: "[f3,c4,eb4,ab4]@3 [c3,eb4,g4,bb4]", I: "[db3,f4,ab4,c5]@35 ~ [eb3,eb4,g4,bb4]@12",
  J: "[f3,eb4,ab4,c5]@3 [c3,eb4,g4,bb4]", K: "~ c5@35 [eb3,eb4,g4,bb4]@12, [db3,f4,ab4]@35 ~@13",
  L: "[db3,f4,ab4,c5]@3 [eb3,eb4,g4,bb4]", M: "[db3,f4,ab4,c5]@36 [eb3,eb4,g4,bb4]@11 ~",
  N: "[f3,eb4,ab4]@3 [c3,eb4,g4,bb4]", O: "[f3,eb4,ab4,c5]!3 ~@9 [c3,eb4,g4,bb4]@4",
  P: "c5 c5@35 [eb3,eb4,g4,bb4]@12, [db3,f4,ab4]@35 ~@13", // Eb Db
})).s("gm_epiano1").gain(0.3)

// chords · pad halo
const pad_halo = note(`<
  ~@12 A B C ~ D E@2 F@2 G H I@2 ~ J K ~ L M N O ~@3 D E@2 F@2 G H I@2 P Q ~ R S T ~@6
>`.pickRestart({
  A: "~@36 [db4,bb4]@8 ~ [c4,ab4]@3", B: "[ab3,f4]@3 ~@33 [db4,bb4]@9 ~ ab4@2, ~@15 c4", C: "[ab3,f4] ~@11",
  D: "~@14 f2 ab2",
  E: "[bb2@3 ab2@3 bb2@3 ab2@3 bb2@2 ab2@3 ~ bb2@2 ab2@3 ~ bb2@6 c3@4 ~@8 f2@2 ab2@3 bb2@5 ~@2 bb2@3 ~@3 bb2@3 ab2@3 ~@3 c3@4 ~@5 c3@4 ~@2 bb2@3 ab2@2 ~ ab2@3 ~@3]/2",
  F: "[eb3@2 ~ [eb3,c4]@4 ~@2 c3@5 ~ f3@5 eb3@5 ~ [c3,ab3]@6 ~ [bb3,ab4]@3 ~@3 [bb2,bb3,ab4]@14 ~ [f2,f4]@31 ~@2 eb2@3 f2@3 ab2@3, c4 ~@8 ab3@3 ~@2 db4@3 ~@3 c4@3 ~@9 bb2@5 ~@59]/2", // Cm Fm Bb7 F
  G: "bb2 ~@2 bb2 ~@2 bb2 ~@2 bb2@2 ~@4 eb3@3 [db4,bb4]@6 [c4,ab4]@6 [ab3,f4]@9 f2@2 ~ ab2@3 f2@3", // Gb Fm Db
  H: "[ab2,c4]@3 [f2,db4]@3 ab2@3 f2@3 ab2@3 bb2@2 ~ c3@4 ~@2 c3@4 ~@20, ~@6 eb4@11 ab4@4 ~@2 ab4@14 ~@11", // Ab Db
  I: "[[eb3,c4] ~@2 [eb3,c4]@4 ~@2 c3@5 ~ f3@5 ~ eb3@5 c3@5 ~@2 bb3@3 ~@3 [bb2,bb3]@14 ~ [bb2,bb3]@5 ~ ab3@20 ~@16, ~@9 ab3@3 ~@2 db4@3 ~@3 c4@3 ~@3 ab3@3 ~@3 bb2@5 ~@22 ab2@20 ~@17]/2", // Cm Bb
  J: "eb4@3 c4@3 eb4@3 c4@3 eb4@3 f4@2 ~ f4@9 ~@21", K: "~@12 c4@4 ~@14 c4@5 ~@13", L: "~@36 c4@3 db4@3 eb4@5 ~",
  M: "eb4@5 ~ c4@11 ~@31", N: "db4@4 ~@2 c4@7 ~@9 db4@6 ~@8 c4@3 db4@3 eb4@5 ~", O: "eb4@5 ~ c4@15 ~@27",
  P: "[c4,ab4]@18 [ab3,f4]@5 ~@25", Q: "[c4,ab4]@3 [ab3,f4] ~@4",
  R: "~@3 f4@3 eb4@3 c4@3 eb4@3 f4@3 eb4@3 c4@3 eb4@3 f4@3 eb4@3 c4@3 eb4@3 f4@3 eb4@5 ~",
  S: "~@3 f4@3 [bb2,eb4]@3 [ab2,c4]@3 [bb2,eb4]@3 f4@3 bb2@8 ~ f4@2 ~ [bb2,eb4]@2 ~ ab2@2 ~ [bb2,eb4]@3 f4@3 [bb2,eb4]@6, ~@18 eb4@5 ~@9 c4@3 ~@13", // Eb5 Ab Eb5
  T: "~@6 bb2@2 ~ ab2@2 ~@8 db3@2 ~@3 eb3@2 ~@2 eb3@2 ~ eb3 ~ eb3@4 ~@11",
})).s("gm_pad_halo").gain(0.3)

// chords · pad halo · soft notes
const pad_halo_soft = note(`<
  ~@49
  [~ c3 ~@3 c3 ~@3 c3 ~@3 c3 ~@2]
  [~@3 c3@3 ~@5 bb2@2 ~ bb2 c3@2 ~ c3 ~@3 db3 ~@4 eb3 ~@11 eb3@2 ~ c3@3 bb2@3, ~@41 bb2@2 ~@5]
  [~@4 bb2@2 c3@2 bb2@3 ~@37, ~@3 eb3@2 ~@43]
  ~@5
>`).s("gm_pad_halo").gain(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@3 B A@3 B A@3 B A@3 B A@3 B A@6 C B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B
>`.pickRestart({
  A: "x ~@3 x!2 ~@2", B: "x ~@7 x ~ x ~@2 x ~@2", C: "x!3 ~@5 x ~ x ~@5",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!23 [~ x ~@2] [~ x ~ x]!32>").gain(0.72)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A B A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~@13 x ~@2", B: "x!3 ~@13",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~ x ~@55>").gain(0.4)

stack(
  recorder, bass, string_ensemble_2, acoustic_guitar_nylon, epiano1, pad_halo, pad_halo_soft, kick, snare, hihat,
  open_hat, crash
)

More by Usher