Strudelify

At Seventeen

Janis Ian

KeyG majorTempo120 bpm
0:00/0:00
// At Seventeen — Janis Ian
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 118 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 · [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
const bass = note(`<
  ~ A@4 B@2 C@2 D E F G H I J@2 K@2 L@2 M@2 H N O@2 P@2 Q@2 R@2 S@2 T U V W X@2 B@2 C@2 D E F G H I J@2 K@2 L@2 M@2 H N
  O@2 P@2 Q@2 R@2 S@2 T U V W X@2 B@2 C@2 D E F G H I J@2 K@2 L@2 M@2 H N O@2 P@2 Q@2 R@2 S@2 T U V W X@2 Y@4 Z
>`.pickRestart({
  A: "[c3@3 c3 g2@3 c3@2 c3@2 g2 c3@2 c3 d3@4 d3 d3@3 g2@2 g2@2 g2@5]/4", B: "[c3@3 c3 c3@3 g3@3 g3 c3@2 e3@2 g3]/2",
  C: "[d3@3 d3 d3@3 d3@3 f3 a3@2 f3@2 a3]/2", D: "g3@3 g3 g3@3 d3", E: "g3 g3@2 d3@2 g3@2 d3", F: "c3@3 c3 c3@3 g3",
  G: "c3@2 c3 c3@3 g3@2", H: "c3@3 c3 c3@4", I: "g3@3 g3!2 e3 d3 g2", J: "[c3@3 c3 c3@3 c3@2 g3@2 c4@2 g3@2 c3]/2",
  K: "[d3@3 d3 d3@3 d3@2 d3@2 a3@2 d3@3]/2", L: "[g2@3 g2 g2@3 g2@2 g2@2 g2@2 d3@2 g2]/2",
  M: "[c3@3 c3 c3@3 c3@2 g3@2 c4@2 g3@3]/2", N: "g2 g2@2 d3@2 g2@3",
  O: "[d#3@3 d#3 d#3@3 d#3@2 a#3@2 d#4@2 a#3@2 d#3]/2", P: "[d3@3 d3 d3@3 g3@2 d3@2 g2@2 d3@2 g3]/2",
  Q: "[c3@3 c3 c3@3 f3@2 f3@2 f3@2 c3@3]/2", R: "[c3@3 c3 c3@3 f3@2 f3@2 c3@2 f3@3]/2",
  S: "[g#3@3 g#3 g#3@3 g3@2 g3@2 g3@2 g3@2 d3]/2", T: "c3@3 g3 c4@3 g3", U: "f3 f3@2 c4@2 f3@2 f3", V: "d3@3 d3 d3@4",
  W: "g2@3 g2 g2@3 g2", X: "[g2@3 g2 g2@3 g2@9]/2", Y: "[c3@3 c3 c3@3 c3@2 e3@2 g3@2 c3 g3@2]/2", Z: "c3",
})).s("gm_electric_bass_finger").gain(0.52)

// chords · piano
const piano = note(`<
  ~ A@4 B@2 C@2 D@3 E F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@2 R@4 B@2 C@2 D@3 E F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2
  N@2 O@2 P@2 Q@2 R@4 B@2 C@2 D@3 E F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@2 R@4 S@4 T
>`.pickRestart({
  A: "[c3@3 c3 g2@3 ~@2 c3@2 g2 c3@2 c3 ~@4 d3 d3@3 ~@2 g2@2 ~ [g3,b3,d4,f4,a4]@4, [c4,d#4,g4,a#4,d5] [e4,g4,c5] [e4,g4,b4,c5] [e4,g4,a4,c5] [f4,a4,c5,d5]@2 [f4,g4,b4,d5] ~, ~@7 c3@2 ~@6 d3@4 ~@4 g2@2 ~@2 g2@4 ~]/4", // G7 Cm7 C Cmaj7 Am7 Dm7 G7
  B: "[[c3,e4,g4,b4,c5,d5]@3 [c3,e4,g4,b4,c5,d5] [e4,g4,c5]@2 [e4,g4,c5] [g3,b4]@3 [g3,e4,g4,a4,c5] c3@2 e3@2 [g3,a3,c4,e4,g4], ~@4 c3@3 ~@4 [e4,g4,a4,c5]@4 ~]/2", // Cmaj7 C G Am7
  C: "[[d3,e4]@3 [d3,f4,c5,d5] [f4,c5,d5]@2 d4 [d3,c#4]@3 [f3,c4] a3@2 f3@2 [a3,g4], ~@4 d3@3 ~@4 [f4,a4,d5]@4 ~]/2", // Dsus2 Dm7 Dmaj7 F5 A7 Dm
  D: "[[f4,g4,b4,e5]@2 [f4,g4,b4,d5] g3 ~@2 [f4,a4,c5,d5] d3 g3 g3@2 [d4,f4,g4,b4] ~@2 [d4,f4,g4,b4] d3 ~@2 [e4,g4,c5] c3 c3@3 [g3,f4,a4,c5], g3@3 [f4,g4,b4,d5]@3 ~ [f4,a4,c5,d5]@4 ~ [d4,f4,g4,b4]@2 ~ [d4,f4,g4,b4]@3 ~ [e4,g4,c5]@4 ~, ~@4 g3@3 ~@4 d3@2 g3@2 ~ c3@3 ~@5]/3", // Em G7 Dm7 G7 C F G7 Dm7 …
  E: "[c3,e4,g4,b4,c5]@2 [c3,e4,g4,b4,c5] c3@3 ~ [e4,g4,a4,c5], ~@3 [e4,g4,a4,c5]@4 ~, ~@3 g3", // Cmaj7 Am7
  F: "[[c3,d4]@3 [c3,d4] [e4,g4,b4,c5]@3 [c4,e4,g4] ~ b4@2 g3!2 [e3,g4] d3 g2, ~@4 c3@4 g3@3 ~@5, ~@7 b4@2 ~@2 g4@2 ~ g4@2]/2", // Csus2 Cmaj7 C Em
  G: "[[c3,e4,g4,c5]@3 [c3,e4,g4,c5] [e4,g4,c5]@2 [e4,g4,c5] c3@2 ~ [e4,g4,c5] c4@2 g3@2 [c3,e4,a4,c5], ~@4 c3@3 [e4,g4,c5]@3 ~ [e4,g4,c5]@4 ~, ~@9 g3@2 ~@5]/2", // C Am C
  H: "[[d3,f4,a4,d5]@3 [d3,f4,a4,d5] [f4,a4,d5]@2 [f4,a4,d5] d3@2 ~ [f4,a4,d5] a3@2 ~@2 [f4,a4,d5], ~@4 d3@3 [f4,a4,d5]@3 ~ [f4,a4,d5]@4 ~, ~@9 d3@2 ~@2 d3@3]/2", // Dm
  I: "[[g2,f4,g4,b4,d5]@3 [g2,f4,g4,b4,d5] [f4,g4,b4,d5]@2 [d4,f4,a4,c5] g2@2 ~ [f4,g4,b4,d5] g2@2 d3@2 [g2,f4,g4,b4,d5], ~@4 g2@3 [d4,f4,a4,c5]@3 ~ [f4,g4,b4,d5]@4 ~, ~@9 g2@2 ~@5]/2", // G7 Dm7 G7 Dm7 G7
  J: "[[c3,e4,g4,c5]@3 [c3,e4,g4,c5] [e4,g4,c5]@2 [e4,g4,c5] c3@2 ~ [e4,g4,c5] c4@2 ~@2 [e4,a4,c5], ~@4 c3@3 [e4,g4,c5]@3 ~ [e4,g4,c5]@4 ~, ~@9 g3@2 ~@2 g3@3]/2", // C Am C
  K: "[[c3,d4]@3 [c3,d4] c4@3 ~ g2 [g2,b3]@2 [d3,a3]@2 a3 a3@2, ~@4 c3@4 ~@5 g2@3, ~@7 b3@2 ~@7]/2", // Csus2 G D5
  L: "[[d#3,d#4,g4,a#4]@3 [d#3,d#4,g4,a#4] [d#4,g4,a#4]@2 [d#4,g4,a#4] d#3@2 ~ [d#4,g4,a#4] ~@2 a#3@2 [d#3,d#4,g4,a#4], ~@4 d#3@3 [d#4,g4,a#4]@3 ~ [d#4,g4,a#4]@4 ~, ~@9 a#3@2 ~@5]/2", // D#
  M: "[[d3,d4,f4,a4,c5]@3 [d3,d4,f4,a4,c5] [d4,f4,a4,c5]@2 [d4,f4,a4,c5] g3@2 ~ [d4,f4,g4,b4] g2@2 d3@2 [g3,d4,f4,g4,b4], ~@4 d3@3 [d4,f4,a4,c5]@3 ~ [d4,f4,g4,b4]@4 ~, ~@9 d3@2 ~@5]/2", // Dm7 G7 Dm7 G7
  N: "[[c3,c4,d#4,g4,a#4]@3 [c3,c4,f4,g4,a#4] [c4,f4,g4,a#4]@2 [c4,f4,g4,a#4] f3@2 ~ [d#4,f4,g#4,c5] f3@2 ~@2 [d#4,f4,g#4,c5], ~@4 c3@3 [c4,f4,g4,a#4]@3 ~ [d#4,f4,g#4,c5]@4 ~, ~@9 f3@2 ~@2 c3@3]/2", // Cm7 Csus4 Fm7 Csus4 Fm7
  O: "[[c3,c4,d#4,g4,a#4]@3 [c3,c4,f4,g4,a#4] [c4,f4,g4,a#4]@2 [c4,f4,g4,a#4] f3@2 ~ [d#4,f4,g#4,c5] c3@2 ~@2 [d#4,f4,g#4,c5], ~@4 c3@3 [c4,f4,g4,a#4]@3 ~ [d#4,f4,g#4,c5]@4 ~, ~@9 f3@2 ~@2 f3@3]/2", // Cm7 Csus4 Fm7 Csus4 Fm7
  P: "[[g#3,d#4,g#4,c5]@3 [g#3,d#4,g#4,c5] [d#4,g#4,c5]@2 [d#4,g#4,c5] g3@2 ~ [d4,f4,g4,b4] g3@2 g3@2 [d3,d4,f4,g4,b4], ~@4 g#3@3 [d#4,g#4,c5]@3 ~ [d4,f4,g4,b4]@4 ~, ~@9 g3@2 ~@5]/2", // G# G7 G# G7
  Q: "[[c3,c4,d#4,g4,a#4]@3 [g3,c4,f4,g4,a#4] [c4,f4,g4,a#4]@2 [c4,f4,g4,a#4] g3 f3 ~ [d#4,f4,g#4,c5] c4@2 f3@2 [f3,d#4,f4,g#4,c5], ~@7 [c4,f4,g4,a#4]@3 ~ [d#4,f4,g#4,c5]@4 ~, ~@9 f3@2 ~@5]/2", // Cm7 Gm7 Csus4 Fm7 Csus4 Fm7
  R: "[[d3,d4,f4,a4,c5]@3 [d3,d4,f4,a4,c5] [d4,f4,a4,c5]@2 [d4,f4,a4,c5] ~@3 [d4,f4,a4,c5] g2 g2@3 g2 ~@2 [d4,f4,g4,b4] g2 g2@3 [d4,f4,g4,b4] [d4,f4,g4,b4] [d4,f4,g4,b4]@2 [d4,f4,g4,b4] [d4,f4,g4,b4]@3 [d4,f4,g4,b4], ~@4 d3@4 g2@3 ~@5 g2@3 ~@4 g2@9, ~@7 [d4,f4,a4,c5]@3 ~ [d4,f4,a4,c5]@4 [d4,f4,a4,c5]@3 ~ [d4,f4,g4,b4]@4 ~@9]/4", // Dm7 G7 Dm7 G7
  S: "[d5!3 [c3,d5] c5@2 c5 [c3,b4]@2 [e3,b4]@2 b4!2 [c3,c5] [g3,e5]@2, c3@3 ~ c3@3 ~@4 g3@2 ~@3]/2", // Csus2 Cmaj7 E5 C
  T: "[c3,c5,e5,g5,b5]", // Cmaj7
})).s("gm_piano").gain(0.44)

// other · trumpet
const trumpet = note(`<
  ~ A@4 ~@8 B@2 ~@8 B@2 C@2 D E F G F G H I J K L@2 M@2 N ~@7 B@2 ~@8 B@2 C@2 D E F G F G H I J K L@2 M@2 ~@8 B@2 ~@8
  B@2 C@2 D E F G F G H I J K L@2 O@2 P@4 Q
>`.pickRestart({
  A: "[~@2 g4@11 a4 c5 g4@2 c4 f4 g4@11 ~@2]/4", B: "[~@2 g4@3 g4 a4 c5@3 d4 g4@3 ~@2]/2",
  C: "[~@4 d#4 f4 g4 a#4@5 ~@4]/2", D: "~@2 g#4@4 g4 g#4", E: "d4 ~", F: "~@2 c4 d4 d#4 g4@3", G: "f4@2 g4 ~",
  H: "~@2 g#4 g4 f4@4", I: "~@2 g4 f4 d#4@4", J: "~ d#4@3", K: "f4 ~", L: "[~ f4@5 ~@2]/2",
  M: "[~ g4 g#4 c5 d5@5 d#5 d5 c5 d5 c5 g#4 d#4]/2", N: "g4 ~", O: "[~@2 g4@2 g#4@2 c5@2 d5@10 d5@4 d5 ~ b4@6 b4 ~]/2",
  P: "[d5@2 d5@2 d5@2 d5@2 d5@3 ~ c5@2 b4@4 b4@3 ~ b4 ~ b4@2 c5@2 e5@4]/2", Q: "g5",
})).s("gm_trumpet").gain(0.19)

// other · tenor sax
const tenor_sax = note(`<
  ~ A@4 ~@8 B@2 ~@8 B@2 C@2 D E F G F G H I J K L@2 M@2 N ~@7 B@2 ~@8 B@2 C@2 D E F G F G H I J K L@2 M@2 ~@8 B@2 ~@8
  B@2 C@2 D E F G F G H I J K L@2 O@2 P Q P Q R
>`.pickRestart({
  A: "[~@2 g4@11 a4 c5 g4@2 d4 f4 g4@11 ~@2]/4", B: "[~@2 g4@3 g4 a4 c5@3 d4 g4@3 ~@2]/2",
  C: "[~@4 d#4 f4 g4 d#5@5 ~@4]/2", D: "~@2 g#4@4 g4 g#4", E: "f4 ~", F: "~@2 c4 d4 d#4 g4@3", G: "f4@2 g4 ~",
  H: "~@2 g#4 g4 f4@4", I: "~@2 f4!2 d#4@4", J: "~ g4@3", K: "g#4 ~", L: "[~ g#4@5 ~@2]/2",
  M: "[~ g4 g#4 c5 d5@5 d#5 d5 c5 d5 c5 g#4 d#4]/2", N: "b4 ~", O: "[~ g4 g#4 c5 d5@5 d5@2 d5 d5@3 d5]/2",
  P: "g5@2 g5@2 g5@2 g5@2 g5@4 g5 ~ g5@2", Q: "~@2 g5@3 ~ g5 ~ g5@8", R: "e5",
})).s("gm_tenor_sax").gain(0.19)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~ A B C D E@2 F@2 G@3 H I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@4 R@2 Q@2 S@3 T E@2 F@2 U@3 H I@2 J@2 K@2 L@2 M@2 N@2 O@2
  P@2 Q@4 R@2 Q@2 S@3 T E@2 F@2 U@3 H I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@4 R@2 Q@2 S@3 V W@4 X
>`.pickRestart({
  A: "[c3,d#3,g3,a#3,d4] [e3,g3,c4]", B: "[e3,g3,b3,c4] [e3,g3,a3,c4]", C: "[f3,a3,c4,d4]",
  D: "[f3,g3,b3,d4] [g2,b2,d3,f3,a3]", // G7
  E: "[[e3,g3,b3,c4,d4]@3 d4 [g3,c4]@2 [e3,g3,c4] b3@3 [e3,g3,a3,c4] [e3,g3,a3,c4]@4 [a2,c3,e3,g3]]/2", // Em7 C5 C Am7
  F: "[e3@3 [f3,c4,d4] [f3,c4,d4]@2 d3 c#3@3 c3 [f3,a3,d4]@4 g3]/2", // Dm7 Dm
  G: "[[f3,g3,b3,e4]@2 d4 [f3,g3,b3,d4]@3 d4 [f3,a3,c4,d4]@4 b3 [d3,f3,g3,b3]@2 b3 [d3,f3,g3,b3]@3 c4 [e3,g3,c4]@4 c4]/3", // Em G7 Dm7 G7 C
  H: "[e3,g3,b3,c4]@2 c4 [e3,g3,a3,c4]@4 c4", I: "[d3@3 d3 [e3,g3,b3,c4]@3 b3@2 b3@2 g3@2 g3 g3@2]/2",
  J: "[[e3,g3,c4]@3 c4 [e3,g3,c4]@2 c4 [e3,g3,c4]@3 c4 [e3,g3,c4]@4 c4]/2", // C
  K: "[[f3,a3,d4]@3 d4 d4@2 d4 [f3,a3,d4]@3 d4 [f3,a3,d4]@4 d4]/2", // Dm
  L: "[[f3,g3,b3,d4]@3 d4 [f3,g3,b3,d4]@2 c4 [d3,f3,a3,c4]@3 d4 [f3,g3,b3,d4]@4 d4]/2", // G7 Dm7 G7
  M: "[[e3,g3,c4]@3 c4 c4@2 c4 [e3,g3,c4]@3 c4 [e3,g3,c4]@4 c4]/2", N: "[d3@3 d3 c3@3 b2@2 b2@2 a2@2 a2 a2@2]/2",
  O: "[[d#3,g3,a#3]@3 a#3 [d#3,g3,a#3]@2 a#3 [d#3,g3,a#3]@3 a#3 [d#3,g3,a#3]@4 a#3]/2", // D#
  P: "[[d3,f3,a3,c4]@3 c4 [d3,f3,a3,c4]@2 c4 [d3,f3,a3,c4]@3 b3 [d3,f3,g3,b3]@4 b3]/2", // Dm7 G7
  Q: "[[c3,d#3,g3,a#3]@3 a#3 [c3,f3,g3,a#3]@2 a#3 [c3,f3,g3,a#3]@3 c4 [d#3,f3,g#3,c4]@4 c4]/2", // Cm7 Csus4 Fm7
  R: "[[d#3,g#3,c4]@3 c4 c4@2 c4 [d#3,g#3,c4]@3 b3 [d3,f3,g3,b3]@4 b3]/2", // G# G7
  S: "[[d3,f3,a3,c4]@3 c4 [d3,f3,a3,c4]@2 c4 [d3,f3,a3,c4]@3 c4 [d3,f3,a3,c4]@4 [d3,f3,a3,c4]@3 b3 [d3,f3,g3,b3]@4 b3]/3", // Dm7 G7
  T: "b3 [d3,f3,g3,b3]@2 b3 [f3,g3,b3]@3 b3", // G7
  U: "[[f3,g3,b3,e4]@2 d4 [f3,g3,b3,d4]@3 d4 [f3,a3,c4,d4]@4 b3 [d3,f3,g3,b3]@2 [d3,f3,g3,b3] [d3,f3,g3,b3]@3 c4 [e3,g3,c4]@4 c4]/3", // Em G7 Dm7 G7 C
  V: "[d3,f3,g3,b3] [d3,f3,g3,b3]@2 [d3,f3,g3,b3] [d3,f3,g3,b3]@3 [d3,f3,g3,b3]", // G7
  W: "[d4!4 c4@2 c4 b3@2 b3@2 b3!2 c4 e4@2]/2", X: "[c4,e4,g4,b4]",
})).s("gm_acoustic_guitar_nylon").gain(0.22)

// drums · kick
const kick = s("bd").struct("<~ A@24 B@12 A@3 C A@20 B@12 A@3 C A@20 B@12 A@3 C B@4 C>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x!3 ~ x", C: "x",
})).gain(0.48)

// drums · snare
const snare = s("sd").struct("<~ A@39 ~ A@35 ~ A@35 ~ A@4 ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.48)

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

// drums · crash
const crash = s("cr").struct("<~@40 x ~@35 x ~@35 x ~@4 x>").gain(0.48)

// drums · ride
const ride = s("rd").struct("<~@5 [~ x] ~@112>").gain(0.48)

stack(bass, piano, trumpet, tenor_sax, acoustic_guitar_nylon, kick, snare, hihat, crash, ride)

More by Janis Ian