Strudelify

Summertime

Jeff

KeyG minorTempo96 bpm
0:00/0:00
// Summertime — Jeff
// 96 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 82 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(96/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.

// chords · brass section
const brass_section = note(`<
  ~@2 A@3 ~ B@4 C ~@11 D@4 E@6 F@3 ~@2 G ~@7 H ~@4 I@2 J@4 K@3 ~@11 L@2 M@4 N@4 O@2
>`.pickRestart({
  A: "[c4 g5@53 ~@18]/3",
  B: "[~@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 f5@6 d5@3 g5@9 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@9 g5@6 d5@3 g5@3]/4", // Dm Eb F Eb F Gm F Dm …
  C: "f5@3 ~@5",
  D: "[~@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 g5@6 f5@3 ~@9 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@3 g5@2 a5 ~@2 bb5 ~@2 a5 ~@2 g5 ~@2 f5 ~@2 g5, ~@45 g5@11 ~@40]/4", // Dm Eb F Eb F Gm F Dm …
  E: "[~@2 f5 d5@3 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 g5@5 f5@3 d5 ~@2 f5@5 ~@2 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@9 f5@5 g5@4 d5@7 ~@2 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 d6@2 c6 ~@2 c6 ~@2 bb5 ~@2 c6]/6", // Dm Eb F Eb F Gm F Dm …
  F: "[~@2 bb5 g5@3 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@8 g5 ~@2 a5 ~@2 bb5 ~@2 f5 ~@2 f5@5 ~@20]/3", // Dm Eb F Gm Dm
  G: "~ bb4@3 f4@2 d4@2", H: "~ bb4@3 f4@4",
  I: "[~@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 g5@6 d5@3 g5@3]/2", // Dm Eb F Eb F Gm F
  J: "[f5@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@3 g5@2 bb5 ~@2 c6 ~@2 bb5 ~@2 c6 ~@2 bb5 ~@2 c6@3 bb5 g5@3 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 g5@6 d5@3 g5@3]/4", // Dm Eb F Gm Dm Eb F Eb …
  K: "[f5@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@9 eb6@2 d6 ~@2 c6 ~@2 bb5 ~@2 c6@3 bb5 g5@6 ~@15]/3", // Dm Eb F Gm Dm
  L: "[~@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 bb4@2 a4 ~@2 f4@5 ~@2]/2", // Dm Eb F Eb F Gm F
  M: "[~@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@9 d6@2 c6 ~@2 c6 ~@2 bb5 ~@2 c6@3 bb5 g5@3 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 g5@6 d5@3 g5@3]/4", // Dm Eb F Gm Dm Eb F Eb …
  N: "[f5@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@8 g5 ~@2 g5 ~@2 g5 ~@2 f5 ~@2 g5@3 bb5@4 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5]@3 [f4,f5,a5]@2 ~@8 bb5@2 a5 ~@2 f5@5 ~@2]/4", // Dm Eb F Gm Dm Eb F Eb …
  O: "[~@6 [d4,d5,f5]@2 [eb4,eb5,g5] ~@2 [eb4,eb5,g5] ~@2 [f4,f5,a5] ~@2 [g4,g5,bb5] ~@2 [d4,d5,f5] ~@2 [d4,d5,f5]@4 ~@21]/2", // Dm Eb F Gm Dm
})).s("gm_brass_section").gain(0.43)

// bass · acoustic bass
const bass = note(`<
  ~@2 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C E A B C D A B C D A
  B C D A B C D A B F D A B C D A B C D A B C G
>`.pickRestart({
  A: "c2@10 ~ c2 c2@2 ~ c2@5 bb1@4", B: "d2@11 f2 g2@2 d2 g1@5 g1@4", C: "c2@11 c2 c2@2 ~ c2@5 bb1@4",
  D: "d2@11 f2 g2@2 d2 g1@5 bb1@4", E: "d2@11 d2 f2@2 f2 ~ g2@5 ~@3", F: "c2@13 ~@10 bb1",
  G: "d2@11 f2 g2@2 d2 g1@5 ~@4",
})).s("gm_acoustic_bass").gain(0.6)

// chords · epiano2
const epiano2 = note(`<
  ~@2 A B C B D B D B D B D B E F E F D B D B D B D B D B D B D B D B D B D B E G@2 F E G@2 F E F E H D B D B D B D B E
  G@2 F E G@2 F D B D B D B D B D B D B D B D I
>`.pickRestart({
  A: "~@3 bb4@5, [eb3,g3,bb3,c4,d4,g5], ~ eb5@7, ~ d5@3", B: "[a3,c4,d4,f4,g4]@3 [a3,c4,d4,f4,g4]",
  C: "~@5 g6@3, [eb3,g3,bb3,c4,d4]", D: "[eb3,g3,bb3,c4,d4]", E: "[g3,bb3,c4,d4,eb4]",
  F: "[c4,d4,f4,g4,a4]@3 [c4,d4,f4,g4,a4]", G: "[g4@11 ~ [bb3,c4]@12, [c4,d4,f4,a4]@23 [d4,eb4]@25, ~@11 g4@2 ~@11]/2",
  H: "[c4,d4,f4,g4,a4]", I: "[a3,c4,d4,f4,g4]@3 ~",
})).s("gm_epiano2").gain(0.24)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@2 A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A D A B A C A B A C A
  B A C A B A C A B ~@2 A B A C A B A C A B A E
>`.pickRestart({
  A: "[eb3,g3,bb3,d4]@2 [eb3,g3,bb3,d4] [eb3,g3,bb3,d4]@2 [eb3,g3,bb3,d4] [eb3,g3,bb3,d4]@2 [eb3,g3,bb3,d4] ~@5 [bb3,d4,eb4,g4] ~@2 [bb3,d4,eb4,g4] [bb3,d4,eb4,g4]@2 [bb3,d4,eb4,g4] ~@3", // Ebmaj7
  B: "[a3,c4,d4,f4]@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] ~@5 [a3,c4,d4,f4] ~@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] ~@3", // Dm7
  C: "[a3,c4,d4,f4]@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] ~@5 [a3,c4,d4,f4] ~@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4]!2 ~@2", // Dm7
  D: "[a3,c4,d4,f4]@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] ~@15", // Dm7
  E: "[a3,c4,d4,f4]@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] [a3,c4,d4,f4]@2 [a3,c4,d4,f4] ~@5 [a3,c4,d4,f4] ~@9", // Dm7
})).s("gm_electric_guitar_clean").gain(0.24).pan(0.4)

// other · tenor sax
const tenor_sax = note(`<
  ~@2 A@3 ~@5 B C D E F G H I J K L M ~ N ~@3 O@2 ~@2 N ~ P Q R S T U V W X Y Z AA AB AC AD AE AF ~ N ~@2 O@2 ~@2 AG AH
  AI AJ AK AL AM AN AO AP AQ AR ~ N ~@2 O@2 ~@3 N ~@2
>`.pickRestart({
  A: "[~ f4@53 ~@18]/3", B: "g3@2 ~ g3@2 ~ g3@2 ~ g3 ~ g3 g3@2 a3 bb3@2 c4 db4@2 d4 ~@2 g3",
  C: "g3 ~@2 g3 ~@2 g3@3 ~@2 g3!2 ~@2 g3 ~@2 g3 ~ g3 ~@3",
  D: "c4 ~ g3!2 ~ g3!2 ~ g3 g3@2 ~ g3 ~@2 g3 ~ g3 ~@2 g3 ~@2 g3",
  E: "g3 ~@2 g3@2 c4@2 ~ g3@2 ~ g3!2 ~@2 g3 ~ g3 ~@2 g3 ~@2 g3",
  F: "c4 ~ g3!2 ~ g3!2 ~ g3!2 ~@2 g3 ~ g3 ~@2 g3@2 ~ g3!2 ~@2", G: "g3 ~@2 g3 ~@2 g3 ~ g3 ~@2 g3 ~@2 g3 ~@2 g3 ~@5 g3",
  H: "c4 ~@2 g3 ~@2 g3 ~ g3 ~@2 g3 ~@2 g3!2 ~ g3 g3@2 ~@4", I: "c4 ~ g3!2 ~ g3!2 ~@2 g3 ~@2 g3 ~ g3 ~@2 g3!2 ~@5",
  J: "c4 ~ g3!2 ~@2 g3@2 ~@3 g3!2 ~ g3!2 ~@2 g3@2 c4 ~@3", K: "d4@2 g3 ~@2 c4@2 ~ g3!2 ~ g3!2 ~ g3!2 ~ g3!2 ~ g3 ~@3",
  L: "c4@2 g3 ~@2 bb3@2 ~ g3 ~@2 g3!2 ~ g3 g3@2 ~ g3@2 bb3 ~@2 g3",
  M: "c4@2 g3 ~@2 bb3@2 ~ g3 ~@2 g3 ~@2 g3 ~@2 g3@3 ~@4", N: "~@6 bb3 ~@2 g3 ~@2 g3 ~ g3!2 ~ g3 g3@2 ~@4",
  O: "[~@8 d4@5 ~ c4@2 ~ bb3@2 ~ g3@7 ~@21]/2", P: "~@23 bb3",
  Q: "c4 ~ bb3!2 ~ bb3!2 ~ bb3!2 ~ bb3!2 ~ bb3 ~@2 bb3 ~@5 bb3",
  R: "c4@2 bb3 ~@2 bb3 ~@2 bb3 ~@2 bb3 c4 ~ bb3 c4 ~ c4!2 ~@4 bb3",
  S: "d4 ~ bb3!2 ~ bb3!2 ~ bb3!2 ~ bb3!2 ~ bb3!2 ~ bb3!2 ~@5",
  T: "bb3 ~@2 bb3 ~@2 bb3 ~ bb3 ~@2 bb3 c4@2 bb3 ~@2 bb3@2 ~ bb3 ~@2 bb3",
  U: "c4 ~ bb3!2 ~ bb3!2 ~ bb3!2 ~ bb3!2 ~ bb3 ~@2 bb3 ~@2 bb3 d4 ~ d4",
  V: "c4 ~ bb3 ~@2 bb3@2 ~@2 bb3 ~ bb3!2 ~ bb3 ~@2 bb3 ~@6", W: "bb3 ~ bb3 ~@2 bb3@4 ~@2 bb3!2 ~ bb3!2 ~ bb3 ~@5 bb3",
  X: "c4@2 bb3@2 ~ bb3 ~@2 bb3 ~@2 bb3!2 ~ bb3!2 ~ bb3 ~@6",
  Y: "d4@2 bb3 ~@2 bb3 ~@2 bb3!2 ~ bb3!2 ~ bb3!2 ~ bb3 ~@5 bb3", Z: "c4 ~ bb3!2 ~ bb3 ~@2 bb3@4 d4@2 bb3 ~@2 bb3@2 ~@5",
  AA: "c4 ~ bb3!2 ~@2 bb3@3 c4 ~@2 c4 ~ bb3!2 ~@2 bb3@2 ~@4",
  AB: "c4 ~ bb3 ~@2 bb3@2 ~ bb3@2 ~ bb3!2 ~ bb3 ~@2 bb3 ~@5 bb3",
  AC: "c4@3 g3 ~@2 g3@2 ~ g3 ~ g3!2 ~ g3!2 ~ g3!2 ~ g3 ~@2 g3",
  AD: "bb3 ~ bb3 ~@2 bb3@3 ~ bb3@2 ~ c4@2 g3 ~@2 g3@2 ~@4 g3",
  AE: "bb3 ~ bb3!2 ~@2 bb3@3 ~@2 bb3!2 ~ bb3 ~@2 bb3!2 ~ bb3 ~@2 bb3", AF: "c4 ~ c4!2 ~ c4!2 ~ c4 ~@6 c4 ~@2 c4@2 ~@4",
  AG: "c4@2 ~ g3@2 ~ g3 ~ g3 ~@2 g3!2 ~ g3!2 ~ g3@2 ~ d4@4", AH: "g3@2 ~ g3 ~@2 g3 ~ g3 ~@2 g3!2 ~ g3!2 ~ g3!2 ~@5",
  AI: "g3@2 ~ g3 ~@2 g3 ~ g3@2 ~ g3!2 ~ g3 ~@2 g3 ~@6",
  AJ: "d4 ~ db4 c4 ~ bb3 g3 ~ g3 ~@3 g3 ~ bb3 g3 ~ bb3 g3@2 ~@3 g3",
  AK: "bb3 ~ g3!2 ~ g3!2 ~ g3 ~@3 g3 ~ g3!2 ~ g3!2 ~ g3 ~@2 g3", AL: "bb3 ~ g3!2 ~ g3!2 ~ g3 ~@3 g3@2 g3 ~@2 g3@5 ~ g3",
  AM: "bb3 ~ g3 bb3@2 ~ bb3 ~ bb3 ~@2 g3 bb3 ~ bb3 ~@2 bb3@3 ~ g3 ~ g3",
  AN: "bb3@2 ~ g3 ~ g3 g3@2 ~ g3 ~ g3 bb3@2 g3@2 ~ g3 ~@5 g3",
  AO: "bb3@2 g3 ~@2 g3 bb3@2 g3 ~@2 g3 bb3 ~ bb3!2 ~ bb3 ~@3 g3 ~ g3",
  AP: "bb3 a3 g3 ~@2 bb3@2 ~ bb3@2 ~ g3 d4 ~ bb3 ~@2 g3@2 ~@5", AQ: "g3 ~@2 g3 ~ g3!2 ~ g3 ~@2 g3!2 ~ g3!2 ~ g3 ~@6",
  AR: "bb3 ~ g3!2 ~ g3!2 ~@7 g3 ~@2 g3@2 ~@5",
})).s("gm_tenor_sax").gain(0.53)

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

// drums · clap
const clap = s("cp").struct("<~@2 [~ x ~ x]!79 [~ x ~@2]>").gain(0.6)

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

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2
  [x ~ x ~@3 x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x]!47
  [x ~ x ~@3 x ~ x!2 ~ x ~@12]
  [x ~ x ~@3 x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x]!18
  [~ x ~@2]
  [x ~ x ~@3 x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x]!12
  [x ~ x ~@3 x ~ x!2 ~ x!2 ~ x!2 ~@8]
>`).gain(0.48)

// drums · low tom
const low_tom = s("lt").struct("<~@9 A ~@11 A ~@11 A ~@15 A ~@7 A ~@9 A ~@14>".pickRestart({
  A: "~@23 x",
})).gain(0.6)

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~ x ~@6]!80>").gain(0.54)

// drums · mid tom
const mid_tom = s("mt").struct("<~ A ~@7 B ~@11 B ~@11 B ~@15 B ~@7 B ~@9 B ~@14>".pickRestart({
  A: "~@21 x ~ x", B: "~@7 x",
})).gain(0.6)

// drums · high tom
const high_tom = s("ht").struct("<[~@16 x!8] [x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x ~@3] ~@80>").gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@2
  [x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x]!47
  [x ~ x!2 ~ x!2 ~ x!2 ~ x ~@12]
  [x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x]!18
  ~
  [x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x]!12
  [x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~@8]
>`).gain(0.36)

stack(
  brass_section, bass, epiano2, electric_guitar_clean, tenor_sax, kick, clap, snare, hihat, low_tom, open_hat, mid_tom,
  high_tom, tambourine
)