Strudelify

That Was Yesterday

Foreigner

KeyE♭ minorTempo113 bpm
0:00/0:00
// That Was Yesterday — Foreigner
// 113 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 13 "synth" pad metallic (copy of ch 3 "synth" pad metallic); ch 11 "lead vocal Left" synth choir (copy of ch 7 "lead vocal" synth brass 1); ch 12 "lead vocal Right" synth choir (copy of ch 7 "lead vocal" synth brass 1)
// note: Full arrangement: all 103 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(113/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 · slap bass 2 · "Bass"
const bass = note(`<
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C A B@2 A@2 B@2 A@2 B D E B F A E B F G H@2 I@2 J@2 K@2 H@2 I@2 J@2 L M C A B@2 A@2
  B@2 A@2 B@2 A@2 B D E B F A E B F G H@2 I@2 ~ N K@2 H@2 I@2 J@2 K@2 H@2 I@2 J@2 L M ~@3
>`.pickRestart({
  A: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~", B: "gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~",
  C: "g1 ~ g1 ~ g1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~", D: "gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~@3",
  E: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~", F: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~",
  G: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ gb1@4 ab1@4", H: "[eb1@5 ~ gb1@2 ab1@4 bb1@2 eb1@7 ~ gb1@2 ab1@4 bb1@4]/2",
  I: "[db1@3 gb1 ab1@2 bb1 db1@3 ~ gb1 ab1@2 bb1@2]/2", J: "[db1@6 f1@2 gb1@4 f1@2 db1@8 f1@2 gb1@4 f1@3 ~]/2",
  K: "[eb1@5 ~ gb1@2 ab1@4 bb1 ~ eb1@6 ~@4 gb1@4 ab1@4]/2", L: "[eb1,eb2]@5 ~ [eb1,eb2]@4 ~@2 [db1,db2]@4",
  M: "~@2 [db1,db2]@4 ~@2 [db1,db2]@2 ~@2 [db1,db2]@3 ~", N: "~@6 f1@2 gb1@4 f1@3 ~",
})).s("gm_slap_bass_2").gain(0.6).pan(0.6)

// chords · piano
const piano = note(`<
  A B C D A B C D A B C D A B C D E F G H A B C D A B C D ~@8 I@2 J@2 K@2 L@2 I@2 J@2 K@2 M@2 E B C D A B C D A B C D A
  B C D ~@8 I@2 J@2 K@2 L@2 I@2 J@2 K@2 L@2 I@2 J@2 K@2 M@2 E ~@2
>`.pickRestart({
  A: "[ab2,ab3,b3,eb4]@7 ~", B: "[ab3,b3,e4]@13 ~@3, ab2", C: "[gb2,gb3,b3,eb4]@7 ~", D: "[gb2,gb3,bb3,eb4]",
  E: "[g3,bb3,db4]@5 ~ [ab3,b3,eb4] ~ [ab3,b3,eb4]@7 ~", F: "[ab3,b3,e4]@3 ~", G: "[gb3,b3,eb4]@7 ~",
  H: "[gb3,bb3,eb4] [gb3,bb3,db4]", // Ebm Gb
  I: "[[eb2,gb4]@6 gb2@2 [ab2,ab4]@4 bb2@2 eb2@7 ~ gb2@2 ab2@4 bb2@4, eb4@14 eb4@17 ~, bb4@12 bb4@19 ~, ~@6 gb4@25 ~]/2", // Ebm Ab
  J: "[[db2,gb4]@3 gb2 [ab2,ab4]@2 bb2 db2@3 ~ gb2 ab2@2 bb2@2, db4@14 db4@17 ~, bb4@12 bb4@19 ~, ~@6 gb4@25 ~]/2", // Gb5 Ab
  K: "[[db2,f4]@6 f2@2 [gb2,gb4]@4 f2@2 db2@8 f2@2 gb2@4 f2@3 ~, ab4@15 ~, db4@7 db4@8 ~, ~@3 f4@3 f4@9 ~]/2", // Db Gb
  L: "[[eb2,gb4]@6 gb2@2 ~@4 bb2 ~ eb4@18, eb4@7 ~@9, bb4@3 bb4@5, ~@3 gb4@2 gb4@11, ~@4 [ab2,ab4]@2 ~ eb2@3 ~@6]/2", // Ebm Ab
  M: "[[g4,bb4]@6 [f4,ab4]@6 [eb4,g4]@6 [f4,ab4]@6 [g4,bb4]@4 [ab4,b4]@3 ~]/2", // Gm Fm Eb Fm Gm Abm
})).s("gm_piano").gain(0.45).pan(0.3)

// other · pad metallic · "synth"
const pad_metallic = note(`<
  A B C D A E@2 D ~@20 F G ~ H F G ~ H I@2 J@2 K@2 L@2 I@2 J@2 K@2 ~@2 M B N D A E@2 D ~@8 F G ~ H F G ~ H I@2 J@2 K@2
  L@2 I@2 J@2 K@2 L@2 I@2 J@2 K@2 O@2 M P@2
>`.pickRestart({
  A: "[eb4,eb5]@8 [ab3,ab4]@3 [bb3,bb4]@3 [b3,b4]@2", B: "[e4,e5]@8 ~@6 [eb4,eb5] [db4,db5], eb4@11 ~@5",
  C: "[eb4,eb5]@9 ~ [e4,e5]@3 eb4@2 ~, ~@13 eb5 ~@2", D: "[eb4,eb5]@8 [db4,db5]@7 ~",
  E: "[e4@12 ~@2 [eb4,eb5] db5 [eb4,eb5]@8 ~@2 [e4,e5]@3 [gb4,gb5] ~@2, e5@8 ~@7 db4@2 ~@15]/2", F: "[bb4,db5,f5]@15 ~",
  G: "[gb4,bb4,db5]@13 ~@3", H: "f5@7 ~ eb5@8, [ab4,c5]", I: "[eb4@6 gb4@2 ab4@4 bb4@2 eb4@17 ~]/2",
  J: "[db4@3 gb4 ab4@2 bb4 db4@5 ~@4]/2", K: "[db4@5 ~ f4@2 gb4@4 f4@2 db4@8 ~@10]/2",
  L: "[eb4@5 ~ gb4@2 ab4@4 bb4@2 eb4@6 ~@12]/2", M: "~@8 [ab3,ab4]@3 [bb3,bb4]@3 [b3,b4]@2",
  N: "[eb4,eb5]@10 [e4,e5]@3 eb4@2 ~, ~@13 eb5 ~@2", // Eb E
  O: "[[g4,bb4]@3 [f4,ab4]@3 [eb4,g4]@3 [f4,ab4]@3 [g4,bb4]@2 [ab4,b4]@2]/2", P: "[[eb4,e4,e5]@5 ~@3]/2",
})).s("gm_pad_metallic").gain(0.6).pan(0.1)

// chords · synth strings 1 · "Strings"
const synth_strings_1 = note(`<
  A B C D A B C D A B C D A B C D E B F G A B C D A B C D H I J K H I J K L@2 M@2 N@2 O@2 L@2 M@2 N@2 P@2 E B C D A B C
  D A B C D A B C D H I J K H I J K L@2 M@2 N@2 O@2 L@2 M@2 N@2 O@2 L@2 M@2 N@2 P@2 E Q@2
>`.pickRestart({
  A: "[ab3,b3,eb4]", B: "[ab3,b3,e4]", C: "[gb3,b3,eb4]", D: "[gb3,bb3,eb4]",
  E: "[g3,bb3,db4]@6 [ab3,b3,eb4] ~ [ab3,b3,eb4]@7 ~", F: "~@10 e4@3 ~ eb4 ~, [gb3,b3,eb4]@7 ~",
  G: "[gb3,bb3,eb4] [gb3,bb3,db4]", H: "[bb3,db4,f4]", I: "[bb3,db4,gb4]", J: "[ab3,db4,f4]@15 ~",
  K: "f4 eb4, [ab3,c4]", L: "[[eb5,gb5,bb5]@31 ~]/2", M: "[[db5,gb5,bb5]@31 ~]/2", N: "[[db5,f5,ab5]@15 ~]/2",
  O: "[eb5,gb5,bb5]/2", P: "[[g3,g4,bb4]@3 [f3,f4,ab4]@3 [eb3,eb4,g4]@3 [f3,f4,ab4]@3 [g3,g4,bb4]@2 [ab3,ab4,b4]@2]/2",
  Q: "[[ab3,b3,e4]@5 ~@3]/2", // E
})).s("gm_synth_strings_1").gain(0.24).pan(0.2)

// chords · french horn · "Horn"
const french_horn = note(`<
  ~@16 A B C D ~@8 E F G H I F J H K@2 L@2 M@2 N@2 K@2 L@2 M@2 O@2 A ~@15 E F G H I F J H K@2 L@2 M@2 N@2 K@2 L@2 M@2
  N@2 K@2 L@2 M@2 P@2 A ~@2
>`.pickRestart({
  A: "db4@6 eb4 ~ eb4@8", B: "e4", C: "eb4@10 e4@3 eb4@2 ~", D: "eb4 db4", E: "~@5 db4@3 eb4@4 f4@4", F: "gb4",
  G: "ab4", H: "ab4@15 ~", I: "bb4@2 c5 db5", J: "ab4@7 ~", K: "[[eb4,gb4,bb4]@31 ~]/2", L: "[[db4,gb4,bb4]@31 ~]/2",
  M: "[[db4,f4,ab4]@15 ~]/2", N: "[eb4,gb4,bb4]/2", O: "[bb4@6 ab4@6 g4@6 ab4@6 bb4@4 b4@3 ~]/2",
  P: "[[g4,bb4]@6 [f4,ab4]@6 [eb4,g4]@6 [f4,ab4]@6 [g4,bb4]@4 [ab4,b4]@3 ~]/2", // Gm Fm Eb Fm Gm Abm
})).s("gm_french_horn").gain(0.4).pan(0.7)

// chords · pad new age
const pad_new_age = note(`<
  ~@16 A B C D E B F G E B F G H I J K H I J L M@2 N@2 O@2 P@2 M@2 N@2 O@2 Q@2 A ~@7 E B F G E B F G H I J K H I J L M@2
  N@2 O@2 P@2 M@2 N@2 O@2 P@2 M@2 N@2 O@2 Q@2 A ~@2
>`.pickRestart({
  A: "[g3,bb3,db4]@6 [ab3,b3,eb4] ~ [ab3,b3]@6 ~@2, ~ eb4", B: "[ab3,b3,e4]", C: "~@10 e4@3 ~ eb4 ~, [gb3,b3,eb4]@7 ~",
  D: "[gb3,bb3,eb4] [gb3,bb3,db4]", E: "[ab3,b3,eb4]", F: "[gb3,b3,eb4]", G: "[gb3,bb3,eb4]", H: "[bb3,db4,f4]",
  I: "[bb3,db4,gb4]", J: "[ab3,db4,f4]@15 ~", K: "f4 eb4, [ab3,c4]", L: "[ab3,c4], f4 ~",
  M: "[eb4@6 gb4@2 ab4@4 bb4@2 eb4@17 ~]/2", N: "[db4@3 gb4 ab4@2 bb4 db4@5 ~@4]/2",
  O: "[db4@5 ~ f4@2 gb4@4 f4@2 db4@8 ~@10]/2", P: "[eb4@5 ~ gb4@2 ab4@4 bb4@2 eb4@6 ~@12]/2",
  Q: "[[g4,bb4]@3 [f4,ab4]@3 [eb4,g4]@3 [f4,ab4]@3 [g4,bb4]@2 [ab4,b4]@2]/2", // Gm Fm Eb Fm Gm Abm
})).s("gm_pad_new_age").gain(0.24).pan(0.8)

// other · electric guitar clean
const electric_guitar_clean = note(`<
  ~@35 A B@2 C@2 D@2 E@2 F@2 G@2 H@2 ~@25 A B@2 C@2 D@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 ~@5
>`.pickRestart({
  A: "~@2 gb2 ab2", B: "[eb2@3 gb2 ab2@2 bb2 eb2@7 ~@2]/2", C: "[db2@6 gb2@2 ab2@4 bb2@2 db2@15 ~@3]/2",
  D: "[db2@3 f2 gb2@2 f2 db2@8 ~]/2", E: "[eb2@6 gb2@2 ab2@4 bb2@2 eb2@9 ~ gb2@4 ab2@2 ~@2]/2",
  F: "[eb2@6 gb2@2 ab2@4 bb2@2 eb2@7 ~@11]/2", G: "[db2@3 gb2 ab2@2 bb2 db2@4 ~@5]/2",
  H: "[db2@3 f2 gb2@2 f2 db2@4 ~@5]/2",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.2)

// drums · kick
const kick = s("bd").struct("<[x!2]!50 [~@3 x ~@2 x ~] [~ x ~@4 x ~] [x!2]!46 [~@3 x ~@2 x ~] [~ x ~@4 x ~] ~@3>")
  .gain(0.71).pan(0.6)

// drums · clap
const clap = s("cp").struct("<~@36 [~ x ~ x]!14 ~@26 [~ x ~ x]!22 ~@5>").gain(0.71).pan(0.6)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!50 [~@2 x ~@2 x ~@2] [x!2] [~ x ~ x]!46 [~@2 x ~@2 x ~@2] [x!2] ~@3>")
  .gain(0.71).pan(0.6)

// drums · hihat
const hihat = s("hh").struct(`<
  A@37 B A B A B A B A B A B A B ~@2 A@25 B A B A B A B A B A B A B A B A B A B@3 ~@5
>`.pickRestart({
  A: "x!8", B: "x ~ x!6",
})).gain(0.64).pan(0.6)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@37 A ~ A ~ A ~ A ~ A ~ A ~ A B C ~@25 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@3 B C ~@3
>`.pickRestart({
  A: "~ x ~@6", B: "x ~@2 x ~@2 x ~", C: "~ x ~@2 x ~ x ~",
})).gain(0.71).pan(0.6)

// drums · shaker
const shaker = s("sh").struct("<~@8 [~ x ~ x]!28 ~@16 [~ x ~@2] ~@7 [~ x ~ x]!16 ~@27>").gain(0.71).pan(0.6)

stack(
  bass, piano, pad_metallic, synth_strings_1, french_horn, pad_new_age, electric_guitar_clean, kick, clap, snare, hihat,
  open_hat, shaker
)

More by Foreigner