Strudelify
KeyB♭ minorTempo120 bpm
0:00/0:00
// Wonder — Natalie Merchant
// 120 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 118 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · overdriven guitar · "Elec. Guitar"
const overdriven_guitar = note(`<
  A B C D E B F@2 G ~@3 H ~@4 I J K L M J N O ~@3 H ~@4 I J K L M J N P ~@18 I J K L M J N P I J K L M J N P I J K L M J
  N P ~@22 I J K L M J N P I J K L Q
>`.pickRestart({
  A: "~@4 c5 bb4 ab4 f4", B: "f4 db4 f4 db4 eb4!2 db4 f4", C: "f4 db4!2 eb4 c4 db4!3", D: "c4 bb3 gb3@2 c4 db4 c4 db4",
  E: "db4 bb3!2 ab3 ab3@3 ~",
  F: "[f4@2 db4@2 db4@2 eb4@2 c4@2 db4@2 db4@2 db4@4 bb3@3 ~ bb3@2 gb3@2 bb3@2 gb3@2 bb3@2]/2",
  G: "bb4 f4 ab4 f4 gb4 f4!2 db4", H: "~@8 bb4@2 ab4@2 gb4 ab4 db5@2", I: "bb4@2 ab4 f4@2 db4@2 f4",
  J: "eb4@2 db4 f4@2 db4@2 eb4", K: "c4 db4@2 db4 c4 bb3 gb3@2", L: "c4 c4@2 db4@2 bb3@2 ab3",
  M: "ab3@3 ~ f4 db4 f4 db4", N: "c4@4 db4@2 db4@4 bb3@3 ~ bb3@2", O: "db4@6 ~@2 bb4@2 ~ ab4@2 gb4@2 ~",
  P: "bb4@3 ~ ab4@3 ~ gb4@3 ~ f4@3 ~", Q: "ab3@13 ~@3",
})).s("gm_overdriven_guitar").gain(0.12)

// chords · acoustic guitar nylon · "Ac. Guitar"
const acoustic_guitar_nylon = note(`<
  ~ A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 D E F C D E F C F C F C F C F C F C
  A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 D E F C D E F C F C F C F C F C F C F C F C A B C@2 A B C@2 A B C@2 G
>`.pickRestart({
  A: "[db4,f4,ab4]@3 ~ [ab3,c4,eb4]@3 ~", B: "[bb3,db4,f4]@3 ~ [ab3,c4,eb4]@3 ~",
  C: "[gb3,bb3,db4]@3 ~ [gb3,bb3,db4]@3 ~", D: "[bb3,eb4,gb4]@3 ~ [bb3,eb4,gb4]@3 ~",
  E: "[f3,ab3,db4,eb4]@3 ~ [f3,ab3,db4,eb4]@3 ~", F: "[bb3,db4,f4]@3 ~ [bb3,db4,f4]@3 ~", G: "[gb3,bb3,db4]@13 ~@3",
})).s("gm_acoustic_guitar_nylon").gain(0.48)

// chords · piano
const piano = note(`<
  ~ A@4 B@2 C D ~@8 A@8 ~@8 A@8 E F G H E F G H I J I J I J I J I J A@24 E F G H E F G H I J I J I J I J I J I J I J
  A@12 K
>`.pickRestart({
  A: "[[ab3,db4,f4]@3 ~ [ab3,db4,f4]@3 ~ [ab3,c4,eb4]@2 [ab3,c4,eb4]@3 ~ [bb3,db4,f4]@8 ~@2 [ab3,c4]@2 db4@3 ~ [gb3,bb3,db4]@8 ~@2 c4@2 db4@3 ~ [gb3,bb3,db4]@8 ~@4 gb3@2 bb3@2 db4@2]/4", // Db Ab Bbm Ab Gb
  B: "[[ab3,db4,f4]@3 ~ [ab3,db4,f4]@3 ~ [ab3,c4,eb4]@2 [ab3,c4,eb4]@3 ~ [bb3,db4,f4]@8 ~@2 [ab3,c4]@2 db4@5 ~]/2", // Db Ab Bbm Ab
  C: "[gb3,bb3,db4]@13 ~@3", D: "db4@13 ~@3", E: "[bb3,eb4,gb4]@3 [eb4,gb4,bb4]@2 [bb3,eb4,gb4]@3",
  F: "[ab3,db4,f4]@5 ~ [db4,f4,ab4]@4 [ab3,db4,f4]@6", G: "[bb3,db4,f4]@5 ~ [db4,f4,bb4]@4 [bb3,db4,f4]@5 ~",
  H: "[gb3,bb3,db4]@5 ~ [bb3,db4,gb4]@4 [gb3,bb3,db4]@5 ~", // Gb
  I: "[bb3,db4,f4,bb4]@3 ~ [bb3,db4,f4,bb4]@3 ~ [bb3,db4,f4,bb4]@3 ~ [bb3,db4,f4,bb4]@3 ~", // Bbm
  J: "[bb3,db4,gb4,bb4]@3 ~ [bb3,db4,gb4,bb4]@3 ~ [bb3,db4,gb4,bb4]@3 ~ [bb3,db4,gb4,bb4]@3 ~", // Gb
  K: "[gb3,bb3,db4,gb4]@13 ~@3", // Gb
})).s("gm_piano").gain(0.48)

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~ A@8 B C D@2 B C D@2 A@8 B C D@2 B C D@2 A@8 E F G H E F G H I J I J I J I J K L A@24 E F G H E F G H I J I J I J I J
  I J I J K L A@12 D
>`.pickRestart({
  A: "[db3@6 ~@2 c3@2 c3@3 ~ bb2@7 ~ bb2@2 ab2@2 ab2@3 ~ gb2@5 ~ gb2@3 ~ gb2@2 gb2@3 ~ gb2@7 ~ gb2@2 gb2@6 ~@2]/4",
  B: "db3@6 ~@4 c3@5 ~", C: "bb2@6 ~@4 ab2@5 ~", D: "gb2@13 ~@3", E: "eb2@5 ~ gb2@6 eb2@3 ~",
  F: "db2@5 ~ eb2@6 db2@3 ~", G: "bb1@5 ~ db2@6 eb2@3 ~", H: "gb2@5 ~ gb2@6 f2@3 ~", I: "bb1!6 db2 eb2",
  J: "gb2!6 eb2 db2", K: "bb1!8", L: "gb2!8",
})).s("gm_acoustic_bass").gain(0.48)

// drums · kick
const kick = s("bd").struct("<~ [x ~@3 x!2 ~@2]!48 [x!8]!8 [x ~@3 x!2 ~@2]!34 [x!8]!12 [x ~@3 x!2 ~@2]!14 x>")
  .gain(0.34)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!116 x>").gain(0.34)

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

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

stack(overdriven_guitar, acoustic_guitar_nylon, piano, bass, kick, snare, hihat, open_hat)