Strudelify
Eternal Flame cover art

Eternal Flame

The Bangles

KeyG majorTempo79 bpm
0:00/0:00
// Eternal Flame — The Bangles
// 79 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 14 "Vibes" named as a mallet, played on vibraphone (its epiano1 patch is not one)
// note: duplicate parts dropped: ch 1 "Electric Piano" epiano2 (copy of ch 14 "Vibes" vibraphone)
// note: Full arrangement: all 78 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(79/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 · vibraphone · "Vibes"
const vibraphone = note(`<
  A@2 B C D E F G H I J ~@28 K L D E M G H I J N C D E F G H O J N C D E F G H O J N C D E F G P ~@5
>`.pickRestart({
  A: "[g4,b4] d4 [g4,b4] d4 [g4,c5] d4 [g4,c5] d4", // G C5
  B: "[g4,b4]@4 ~@2 d4@6 [g4,b4]@6 d4@5 ~ [g4,b4]@5 ~ d4@6 [g4,b4]@6 d4@5 ~", // G
  C: "[g4,c5]@5 ~ d4@6 [g4,c5]@6 d4@5 ~ [f#4,a4]@5 ~ d4@6 [f#4,a4]@5 ~ d4@5 ~", // C5 F#m
  D: "[g4,b4]@6 d4@6 [g4,b4]@6 d4@6 [g4,b4]@5 ~ d4@6 [g4,b4]@6 d4@6", // G
  E: "[g4,c5] d4 [g4,c5] d4 [f#4,a4] d4 [f#4,a4] d4", // C5 F#m
  F: "[g4,b4]@6 e4@6 [g4,b4]@6 e4@5 ~ [f#4,b4]@6 d#4@6 [f#4,b4]@6 d#4@5 ~", // G B5
  G: "[g4,b4]@6 d4@6 [g4,b4]@6 d4@5 ~ [a4,c#5]@6 e4@5 ~ [a4,c#5]@6 e4@5 ~", // G A
  H: "[f#4,a4]@6 d4@6 [f#4,a4]@6 d4@6 [f#4,b4]@5 ~ d4@6 [f#4,b4]@5 ~ d4@6", // F#m B5
  I: "[g4,c5] e4 [g4,c5] e4 [g4,c5] e4 [g4,c5] e4", // C5
  J: "[g4,c5]@6 e4@6 [g4,c5]@6 e4@6 [g4,c5]@6 e4@6 [g4,c5]@5 ~ e4@5 ~", // C5
  K: "[g4,b4]@4 ~@2 d4@6 g4 g4@5 d4@5 ~ [g4,b4]@5 ~ d4@6 [g4,b4]@6 d4@5 ~, ~@2 b4 ~@5", // G
  L: "[g4,c5]@5 ~ d4@6 [g4,c5]@6 d4@5 ~ [f#4,a4]@5 ~ d4@6 [f#4,a4]@6 d4@5 ~", // C5 F#m
  M: "[g4,b4]@5 ~ e4@6 [g4,b4]@6 e4@5 ~ [f#4,b4]@6 d#4@6 [f#4,b4]@6 d#4@5 ~", // G B5
  N: "~ b4@4 ~ d4@6 [g4,b4]@6 d4@5 ~ [g4,b4]@5 ~ d4@6 [g4,b4] [g4,b4]@5 d4@5 ~, g4@5 ~@43", // G
  O: "[g4,c5]@6 e4@6 [g4,c5]@6 e4@6 [g4,c5]@6 e4@6 [g4,c5]@5 ~ e4@6", // C5
  P: "[f#4,a4]@6 d4@6 [f#4,a4]@6 d4@6 [f#4,b4]@5 ~ d4@6 ~@12", // F#m B5
})).s("gm_vibraphone").gain(0.26)

// chords · vibraphone · "Vibes" · soft notes · B5 C5 G C5 F#m G
const vibraphone_soft = note(`<
  ~@72
  [~@36 [f#4,b4]@5 ~ d4@6]
  [[g4,c5]@6 e4@6 [g4,c5]@6 e4@6 [g4,c5]@6 e4@6 [g4,c5]@5 ~ e4@6]
  [[g4,c5]@6 e4@6 [g4,c5]@6 e4@6 [g4,c5]@6 e4@6 [g4,c5]@5 ~ e4@5 ~]
  [~ b4@4 ~ d4@6 [g4,b4]@6 d4@5 ~ [g4,b4]@5 ~ d4@6 [g4,b4] [g4,b4]@5 d4@5 ~, g4 ~@11]
  [[g4,c5]@5 ~ d4@6 [g4,c5]@6 d4@5 ~ [f#4,a4]@5 ~ d4@6 [f#4,a4]@5 ~ d4@5 ~]
  [[g4,b4]@6 d4@7 ~@35]
>`).s("gm_vibraphone").gain(0.1)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~ A B ~@17 C@2 D@6 E@6 F@7 ~@6 G H@6 I@3 J@2 K@7 L@6 ~@6>".pickRestart({
  A: "~@36 [e4,e5]@3 [d4,d5]@3 [b3,b4]@5 ~", B: "[g3,g4]@5 ~@11",
  C: "[[d2,f#4,a4,d5,d6]@11 ~ [a4,a5]@10 ~@18 d4@6 ~ [b3,g4]@5 ~ d4@5 ~@13 d4@4 d4@3 [c4,d4]@3 d4@3 ~@5 d4@3 e4@3 [c4,f4], d4@22 d4@12 d4@6 ~@6 [d4,d6]@7 b3@3 ~@2 [d4,a5]@11 a3@15 ~ a3@8 ~@3, ~@23 f4@23 ~ d5@11 b3@6 f#4@3 g4@10 ~@10 e4@5 ~@4, ~@37 c4@8 ~ d2@50, ~@59 a4@12 ~@4 f#4@5 ~@4 d4@4 c4@6 ~@2]/2", // D A Em Csus2 F5 D D5
  D: "[[f3,a3,c4]@16 a4@4 ~@2 [d4,g4]@7 d4@17 ~ [g4,c5]@5 ~ e4@4 ~@2 [g4,b4]@6 [d4,e4]@5 ~ [e4,a4]@6 ~@6 [e4,g4]@6 c4@5 d4@43 ~@6 c4@73 ~@56 c4@3 b3@13, f4@21 ~ [g3,b3]@23 ~ c4@20 ~@4 a3@25 ~@168 d#3@24 ~, ~@22 f4 ~@23 c3@12 b2@12 c4@7 c4@12 ~@181 b3@5 ~@13, ~@46 e4@6 f4@6 e4@7 ~@5 a2@12 g2@13 ~@193, ~@71 e3@25 ~@143 e3@49]/6", // F G5 C5 G Dsus2 A5 Em G
  E: "[e3@22 ~@25 d3@14 ~@117 c5@2 ~@12 c5 d5@10 ~ a5@10 ~@18 d4@6 ~ [b3,g4]@5 ~ d4@5 ~@6 f#4@3 ~@4 d4@4 d4@3 [c4,d4]@3 d4@4 ~@4 d4@3 e4@3 f4, ~@22 c#3@24 ~@128 a4@4 ~@4 b4@4 e5@4 e5@3 d4@21 d4@12 d4@3 c4@8 ~ [d4,d6]@7 b3@3 ~@2 [d4,a5]@9 g4@8 f#4@5 ~@5 d4@2 e4 c4@6 ~@2, ~@23 a3@152 ~ b4@4 c5@4 c5@4 d5@4 d3@96, ~@192 f#4@22 ~ f4@23 ~ d2@49, ~@192 [a4,d6]@12 a4@33 ~@2 d5@11 b3 a4@10 a3@15 ~ a3@8 ~@3]/6", // Em Csus2 D D5
  F: "[[f3,a3,c4]@16 a4@5 ~ g4@7 d4@17 ~@2 g4@4 ~@2 e4@4 ~ [g4,b4]@6 [d4,e4]@5 ~ [e4,a4]@6 ~@6 [e4,g4]@6 c4@5 d4@43 ~@54 [a3,e4]@46 ~ g3@2 g3@65 ~@31, f4@21 ~ [g3,b3]@23 ~ c3@12 b2@13 [e3,a3]@25 ~@95 d4@120 ~@25, ~@22 d4@5 ~@19 c4@20 ~@4 c4@7 c4@12 ~@54 c4@73 ~@22 b3@43 ~@55, ~@22 f4 ~@23 e4@6 f4@6 e4@7 ~@6 a2@12 g2@13 ~@240, ~@47 c5@6 ~@187 g4@21 ~@75]/7", // F G Dsus2 A5 Em A5 G A5
  G: "~@24 c4@3 d4@2 ~@8 g4@2 ~ b4@2 ~ d5 ~@2 f#5@2, ~@29 e4@14 ~@5, ~@39 a4@2 ~ c5@2 ~ e5@2 ~",
  H: "[g5@90 f#5@5 d5@24 e5@53 ~ d5@42 d#5@20 ~@2 e5@50 f#5]/6", I: "[~@22 d5@24 ~ g5@97]/3", J: "[g5@15 a5]/2",
  K: "[g5@119 f#5@21 g5@27 e5@24 f#5@23 d5@24 ~ e5@48 g5@49]/7",
  L: "[g5@89 f#5@5 ~ d5@23 e5@54 ~ d5@41 d#5@24 e5@48 ~@2]/6",
})).s("gm_string_ensemble_1").gain(0.31)

// chords · string ensemble 1 · "Strings" · soft notes
const string_ensemble_1_soft = note("<~@20 A B C@2 ~@2 D@2 ~@4 A B C@2 ~@35 E@4 F@2 G>".pickRestart({
  A: "~@22 c4@15 ~@11", B: "~ g4@3 ~@8", C: "[~@23 g3@12 ~@13]/2", D: "[~@47 b3@31 ~@18]/2",
  E: "[~@47 f#5@23 d5@25 g5@97]/4", F: "[g5@89 f#5@6 ~]/2", G: "d5@13 ~@35",
})).s("gm_string_ensemble_1").gain(0.15)

// bass · fretless bass · "Bass"
const bass = note("<~ A B@8 C@8 D@2 E@3 F@7 G@5 H@3 I J@4 K@3 L M@5 N@3 O P@5 N@3 O Q@5 N@3 ~@5>".pickRestart({
  A: "~@12 c2 b1 d1@2",
  B: "[g1@13 ~@4 g2@6 e2@13 ~@5 a#1@3 b1@3 c2@12 ~@6 c2@6 d2@8 ~@4 d2@6 e2@6 g2@13 ~@5 g2@6 e2@16 ~@2 b1@5 ~ c2@13 ~@5 c2@5 ~ d2@11 ~ a2@6 d2@2 d#2@4 e2@11 ~ e3@7 ~@5 b2@5 f#2@6 ~ b1@10 ~@2 e2@11 ~@2 b2@2 ~@2 b2@6 ~ a2@11 ~@2 a1@8 ~@3 d2@13 ~@5 d2@6 b1@15 ~@3 b1@6 a1@9 ~@3 a2@17 ~ b2@3 a2@2 b2@3 ~ a2@2 g2@7 ~]/8",
  C: "[a1@10 ~@2 a2@2 ~@3 a2@16 ~@2 a2@3 ~@3 a2@6 g2@13 ~@5 g2@6 e2@13 ~@5 a#1@3 b1@3 c2@12 ~@6 c2@6 d2@8 ~@4 d2@6 e2@6 g2@13 ~@5 g2@6 e2@16 ~@2 b1@5 ~ c2@13 ~@5 c2@5 ~ d2@11 ~ a2@6 d2@3 d#2@3 e2@11 ~ e3@7 ~@5 b2@5 f#2@6 ~ b1@10 ~@2 e2@11 ~@2 b2@2 ~@3 b2@6 a2@11 ~@2 a1@9 ~@2 d2@13 ~@5 d2@6 b1@14 ~@4 b1@6 a1]/8",
  D: "[~@12 a2@5 ~@12 b2@3 a2@2 b2@3 ~ a2@3 g2@6 a1@11 ~ a2@13 ~@4 a1@7 a2@4 ~@2 d2@4 ~@3]/2",
  E: "[a2@2 ~@9 d2@11 ~ d3@8 a2@3 d3@2 ~@2 a2@3 d2@5 ~ d2@13 ~@10 d3@8 ~@4 d2@4 ~@3 e2@3 ~@3 f2@14 ~@4 f2@3 ~@3 g2@14 ~@4 g2@2 ~@5, ~@60 a2@19 ~@65]/3",
  F: "[c2@11 b1@8 ~@4 a1@8 ~@4 g1@8 ~@4 d2@19 d2@3 ~@2 b1@14 ~@4 b1@3 ~@3 c2@18 c2@12 ~ c2@6 c2@10 ~@26 d3@10 ~@14 e3@8 ~@4 e3@11 ~ b2@5 ~@7 b1@10 ~@14 b2@4 ~@2 b2@4 ~@2 a2@11 ~ a1@10 ~ d2@18 ~@7 b1@14 ~@4 b1@2 ~@4, ~@143 d2@45 ~@3 e2@48 e2@24 ~@42 d2@31]/7",
  G: "[a1@12 a2@16 b2@3 a2@3 b2@4 a2@3 g2@4 ~@2 a1@12 a2@16 ~@2 b2@3 a2@3 b2@3 a2@3 g2@5 ~ d2@12 d2@12 d3@8 ~ a2@2 d3@3 ~@3 d2@5 ~@25 d3@8 ~@11 e2@3 ~@3 f2@14 ~@4 f2@4 ~@2 g2@14 ~@4 g2@3 ~@4, ~@134 a2@4 ~@5 d2@36 d2@14 ~@47, ~@156 a2@19 ~@65]/5",
  H: "[c2@11 b1@8 ~@4 a1@8 ~@5 g1@8 ~@3 d2@19 d2@3 ~@2 b1@14 ~@4 b1@3 ~@3 c2@18 ~ c2@12 c2@18]/3",
  I: "~@24 d3@11 ~@13, d2@15 ~",
  J: "[~@17 g2@6 e2@13 ~@5 a#1@3 b1@3 c2@12 ~@6 c2@6 d2@8 ~@4 d2@6 e2@6 g2@13 ~@5 g2@6 e2@16 ~@2 b1@5 ~ c2@13 ~@6 c2@5 d2@11 ~ a2@6 d2@3 d#2@4]/4",
  K: "[e2@11 e3@7 ~@6 b2@5 f#2@6 b1@10 ~@2 e2@11 ~@2 b2@2 ~@3 b2@6 a2@11 ~@2 a1@9 ~@2 d2@13 ~@5 d2@6 b1@14 ~@4 b1@6 ~]/3",
  L: "a1@9 ~@2 a2@17 ~ b2@3 a2@2 ~ b2@2 a2@4 g2@7",
  M: "[a1@10 ~@2 a2@4 ~ a2@16 ~@3 a2@2 ~@3 a1@6 g2@13 ~@5 g2@6 e2@13 ~@5 a#1@3 b1@3 c2@12 ~@6 c2@6 d2@8 ~@4 d2@6 e2@6 g2@18 ~@6 e2@16 ~@2 b1@5 ~ c2@13 ~@6 c2@5 d2@11 ~ a2@6 d2@3 d#2@3 ~, ~@161 g2@18 ~@61]/5",
  N: "[e2@11 e3@7 ~@5 b2@6 f#2@6 b1@10 ~@2 e2@11 ~@2 b2@2 ~@3 b2@6 a2@11 ~@2 a1@9 ~@2 d2@14 ~@4 d2@6 b1@14 ~@4 b1@6 ~]/3",
  O: "a1@9 ~@2 a2@18 b2@3 a2@2 ~ b2@2 a2@4 g2@7",
  P: "[~ a1@10 ~ a2@2 ~@3 a2@16 ~@3 a2@2 ~@3 a2@6 g2@13 ~@5 g2@6 e2@13 ~@5 a#1@3 b1@3 c2@12 ~@6 c2@6 d2@8 ~@4 d2@6 e2@6 g2@18 ~@6 e2@16 ~@2 b1@5 ~ c2@13 ~@6 c2@5 d2@11 ~ a2@6 d2@3 d#2@3 ~, ~@161 g2@18 ~@61]/5",
  Q: "[~ a1@10 ~ a2@2 ~@3 a2@16 ~@3 a2@3 ~@2 a2@6 g2@13 ~@5 g2@6 e2@13 ~@5 a#1@3 b1@3 c2@12 ~@6 c2@6 d2@8 ~@4 d2@6 e2@6 g2@18 ~@6 e2@16 ~@2 b1@5 ~ c2@13 ~@6 c2@5 d2@11 ~ a2@6 d2@3 d#2@3 ~, ~@161 g2@18 ~@61]/5",
})).s("gm_fretless_bass").gain(0.31)

// bass · fretless bass · "Bass" · soft notes
const bass_soft = note("<~@20 A ~@6 B ~@4 C ~@40 D E@4>".pickRestart({
  A: "~ d3@2 ~@13", B: "~@30 f#2@5 ~@13", C: "~@2 d3@3 ~@19", D: "a1@9 ~@2 a2@18 b2@3 a2@2 ~ b2@2 a2@4 g2@7",
  E: "[~ a1@10 ~ a2@2 ~@3 a2@16 ~@3 a2@2 ~@3 a2@6 g2@13 ~@5 g2@6 e2@13 ~@5 a#1@3 b1@3 c2@12 ~@6 c2@6 d2@8 ~@4 d2@6 e2@6 g2@24 ~@25]/4",
})).s("gm_fretless_bass").gain(0.15)

// chords · piano
const piano = note("<~@19 A ~@2 B ~ C ~ D ~@7 E ~ C ~ F ~@39>".pickRestart({
  A: "d5 ~@47", B: "~@12 [a3,c4,f4]@7 ~@5 [b3,d4,g4]@7 ~@5 [b3,d4,g4]@9 ~@3, ~@12 b3 ~@35",
  C: "~@12 [d4,f#4]@2 ~ [e4,g4]@2 ~ [f#4,a4]@2 ~@28", // D Em F#m
  D: "~@14 d5@3 ~@6 d6@17 ~@8, a4@5 d5@5 ~@7 g5@7 ~@24, ~@3 c5@8 c5@6 ~@2 a5@20 ~@9, ~ a4 ~@4",
  E: "~@12 [a3,c4,f4]@8 ~@4 [b3,d4,g4]@7 ~@5 [b3,d4,g4]@9 ~@3, ~@12 b3 ~@35", // F G
  F: "~@14 d5@3 ~@6 d6@17 ~@8, a4@6 d5@5 ~ c5@6 ~ a5@20 ~@9, ~@3 c5@6 a4@8 g5@8 ~@23",
})).s("gm_piano").gain(0.41)

// other · electric guitar jazz · "Humbucker"
const electric_guitar_jazz = note(`<
  ~@27
  [b4@10 ~@2 b4@15 ~@3 b4@3 c5@3 b4@5 ~ a4@5 ~]
  [g4@19 ~@4 g4@18 f#4@6 ~]
  [f#4@10 ~@2 e4@9 ~@4 d4@8 ~@3 d4@11 ~]
  [d4 c4 b3 c4 ~ g3!2 ~]
  [d4@17 ~ c4@11 ~ b3@11 ~ g3@5 ~]
  ~@46
>`).s("gm_electric_guitar_jazz").gain(0.51)

// other · orchestra hit · "Tutti Orch"
const orchestra_hit = note("<~@19 A@3 ~@9 B@3 ~@13 C@2 ~@29>".pickRestart({
  A: "[~@41 a3@5 ~ d4@82 ~@15]/3", B: "[~@42 a3@5 d4@82 ~@15]/3", C: "[~@42 g2@5 [g2,g3]@18 ~@31]/2",
})).s("gm_orchestra_hit").gain(0.51)

// other · music box · "Tinkle Bells"
const music_box = note(`<
  A@3 B C D@2 A@2 B E B@2 A B A B A@2 C D B D B D@2 E ~@5 B@2 A B D@2 E D B D E B@2 D B C B@2 A B@2 A B D E B@2 A B@2 A
  B D E B@2 A B@2 A ~@6
>`.pickRestart({
  A: "~@3 g7", B: "~@36 g7@11 ~", C: "~@9 g7@2 ~", D: "~@18 g7@5 ~", E: "~@12 g7@3 ~",
})).s("gm_music_box").gain(0.31)

// other · music box · "Tinkle Bells" · soft notes
const music_box_soft = note("<~@72 [~@36 g7@11 ~] [~@18 g7@5 ~] [~@12 g7@3 ~] [~@36 g7@11 ~]!2 ~>")
  .s("gm_music_box").gain(0.1)

// other · timpani
const timpani = note("<~@19 A B ~@10 C@2 ~@14 D@2 ~@29>".pickRestart({
  A: "~@42 a2@5 ~", B: "d2 ~@7", C: "[~@42 a2@5 d2@6 ~@43]/2", D: "[~@41 [d2,d3]@4 ~@2 [g1,g2]@8 ~@41]/2",
})).s("gm_timpani").gain(0.51)

// drums · kick
const kick = s("bd").struct("<~@47 A B ~@8 B ~@8 B ~@8 B ~@2>".pickRestart({
  A: "~@7 x", B: "x",
})).gain(0.26)

// drums · rim
const rim = s("rim").struct("<A@4 B A@8 B A@27 B A@8 B A@8 B A@8 B A@3 ~@6>".pickRestart({
  A: "x!2", B: "x ~ x!2",
})).gain(0.31)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~@72 [x!2]!5 x>").gain(0.1)

// drums · snare
const snare = s("sd").struct(`<
  A@4 B C A@4 C A@2 B C A@4 C@2 A@3 C A@7 C A@3 C A@4 B C A@4 C A@3 C A@4 C A@3 C A@4 C A@3 C A@3 C@3 ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@3 x",
})).gain(0.15)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@72 [~@3 x] [~ x ~ x] [~@3 x] [~ x ~ x]!2 [~ x ~@2]>").gain(0.05)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!72 [x!5 ~@3] ~@5>").gain(0.31)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@72 [~@5 x!3] [x!8]!4 [x!2 ~@6]>").gain(0.1)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@2 A@2 ~ A@4 ~ A@3 ~ A@4 ~ A@22 ~ A@4 ~ A@3 ~ A@4 ~ A@3 ~ A@4 ~ A@3 ~ A@3 ~@6
>`.pickRestart({
  A: "~ x ~ x",
})).gain(0.36)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@72 [~ x ~ x] ~ [~ x ~ x]!3 ~>").gain(0.1)

// drums · cowbell
const cowbell = s("cb").struct("<[x!2]!2 ~@76>").gain(0.36)

stack(
  vibraphone, vibraphone_soft, string_ensemble_1, string_ensemble_1_soft, bass, bass_soft, piano, electric_guitar_jazz,
  orchestra_hit, music_box, music_box_soft, timpani, kick, rim, rim_soft, snare, snare_soft, hihat, hihat_soft,
  tambourine, tambourine_soft, cowbell
)

More by The Bangles