Strudelify

Goodbye Girl

David Gates

KeyE♭ majorTempo110 bpm
0:00/0:00
// Goodbye Girl — David Gates
// 110 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: ch 3 "strings" named as a string part, played on string ensemble 1 (its pad halo patch is not one)
// note: Full arrangement: all 77 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/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 · piano · "Unnamed-000"
const piano = note(`<
  A@2 B@7 C@3 D E F G@2 H I@2 J@4 K@5 L M N O ~@2 P@2 Q@3 R S@2 T U V@4 W@6 X@6 Y@7 ~ Z@2 AA@5 ~
>`.pickRestart({
  A: "[~@27 eb5@28 [g4,bb4]@2 [f4,bb4,d5]@7, ~@25 g4@30 ~@9, ~@26 bb4@29 ~@9]/2", // Gm Bb
  B: "[~ [g4,bb4,eb5]@3 [f4,bb4,d5]@7 ~ [g4,bb4,eb5]@7 [eb4,ab4,bb4]@7 ~ [eb4,ab4,c5]@19 ~@4 bb4@32 ~ [bb3,eb4,g4,bb4]@7 bb4@4 [bb3,eb4,g4,bb4]@11 bb4@4 [bb3,d4,f4,g4]@7 [bb3,d4,f4,g4]@19 g4@4 [c4,eb4,g4,c5]@11 d5@4 [c4,eb4,g4,c5]@11 ~@4 g4@29 ~@4 f4@11 [ab3,c4,eb4,f4]@11, ~@46 d4@37 ~@82 bb3@34 ~ c4@13 ~@11, ~@48 ab4@35 ~@83 d4@32 ab3@15 ~@11, ~@167 f4@31 ~@3 eb4@12 ~@11]/7", // Eb Bb Eb Ebsus4 Ab Eb Gm7 Cm …
  C: "[g4@4 [g3,bb3,eb4,f4]@7 ~@8 [eb3,g3,bb3,c4]@11 eb4@4 [g3,ab3,c4,eb4]@7 ~ [g3,ab3,c4,eb4]@15 ~@7 f4@32, ~@5 f3@3, ~@31 bb3@17, ~@21 d4@11]/3", // Eb Cm7 Abmaj7
  D: "bb3 [bb3,eb4,g4,bb4]@3 [eb4,g4]@3 ~", E: "[bb3,d4,f4,g4]",
  F: "~ eb5@2 d5 [eb4,g4,c5]@3 bb4, ~ g4@11 ~@20, ~@3 c5@9 ~@20", // Cm
  G: "[[bb3,d4,f4,g4]@9 [ab3,c4,eb4,f4]@2 [c4,eb4,f4] [ab3,c4,eb4,f4]@2 [f4,c5]@2]/2", // Gm7 Fm7 F7 Fm7 F5
  H: "[bb3,f4,bb4]@2 [bb3,d4,f4,g4]@4 eb4 f4", I: "[[ab3,c4,eb4,f4]@11 ~@5]/2",
  J: "[~ [eb4,g4,bb4]@3 [eb4,g4] [eb4,g4,bb4] [eb4,g4,bb4]@3 [f4,bb4]@3 [d4,f4,bb4]@3 [eb4,ab4]@2 bb4 c5@7 [bb3,d4,g4] [bb3,d4] [d4,g4] [bb3,d4,g4] [d4,g4] [bb3,d4,g4] [d4,g4], ~@17 [eb4,ab4]@8 ~@7]/4", // Eb Bb5 Bb Ab5 Gm Bb G5 Gm …
  K: "[[bb3,d4,g4] [eb4,g4,bb4]@3 [eb4,g4] [eb4,g4,bb4] [eb4,g4,bb4]@3 [f4,bb4]@3 [d4,f4,bb4]@3 [eb4,ab4]@2 bb4 c5@7 [eb3,ab3,c4,eb4]@2 [eb3,ab3,c4,eb4]!3 [f3,bb3,d4,f4]@3 [g3,c4,eb4,g4]@4 [g4,c5]@3, ~@17 [eb4,ab4]@8 ~@15]/5", // Gm Eb Bb5 Bb Ab5 Ab Bb Cm …
  L: "[f4,bb4]@2 [f4,bb4]@2 [eb4,g4]@3 ~", M: "[c4,g4]@4 [c4,g4]@3 eb4", N: "f4 [f3,ab3,b3,eb4]@6 eb4",
  O: "f4 [bb3,c4,eb4,g4]@2 [bb3,c4,eb4]@3 ~@2", // Cm7
  P: "[~ bb3 [bb3,eb4]@16 [f4,bb4,d5]@4 [g4,bb4,eb5]@2 [f4,bb4,d5]@4 [g4,bb4,eb5]@4]/2", // Eb5 Bb Eb Bb Eb
  Q: "[[eb4,ab4,bb4]@8 [eb4,ab4,c5]@20 ~@5 bb4@35 [bb3,eb4,g4,bb4]@8 bb4@4 [bb3,eb4,g4,bb4]@12 bb4@4, ~@7 d4@10 ~@7, ~@31 ab4@37 ~@28]/3", // Ebsus4 Ab Eb
  R: "[bb3,d4,f4,g4]@2 [bb3,d4,f4,g4]@5 g4", // Gm7
  S: "[[c4,eb4,g4,c5]@3 d5 [c4,eb4,g4,c5]@3 ~ g4@8, ~@7 bb3@9, ~@29 d4@35, ~@31 f4@33]/2", // Cm
  T: "~ f4@3 [ab3,c4,eb4,f4]@3 g4, ~ [ab3,c4]@15 ~@16, ~@3 eb4@13 ~@16", // Fm7 Ab
  U: "[g3,bb3,eb4,f4]@2 ~@2 [eb3,g3,bb3,c4]@3 eb4", // Eb Cm7
  V: "[[g3,ab3,c4,eb4]@8 [g3,ab3,c4,eb4]@16 ~@8 f4@31 bb3@4 [bb3,eb4,g4,bb4]@12 [eb4,g4]@12 ~@4 [bb3,d4,f4,g4]@32 ~, ~@7 f3@9 ~@16, ~@29 bb3@34 ~@65, ~@30 d4@33 ~@65]/4", // Abmaj7 Eb Gm7
  W: "[~@3 eb5@8 d5@4 [eb4,g4,c5]@12 bb4@4 [bb3,d4,f4,g4]@36 [ab3,c4,eb4,f4]@8 [c4,eb4,f4]@4 [ab3,c4,eb4,f4]@8 [f4,c5]@8 [bb3,f4,bb4]@8 [bb3,d4,f4,g4]@16 eb4@4 f4@4 [ab3,c4,eb4,f4]@44 ~@21, ~ g4@11 ~@180, ~@2 c5@9 ~@181]/6", // Cm Gm7 Fm7 F7 Fm7 F5 Bb5 Gm7 …
  X: "[~@3 [eb4,g4,bb4]@12 [eb4,g4]@4 [eb4,g4,bb4]@4 [eb4,g4,bb4]@12 [f4,bb4]@12 [d4,f4,bb4]@12 [eb4,ab4]@8 bb4@4 c5@28 [bb3,d4,g4]@4 [bb3,d4]@4 [d4,g4]@4 [bb3,d4,g4]@4 [d4,g4]@4 [bb3,d4,g4]@4 [d4,g4]@4 [bb3,d4,g4]@4 [eb4,g4,bb4]@12 [eb4,g4]@4 [eb4,g4,bb4]@4 [eb4,g4,bb4]@12 [f4,bb4]@12 [d4,f4,bb4]@12 [eb4,ab4]@5, ~@67 [eb4,ab4]@32 ~@93]/6", // Eb Bb5 Bb Ab5 Gm Bb G5 Gm …
  Y: "[~@3 bb4@4 c5@28 [eb3,ab3,c4,eb4]@8 [eb3,ab3,c4,eb4]@4 [eb3,ab3,c4,eb4]@4 [eb3,ab3,c4,eb4]@4 [f3,bb3,d4,f4]@12 [g3,c4,eb4,g4]@16 [g4,c5]@12 [f4,bb4]@8 [f4,bb4]@8 [eb4,g4]@12 ~@4 [c4,g4]@16 [c4,g4]@12 eb4@4 f4@4 [f3,ab3,b3,eb4]@24 eb4@4 f4@4 [bb3,c4,eb4,g4]@8 [bb3,c4,eb4]@12 ~@9, ~@3 [eb4,ab4]@32 ~@189]/7", // Ab Bb Cm C5 Bb5 Eb C5 Fm7b5 …
  Z: "[~@3 [ab3,c4,eb4,g4]@16 [ab4,c5]@16 [g4,bb4,eb5]@28 ~]/2", // Abmaj7 Ab Eb
  AA: "[~@3 d5@8 [g4,bb4,eb5]@4 [f4,bb4,d5]@8 [g4,bb4,eb5]@8 [eb4,ab4,bb4]@8 [eb4,ab4,c5]@28 [d4,ab4,bb4]@28 ~@4 bb3@32 ~@29, ~ f4@11 ~@85 g4@35 ~@28, ~@2 bb4@9 ~@84 bb4@36 ~@29, ~@98 eb4@33 ~@29]/5", // Eb Bb Eb Ebsus4 Ab Bb7
})).s("gm_piano").gain(0.48)

// other · piano · "base"
const piano_2 = note("<A@6 B@2 C@8 D@3 E F@8 G@7 H@8 I@8 J@4 K@8 L@7 M@7>".pickRestart({
  A: "[~@39 bb2@7 g3@11 ~@11 d3@4 bb3@15 ~@8 eb3@7 c4@15 ~@11 eb3@7 ~ f3@11 eb3@22 eb3@7 ~ d3@15, ~@9 eb2@10 g2@10 ab2@10 bb2@10 ~@15]/6",
  B: "[d3@7 d3@7 c3@15 c3@15 g2@15 g2@5]/2",
  C: "[~@3 g2@2 ~@5 f2@15 f2@15 c2@15 c2@15 ab1@15 ab1@7 ab1@8 bb1@16 bb1@8 bb2@8 eb3@24 eb3@8 d3@16 d3@8 d3@8 c3@16 c3@16 g2@16 g2@8 g2@4]/8",
  D: "[~ f2@4 f2@4 g2@6 g2@2 bb2@3 bb2@2 bb2@2]/3", E: "bb2 ~",
  F: "[~ eb2@3 eb2 eb2@4 g1@3 g1 g1@4 ab1@3 ab1 ab1@4 bb1@3 bb1 bb1@4 eb2@3 eb2 eb2@4 g1@3 g1 g1@4 ab1@3 ab1 ab1@4 ab1@3 ab1!2 bb1@2]/8",
  G: "[~ c2@3 c2 c2@4 g1@3 g1 g1@4 ab1@3 ab1 ab1@4 db2@8 c2@3 c2 c2@4 f2@3 f2 f2@4 bb1@7]/7",
  H: "[~@4 bb2@2 g3@3 ~@3 d3 bb3@4 ~@2 eb3@2 c4@4 ~@3 eb3@2 f3@3 eb3@6 eb3@2 d3@4 d3@2 d3@2 c3@4 c3@4 g2@4 g2@2 g2, ~ eb2@8 g2@8 ab2@8 bb2@8 ~@31]/8",
  I: "[~@4 f2@16 f2@16 c2@16 c2@16 ab1@16 ab1@8 ab1@7 bb1@16 bb1@8 bb2@8 eb3@24 eb3@8 d3@16 d3@8 d3@8 c3@16 c3@16 g2@16 g2@8 g2@5]/8",
  J: "[~@3 f2@16 f2@16 g2@24 g2@8 bb2@12 bb2@8 bb2@8 bb2@16 ~@17]/4",
  K: "[~@3 eb2@12 eb2@4 eb2@16 g1@12 g1@4 g1@16 ab1@12 ab1@4 ab1@16 bb1@12 bb1@4 bb1@16 eb2@12 eb2@4 eb2@16 g1@12 g1@4 g1@16 ab1@12 ab1@4 ab1@16 ab1@12 ab1@4 ab1@4 bb1@9]/8",
  L: "[~@3 c2@12 c2@4 c2@16 g1@12 g1@4 g1@16 ab1@12 ab1@4 ab1@16 db2@32 c2@12 c2@4 c2@16 f2@12 f2@4 f2@16 bb1@29]/7",
  M: "[~@15 bb2@8 g3@12 ~@12 f3@4 bb3@16 ~@8 eb3@8 c4@16 ~@12 eb3@8 f3@12 [eb2,eb3]@64 ~@29, ~@3 eb2@32 g2@32 ab2@32 bb2@32 ~@93]/7", // Eb
})).s("gm_piano").gain(0.36)

// other · string ensemble 1 · "strings"
const string_ensemble_1 = note("<~@20 A@8 B@8 C@4 ~ D@7 E@8 F@8 G@8 H@5>".pickRestart({
  A: "[~ eb4@8 g4@8 ab4@8 bb4@8 eb4@8 g4@8 ab4@8 bb4@7]/8", B: "[~ c5@8 g4@8 ab4@8 bb3@8 c4@8 f4@8 bb3@8 eb4@7]/8",
  C: "[~ g4@8 ab4@8 bb3@8 ~@7]/4", D: "[~@4 c4@32 g4@32 f4@32 c4@32 ab4@31 bb4@32 eb4@29]/7",
  E: "[~@3 [d4,d5]@32 [c4,c5]@32 [g3,g4]@32 [f4,ab4]@32 [g4,bb4]@32 ~@32 d5@16 [d4,f4,bb4]@16 eb4@29, ~@163 [d4,f4,bb4]@48 ~@45]/8", // D C G Fm Gm Bb
  F: "[~@3 g4@32 ab4@32 bb4@32 eb4@32 g4@32 ab4@32 bb4@32 c5@29]/8",
  G: "[~@3 g4@32 ab4@32 bb3@32 c4@32 f4@32 bb4@32 eb4@32 g4@29]/8", H: "[~@3 ab4@32 bb4@32 eb4@64 ~@29]/5",
})).s("gm_string_ensemble_1").gain(0.08)

// other · string ensemble 1 · "strings" · soft notes
const string_ensemble_1_soft = note("<~ A B@4 C@7 D@8 ~@56>".pickRestart({
  A: "~@25 d5@7", B: "[~ eb5@3 d5@7 ~ eb5@7 bb4@7 ~ c5@26 [d4,bb4]@60 ~@15]/4",
  C: "[~@7 c4@15 g4@15 f4@15 c4@15 ab4@15 bb4@16 eb4@14]/7",
  D: "[~ [d4,d5]@8 [c4,c5]@8 [g3,g4]@8 [f4,ab4]@8 [g4,bb4]@8 ~@8 d5@4 [d4,f4,bb4]@4 ~@7, ~@41 [d4,f4,bb4]@12 ~@11]/8", // D C G Fm Gm Bb
})).s("gm_string_ensemble_1").gain(0.05)

// drums · snare
const snare = s("sd").struct("<~@19 A B@11 ~ B@3 ~@4 B@7 C@23 ~@8>".pickRestart({
  A: "~@7 x", B: "~@5 x ~@2", C: "~@19 x ~@12",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B C D E F G H I J K L@3 M N L O P Q@7 M Q@3 R S@3 L@3 T U V@6 W X@7 A X@3 Y X@10 ~@8
>`.pickRestart({
  A: "~@3 x ~@28", B: "~ x ~@29 x", C: "~@7 x", D: "~@4 x ~@8 x ~@2", E: "~@3 x", F: "~@11 x ~@4", G: "~@5 x ~@2",
  H: "~@9 x ~@6", I: "~@15 x ~@16", J: "~@13 x ~@18", K: "~@3 x ~@2 x ~", L: "~@3 x ~@3 x", M: "~ x ~ x ~@2 x ~",
  N: "x ~@2 x ~@3 x", O: "~@3 x!4 ~", P: "~@2 x!2 ~@2 x ~", Q: "~ x ~@2 x ~@2 x", R: "~ x ~@3 x ~@2",
  S: "~ x ~@2 x ~@3", T: "~@3 x ~@4", U: "~ x ~@6", V: "x!2 ~@6", W: "x ~@2 x ~@27 x", X: "~@3 x ~@27 x",
  Y: "~@3 x ~@23 x ~@4",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@54 [~@27 x ~@3 x] ~@22>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 A ~@3 B A ~@13 C ~@3 D ~@10 E F ~@3 G ~@18>".pickRestart({
  A: "x", B: "~@6 x!2", C: "~@13 x!2 ~", D: "~@7 x", E: "~@15 x ~@15 x", F: "~@19 x ~@3 x ~@8",
  G: "~@15 x ~@3 x ~@3 x ~@7 x",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@12 A ~@2 B ~@2 C D ~@2 A C ~@3 E A ~@3 A@4 ~@3 A ~ A ~ A ~ A F ~ F ~ F@2 ~@3 F ~ F ~ F ~ F@2 ~ F ~ F ~ F ~@8
>`.pickRestart({
  A: "x", B: "~ x", C: "~@3 x", D: "~@5 x ~ x", E: "~@5 x ~@2", F: "~@31 x",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@18 A B ~@3 C ~@3 D ~@10 E ~@3 F ~@3 G ~@6 H I ~@3 J ~@18>".pickRestart({
  A: "~@3 x ~ x ~@2", B: "~@8 x!3 ~@3 x ~", C: "~@3 x!2 ~ x ~", D: "~@3 x!2 ~@3", E: "~@3 x ~@2 x ~", F: "~@5 x!2 ~",
  G: "~@15 x ~@3 x ~@3 x ~@3 x ~@4", H: "~@7 x ~ x ~@22", I: "~@15 x ~ x ~@14", J: "~@7 x ~@3 x ~@20",
})).gain(0.48)

// drums · ride bell
const ride_bell = s("rd").struct("<~ A B C D ~@19 E ~@3 E ~ E@2 ~@37 F@5 ~@3>".pickRestart({
  A: "~@9 x ~@6", B: "~ x", C: "~@7 x ~@8", D: "~@11 x ~@20", E: "~ x ~@6", F: "~@11 x ~@15 x ~@4",
})).gain(0.16)

// drums · splash
const splash = s("cr").struct(`<
  ~@4 A ~@5 B C ~@4 C@3 D C@5 ~@2 E C ~ C@3 ~@2 C ~@3 C ~@7 F ~@7 F ~@3 F ~@3 F ~@2 F ~@2 F ~@7
>`.pickRestart({
  A: "~@11 x ~@20", B: "~@3 x ~@12", C: "~ x ~@6", D: "~ x ~@5 x", E: "~@3 x", F: "~@3 x ~@28",
})).gain(0.16)

stack(
  piano, piano_2, string_ensemble_1, string_ensemble_1_soft, snare, hihat, low_tom, mid_tom, open_hat, high_tom,
  ride_bell, splash
)