Strudelify

Johnny Angel

Shelley Fabares

KeyF majorTempo120 bpm
0:00/0:00
// Johnny Angel — Shelley Fabares
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 69 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 · [...]/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 · piano · "Unnamed-001"
const piano = note("<A B C@2 ~@65>".pickRestart({
  A: "bb3@2 d4@2 a4@2 g4@2 a4@2 g4@2 a4@3 ~", B: "g4@3 ~ d4@3 ~ f4@3 ~ e4@3 ~", C: "[g4@3 ~ f4@15 ~ d4@5 ~ g4@5 ~]/2",
})).s("gm_piano").gain(0.8)

// other · piano · "Unnamed-002"
const piano_2 = note(`<
  A@2 B@2 C D E@2 A@2 F@2 C D E@2 A@2 G@2 H@2 I J K@2 L@2 C D E@2 M@2 B@2 C D E@2 A@2 F@2 C D E@2 A@2 G@2 H@2 I J K@2
  L@2 C D E@2 M@2 N@3
>`.pickRestart({
  A: "[~@4 d4@15 ~ bb3@3 ~ d4@3 ~ c4@3 ~]/2", B: "[e4@3 ~@3 c4@5 ~@3 c4@4 c4@2 b3@5 ~ e4@5 ~]/2", C: "~@4 c4@11 ~",
  D: "~@4 d4@11 ~", E: "[~@4 d4@15 ~@3 bb3@9 ~]/2", F: "[e4@3 ~@3 a3@5 ~@3 a3@4 a3@2 bb3@11 ~]/2",
  G: "[e4@3 ~@3 c4@5 ~@3 d4@4 d4@2 c4@11 ~]/2", H: "[~@4 eb4@15 ~ eb4@7 ~@5]/2", I: "eb4@3 ~ d4@3 ~@9",
  J: "~@2 db4@2 d4@3 ~@9", K: "[~@4 f4@15 ~ f4@7 ~@5]/2", L: "[f4@3 ~ e4@3 ~ d4@3 ~ d4@7 ~ b3@7 ~ bb3@3 ~]/2",
  M: "[~@4 d4@15 ~ bb3@3 ~ d4@3 ~ c4@2 d4@2]/2", N: "[e4@3 ~@3 c4@5 ~@3 c4@4 c4@2 d4@5 ~ d4@9 ~@13]/3",
})).s("gm_piano").gain(0.72)

// other · synth strings 1 · "Unnamed-003"
const synth_strings_1 = note(`<
  A@2 B@2 C@2 D@2 E@2 F@2 C@2 D@2 E@2 G@2 H@2 I J K@2 L@2 C@2 D@2 M@4 C@2 D@2 E@2 F@2 C@2 D@2 E@2 G@2 H@2 I J K@2 L@2
  C@2 D@2 N@5
>`.pickRestart({
  A: "[~@4 bb3@15 ~ a3@3 ~ bb3@3 ~ bb3@3 ~]/2", B: "[bb3@3 ~@3 a3@5 ~@3 a3@4 a3@2 f3@5 ~ bb3@5 ~]/2", C: "~@4 a3@11 ~",
  D: "[~@4 bb3@15 ~@3 g3@9 ~]/2", E: "[~@4 bb3@15 ~ f3@3 ~ bb3@3 ~ bb3@3 ~]/2",
  F: "[bb3@3 ~@3 f3@5 ~@3 eb3@4 eb3@2 e3@11 ~]/2", G: "[bb3@3 ~@3 a3@5 ~@3 bb3@4 bb3@2 a3@11 ~]/2",
  H: "[~@4 c4@15 ~ c4@7 ~@5]/2", I: "c4@3 ~ bb3@11 ~", J: "~@4 bb3@11 ~", K: "[~@4 d4@15 ~ d4@7 ~@5]/2",
  L: "[d4@3 ~ c4@3 ~ bb3@3 ~ c4@7 ~@13]/2",
  M: "[~@4 bb3@15 ~ f3@3 ~ bb3@3 ~ bb3@7 ~@3 a3@5 ~@3 a3@4 a3@2 f3@5 ~ bb3@5 ~]/4",
  N: "[~@4 bb3@15 ~ f3@3 ~ bb3@3 ~ bb3@7 ~@3 a3@5 ~@3 a3@4 a3@2 bb3@5 ~ c4@9 ~@13]/5",
})).s("gm_synth_strings_1").gain(0.48)

// other · french horn · "Unnamed-004"
const french_horn = note(`<
  A@3 ~@3 B@2 A@3 ~@3 B@2 A@3 ~ C D ~@2 E F G H ~@2 B@2 A@3 ~@3 B@2 A@3 ~@3 B@2 A@3 ~ C D ~@2 E F G H ~@2 B@2 A@3 I@2
>`.pickRestart({
  A: "[~@12 f3@7 ~@9 c3@7 ~@13]/3", B: "[~@12 f3@7 ~@13]/2", C: "~@4 bb3@11 ~", D: "g3 a3 ~@6", E: "g3@3 ~ c4@11 ~",
  F: "a3 b3 ~@6", G: "~@4 g3@3 ~ f3@3 ~ f3@3 ~", H: "d3@3 ~ f3@7 ~ g3@3 ~", I: "[~@4 bb1@5 ~ c2@9 ~@13]/2",
})).s("gm_french_horn").gain(0.72)

// bass · slap bass 1 · "Unnamed-005"
const bass = note(`<
  A@3 B C D E@2 F@3 G C D E@2 H@3 I J@3 K L@4 C D E@2 M@3 B C D E@2 F@3 G C D E@2 H@3 I J@3 K L@4 C D E@2 M@3 N@2
>`.pickRestart({
  A: "[~@4 g2@5 ~ d3@2 g2@7 ~ g2@7 ~ c2@7 ~ f2@5 ~ a2@5 ~]/3", B: "c3@3 ~ g2@5 ~ c2@5 ~", C: "~@4 f2@5 ~ a2@5 ~",
  D: "c3@3 ~ d2@5 ~ a2@5 ~", E: "[d3@3 ~ g2@5 ~ d3@2 g2@7 ~ g2@5 ~ bb2@5 ~]/2",
  F: "[d3@3 ~ g2@5 ~ d3@2 g2@7 ~ g2@7 ~ c2@7 ~ f2@5 ~ gb2@5 ~]/3", G: "gb2@3 ~ g2@5 ~ c2@5 ~",
  H: "[d3@3 ~ g2@5 ~ d3@2 g2@7 ~ g2@7 ~ c2@7 ~ f2@5 ~ bb2@5 ~]/3", I: "bb2@3 ~ f2@5 ~ f2@5 ~",
  J: "[~@4 c3@5 ~ f3@9 ~ c3@7 ~ f2@7 ~ bb2@11 ~]/3", K: "f2@3 ~ bb2@11 ~",
  L: "[a2@3 ~ d3@5 ~ g3@9 ~ d3@7 ~ g2@7 ~ c3@3 ~ bb2@3 ~ a2@7 ~ g2@7 ~ c3@3 ~]/4",
  M: "[d3@3 ~ g2@5 ~ d3@2 g2@7 ~ g2@7 ~ c2@7 ~ f2@5 ~ a2@5 ~]/3", N: "[c3@3 ~ g2@5 ~ f2@21 ~]/2",
})).s("gm_slap_bass_1").gain(0.56)

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

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@5>".pickRestart({
  A: "~@4 x!2 ~@2",
})).gain(0.72)

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

stack(piano, piano_2, synth_strings_1, french_horn, bass, kick, snare, hihat, mid_tom, open_hat)