Strudelify

A Girl Like You

Edwyn Collins

KeyC minorTempo126 bpm
0:00/0:00
// A Girl Like You — Edwyn Collins
// 126 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 electric guitar clean (copy of ch 8 electric guitar jazz)
// note: Full arrangement: all 121 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(126/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.

// other · lead 8 bass lead
const lead_8_bass_lead = note(`<
  ~@113
  [ab4 g4 ab4 g4 ab4 g4 ab4 g4 ab4 g4 ab4 g4 ab4 g4 ab4 g4]!7
  [ab4 g4 ab4 g4 ab4 g4 ab4 g4 ab4 g4 ab4 g4 ab4 ~@3]
>`).s("gm_lead_8_bass_lead").gain(0.2)

// other · overdriven guitar
const overdriven_guitar = note("<~@105 A B C D E F G F E F G F E F G H>".pickRestart({
  A: "g4@6 bb3@3 ~@7", B: "ab4@3 bb3@2 ~@3", C: "bb4@3 bb3@2 ~@3", D: "ab5@3 bb3 c4 ~@3", E: "g5@6 bb3@3 ~@7",
  F: "ab5@3 bb3@2 ~@3", G: "bb5@3 bb3@2 ~@3", H: "ab5@3 ~@5",
})).s("gm_overdriven_guitar").gain(0.42).pan(0.7)

// chords · rock organ · Cm Gm7 Fm7 Gm7 Fm7 Gm7 Cm
const rock_organ = note(`<
  ~@67
  [[eb4,g4,c5] ~@3 [f4,g4,bb4,d5] ~@3 [f4,ab4,c5,eb5]@4 [f4,g4,bb4,d5] ~@3]
  [[f4,ab4,c5,eb5]@3 ~ [f4,g4,bb4,d5] ~ [eb4,g4,c5]@8 ~@2]
  ~@52
>`).s("gm_rock_organ").gain(0.4)

// chords · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~ 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 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 A B A B C D A B 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 E
>`.pickRestart({
  A: "~@2 [eb4,g4,c5]@2 c3 ~ c3 ~, c3@3 ~@2 [eb4,g4,c5]@2 ~", // Cm
  B: "[c3,eb4,ab4,c5]@5 ~ [g4,bb4,d5]@3 ~@3 c3@3 ~, ~@10 [g4,bb4,d5]@5 ~", // Ab Gm
  C: "~@4 [eb4,g4,c5]@4 c3@2 [eb4,g4,c5]@4 c3 ~, c3@7 ~@9", // Cm
  D: "[c3,eb4,ab4,c5]@5 ~ [eb4,g4,c5]@4 c3@2 [eb4,g4,c5]@2 c3 ~, ~@6 c3@3 ~@7", // Ab Cm
  E: "[c3,eb4,ab4,c5]@5 ~ [g4,bb4,d5]@3 ~@3 c3@2 ~@2, ~@5 [g4,bb4,d5]@2 ~", // Ab Gm
})).s("gm_electric_guitar_jazz").gain(0.32).pan(0.6)

// other · vibraphone
const vibraphone = note("<~ A B@2 C A B@2 C ~@14 D E ~@22 D E ~@32 F G H I H I H I J K L M ~@28>".pickRestart({
  A: "~@6 eb6@2 f6@3 ~ g6@3 ~, ~@12 gb6 ~@3",
  B: "[bb6@2 [gb6,g6] ~@7 eb6@2 d6 ~ c6@8 eb6@2 f6@3 ~ g6@3 ~, ~@28 gb6 ~@3]/2", C: "bb6@2 [gb6,g6] ~@3 eb6@6 ~@4",
  D: "~@4 c5 ~ c5@2 eb5@3 ~ f5@3 ~, ~@12 e5 ~@3", E: "eb5 ~@3 c5 ~ c5@6 ~@4",
  F: "~@4 g5@3 ~ [f5,gb5] ~ eb5@2 c5 ~ bb4 ~, ~@4 gb5 ~@11", G: "eb5@6 f5@9 ~",
  H: "~@4 g5@4 [f5,gb5] ~ eb5 ~ c5 ~ bb4 ~, ~@4 gb5 ~@11", I: "eb5@3 f5@5",
  J: "~@4 g5@2 ~@2 g5@4 f5 ~ g5@2, ~@4 gb5 ~@3 gb5 ~@7", K: "bb5@2 g5@4 bb5@4 [g5,d6]@5 ~, ~@10 bb5@3 ~@3",
  L: "~@12 g5@3 ~", M: "bb5@2 g5@4 c6@7 ~@3",
})).s("gm_vibraphone").gain(0.42).pan(0.6)

// bass · electric bass finger
const bass = note(`<
  A B C D E D E F C B C D E D E F C B C D E D E F C B C D E D E F C B C D E D E F C B C D E D E F C B C D E D E F C B C
  D E D E F C B C D E D E F C B C D E D E F C B C D E D E D E B C D E D E B G D E D E F C B H D E D E F C B C F C B C F
  C B I
>`.pickRestart({
  A: "~@5 g1 bb1 b1", B: "c2@5 ~ c2 ~ c2@5 ~ c2 ~", C: "c2@5 ~ c2 ~ c2@2 g1@2 bb1@2 b1@2",
  D: "c2@4 ~@2 c2 ~ c2@5 ~ c2 ~", E: "c2@4 ~@2 c2 ~ c2@2 g1@2 bb1@2 b1@2", F: "c2@5 ~ c2 ~ c2@4 ~@2 c2 ~",
  G: "c3 ~ c3@2 bb2@2 bb2@2 ab2 ~ ab2@2 g2 ~ g2@2", H: "g2@2 f2 eb2 f2 eb2 c2 bb1",
  I: "c2@5 ~ c2 ~ c2@2 g1@2 bb1@2 ~@2",
})).s("gm_electric_bass_finger").gain(0.38)

// other · overdriven guitar
const overdriven_guitar_2 = note(`<
  ~@24 A B C B D B C B E ~@15 A B C B D B C B E ~@16 F G H I J K L@2 M ~@8 N@2 O ~@2 P@2 Q@2 R@2 S@2 T U V W X Y Z AA AB
  AA Z AA AB AA Z AA AB ~
>`.pickRestart({
  A: "~@10 c4@2 eb4 ~ f4 ~", B: "f4@4 eb4@2 c4@7 ~ c4@2", C: "eb4@2 bb4 g4@2 c4 eb4 f4",
  D: "d4@4 bb3@2 c4@3 ~ c4@2 eb4@2 f4@2", E: "d4@2 bb3 c4@4 ~", F: "c4 eb4@6 ~", G: "bb4 c5@7", H: "d5 eb5@7",
  I: "f5@15 ~", J: "c4 eb4@5 f4 eb4", K: "f4@11 ~ f4 eb4 c4@2", L: "[eb4@2 c4 bb3 g3 bb3 ~ d4@2 bb3 c4 eb4@4 ~]/2",
  M: "eb4@15 ~", N: "[f4@9 ~@7]/2", O: "f4@7 ~", P: "[c4 ~ eb4 ~ eb4@4 c4@2 eb4@2 f4@2 g4@15 ~@3]/2",
  Q: "[c4@2 eb4 ~ eb4@4 c4@2 eb4@2 f4@2 bb3@14 ~@4]/2", R: "[c4 eb4 eb4@2 eb4 c4 eb4 bb4@8 ~]/2",
  S: "[c4@2 eb4 ~ eb4@3 c4 f4@2 eb4@2 f4 ~ f4@8 eb4 ~ f4@6 eb4 ~]/2", T: "f4@6 eb4 ~ f4@6 eb4 ~",
  U: "f4@5 ~ eb4 ~ f4@6 eb4 ~", V: "f4@5 ~@11", W: "gb4@7 ~@9", X: "ab4@3 ~@5", Y: "gb5@3 ~@5", Z: "f5@5 ~@11",
  AA: "gb5@7 ~@9", AB: "ab5@3 ~@5",
})).s("gm_overdriven_guitar").gain(0.31).pan(0.7)

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

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

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

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

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@7 A ~@15 A ~@3 A ~@3 A ~@15 A ~@3 A ~@3 A ~@7 B ~@7 A ~@7 A ~@7 A ~ A ~ A ~ A ~@5 C ~ A ~ A ~@3 A ~ A ~ A ~ A ~
  A ~ A ~
>`.pickRestart({
  A: "x", B: "~@2 x!2 ~@2 x!2", C: "x!2 ~@2",
})).gain(0.3)

// drums · ride bell
const ride_bell = s("rd").struct("<~@105 A B C@2 A B ~@2 A B ~@2 A B ~@2>".pickRestart({
  A: "~ x!3", B: "x ~ x ~ x ~ x!2", C: "x!4",
})).gain(0.38)

// drums · tambourine
const tambourine = s("tb").struct("<~ [~ x ~ x]!64 ~ [~ x ~ x]!55>").gain(0.3)

stack(
  lead_8_bass_lead, overdriven_guitar, rock_organ, electric_guitar_jazz, vibraphone, bass, overdriven_guitar_2, kick,
  snare, hihat, open_hat, crash, ride_bell, tambourine
)