Strudelify

Ex-Girlfriend

No Doubt

KeyE minorTempo84 bpm
0:00/0:00
// Ex-Girlfriend — No Doubt
// 84 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 77 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(84/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · steel drums
const steel_drums = note("<~ A B A B ~@10 A B ~@10 A B ~@6 A B ~@26 A C ~@12>".pickRestart({
  A: "[a4,c5]@3 ~ [g4,b4]@3 ~ [f#4,a4]@3 ~ [e4,g4]@3 ~", B: "[d#4,f#4]@3 ~ [c4,e4]@3 ~ [b3,d#4]@3 ~ [a3,c4]@3 ~",
  C: "[d#4,f#4] ~@15", // D#m
})).s("gm_steel_drums").gain(0.72)

// other · shanai
const shanai = note(`<
  ~@57
  [b6@7 ~@3 c7@2 b6@2 a6@2]
  [b6@7 ~@2 a6 g6 a6 b6 a6@3]
  [e6 f#6 g6 e6 f#6@5 ~ e6!2 f#6 g6@3]
  [b5@7 ~@7 e5@2]
  [b6@7 ~@3 c7@2 b6@2 a6@2]
  [b6@5 ~@2 a6 g6 a6 b6 a6 b5@3 e5]
  ~@14
>`).s("gm_shanai").gain(0.72)

// chords · pan flute
const pan_flute = note(`<
  ~@5 A ~ A ~ B@2 C D E F ~@2 A ~ A ~ G ~ A H I J ~@2 B@2 C K L M N@2 A ~ A ~ G ~ A H I O I P ~@16 A ~ A ~ G ~ A H I O I
  ~
>`.pickRestart({
  A: "[e4,g4]!4 [d#4,f#4]!2 [d#4,f#4]@2 [c4,e4]!2 [c4,e4]@2 [c4,e4]@2 [b3,d#4]@2", B: "e5@15 ~", C: "a4@15 ~",
  D: "f#4@7 ~ g4@3 ~ a4@3 ~", E: "b4@15 ~", F: "c5@15 ~",
  G: "[e4,g4]!4 [d#4,f#4]!2 [d#4,f#4]@2 [c4,e4]@2 [c4,e4] [c4,e4]@2 [c4,e4] [b3,d#4]@2", H: "~@14 a3!2",
  I: "a3!2 a3@2 a3@2 g3 a3@2 g3 a3@3 ~ a3!2", J: "a3!4 a3@2 g3 a3@2 g3 c4@2 b3@2 ~@2", K: "f#4@7 ~ g4@3 ~ e4@2 f#4@2",
  L: "g4@3 ~ e4@2 b4@3 ~@3 e4@2 f#4@2", M: "g4@2 e4@2 ~@2 c5@2 b4@3 ~@3 e4@2",
  N: "[f#4@3 ~ e4@2 f#4@3 ~ e4@3 ~ g4@8 f#4@3 ~@7]/2", O: "a3!4 a3@2 g3 a3@2 g3 c4@2 b3@2 a3!2",
  P: "e4!4 d4@2 d4 c4@2 c4 b3@2 ~@4",
})).s("gm_pan_flute").gain(0.4)

// other · distortion guitar · "Maryn =þ"
const distortion_guitar = note(`<
  ~@5 A B A B ~@8 A B A B A B A B ~@12 A B A B A B A B ~@4 C@2 D E ~@12 A B A B A B A B ~@4
>`.pickRestart({
  A: "e2!4 b2!4 c3!2 c3@2 c3!2 c3@2", B: "e2!4 c3!4 b2@7 ~", C: "e2!16", D: "b2!16", E: "b2!9 ~@7",
})).s("gm_distortion_guitar").gain(0.72)

// other · electric guitar jazz · "Maryn =þ"
const electric_guitar_jazz = note("<~@25 A B ~@18 A B A C ~@4 D E D E ~@16 A B A C>".pickRestart({
  A: "e3@3 ~ b2@3 ~ e3@3 ~ b2@3 ~", B: "d#3@3 ~ b2@3 ~ d#3@3 ~ b2@3 ~", C: "d#3@3 ~@13", D: "b2 e3 c3 b2!2 e3 c3 b2",
  E: "b2 f#3 e3 c3 b2 e3 c3 b2",
})).s("gm_electric_guitar_jazz").gain(0.72)

// bass · electric bass finger
const bass = note(`<
  ~ A B A B C D C D A B A B A B A B C D C D C D C D ~@4 A B A B A@2 E F C D C D C D C D ~@4 G@2 H I J K J K A B A@3 B E
  L C D C D C D C D ~@4
>`.pickRestart({
  A: "e2!3 ~@9 b2!3 ~", B: "f#2!3 ~@13", C: "e2!3 ~ e2!3 ~ b1!3 ~ b1!3 ~", D: "e2!8 d#2!7 ~", E: "f#2!3 ~@9 b2!3 ~",
  F: "b1!3 ~@13", G: "e2!11 b2@2 b2 b2@2", H: "b2!11 e2@2 e2 e2@2", I: "b2!9 ~@5 b1@2", J: "e2@5 ~ e3@3 ~@3 e3@3 ~",
  K: "b2@5 ~ e3@3 ~@3 e3@3 ~", L: "b1 ~@15",
})).s("gm_electric_bass_finger").gain(0.72)

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

// drums · snare
const snare = s("sd").struct("<~@4 A B@4 ~@7 A B@8 ~@11 A B@8 ~@4 B@3 C D@10 ~ A B@8 ~@4>".pickRestart({
  A: "~@3 x", B: "~ x ~ x ~ x ~ x", C: "~ x ~ x ~@4", D: "~ x ~ x",
})).gain(0.72)

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

// drums · splash
const splash = s("cr").struct("<~@5 A@11 ~ A@10 ~@2 A@35 B A@11 B>".pickRestart({
  A: "~ x ~ x", B: "x",
})).gain(0.72)

stack(steel_drums, shanai, pan_flute, distortion_guitar, electric_guitar_jazz, bass, kick, snare, hihat, splash)

More by No Doubt