Strudelify

Love Theme From St. Elmo's Fire (Instrumental)

Foster David

KeyA♭ majorTempo120 bpm
0:00/0:00
// Love Theme From St. Elmo's Fire (Instrumental) — Foster David
// 120 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 103 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · "A.PIANO 1"
const piano = note(`<
  A B A B C D C D E F G@2 E F H I@7 J@3 K L@2 M K N O@7 P@2 Q@2 R@4 S@4 C D C D M K L@2 M K N O@7 P@2 Q@2 R@4 S@4 C D C
  D M K L@2 M K N O@7 T U V W X
>`.pickRestart({
  A: "ab3 eb4 ab4 eb4 ab4 eb4 ab4 eb4", B: "ab3 eb4 ab4 eb4 bb4 eb4 g4 eb4", C: "~ [ab3,c4] [ab3,c4]@2",
  D: "~@2 [ab3,c4] [f3,bb3,db4]@5", E: "eb5@3 [eb5,c6]@5", F: "~@2 ab5 [db5,bb5] ~ [eb5,c6] ~ [eb5,c6]",
  G: "[~ [db5,bb5] ~ [f5,db6]@9 ~@4]/2", H: "~ [db5,bb5] ~ [f5,db6]@5",
  I: "[~@2 ab5 [db5,bb5] ~ [eb5,c6] ~ [f5,db6]@3 ~ [bb4,db5]@2 [c5,eb5] [db5,f5] [bb4,g5]@2 ~ g5 [c5,ab5] ~ [db5,bb5] ~ [eb5,c6]@3 ~ [ab4,c5]@2 [bb4,db5] [c5,eb5] [ab4,f5]@2 ~ ab5 [db5,bb5] ~ [eb5,c6] ~ [f5,db6]@3 ~ [bb4,db5]@2 [c5,eb5] [db5,f5] [bb4,g5]@2 ~ g5 [c5,ab5] ~ [db5,bb5]@3]/7", // Gb Cm Db Bbm Cm Db Eb Fm …
  J: "[[ab4,db5,f5]@8 [bb4,g5,ab5]@24 eb4 ~@5 [eb4,c5]@10, ~@4 eb5@15 ~@5]/3", // Db Eb Cm
  K: "~@2 ab4 [db4,bb4] ~ [eb4,c5] ~ [eb4,c5]", L: "[~ [db4,bb4] ~ [f4,db5]@9 ~@4]/2", M: "eb4@3 [eb4,c5]@5",
  N: "~ [db4,bb4] ~ [f4,db5]@5", // Gb Db
  O: "[~@2 ab4 [db4,bb4] ~ [eb4,c5] ~ [f4,db5]@3 ~ [bb4,db5]@2 [c5,eb5] [db5,f5] [bb4,g5]@2 ~ g4 [c4,ab4] ~ [db4,bb4] ~ [eb4,c5]@3 ~ [ab4,c5]@2 [bb4,db5] [c5,eb5] [ab4,f5]@2 ~ ab4 [db4,bb4] ~ [eb4,c5] ~ [f4,db5]@3 ~ [bb4,db5]@2 [c5,eb5] [db5,f5] [ab4,g5]@2 ~ g4 [c4,ab4] ~ [db4,bb4]@3]/7", // Gb Cm Db Bbm Cm Db Eb Fm …
  P: "[[ab3,db4,f4]@4 [bb3,eb4,g4,ab4]@8 g4 ab4 bb4 c5]/2", Q: "[[f4,db5]@4 [db4,bb4]@3 [eb4,c5]@7 ab4 c5]/2",
  R: "[[f4,db5]@8 ~@2 eb5@4 [db4,bb4]@8 [c4,ab4]@4 [db4,bb4]@4 [eb4,c5]@26 [ab4,c5]@2 ~ [ab4,c5,f5]@2 ~ [bb4,e5,g5]@2]/4", // Db Gb Fm Gb Cm Ab Fm Edim
  S: "[[c5,f5,ab5]@4 [f4,bb4,f5]@3 [bb4,eb5,g5]@5 [eb4,ab4,eb5]@3 [ab4,db5,f5]@12 [ab4,db5,f5] [bb4,eb5,g5,ab5]@4]/4", // Fm Bb5 Eb Ab5 Db Eb
  T: "[ab4,db5,f5] [bb4,eb5,g5]", U: "[db5,f5,ab5] [eb5,g5,bb5]", V: "[eb5,ab5,bb5,c6]",
  W: "[db4,f4,ab4] [bb3,eb4,g4], ab3", X: "[bb3,c4,eb4,ab4]",
})).s("gm_piano").gain(0.5)

// other · pad halo · "HALO PAD"
const pad_halo = note(`<
  ~@4 A B A B ~@8 C@2 D@2 C@2 ~@2 E F@3 E G@2 ~ C@2 D@2 C@2 ~ H I@2 J@3 K L@3 ~ A M A M E F@3 E G@2 ~ C@2 D@2 C@2 ~ H
  I@2 J@3 K L@3 ~ A M A M ~@8 C@2 D@2 C@2 ~@3 N O
>`.pickRestart({
  A: "ab2@2 [ab3,c4]@2 [ab3,c4]@3 eb3", B: "ab2@2 [ab3,c4] [bb3,db4]@5", C: "[~@3 db5@2 eb5 f5 g5@3 ~@6]/2",
  D: "[~@3 c5@2 db5 eb5 f5@3 ~@6]/2", E: "eb5@3 c6@5", F: "[~@2 ab5 bb5@2 c6@2 c6@2 bb5@2 db6@9 ~@4]/3",
  G: "[~@2 ab5 bb5@2 c6@2 c6@2 bb5@2 db6@5]/2", H: "~@4 g4 ab4 bb4 c5", I: "[[f4,db5]@4 bb4@3 [ab4,c5]@7 ~ c5]/2",
  J: "[[f4,db5]@4 ~ eb5@2 [g4,bb4]@4 ab4@2 bb4@2 [ab4,c5]@9]/3", K: "~@8 c5@3 f5@2 ~ g5@2",
  L: "[[c5,ab5]@4 f5@3 [bb4,g5]@5 eb5@3 [ab4,f5]@3 ~@6]/3", M: "ab2 eb3 [ab3,c4] [bb3,db4]@5",
  N: "db2 ab2 f3@2 eb2 bb2 g3@2", O: "[ab2,eb3,ab3]",
})).s("gm_pad_halo").gain(0.19)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@16 A B C D E B ~@2 F@3 G F@3 H I J K L I M N@2 O F I P Q R S T U@2 ~@4 F@3 G F@3 H I J K L I M N@2 O F I P Q R S T
  U@2 ~@23
>`.pickRestart({
  A: "bb2 ~@3", B: "g2 ~@3", C: "ab2 ~@2 g2", D: "f2@2 ~@3 a2@3", E: "bb2 ~@2 a2", F: "ab2@6 ~ ab2",
  G: "ab2@2 ab3 g3 eb3 bb2 ab2 g2", H: "ab2 a2", I: "bb2@6 ~ ab2", J: "g2@6 ~ g2", K: "ab2@6 ~ g2", L: "f2@4 ~ a2@3",
  M: "g2@4 ~ eb2@3", N: "[db2 eb2@3]/2", O: "bb2@4 g2@3 g2", P: "g2@4 eb2@3 g2", Q: "ab2@6 ~ eb2",
  R: "ab2@8 c3@3 ab2@2 g2@3", S: "f2@4 d2@3 d2", T: "eb2 c2", U: "[db2@3 eb2]/2",
})).s("gm_acoustic_bass").gain(0.63)

// bass · acoustic bass · "ACOU BASS" · soft notes
const bass_soft = note("<~@84 A B A C A B A D E F G H I J ~@5>".pickRestart({
  A: "ab2@2 ~@5 eb2", B: "ab2 ~@3", C: "ab2@2 ~@5 g2", D: "ab2 ~ a2 ~", E: "bb2@2 ~@5 ab2", F: "g2@2 ~@5 g2",
  G: "ab2 ~@2 g2", H: "f2@2 ~@3 a2@3", I: "bb2 ~@2 ab2", J: "g2 ~@3",
})).s("gm_acoustic_bass").gain(0.31)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  A B A B A B A B A@2 C@2 A@2 C D E F G H E F ~@2 I@2 J@2 I@2 J@2 K L M N O@4 P@2 Q@3 R S@3 T U@2 V@4 J@2 I@2 J@2 K L M
  N O@4 P@2 Q@3 R S@3 T U@2 W@3 A C@2 A@2 C D E F G H E F ~@2 X Y@2
>`.pickRestart({
  A: "ab3 eb4 ab4 eb4 ab4 eb4 ab4 eb4", B: "ab3 eb4 ab4 eb4 bb4 eb4 g4 eb4", C: "ab3 db4 eb4 f4 eb4 f4 eb4 f4",
  D: "ab3 db4 eb4 f4 db4 f4 c4 f4", E: "~ [bb3,db4,f4]!7", F: "~ [bb3,db4,eb4]!7", G: "~ [ab3,c4,eb4]!7",
  H: "~ [f3,ab3,db4]!4 [f3,a3,eb4]!3", I: "[ab3,c4,eb4]/2", J: "[ab3,db4,f4]/2", K: "[ab3,db4,f4,f5]",
  L: "[bb3,db4,eb4,g5]", M: "[ab3,c4,eb4,eb5]", N: "f5@2 g5@2 ~@3 c6, [ab3,db4,f4]@4 ab5@3 ~, ~@5 [ab3,eb4,f4]@3",
  O: "[[bb3,db4,f4]@2 [bb3,db4,eb4]@2 [ab3,db4,f4] [bb3,eb4,g4]@3, db6@7 ~]/4", // Bbm Eb7 Db Eb
  P: "[[f4,db5]@4 bb4@3 [ab4,c5]@7 ~ c5]/2", Q: "[[f4,db5]@4 ~ eb5@2 [g4,bb4]@4 ab4@2 bb4@2 [ab4,c5]@9]/3",
  R: "~@8 c5@2 ~ f5@2 g5@2 ~", S: "[ab5@4 f5@3 g5@5 eb5@3 f5@7 f5 g5]/3", T: "ab5 bb5",
  U: "[ab3 eb4 ab4 eb4 ab4 eb4 ab4 eb4 ab3 eb4 ab4 eb4 ab4 eb4 g4 eb4, c6@3 bb5]/2",
  V: "[ab3 eb4 ab4 eb4 ab4 eb4 ab4 eb4 ab3 eb4 ab4 [eb4,g5] [bb4,eb6] [eb4,bb5] [g4,g5] eb4 [ab3,c4,eb4]@16, ab5@12 ~@3 ab5@9 ~@8]/4", // Eb Eb5 G Ab
  W: "[ab3 eb4 ab4 eb4 ab4 eb4 ab4 eb4 ab3 eb4 ab4 [eb4,g5] [bb4,eb6] [eb4,bb5] [g4,g5] eb4 ab3 eb4 ab4 eb4 ab4 eb4 ab4 eb4, ab5@4 ~ ab5@3]/3", // Eb Eb5 G
  X: "[ab3,c4,eb4]", Y: "[[db4,f4] [eb4,g4] [ab3,ab4] ~, ab5]/2",
})).s("gm_string_ensemble_2").gain(0.22)

// other · soprano sax · "SOPRAN SAX"
const soprano_sax = note("<~@54 A@4 B@5 C@2 D E F G ~@6 H I@3 ~@24>".pickRestart({
  A: "[c4@3 ab4@7 f4 g4@2 ab4@2 ab4@2 g4@2 bb4@9 ~@4]/4",
  B: "[c4@3 ab4@7 f4 g4@2 ab4@2 ab4@2 g4@2 ~@7 f4 g4@2 ab4@2 bb4@9, ~@19 bb4@8 ~@13]/5",
  C: "[~@2 eb4 f4@2 g4@2 ab4@9]/2", D: "~@2 f4 g4@2 c5@3", E: "bb4", F: "~@2 eb4 f4@2 g4@3", G: "db4 eb4",
  H: "~@8 c4@2 ~ db4@2 eb4@3", I: "[f4@4 db4@3 eb4@5 c4@2 ab3 db4@9]/3",
})).s("gm_soprano_sax").gain(0.32)

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

// drums · snare
const snare = s("sd").struct("<~@24 A@15 ~ A@8 ~@6 A@15 ~ A@8 ~@6 A@15 ~ A@2 ~>".pickRestart({
  A: "~ x",
})).gain(0.53)

// drums · high tom
const high_tom = s("ht").struct("<~@31 A ~@13 B ~@15 A ~@13 B ~@15 A ~@11>".pickRestart({
  A: "~ x", B: "~@3 x",
})).gain(0.67)

// drums · crash
const crash = s("cr").struct("<~@31 A B ~@12 C ~@15 A B ~@12 C ~@15 A ~@11>".pickRestart({
  A: "~@6 x!2 ~@8", B: "x", C: "~ x ~@2 x ~@2 x",
})).gain(0.67)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@24 A@7 ~ A@3 ~ A ~@3 A@5 ~@9 A@7 ~ A@3 ~ A ~@3 A@5 ~@9 A@7 ~ A@3 ~ A ~@3 A@2 ~
>`.pickRestart({
  A: "~ x",
})).gain(0.6)

stack(piano, pad_halo, bass, bass_soft, string_ensemble_2, soprano_sax, kick, snare, high_tom, crash, tambourine)

More by Foster David