Strudelify

Lollipop

The Chordettes

KeyA♭ majorTempo127 bpm
0:00/0:00
// Lollipop — The Chordettes
// 127 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 76 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(127/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 · "ACOU BASS"
const bass = note(`<
  ~@11 A B C B C B C D A E F G H E F I J B C B C B C D K L M N O L M I@2 B C B C B C D A E F G H E F I J B C B C B C D A
  ~@7 P
>`.pickRestart({
  A: "~@3 eb3@2 db3@6 ~ c3@6 bb2@6", B: "ab2@7 ~@3 ab2@2 f2@9 ~@3", C: "bb2@4 ~ bb2 eb2@3 g2@3", D: "ab2 ~@3",
  E: "ab2@10 ~@2 db2@9 ~ g2@2", F: "ab2@8 ~@4 db2@9 ~@3", G: "ab2@10 ~@2 ab2@11 ~", H: "db2@11 ~ eb2@10 ~@2",
  I: "eb2@5 ~@19", J: "ab2@5 ~@7 eb2@11 ~", K: "~@3 eb3@2 db3@6 ~ c3@6 ab2@6", L: "db2@3 ~ db2@3 ~",
  M: "db2@10 ~@2 db2@9 ~@3", N: "ab2@11 ~ db2@11 ~", O: "ab2@11 ~ eb2@6 ab2@6", P: "~@4 ab2 ~@3",
})).s("gm_acoustic_bass").gain(0.45)

// chords · acoustic guitar steel · "+MANDOLIN"
const acoustic_guitar_steel = note(`<
  ~@12 A B A B A B C ~ D@2 E F D@2 G H A B A B A B C I J K L M N O P ~ A B A B A B C ~ D@2 E F D@2 G H A B A B A B C ~@9
>`.pickRestart({
  A: "[c4,eb4,ab4]@2 [c4,eb4,ab4] [c4,eb4,ab4]@3 [c4,f4,ab4]@2 [c4,f4,ab4] [c4,f4,ab4]@3", // Ab Fm
  B: "[db4,f4,ab4]@4 [db4,f4,ab4]@2 [db4,f4,ab4]@6 [bb3,eb4,g4]@3 ~ [bb3,eb4,g4]@2 [bb3,eb4,g4]@6", // Db Eb
  C: "[c4,eb4,ab4] ~@5", D: "[c4,eb4,ab4]@2 [c4,eb4,ab4] [c4,eb4,ab4]@3 [db4,f4,bb4]@2 [db4,f4,bb4] [db4,f4,bb4]@3",
  E: "[c4,eb4,ab4]@2 [c4,eb4,ab4] [c4,eb4,ab4]@3 [c4,eb4,ab4]@2 [c4,eb4,ab4] [c4,eb4,ab4]@3", // Ab
  F: "[db4,f4,bb4]@4 [db4,f4,bb4]@2 [db4,f4,bb4]@6 [bb3,eb4,g4]@3 ~ [bb3,eb4,g4]@2 [bb3,eb4,g4]@6", // Bbm Eb
  G: "[bb3,eb4,g4] ~@5", H: "[c4,eb4,ab4]@2 ~@4 [db4,f4,bb4]@2 [bb3,eb4,bb4] [bb3,eb4,g4]@3",
  I: "~@3 eb3@2 db3@6 ~ c3@6 ab2@6",
  J: "[f4,ab4,db5]@4 [f4,ab4,db5]@2 [f4,ab4,db5]@6 [f4,ab4,db5]@4 [f4,ab4,db5]@2 [f4,ab4,db5]!6", // Db
  K: "[f4,ab4,db5]@4 [f4,ab4,db5]@2 [f4,ab4,db5]@6 [f4,ab4,db5]!6 [f4,ab4,eb5] [f4,ab4,e5] [f4,ab4,f5] [f4,ab4,gb5] [f4,ab4,g5] [f4,ab4,ab5]", // Db Fm7 Fm
  L: "[c5,eb5,ab5]@4 [c5,eb5,ab5]@2 [c5,eb5,ab5]@6 [f4,ab4,db5]@4 [f4,ab4,db5]@2 [f4,ab4,db5]!2 [f4,ab4,f5] [f4,ab4,gb5] [f4,ab4,g5] [f4,ab4,ab5]", // Ab Db Fm
  M: "[c5,eb5,ab5]@2 [c5,eb5,ab5] [c5,eb5,ab5]@2 [c5,eb5,ab5] [c5,eb5,ab5]@2 [c5,eb5,ab5] [c5,eb5,ab5]@3", // Ab
  N: "[f4,ab4,db5]!6 [f4,ab4,db5]@6 [f4,ab4,db5]@4 [f4,ab4,db5]@2 [f4,ab4,db5]@3 [f4,ab4,db5]!3", // Db
  O: "[f4,ab4,db5]!2 [f4,ab4,db5]@2 [f4,db5]@2 [f4,db5]@4 [f4,ab4,db5]@2 [f4,ab4,db5]@4 [f4,ab4,db5]@2 [f4,ab4,db5]@2 [f4,ab4,db5]@2 [f4,ab4,db5]@2, ~@2 ab4@3 ~@7", // Db
  P: "[g4,bb4,eb5] ~@11", // Eb
})).s("gm_acoustic_guitar_steel").gain(0.25).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@10 A ~@7 A ~@15 A ~@15 A ~@15 A ~@9>".pickRestart({
  A: "~@3 x",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct("<~@12 A@6 ~@2 A@6 ~@2 A@6 ~@2 A@6 ~@2 A@6 ~@2 A@6 ~@2 A@6 ~@10>".pickRestart({
  A: "x ~@4 x!2 ~@4 x",
})).gain(0.72)

// drums · clap
const clap = s("cp").struct("<~@12 A@6 B ~ A@6 B@2 A@6 B ~ A@6 B@2 A@6 B ~ A@6 B@2 A@6 B ~@8 C>".pickRestart({
  A: "~ x ~ x", B: "x", C: "~ x",
})).gain(0.72)

// drums · rim
const rim = s("rim").struct("<A B A B A B A B A B C ~@57 A B A B A B D ~>".pickRestart({
  A: "x ~@2 x ~ x!2 ~@2 x ~ x", B: "x ~@2 x ~ x!2 ~ x!2 ~ x", C: "x ~ x!2 ~@8", D: "x",
})).gain(0.64)

stack(bass, acoustic_guitar_steel, kick, snare, clap, rim)