Strudelify

fireflies

Owl City

KeyE♭ majorTempo176 bpm
0:00/0:00
// fireflies — Owl City
// 176 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5478274; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 114 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(176/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 · glockenspiel
const glockenspiel = note(`<
  A B C D A B C E F B C D A B C E G H I J K@2 L@2 G H I J K@2 M@2 N@3 O@2 P Q R S T U R S V W@2 G H I J K@2 L@2 G H I J
  K@2 L@2 N@3 O@2 P Q R S T U R S V X@2 N@3 O@2 P Q R S T U R S V X@2 ~@18
>`.pickRestart({
  A: "~@2 d7@2 bb6@3 eb7", B: "~@2 f7@3 bb6 eb7@2", C: "~@2 c7 bb6 ~@2 ab6 bb6", D: "~@2 c7@2 g7@3 bb6",
  E: "~@2 c7@2 g7 eb7 ab7 eb7", F: "bb6@2 d7@2 bb6@3 eb7", G: "~@2 bb6 f7@2 f7@2 eb7", H: "f7 eb7 bb6@2",
  I: "~@2 bb6 c7@2 c7@2 bb6", J: "c7 eb7 f7@2", K: "[~@2 g7@2 f7@2 eb7 bb6@2 bb6 g7@2 f7@2 eb7@2]/2", L: "c7/2",
  M: "[~@2 d7 eb7, c7]/2", N: "[~@2 g7@2 f7@2 eb7 bb7@2 g7@3 f7@2 eb7 f7@9]/3", O: "[~@2 bb6@2 eb7@2 d7 c7@9]/2",
  P: "bb6", Q: "d7", R: "c7@3 bb6", S: "c7@2 c7 eb7@3 g7@2", T: "f7@2 eb7 bb6@3 bb6@2", U: "c7@2 c7 eb7@3 f7@2",
  V: "f7 eb7 bb6@4 eb7@2", W: "[f7@5 ~@3]/2", X: "f7/2",
})).s("gm_glockenspiel").gain(0.3)

// other · xylophone
const xylophone = note(`<
  ~@7 A B C@2 D@2 E@2 ~ F G H I J@2 K@2 F G H I J@2 K@2 ~@16 F G H I J@2 K@2 F G H I J@2 K@2 L@3 M@2 N O P Q R S T Q U
  V@2 L@3 M@2 N O P Q R S T Q U V@2 ~@18
>`.pickRestart({
  A: "~@3 [eb5,eb6]", B: "[d5,d6]@3 [bb4,bb5]@3 [eb5,eb6]@2", C: "[[d5,d6]@3 [bb4,bb5]@3 [c5,c6]@8 [bb4,bb5]@2]/2",
  D: "[[d5,d6]@3 [eb5,eb6]@3 [f5,f6]@8 [bb4,bb5]@2]/2", E: "[[g5,g6]@3 [f5,f6]@3 [eb5,eb6]@8 ~@2]/2",
  F: "~@2 bb5 f6@2 f6@2 eb6", G: "f6 eb6 bb5@2", H: "~@2 bb5 c6@2 c6@2 bb5", I: "c6 eb6 f6@2",
  J: "[~@2 g6@2 f6@2 eb6 bb5@2 bb5 g6@2 f6@2 eb6@2]/2", K: "c6/2", L: "[~@2 g6@2 f6@2 eb6 bb6@2 g6@3 f6@2 eb6 f6@9]/3",
  M: "[~@2 bb5@2 eb6@2 d6 c6@9]/2", N: "[bb4,bb5]", O: "[d5,d6]", P: "[c5,c6]@3 bb5", Q: "c6@2 c6 eb6@3 g6@2",
  R: "f6@2 eb6 bb5@3 bb5@2", S: "c6@2 c6 eb6@3 f6@2", T: "c6@3 bb5", U: "f6 eb6 bb5@4 [eb5,eb6]@2", V: "[f5,f6]/2",
})).s("gm_xylophone").gain(0.3)

// other · xylophone · soft notes
const xylophone_soft = note("<~@33 A B@2 C D E F G H I J G K L@2 ~@66>".pickRestart({
  A: "[eb5,g5]!4", B: "[d5,f5]!4", C: "ab5 c5 ab5 c5 ab5 c5 ab5 c5", D: "g5 bb4 g5 bb4 g5 bb4 g5 bb4",
  E: "d5 bb4 d5 bb4 d5 bb4 d5 bb4", F: "c5 ab4 c5 ab4 c5 ab4 bb4@2", G: "c5@2 c5 eb5@3 g5@2", H: "f5@2 eb5 bb4@3 bb4@2",
  I: "c5@2 c5 eb5@3 f5@2", J: "c5@3 bb4", K: "f5 eb5 bb4@4 eb5@2", L: "[f5@5 ~@3]/2",
})).s("gm_xylophone").gain(0.2)

// other · vibraphone
const vibraphone = note(`<
  ~@7 A B C@2 D@2 E@2 ~ F G H I J@2 K L F G H I J@2 K M N@3 O@2 P Q R S T U V S W X@2 F G H I J@2 K L F G H I J@2 K ~
  Y@3 Z@2 AA AB AC S T U V S AD AE@2 Y@3 Z@2 AA AB AC S T U V S AD AE@2 ~@18
>`.pickRestart({
  A: "~@3 [eb4,eb5]", B: "[d4,d5]@3 [bb3,bb4]@3 [eb4,eb5]@2", C: "[[d4,d5]@3 [bb3,bb4]@3 [c4,c5]@8 [bb3,bb4]@2]/2",
  D: "[[d4,d5]@3 [eb4,eb5]@3 [f4,f5]@8 [bb3,bb4]@2]/2", E: "[[g4,g5]@3 [f4,f5]@3 [eb4,eb5]@8 ~@2]/2",
  F: "~@2 bb4 f5@2 f5@2 eb5", G: "f5 eb5 bb4@2", H: "~@2 bb4 c5@2 c5@2 bb4", I: "c5 eb5 f5@2",
  J: "[~@2 g5@2 f5@2 eb5 bb4@2 bb4 g5@2 f5@2 eb5@2]/2", K: "[ab3,c5] [ab3,d4]", L: "[ab3,eb4]!2",
  M: "[ab3,d4] [ab3,eb4]", // Abdim Ab5
  N: "[~@2 [g4,g5]@2 [f4,f5]@2 [eb4,eb5] [bb4,bb5]@2 [g4,g5]@3 [f4,f5]@2 [eb4,eb5] [f4,f5]@9]/3", // G F Eb Bb G F Eb F
  O: "[~@2 [bb3,bb4]@2 [eb4,eb5]@2 [d4,d5] [c4,c5]@9]/2", P: "[bb3,bb4]", Q: "[d4,d5]", R: "[c4,c5]@3 bb4",
  S: "c5@2 c5 eb5@3 g5@2", T: "f5@2 eb5 bb4@3 bb4@2", U: "c5@2 c5 eb5@3 f5@2", V: "c5@3 bb4", W: "f5 eb5 bb4@4 eb5@2",
  X: "[f5@5 ~@3]/2", Y: "[~@2 g5@2 f5@2 eb5 bb5@2 g5@3 f5@2 eb5 f5@9]/3", Z: "[~@2 bb4@2 eb5@2 d5 c5@9]/2",
  AA: "[bb4,bb5]", AB: "[d5,d6]", AC: "[c5,c6]@3 bb4", AD: "f5 eb5 bb4@4 [eb4,eb5]@2", AE: "[f4,f5]/2",
})).s("gm_vibraphone").gain(0.4)

// other · vibraphone
const vibraphone_2 = note(`<
  ~@8 A B C D A B E ~ F G H I J@2 K L F G H I J@2 K M N O P Q N O R S T U V W T X Y@2 F G H I J@2 Z L F G H I J@2 Z ~
  AA@3 AB@2 AC AD AE AF AG AH AI AF AJ AK@2 AA@3 AB@2 AC AD AE AF AG AH AI AF AJ AK@2 ~@18
>`.pickRestart({
  A: "[f4,ab4,d5,bb5]@3 [f4,ab4,eb5,bb5]", B: "[bb3,eb4,bb4,eb5]@4 eb5 bb4 [bb3,eb4]@2", C: "[ab3,bb3,eb4,ab4]@3 ~",
  D: "[ab3,bb3,eb4,c5]@3 [ab3,eb4,ab4,eb5]", E: "[ab3,bb3,eb4,c5]@3 ~", F: "~@2 bb3 f4@2 f4@2 eb4", G: "f4 eb4 bb3@2",
  H: "~@2 bb3 c4@2 c4@2 bb3", I: "c4 eb4 f4@2", J: "[~@2 g4@2 f4@2 eb4 bb3@2 bb3 g4@2 f4@2 eb4@2]/2",
  K: "[ab3,c4] [ab3,c4,d4]", L: "[ab3,eb4]!2", M: "[ab3,d4] [ab3,eb4]", N: "[ab3,eb4,ab4,eb5]", O: "[bb3,eb4,bb4,eb5]",
  P: "[d4,bb4,f5] [f4,bb4,f5]", Q: "[g4,bb4,g5]", R: "[g3,d4,g4,d5]", S: "[ab3,eb4,ab4,eb5]@3 bb4",
  T: "c5@2 c5 eb5@3 g5@2", U: "f5@2 eb5 bb4@3 bb4@2", V: "c5@2 c5 eb5@3 f5@2", W: "c5@3 bb4", X: "f5 eb5 bb4@4 eb5@2",
  Y: "[f5@5 ~@3]/2", Z: "[ab3,c4] [ab3,d4]", AA: "[~@2 g4@2 f4@2 eb4 bb4@2 g4@3 f4@2 eb4 f4@9]/3",
  AB: "[~@2 bb3@2 eb4@2 d4 c4@9]/2", AC: "[bb3,bb4]", AD: "[d4,d5]", AE: "[c4,c5]@3 bb3", AF: "c4@2 c4 eb4@3 g4@2",
  AG: "f4@2 eb4 bb3@3 bb3@2", AH: "c4@2 c4 eb4@3 f4@2", AI: "c4@3 bb3", AJ: "f4 eb4 bb3@4 [eb4,eb5]@2", AK: "[f4,f5]/2",
})).s("gm_vibraphone").gain(0.35)

// chords · pad sweep · "Sweep Synthesizer"
const pad_sweep = note("<~@16 A@2 B@2 C@2 D@2 A@2 B@2 C@2 E@2 ~@82>".pickRestart({
  A: "[[f3,bb3,d4,bb4]@3 ~]/2", B: "[[eb3,ab3,ab4,c5]@3 ~]/2", C: "[[bb2,bb3,f4,bb4,d5]@3 ~]/2",
  D: "[eb3,ab3,c4,ab4,c5]/2", E: "[[eb3,ab3,ab4]@2 [ab2,eb3,ab3,ab4,d5] [ab2,eb3,ab3,ab4,eb5], [c4,c5]]/2",
})).s("gm_pad_sweep").gain(0.3)

// chords · synth strings 1
const synth_strings_1 = note("<~@48 A@2 B@2 C D E@2 A@2 B@2 C D E ~@51>".pickRestart({
  A: "[[f3,bb3,d4]@3 ~]/2", B: "[ab2,ab3,eb4]/2", C: "[bb2,f3,bb3,d4]", D: "[eb2,eb3,bb3,eb4]", E: "[ab2,ab3,eb4]",
})).s("gm_synth_strings_1").gain(0.25)

// chords · synth strings 1
const synth_strings_1_2 = note(`<
  ~@64 A B C@2 A D E A@2 F G H A D I@2 A B C@2 A D E A@2 F G H A D J@2 ~@18
>`.pickRestart({
  A: "[ab1,ab2,eb3]", B: "[c2,c3,eb3]", C: "[bb1,bb2,f3]/2", D: "[eb2,bb2,eb3]", E: "[g1,g2,d3]", F: "[eb1,eb2,bb2]",
  G: "[ab1,ab2,eb3] [bb1,bb2,f3]", H: "[c2,c3,g3]", I: "[f2,c3,f3]", J: "[bb1,bb2,eb3,f3]/2",
})).s("gm_synth_strings_1").gain(0.45)

// chords · synth strings 1 · soft notes
const synth_strings_1_soft = note("<~@96 A B C@2 A D E F@2 D G H ~@6>".pickRestart({
  A: "[ab2,eb3]", B: "[g2,eb3]", C: "[[f2,f3], bb2 ~]/2", D: "eb2", E: "g2", F: "ab2", G: "ab2 bb2", H: "c3@3 ~",
})).s("gm_synth_strings_1").gain(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~@16 A B A B A B A B A B A B A B A C ~@15 D A B A E A B A F A B A E A B A ~ G H G I G H G I G H G I G H G I G H G I G
  H G I G H G I G H G J ~@18
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~", B: "~ x ~@2", C: "~@2 x!2 ~@4", D: "~@3 x ~@4", E: "~@3 x ~@2 x ~", F: "~@2 x!2 ~@2 x ~",
  G: "x ~@6 x", H: "x", I: "x ~ x ~@2 x ~@2", J: "x!2 ~@2",
})).gain(0.3)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@19 A ~@3 A ~@3 A ~@23 B ~@7 B ~@35 C ~@18>".pickRestart({
  A: "~@3 x ~@2 x ~", B: "~ x ~@2", C: "~ x",
})).gain(0.2)

// drums · snare
const snare = s("sd").struct("<~@31 [~ x] ~@15 [~@4 x ~@2 x] [~ x]!47 ~@19>").gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@16 [~ x]!15 ~@64 [~ x] ~@18>").gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<~@48 [x!2]!15 ~@51>").gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@47 [~@3 x] ~@66>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@15 [~ x] ~@48 [x!2]!32 ~@18>").gain(0.45)

// drums · high tom
const high_tom = s("ht").struct("<~@47 [~@5 x ~@2] ~@66>").gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@8 [~ x]!7 ~@17 [x!4]!15 x [~ x ~ x]!15 ~@51>").gain(0.15)

// drums · shaker
const shaker = s("sh").struct("<~@16 [x!8]!16 ~@16 x ~@7 x ~@57>").gain(0.15)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@48 [~ x!7] [x!8]!7 [~ x!7] [x!8]!6 ~@51>").gain(0.05)

// drums · triangle
const triangle = s("triangles:35").struct("<~@36 [x ~ x!3 ~ x!2]!10 [x ~ x!3 ~@3] ~@67>").gain(1.3)

// drums · bell tree
const bell_tree = s("marktrees:0").struct("<~@33 x ~@80>").gain(1.18)

stack(
  glockenspiel, xylophone, xylophone_soft, vibraphone, vibraphone_2, pad_sweep, synth_strings_1, synth_strings_1_2,
  synth_strings_1_soft, kick, kick_soft, snare, snare_soft, hihat, mid_tom, open_hat, high_tom, ride, shaker,
  shaker_soft, triangle, bell_tree
)