Strudelify

Want Ads

Honey Cone

KeyA♭ majorTempo104 bpm
0:00/0:00
// Want Ads — Honey Cone
// 104 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 2 "Clean Electric" electric guitar clean (copy of ch 4 "Honky Tonk Keys" piano)
// note: Full arrangement: all 67 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(104/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.

// bass · electric bass finger · "Fingered Bass"
const bass = note(`<
  A B C D A E F G F G H I J I H I K L K A F G F G H I J I H I K L K A F M F M N@2 B O D A E H I H I H I K@3 A F M F M F
  M F M F M F M
>`.pickRestart({
  A: "eb2 eb2@2 eb2 eb2@2 eb2 eb2@2 eb2 eb2@2 eb2@2 eb2@2", B: "~@3 ab2 ab2@4 ~@8",
  C: "~@3 db3!2 db3@2 db3!2 db3@2 db3 db3@2 db3@2", D: "~@3 bb2 bb2@4 ~@8", E: "ab2@3 g2@3 f2@10",
  F: "ab2@3 eb2@3 f2@3 c2@3 c2@2 c2@2", G: "db2@4 c2@3 bb1 bb1@2 eb2 eb2@2 eb2 eb2@2",
  H: "ab2@3 c3@3 f2@4 eb2 eb2@2 eb2 eb2@2", I: "db2@3 f2@3 bb1@4 eb2 eb2@2 eb2 eb2@2",
  J: "ab2@3 c3@3 f2@4 eb2 eb2@3 eb2@2", K: "bb1@2 bb1@2 c2@2 c2@2 db2@2 db2 ab1@2 db2 ab1@2",
  L: "bb1@2 bb1@2 c2@2 c2@2 db2@2 db2 ab1!2 db2 ab1@2", M: "db2@4 c2@3 bb1@3 eb2 eb2@2 eb2 eb2@2", N: "ab2!16",
  O: "~@3 db3!2 db3@2 db3@2 db3@2 db3 db3@2 db3@2",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · piano · "Honky Tonk Keys"
const piano = note(`<
  A B C D E F G H I J K L M N O P Q R S@2 G H T J K L U V O P W X Y@2 I Z AA J AB AC B C D AD AE AF AG AH AI AJ AK AL R
  AM@2 I AN AA AO I AN AA AO AP ~@3
>`.pickRestart({
  A: "[db4,f4,ab4] [db4,f4,ab4]@2 [db4,f4,ab4] [db4,f4,ab4]@2 [db4,f4,ab4] [db4,f4,ab4]@2 [db4,f4,ab4] [db4,f4,ab4]@2 [db4,f4,ab4]@2 [db4,f4]@2", // Db
  B: "ab4!2 ~ [c4,eb4,ab4] [c4,eb4,ab4]@4 ab4@2 f4@2 ab4!2 ab4@2", // Ab
  C: "f4@3 [db4,f4,ab4]!2 [db4,f4,ab4]@2 [db4,f4,ab4]@2 [db4,f4,ab4]@2 [db4,f4,ab4] [db4,f4,ab4]@2 [db4,f4]@2", // Db
  D: "c5 bb4 ab4 [db4,f4,bb4]!2 f4 c5@3 bb4 c5 bb4 ab4@3 f4", // Bbm
  E: "c5@2 bb4 ab4 ab4@2 ~ eb5@3 c5@2 bb4 ab4@3, db4, f4@3 f4@5",
  F: "[eb4,ab4]@3 [eb4,g4]@3 [f4,ab4]@2 [f4,ab4] f4!3 ab4!2 f4 eb4, c5@9 ~@7", G: "[c4,eb4,ab4]!2 ~ [c4,f4,ab4]@4 f4",
  H: "[db4,f4,ab4]@2 f4 [eb4,ab4]@2 f4@2 [db4,f4]@3 [db4,f4]!2 ab4!2 f4 eb4", // Db Ab5 Db
  I: "[eb4,ab4,c5]@2 bb4 ab4 ~@2 [c4,f4,ab4]@8 f4@2", J: "[db4,f4,ab4]@2 f4 [eb4,ab4]@2 f4@2 [db4,f4]@9",
  K: "~@2 c5 eb5@2 c5@2 c5@2 bb4@2 ab4@5, eb4, ab4@11 ~@5",
  L: "[db4,f4,bb4]@2 f4 [db4,f4,ab4]@2 ab4 f4 eb4 ~@2 [db4,f4,ab4]@6", // Bbm Db
  M: "~@2 f4@2 ab4@2 f4 c5@2 bb4 ab4 bb4 f4@4, [c4,eb4]", N: "f4@2 ~ c5@3 bb4 bb4@2 c5@3 ~@4, db4, ~ f4@7",
  O: "~@2 c5@2 eb5@3 eb5@2 f5@2 c5 ab4@4, eb4, ab4@3 ~",
  P: "[f4,bb4]@2 ~@2 ab4@2 ~ bb4@2 c5@3 ~@2 f4@2, db4, ~ f4@2 f4@4 ~", // Bb5
  Q: "bb4@2 bb4@2 c5@2 c5 ~@2 db5@3 ~@4, [db4,f4]@4 [eb4,g4]@3 db5@2 ~@7, ~ [f4,ab4]", // Db Eb Fm
  R: "bb4@2 bb4@2 c5@2 c5 ~ [f4,ab4]@8, [db4,f4]@4 [eb4,g4]@3 db5@9", // Fm Db Eb
  S: "[bb4@2 bb4@2 c5@2 c5 ~@2 bb4@3 ~@5 eb5!2 c5 eb5@2 f5 c5@3 f4!2 ab4!2 f4 eb4, [db4,f4]@4 [eb4,g4]@3 db5@2 ~@6 eb5@2 ~@15, ~ [f4,ab4] [f4,ab4] ~]/2", // Db Eb Fm
  T: "[eb4,ab4,c5] c5 ~ [c4,f4,ab4]@4 f4", U: "~@2 f4@2 ab4 db5@2 c5@2 bb4@2 bb4 f4@4, [c4,eb4]",
  V: "f4@2 ~@2 c5@2 bb4@2 bb4 ab4@2 bb4@2 c5@3, db4, ~ f4@7",
  W: "bb4@2 bb4@2 c5@2 c5 ~@2 db5@3 ~@2 f4@2, [db4,f4]@4 [eb4,g4]@3 db5@2 ~@7, ~ ab4, ~@4 f4@3 ~", // Db Eb
  X: "bb4@2 bb4@2 c5@2 c5 ~ f4@6 f4@2, [db4,f4]@4 [eb4,g4]@3 db5@9, ~ ab4", // Db Eb
  Y: "[bb4@2 bb4@2 c5@2 c5 ~@6 bb4@2 ~@2 eb5!2 c5 eb5@2 f5 c5@3 f4!2 ab4!2 f4 eb4, [db4,f4]@4 [eb4,g4]@3 db5@5 ~@3 eb5@2 ~@15, ~ [f4,ab4] [f4,ab4] ~]/2", // Db Eb Fm
  Z: "[db4,f4,ab4]@2 f4@2 [eb4,ab4]@2 f4 [db4,f4]@3 f4!2 ab4!2 f4 eb4", AA: "[eb4,ab4,c5]!2 ~ [c4,f4,ab4]@4 f4",
  AB: "[c4,eb4,ab4]@2 f4 ab4@2 f4 ~@2", AC: "~@2 ab4@2 ab4@2 f4 f4@2 ab4@3 ~@4",
  AD: "c5@2 bb4@2 ab4@2 ~ eb5@3 c5@2 bb4 ab4@3, db4, f4@3 f4@5",
  AE: "[eb4,ab4]@3 [eb4,g4]@3 [f4,ab4]@5 bb4 c5 eb5 c5 bb4, c5@11 ~@5", AF: "[eb4,ab4,c5]@12 ~ bb4@2 f4",
  AG: "[db4,f4,ab4]@6 [db4,f4,ab4]@4 [db4,f4,ab4] [db4,f4,ab4]@2 [db4,f4,ab4] [db4,f4,ab4]@2", // Db
  AH: "c5@10 eb5 c5@2 bb4 ab4@2, eb4, ab4@7 ~",
  AI: "bb4@2 ab4@2 ~@2 ab4@2 ~@2 [db4,f4,ab4] [db4,f4,ab4]@2 [db4,f4,ab4] [db4,f4,ab4]@2, db4 ~, f4!2 ~@2", // Db
  AJ: "[eb4,ab4,c5]@10 bb4@2 g4 f4 eb4@2", AK: "ab4@13 bb4 ab4@2, [db4,f4]",
  AL: "bb4@2 bb4@2 c5@2 c5 db5!2 db5@3 ~@4, [db4,f4] [eb4,g4] [f4,ab4]@2", // Db Eb Fm
  AM: "[bb4@2 bb4@2 c5@2 c5 ~@2 bb4@3 ~@2 bb4 ~@2 eb5!2 c5 eb5@2 f5 c5@3 f4!2 ab4!2 f4 eb4, [db4,f4]@4 [eb4,g4]@3 db5@2 ~@6 eb5@2 ~@15, ~ [f4,ab4] [f4,ab4] ~]/2", // Db Eb Fm
  AN: "[db4,f4,ab4]@2 f4@2 [eb4,ab4]@2 f4 [db4,f4]@3 [db4,f4]!2 ab4!2 f4 eb4", // Db Ab5 Db
  AO: "[db4,f4,ab4]@2 f4 [eb4,ab4]@2 [db4,f4]@2 [db4,f4]@3 f4!2 ab4!2 f4 eb4", // Db Ab5 Db
  AP: "[eb4,ab4,c5]@2 bb4 ab4 ~@2 [c4,f4,ab4]@8 ~@2", // Ab Fm
})).s("gm_piano").gain(0.28).pan(0.2)

// chords · piano · "Honky Tonk Keys" · soft notes · Db Ab5 Db Ab Fm Db Ab5 Db
const piano_soft = note(`<
  ~@63
  [~@7 f4]
  [[db4,f4,ab4]@2 f4@2 [eb4,ab4]@2 f4 [db4,f4]@3 [db4,f4]!2 ab4!2 f4 eb4]
  [[eb4,ab4,c5]!2 ~ [c4,f4,ab4]@4 f4]
  [[db4,f4,ab4]@2 f4 [eb4,ab4]@2 [db4,f4]@2 [db4,f4]@3 f4!2 ab4!2 f4 ~]
>`).s("gm_piano").gain(0.12).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  A B@3 C D E F G H I J K L I C M C A D I@2 G K N O C M B I P C I Q A M I C M I R S C T K G C I@2 B U V W X Y C Z AA C I
  M AB K I AC ~@2
>`.pickRestart({
  A: "x!2 ~ x!2 ~@3", B: "x ~@3 x ~@2 x", C: "x ~@2 x!2 ~@3", D: "~ x!2 ~ x!2 ~@2", E: "x ~ x ~@4 x!2 ~ x ~@3 x ~",
  F: "x ~@3 x!2 ~@2", G: "x!2 ~@2 x!2 ~@2", H: "x ~ x ~@4 x!2 ~@6 x", I: "x!2 ~@2 x ~@3", J: "x ~@7 x ~ x!2 ~@2 x!2",
  K: "x!2 ~@2 x ~@2 x", L: "x ~ x!2 ~@2 x ~ x ~@5 x ~", M: "x ~@2 x!2 ~@2 x", N: "x!2 ~ x ~@2 x ~ x ~@5 x ~",
  O: "x ~@3 x!2 ~ x", P: "x ~ x!2 ~@2 x ~@3 x ~@5", Q: "~@3 x ~@4", R: "x ~ x!2 ~@2 x ~ x ~ x ~@5",
  S: "x ~@7 x ~ x!2 ~@2 x ~", T: "~ x ~ x ~@4", U: "x ~ x ~@7 x!2 ~@4", V: "x!2 ~ x ~@2 x ~ x ~ x!2 ~@2 x!2",
  W: "x ~ x ~@5 x ~ x!2 ~@2 x!2", X: "x ~@2 x ~ x ~ x", Y: "~@4 x!2 ~@2", Z: "x ~ x!2 ~@2 x ~ x ~@2 x ~@2 x ~",
  AA: "~ x ~@2 x ~@3", AB: "x ~@5 x ~@3 x!2 ~@4", AC: "x",
})).gain(0.3)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@63 [~@6 x!2 ~@8] [~@2 x ~@3 x!3 ~@7] [x ~@2 x!2 ~@2 x] [x!2 ~@2 x ~@2 x]>")
  .gain(0.15)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@43 [~@3 x ~ x ~ x ~@2 x ~@4 x] ~@20 [~ x ~ x]!3>").gain(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@33 [~@3 x!3 ~ x!9] ~@33>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A B A ~ C A C A D E D A D A C A F ~ F A@2 G@2 H A@2 I J K A K ~ A C A L A M A M A ~ A N A@4 E@4 ~ A@6 E A O P ~@2
>`.pickRestart({
  A: "x!16", B: "x!5 ~ x!8 ~ x", C: "x ~ x!14", D: "x!8 ~ x!7", E: "x!8 ~@8", F: "x!13 ~@2 x", G: "x!6 ~ x!9",
  H: "x!10 ~@6", I: "x!2 ~ x!13", J: "x!7 ~ x!7 ~", K: "~ x!10 ~ x!4", L: "x!7 ~ x!8", M: "x!7 ~ x!4 ~ x!3",
  N: "x!5 ~ x!10", O: "x!3 ~ x ~ x ~ x!2 ~ x ~@2 x ~", P: "x ~ x ~@5 x ~@2 x ~@4",
})).gain(0.2)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@63 [~@3 x ~ x ~ x ~@2 x ~ x!2 ~ x] [~ x ~ x!5 ~ x!2 ~ x!4] [x!16] [x!15 ~]>")
  .gain(0.05)

// drums · mid tom
const mid_tom = s("mt").struct("<~@33 A ~@16 B C D E F ~@6 G ~@5>".pickRestart({
  A: "~ x!2 ~@13", B: "~@9 x ~@2 x!4", C: "~@12 x!2 ~@2", D: "~@3 x", E: "~@9 x ~ x!3 ~ x", F: "~ x!7 ~@8",
  G: "~@13 x!3",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~@2 B ~ B ~ C ~ C ~ C ~ B ~ D ~ D ~@2 E@2 ~@3 F G H ~ H ~@2 B ~ I ~ J ~ J ~@3 K ~@21
>`.pickRestart({
  A: "~@5 x ~@8 x ~", B: "~ x ~@14", C: "~ x", D: "~@13 x!2 ~", E: "~@3 x ~@4", F: "~ x ~@6", G: "~@7 x ~@7 x",
  H: "x ~@10 x ~@4", I: "~@7 x ~@8", J: "~@7 x ~@4 x ~@3", K: "~@5 x ~@10",
})).gain(0.25)

// drums · cowbell
const cowbell = s("cb").struct("<A@5 ~ A@13 ~ A@13 ~ A@9 ~ A@10 ~ A@12>".pickRestart({
  A: "x ~@2 x ~@4",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@6 A ~@5 A ~@7 A ~@5 A ~@7 A ~@9 A ~@6 A@5 ~@6 A ~@4>".pickRestart({
  A: "x",
})).gain(0.35)

stack(
  bass, piano, piano_soft, kick, kick_soft, snare, snare_soft, low_tom, hihat, hihat_soft, mid_tom, open_hat, cowbell,
  crash
)