Strudelify

Afternoon Delight

Starland Vocal Band

KeyF majorTempo145 bpm
0:00/0:00
// Afternoon Delight — Starland Vocal Band
// 145 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(145/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 pick · "Base"
const bass = note(`<
  A@5 B C@2 B@2 C@4 D E C@2 F G B@2 C@2 B@2 C@2 B H I J@2 K L B@2 K L B@4 C@2 B@2 C@2 B H I J@2 K L B@2 K L B@2 K E M E
  K E M N B@2 C@2 B@2 C@2 B H I J@2 K L B@2 K L B@2 O P Q R@3 S T U@3 V W ~
>`.pickRestart({
  A: "[~@2 f2@31 ~ f2@31 ~ f1@7 ~ c2@6]/5", B: "~@2 f1@7 ~ c2@6", C: "~@2 g1@7 ~ d2@6", D: "~@2 c2@7 ~ c2@6",
  E: "~@2 bb1@7 ~ a1@6", F: "~@2 c2@7 ~ bb1@6", G: "~@2 a1@7 ~ g1@6", H: "~@2 f1@3 ~ c1@3 ~ f1@6", I: "~@2 c2@7 ~ a1@6",
  J: "~@2 d2@7 ~ a1@6", K: "~@2 g1@7 ~ a1@6", L: "~@2 bb1@7 ~ c2@3 ~ f1@2", M: "~@2 g1@7 ~ c2@6",
  N: "~@2 bb1@7 ~ a1@3 ~ g1@2", O: "~@2 g1@7 ~ g1@6", P: "~@2 bb1@7 ~ bb1@6", Q: "~@2 c2@7 ~ c1@6",
  R: "~@2 f1@7 ~ c1@6", S: "~@2 d2@3 ~ c2@3 ~ bb1@2 c2@2 d2@2", T: "e2@5 ~ c2@3 ~ bb1@2 c2@2 d2@2",
  U: "[e2@2 [g2,bb2]@7 ~ [g2,bb2]@23 ~ [g2,bb2]@3 ~ [g2,bb2]@2 [g2,bb2]@3 ~ [f2,c3]@2 [f2,c3]@2]/3", V: "~@5 c1 d1 f1",
  W: "~@2 bb1@2 a1@2 g1@3 ~ [f0,f1]@6", // F
})).s("gm_electric_bass_pick").gain(0.56)

// chords · acoustic guitar nylon · "Piano 1"
const acoustic_guitar_nylon = note("<A@2 B C@2 ~@100>".pickRestart({
  A: "[~ [f4,a4]@9 g4@8 bb4@8 a4@6, c4@5 ~@11]/2", B: "~ [bb4,d5]@9 f4@6, f4@5 ~@3",
  C: "[~ [bb4,d5]@9 f4@8 ~@14, f4@5 ~@11]/2", // Bb
})).s("gm_acoustic_guitar_nylon").gain(0.72)

// chords · piano · "Piano 1"
const piano = note("<~@29 A@2 B@7 C@2 ~@2 A@2 ~@5 D@8 E@4 ~ F@8 ~ A@2 ~@5 D@8 G@8 H@4 I J@6>".pickRestart({
  A: "[~@7 [c4,f4,a4]@2 ~@7]/2", // F
  B: "[~@3 [d4,f4,a4]@2 ~@2 [d4,f4,a4]@2 ~@2 [d4,f4,a4]@2 ~@2 [d4,f4,a4]@2 ~@2 [bb3,d4]@2 ~@2 [c4,e4,g4]@2 [d4,f4,c5]@2 [d4,f4,c5] [e4,g4,c5]@2 bb4 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [bb3,d4,f4]@2 ~@2 [c4,e4,a4]]/7", // Dm Bb C Dm7 C F Bb Am
  C: "[~ [d4,f4,c5]@2 [d4,f4,c5] c5@2 bb4 [c4,f4,a4]@3 g4 f4@2 ~@3, ~@4 [e4,g4]@3 ~@9]/2", // Dm7 F Em
  D: "[~ [c4,a4,c5]@4 [c4,g4,bb4] [f4,a4] [c4,g4,bb4]@2 [c4,g4,bb4]@2 ~@4 [c4,f4,a4]@2 [e4,g4,c5]@2 [e4,g4,c5] [e4,g4,db5]@2 [e4,g4,db5] [f4,a4,d5]@2 ~@2 [d4,f4,a4]@2 ~@2 [d4,f4,a4]@2 ~@2 [d4,f4,a4]@2 ~@2 [d4,f4,a4]@2 ~@2 [bb3,d4]@2 ~@2 [c4,e4,g4]@2 [d4,f4,c5]@2 [d4,f4,c5] [e4,g4,c5]@2 bb4 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]]/8", // F C7 F C7 F C Dbdim Dm …
  E: "[~@3 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [bb3,d4,f4]@2 ~@2 [c4,e4,a4]@2 [d4,f4,c5]@2 [d4,f4,c5] c5@2 bb4 [c4,f4,a4]@3 g4 f4@2 ~@3, ~@20 [e4,g4]@3 ~@9]/4", // F Bb Am Dm7 F Em
  F: "[~@3 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]]/8", // Dm Em Dm Em
  G: "[~@3 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [bb3,d4,f4]@2 ~@2 [c4,e4,a4]@2 [d4,f4,c5]@2 [d4,f4,c5] c5@2 bb4 [c4,f4,a4]@3 g4 f4@2 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 [g4,bb4,d5]@8 [e4,a4,c5]@8 [f4,bb4,d5]@7, ~@20 [e4,g4]@3 ~@41]/8", // F Bb Am Dm7 F Gm Am Bb …
  H: "[~ [e4,g4,c5]@8 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4]@2 f4@2 e4@2 d4 e4 f4]/4", // C F
  I: "g4@3 e4@2 e4 f4 g4",
  J: "[a4@2 c5@4 bb4@2 a4@2 bb4@2 c5@22 [f4,c5]@4 [f4,c5]@2 [f4,c5]@4 [f4,a4]@2 [f4,a4]@4 ~@8 c4@2 d4@2 f4@4 bb4@2 a4@2 g4@2 ~ [f4,a4]@9 ~@14, ~@36 c4@5 ~@7]/6", // F5 F
})).s("gm_piano").gain(0.72)

// chords · piano · "Piano 2"
const piano_2 = note(`<
  A B C D E@8 F@8 E@8 G@2 H@2 I J ~ K L J ~@3 M@8 G@2 H@2 I J ~ K L J ~@3 N O P Q R O P S@8 T@3 H@2 I J ~ K L J ~@3 U@5
  L V W X@4 ~@2
>`.pickRestart({
  A: "~@2 f4 c4 f4 ~ f4 c4", B: "f4 ~ f4 c4 f4 ~ f4 c4", C: "f4 ~ d4 bb3 d4 ~ d4 bb3", D: "d4 ~ d4 bb3 d4@3 ~",
  E: "[~@3 [f4,a4,c5]@2 ~@2 [c4,f4]@2 ~@2 [f4,a4]@2 ~@2 [c4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4,a4]@2 ~@2 [bb3,d4]@2 ~@2 [f4,a4]@2 ~@2 [c4,f4]@2 ~@2 [c4,f4]@2 ~@2 [c4,f4]@2 ~@2 [bb3,d4]@2 ~@2 [bb3,d4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]]/8", // F F5 F F5 Dm Bb F F5 …
  F: "[~@3 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]@2 ~@2 [e4,g4]]/8", // Dm Em Dm Em
  G: "[~ [c4,a4,c5]@4 [c4,g4,bb4] [f4,a4] [c4,g4,bb4]@2 [c4,g4,bb4]@2 ~@5]/2", // F C7 F C7
  H: "[~ [e4,g4,c5]@2 [e4,g4,c5] [e4,g4,db5]@2 [e4,g4,db5] [f4,a4,d5]@2 a4 f4 d4 f4 a4 f4 d4]/2", // C Dbdim Dm
  I: "f4 a4 f4 a4 f4 a4 f4 d4", J: "f4 ~@7", K: "~ a4 f4 c4 f4 g4 f4 c4", L: "f4 bb4 f4 c4 f4 a4 f4 c4",
  M: "[~@3 [f4,a4]@2 ~@2 [f4,a4]@2 ~@2 [f4,a4]@2 ~@2 [c4,f4]@2 ~@2 [bb3,d4]@2 ~@2 [bb3,d4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [f4,a4]@2 ~@2 [f4,a4]@2 ~@2 [f4,a4]@2 ~@2 [c4,f4]@2 ~@2 [bb3,d4]@2 ~@2 [bb3,d4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]]/8", // F F5 Bb Dm F F5 Bb Dm
  N: "~ bb4 g4 f4 d4 f4 d4 f4", O: "g4 bb4 g4 f4 d4 f4 d4 f4", P: "g4 bb4 g4 e4 c4 e4 c4 e4",
  Q: "g4!2 e4 c4 e4 g4 bb4 g4", R: "e4 bb4 g4 f4 d4 f4 d4 f4",
  S: "[g4!2 e4 c4 e4 [g4,bb4]@2 [e4,g4]@2 ~@2 [f4,a4]@2 ~@2 [f4,a4]@2 ~@2 [f4,a4]@2 ~@2 [c4,f4]@2 ~@2 [bb3,d4]@2 ~@2 [bb3,d4]@2 ~@2 [d4,f4]@2 ~@2 [d4,f4]@2 ~@2 [f4,a4]@2 ~@2 [f4,a4]@2 ~@2 [f4,a4]@2 ~@2 [c4,f4]@2 ~@2 [bb3,d4]@2 ~@2 [bb3,d4]]/8", // Gm Em F F5 Bb Dm F F5 …
  T: "[~@3 [d4,f4]@2 ~@2 [d4,f4]@2 [c4,a4,c5]@4 [c4,g4,bb4] [f4,a4] [c4,g4,bb4]@2 [c4,g4,bb4]@2 ~@5]/3", // Dm F C7 F C7
  U: "[~ d5@2 bb4@2 g4@2 d4@2 c5@2 a4@2 e4@2 c4@2 d5@2 bb4@2 f4@2 d4@2 c5@2 g4@2 e4@2 c4@2 a4 f4 c4 f4 g4 f4 c4]/5",
  V: "f4 f4@2 e4@2 d4 e4 f4", W: "g4@3 e4@2 e4 f4 g4",
  X: "[a4 c5@2 bb4 a4 bb4 ~@3 f4@8 [f4,c5]@2 [f4,c5] [f4,c5]@2 [f4,a4] [f4,a4]@2 ~@7, ~@6 c5@11 ~@15]/4", // F5 F
})).s("gm_piano").gain(0.56)

// chords · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  A@8 B@8 C@8 D@7 E@3 F G@2 H@2 I@8 J@3 ~@2 E@3 F G@2 K@8 L@4 M@6 N@5 E@3 F O@7 P Q R S@3 T U V ~@4
>`.pickRestart({
  A: "[~@34 bb4@31 ~ f4@31 ~ g4@30, ~@2 f4@63 ~@63]/8", B: "[~@2 f4@31 ~ g4@31 ~ g4@31 ~ c4@30]/8",
  C: "[~@2 g4@31 ~@17 [e4,g4]@15 ~ f4@31 ~ g4@30, ~@34 c4@31 ~@63]/8", D: "[~@2 f4@31 ~ g4@31 ~ f4@31 ~@15]/7",
  E: "[~@18 f4@15 ~ g4@7 ~ a4@6, ~@2 d4@31 ~@15]/3", F: "~@2 bb4@7 ~ c4@3 ~ f4@2", G: "[~ f4@15]/2",
  H: "[~ [bb3,d4,f4]@4 [c4,e4,a4]@4 [d4,f4,c5]@4 [e4,g4]@3]/2", // Bb Am Dm7 Em
  I: "[~@2 a4@15 ~ c5@15 ~ a4@32 [d4,g4,bb4]@32 [c4,a4]@30, ~ f4@63, ~ c4@32 ~@31]/8", // Gm F
  J: "[~@9 d5@8 ~@7, ~ [g4,bb4]@16 ~@7]/3", // Gm
  K: "[~@2 [bb3,d4,f4]@8 [c4,e4,a4]@8 [d4,f4,c5]@8 [e4,g4]@8 a4@15 ~ c5@15 ~ [d4,g4,bb4]@31 ~ [c4,e4,g4,bb4]@30, ~@34 f4@63 ~@31, ~@34 c4@31 ~@63]/8", // Bb Am Dm7 Em Gm C7
  L: "[~@2 [d4,f4,g4,bb4]@31 ~ [c4,e4,g4,bb4]@30]/4", M: "[~ [c4,f4,a4]@16 [d4,f4,g4,bb4]@16 [c4,f4,a4]@15]/6",
  N: "[~@18 d5@16 f4@31 ~@15, ~ [f4,g4,bb4]@16 ~@23]/5", // Gm7
  O: "[~@2 f4@31 ~ [bb3,d4,f4]@8 [c4,e4,a4]@8 [d4,f4,c5]@8 [e4,g4]@8 a4@15 ~ c5@15 ~ [g4,bb4,d5]@14, ~@66 [c4,f4]@31 ~@15]/7", // Bb Am Dm7 Em Gm F5
  P: "~ [e4,a4,c5]@7", Q: "~ [f4,bb4,d5]@7", R: "~ [e4,g4,c5]@7", S: "[~@2 [f4,a4]@31 ~ f4@14]/3", T: "~ g4@7",
  U: "~ c4@7", V: "~ f4@7",
})).s("gm_string_ensemble_2").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@4 [~@5 x ~@2]!15 ~ [~@5 x ~@2]!66 ~ [~@5 x ~@2]!15 ~@3>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct(`<
  A@14 B A@3 B C B A@12 B A@3 B A@16 B A@3 B A@21 B A@2 B A@2 C B A@14 D ~@2
>`.pickRestart({
  A: "~@3 x ~@3 x", B: "~ x ~ x ~@3 x", C: "~@3 x ~@2 x ~", D: "~ x ~@6",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 A B ~@7 B ~@6 C ~@7 C ~ D B ~@19 D B ~@34 C ~@9 C ~ D B ~@5>".pickRestart({
  A: "~@6 x!2", B: "x", C: "~@5 x!3", D: "~@7 x",
})).gain(0.48)

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

// drums · high tom
const high_tom = s("ht").struct("<~@3 A ~@7 B ~@7 A ~@28 C ~@20 C ~@7 D ~@8 A ~@18>".pickRestart({
  A: "~@3 x ~@4", B: "~@7 x", C: "~@3 x!2 ~@2 x", D: "~@5 x ~ x",
})).gain(0.48)

// drums · splash
const splash = s("cr").struct("<~@12 A ~@7 A ~@7 A ~ A ~@18 A ~ A ~@26 A ~@8 A ~@9 A ~ A ~@5>".pickRestart({
  A: "~ x ~@6",
})).gain(0.48)

stack(bass, acoustic_guitar_nylon, piano, piano_2, string_ensemble_2, kick, hihat, mid_tom, open_hat, high_tom, splash)