Strudelify
KeyF majorTempo70 bpm
0:00/0:00
// Wave — Patti Smith
// 70 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 51 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · acoustic bass
const bass = note(`<
  ~ A B C D E F G A H I J K G L M N O P C D E F G A C D E F G A H I J K G L M N O P C D E F G A@4 Q
>`.pickRestart({
  A: "f2@2 ~ bb2 bb2@2 ~ f2 f2@2 ~ bb2 bb2@2 ~ f2", B: "f2@2 ~ bb2 bb2@2 ~ f2!2 ~@2 bb2!2 ~@3",
  C: "f2@2 ~ c3 c3@2 ~ f2 db3@2 ~ ab2 ab2@2 ~ db3", D: "c3@2 ~ g2 g2@2 c3 g2 f2@2 ~ c3 c3@3 f2",
  E: "bb2@2 ~ f2 f2@3 bb2 bb2@2 ~ f2 f2@2 bb2 f2", F: "a2@2 ~ e2 e2@2 a2@2 d2@2 ~ a2 a2@2 ~ d2",
  G: "g2@2 ~ g2 g2@2 d2 ~ db2@2 ~ db2 c2@2 ~ c2", H: "f2@2 ~ c3 c3@2 ~ f2 db2@2 ~ db2 db2@2 ~ db2",
  I: "c2@2 ~ c2!2 ~ g2 ~ f2@2 ~ c3 c3@2 f2@2", J: "bb2@2 ~ f2 f2@2 bb2 f2 bb2@2 ~ f2 f2@2 bb2 ~",
  K: "a2@2 ~ e2 e2@2 a2 e2 d2@2 ~ d2!2 ~ a2@2", L: "f2@2 ~ bb2 bb2@3 f2 f2@2 ~ bb2 bb2@2 ~@2",
  M: "bb2@2 ~ f2 f2@2 ~ bb2 db3@2 ~ db3 db3@2 ~ db3", N: "c3@2 ~ c3 c3@2 ~ g2 c3@2 ~ c3 c3@2 g2 c3",
  O: "db3@2 ~ db3 db3@3 db3 b2@2 ~ b2 b2@2 ~ b2", P: "bb2@2 ~ bb2 bb2@3 bb2 c2@2 ~ c2!2 ~ c2 ~",
  Q: "f2@2 ~ bb2 bb2@2 ~ f2 f2@2 ~ bb2 bb2@2 ~@2",
})).s("gm_acoustic_bass").gain(0.57)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~ A B C D E F G H I J K L M N O P Q R C D E F G H C D E F G H I J K L M N O P Q R C D E F G H A S T@2
>`.pickRestart({
  A: "[ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,g4]!2 ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,g4] ~ [ab3,c4,g4]!2 ~", // Ab Abmaj7 Ab Abmaj7
  B: "[ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,g4]!2 ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,g4] ~ [ab3,c4,g4] [ab3,g4] ~", // Ab Abmaj7 Ab Abmaj7
  C: "[a3,c4,e4,g4] ~ [a3,c4,e4,g4] ~ [a3,c4,e4,g4]!2 ~ [g3,bb3,db4] ~ [g3,bb3,db4]@2 ~ [g3,bb3,db4] ~ [g3,bb3,db4] ~", // Am7 Gdim
  D: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] [bb3,eb4] ~ [a3,eb4,gb4] ~ [a3,eb4,gb4]@2 ~ [a3,eb4,gb4] ~ [a3,eb4,gb4] ~", // Eb Eb5 Ebdim
  E: "[bb3,d4,a4] ~ [bb3,d4,a4] ~ [bb3,d4,a4]!2 ~ [bb3,db4,g4] ~ [bb3,db4,g4]@3 [bb3,db4,g4] ~ [bb3,db4,g4] ~", // Bbmaj7 Gdim
  F: "[g3,d4,gb4] ~ [g3,d4,gb4] ~ [g3,db4,f4]!2 ~ [a3,c4,e4] ~ [a3,c4,e4]@2 ~ [a3,c4,eb4] ~ [a3,c4,eb4] ~", // Gmaj7 Gm7b5 Am Adim
  G: "[f3,a3,c4] ~ [f3,a3,c4] ~ [f3,g3,b3] [g3,b3] ~ [f3,ab3,b3,eb4] ~ [f3,ab3,b3,eb4]@2 ~ [e3,g3,bb3] ~ [e3,g3,bb3] ~", // F G7 G Fm7b5 Edim
  H: "[f3,ab3,eb4] ~ [f3,ab3,eb4] ~ [f3,bb3,d4]@2 [bb3,d4] [f3,ab3,eb4] ~ [f3,ab3,eb4] ~ [f3,bb3,d4]@3 [bb3,d4] ~", // Fm7 Bb Fm7 Bb
  I: "[a3,c4,g4] ~@2 [a3,c4,g4]!3 ~ [g3,bb3,db4] ~ [g3,bb3,db4]@3 [g3,bb3,db4] ~ [g3,bb3,db4] ~", // Am7 Gdim
  J: "[g3,bb3,eb4] ~ [g3,bb3,eb4] [bb3,eb4] ~ [g3,bb3,eb4] ~ [a3,eb4,gb4] ~ [a3,eb4,gb4] ~ [a3,eb4,gb4] [eb4,gb4] ~ [a3,eb4,gb4] ~", // Eb Eb5 Eb Ebdim Ebm Ebdim
  K: "[bb3,d4,a4] ~@2 d4 ~ [bb3,d4,a4] ~ [bb3,db4,g4] ~ [bb3,db4,g4]@2 ~ [bb3,db4,g4] ~ [bb3,db4,g4] ~, ~ [bb3,d4,a4] ~@6", // Bbmaj7 Gdim Bbmaj7
  L: "[g3,d4,gb4] ~ [g3,d4,gb4] [g3,db4,f4] ~ [g3,db4,f4] ~ [a3,c4,e4] ~ [a3,c4,e4] ~ [a3,c4,eb4]@2 ~ [a3,c4,eb4] ~", // Gmaj7 Gm7b5 Am Adim
  M: "[f3,a3,c4] ~ [f3,a3,c4] ~ [f3,g3,b3] [g3,b3] ~ [e3,ab3,b3,db4] ~ [e3,ab3,b3,db4]@2 ~ [e3,g3,bb3,db4] ~ [e3,g3,bb3,db4] ~", // F G7 G Dbm7 Edim
  N: "[f3,ab3,eb4] ~ [f3,ab3,eb4] ~ [f3,bb3,d4] [bb3,d4] ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] ~ [f3,bb3,d4]@3 [bb3,d4] ~, ~@11 e4 ~@4", // Fm7 Bb Fm7 Bb
  O: "[ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4]!2 ~ [g3,bb3,db4,f4] ~ [g3,bb3,db4,f4] ~ [g3,bb3,db4,f4] ~@2 [bb3,db4] ~, ~@13 [g3,bb3,db4,f4]@2 ~", // Db Gm7b5 Bbm Gm7b5
  P: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] [bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] [bb3,eb4] ~", // Eb Eb5 Eb Eb5
  Q: "[ab3,b3,eb4] ~ [ab3,b3,eb4] ~ [ab3,b3,eb4]!2 ~ [f3,ab3,b3,eb4] ~ [f3,ab3,b3,eb4] ~ [f3,ab3,b3,eb4] ~ [f3,ab3,b3,eb4]!2 ~", // Abm Fm7b5
  R: "[f3,ab3,db4] ~ [f3,ab3,db4] ~ [f3,ab3,db4] [ab3,db4] ~ [e3,ab3,db4] ~ [e3,ab3,db4] ~ [e3,ab3,db4] ~ [e3,ab3,db4] [ab3,db4] ~", // Db Db5 Dbm Db5
  S: "[ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,g4] [c4,g4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,g4] ~@2 c4 ~, ~@13 [ab3,c4,g4]@2 ~", // Ab Abmaj7 C5 Ab Abmaj7
  T: "[ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,g4] [c4,g4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,g4] ~ [ab3,c4,g4] [c4,g4] ~", // Ab Abmaj7 C5 Ab Abmaj7 C5
})).s("gm_acoustic_guitar_nylon").gain(0.32).pan(0.2)

// other · vibraphone
const vibraphone = note(`<
  ~@3 A B C D E F G H I J K L ~@4 A B C D E F A B C D E F G H I J K L ~@4 A B C D E F ~@4
>`.pickRestart({
  A: "~@3 a4 ~ e5 c5 a4 db5 ~@7", B: "c6 bb5 g5 ~ c5 ~@3 gb5 eb5 c5 a4 ~@4", C: "~@2 bb4 d5 f5 a5 ~@3 bb4 db5 f5 ~@4",
  D: "~@2 g4 d5 gb5 db5 f5 ~ e5 c5 e5 eb5 ~@4", E: "f4 a4 ~@2 g4 f4 d4 ~ db4 f4 ab4 ~ c4 e4 g4 ~",
  F: "f4 eb4 c4 eb4 bb4 ~ bb4 ~ f4 eb4 c4 eb4 bb4!3 ~", G: "~@3 [f4,a4,c5] e5 c5 a4 f4 db4 ~@7",
  H: "eb5 c5 bb4 g4 ~ eb5 c5 ~ gb5 eb5 c5 a4 ~ gb5 eb5 ~", I: "bb4 ~ d5 a5 ~@2 d5 a5 g5 ~@2 db5 ~ g5 db5 bb4",
  J: "~@3 g4 [db5,gb5] f5 ~@2 [c5,e5]!2 ~ [c5,eb5] ~ [c5,eb5] ~@2", // Gb5 C Cm
  K: "[f4,a4]!2 ~@2 [d4,f4]!2 ~@2 db4 f4 ab4 ~ c4 e4 g4 ~", L: "f4@2 ~ f4 bb3@2 ~@2 f4!2 ~ bb3 ~ bb3 ~@2",
})).s("gm_vibraphone").gain(0.25).pan(0.9)

// other · vibraphone · soft notes
const vibraphone_soft = note("<~@3 A B ~@5 C D E ~@6 A B ~@4 A B ~@5 C D E ~@6 A B ~@8>".pickRestart({
  A: "~@4 g5 ~@11", B: "~@3 eb5 ~@12", C: "~@15 a4", D: "~@5 bb4 ~@3 bb4 ~@6", E: "g4 ~@4 db5 ~@10",
})).s("gm_vibraphone").gain(0.15).pan(0.9)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x]!50>").gain(0.4)

// drums · rim
const rim = s("rim").struct("<~ [x ~@2 x ~@2 x ~@3 x ~@2 x ~@2]!46 [x ~ x ~@2 x ~ x ~ x ~ x!2 ~ x ~]!4>").gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  [x!4]
  [x!16]!14
  [~ x ~ x ~ x ~@2]!4
  [x!16]!18
  [~ x ~ x ~ x ~@2]!4
  [x!16]!6
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]!4
>`).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@15 [~@7 x]!4 ~@18 [~@7 x]!4 ~@6 [~ x ~ x ~ x ~ x]!4>").gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@15 [x!16]!4 ~@18 [x!16]!4 ~@10>").gain(0.5)

// drums · bongos
const bongos = s("bongo:18").struct("<~@47 [~ x ~@6]!4>").gain(0.78)

// drums · congas
const congas = s("conga:13").struct("<~@47 [~ x ~@3 x ~@2]!4>").gain(0.95)

// drums · congas
const congas_2 = s("conga:18").struct("<~@47 [~@2 x ~@8 x ~@4]!4>").gain(0.95)

// drums · congas
const congas_3 = s("conga:33").struct("<~@47 [~@6 x!2 ~@5 x!3]!4>").gain(0.95)

stack(
  bass, acoustic_guitar_nylon, vibraphone, vibraphone_soft, kick, rim, hihat, open_hat, ride, bongos, congas, congas_2,
  congas_3
)

More by Patti Smith