Strudelify

Black Balloon

Goo Goo Dolls

KeyD♭ majorTempo100 bpm
0:00/0:00
// Black Balloon — Goo Goo Dolls
// 100 bpm, 4/4, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 4 viola (copy of ch 3 "sorry not a drummer" violin)
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · overdriven guitar · "BLACK BALLONE"
const overdriven_guitar = note(`<
  A B C D C E F G F B F B F B F B F B ~@8 F B F B F B ~@11 F B F B H I J K J D ~@43 A B A B A B A B A B A B
>`.pickRestart({
  A: "~@2 ab5@2 [f4,c6] ~ [bb2,ab3] [bb2,f4], bb2@11 ab5@4 ~, f4@4 ~ db4 ~@2", // F5 Bb7 Bb5
  B: "f4 [ab3,ab5] [db4,f6] ~ ab3 db4 [ab3,ab5]@2, bb2, ~@3 db4 c6@2 ~@2, ~@7 db6@2 ~@7", // Ab Db Ab
  C: "f4 f4@4 ab5@3 ~@2 db4@2 bb2 ~ f4@2, bb2@12 ~ bb2@2 ~, ~@4 f4 ~ ab3 ~, ~@9 c6@2 ~ ab5@4",
  D: "f4@2 ~@4 db4@2 ~@2 db4@2 ~ ab5@3, bb2, ~ ab3 db4 ~ [ab3,db6] ~ ab3@2, ~@3 ab5@2 f6@2 ~@2 c6@4 ~@3", // Db5
  E: "f4@2 ~@8 db4@2 ~ ab5@3, bb2, ~ ab3 db4!2 ab3 ~ ab3@2, ~@3 ab5@2 f6@2 db6@2 c6@4 ~@3",
  F: "~@2 ab5@2 [f4,c6] ~@2 f4, bb2@11 ab5@4 ~, f4@4 ~ db4 [bb2,ab3] ~, ~@13 bb2@2 ~", // F5 Bb7
  G: "f4 ~@4 db4 [ab3,ab5]@2, bb2, ~ ab3 db4!2 ab3 ~@3, ~@3 ab5@2 f6@2 db6@2 c6@4 ~@3", // Ab
  H: "~@2 ab5@2 [f4,c6] ~ [bb2,ab3] [bb2,f4], f4@4 ~ db4 ~@2, ~ bb2@10 ab5@4 ~", // F5 Bb7 Bb5
  I: "f4 [ab3,ab5] [db4,f6] ~@2 db4 [ab3,ab5]@2, bb2, ~@3 db4 ab3 ~@3, ~@7 db6@2 c6@4 ~@3", // Ab Db Ab
  J: "f4 f4@4 ab5@3 ~@2 db4@2 bb2 ~ f4!2, bb2@12 ~ bb2@2 ~, ~@4 f4 ~ ab3 ~, ~@9 c6@2 ~ ab5@4",
  K: "f4@2 ~@4 db4@2 [ab3,db6]@2 db4@2 ~ ab5@3, bb2, ~ ab3 db4 ~@3 ab3@2, ~@3 ab5@2 f6@2 ~@3 c6@4 ~@2", // Db5
})).s("gm_overdriven_guitar").gain(0.06)

// other · bassoon
const bassoon = note("<~@36 A B C D E F ~@15 A B C D E F ~@16 G H I J ~@3 G H I J ~@3 K@2 ~@13>".pickRestart({
  A: "db5!2 c5@2 ab4@2 f4 ab4", B: "ab4@2 ab4@2 f4@4 eb4@2 eb4 db4@3 ~ ab4", C: "db5!2 c5@2 eb5 [ab4,eb5] ab4!2",
  D: "ab4@2 ab4@2 db5@4 db5@2 db5 bb4 ab4@2 ~ ab4", E: "db5!2 c5@2 db5@2 db5 c5", F: "c5 db5@3 eb5!2 db5 ~",
  G: "db5 c5@2 ab4@2 f4 ab4!2", H: "f4@6 eb4@2 eb4 db4@3 ~ ab4 db5@2", I: "db5@3 eb5 ab4!4",
  J: "db5@6 db5@2 db5 bb4 ab4@2 ~@4", K: "[db5 db5@3 eb5!2 db5@3 ~@7]/2",
})).s("gm_bassoon").gain(0.64)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~@8 A B A B A B A B A B C D E F A B A B A B G H G H C I J@2 K@7 L M L M L M L M L N C I J@2 K@7 O@2 P@2 Q R S T U V W
  O@2 P X K@7 Y K@6 Z AA@4 ~@10
>`.pickRestart({
  A: "[db3,db4,ab4,db5]@2 [db3,db4,ab4,db5]!4 [db3,db4,ab4,db5]@2 [db3,db4,ab4,db5] [db3,db4,ab4,db5]@3 [db3,db4,ab4,db5]@2 [db3,db4,ab4,db5]!2", // Db5
  B: "[gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]!4 [gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]!2 [gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]@2 [eb3,ab3,db4,ab4,db5]!2", // Gbsus2 Dbsus2
  C: "bb3 db4 db5!2 c4 ab4 db5!2",
  D: "db4@2 ab4@2 db5@2 [db4,ab4,db5]!2 [db4,gb4,ab4,db5]@2 [db4,gb4,ab4,db5]!2 [db4,gb4,ab4,db5]@2 ab3@2", // Db5 Dbsus4
  E: "[eb3,bb3,db4,ab4,db5]@2 [eb3,bb3,db4,ab4,db5]@2 [eb3,bb3,db4,ab4,db5]@2 [eb3,bb3,db4,ab4,db5]!4 [eb3,bb3,db4,ab4,db5]@2 [eb3,bb3,db4,ab4,db5]@2 [eb3,bb3,db4,ab4,db5]!2", // Ebsus4
  F: "[gb3,db4,db5]@2 [gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]!4 [gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]!2", // Gb5 Gbsus2
  G: "[db3,bb3,db4,ab4,db5]@2 [db3,db4,ab4,db5]!4 [db3,db4,ab4,db5]@2 [db3,c4,db4,ab4,db5] ab4 ab4@2 [db3,db4,ab4,db5]@2 [db3,db4,ab4,db5]!2, ~@9 [db3,db4,db5]@3 ~@4", // Bbm7 Db5 Dbmaj7 Db5 Db
  H: "[gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]!5 [db4,ab4,db5] [f3,gb3,db4,ab4,db5] [gb3,db4,ab4,db5] [f3,gb3,db4,ab4,db5] [f3,db4,ab4,db5] [gb3,db4,ab4,db5]@2 [eb3,gb3,ab3,db4,ab4,db5] [eb3,ab3,db4,ab4,db5]", // Gbsus2 Db5 Db Gbsus2 Db Gbsus2 Ebm7 Dbsus2
  I: "db4@2 ab4@2 db5@2 [db4,ab4,db5]!2 [f3,db4,ab4,db5]@2 [f3,db4,ab4,db5]!2 [gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]@2", // Db5 Db Gbsus2
  J: "[ab3,db4,eb4,ab4,db5]@2 [ab3,db4,eb4,ab4,db5]@2 [ab3,db4,eb4,ab4,db5]@2 [ab3,db4,eb4,ab4,db5]!4 [ab3,db4,eb4,ab4,db5]@2 [ab3,db4,eb4,ab4,db5]@2 [ab3,db4,eb4,ab4,db5]!2", // Absus4
  K: "f4!8", L: "[db3,db4,ab4,db5]@12 [db3,db4,ab4,db5]@2 [db3,db4,ab4,db5]!2",
  M: "[gb3,db4,ab4,db5]@12 [gb3,db4,ab4,db5]@2 [gb3,db4,ab4,db5]!2", N: "[gb3,db4,ab4,db5]",
  O: "f4@3 f4 f4@2 f4@2 f4@2 f4@2 f4@2 f4@2", P: "f4@2 f4@2 f4@2 f4!4 f4@2 f4@2 f4!2",
  Q: "f4@3 f4 f4@2 f4@2 f4!2 f4@2 f4@2 f4!2", R: "f4@3 f4 f4@2 f4@2 f4@2 f4@2 f4@4",
  S: "f4@2 f4@2 f4@2 f4@2 f4!2 f4@2 f4@2 f4!2", T: "f4@2 f4!2 f4@2 f4@2 f4!2 f4@2 f4@4", U: "f4!4 f4@2 f4@2",
  V: "f4@12 f4@3 ab4", W: "bb4", X: "f4@2 f4@2 f4@2 f4!4 f4@2 f4@2 f4@2", Y: "f4@2 f4!2 f4@2 f4@2 f4!2 f4@2 f4@2 f4@2",
  Z: "f4@3 f4 f4@2 f4@2 f4!2 f4@2 f4@2 f4@2", AA: "f4",
})).s("gm_acoustic_guitar_steel").gain(0.64)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@22 A B ~@12 C D C D E F G ~@14 C D C D E F H I J K L M J C N O P ~ I J L@2 C D C D E F H Q R C D E F H S P ~@13
>`.pickRestart({
  A: "[db3,ab3,db4,ab4,db5]", B: "[db3,db4,ab4,db5]", C: "bb4 ab4 db5 ab4!3 db5 f4", D: "gb4 ab4 db5 f4!2 ab4 db5 ab4",
  E: "bb4 ab4 db5 ab4!2 c5 db5 f4", F: "gb4 ab4 db5 f4!2 ab4 db5 f4", G: "gb4 ab4 db5 ab4!2 db5 db5@2",
  H: "gb4!2 db5 ab4!2 db5 db5@2", I: "f4 ab4 db5 c5 db5!2 c5 db5", J: "gb4 ab4 db5!6",
  K: "bb4 ab4 db5 bb4 ab4 db5!2 ab4", L: "ab4!2 db5!2 ab4!2 db5!2", M: "f4 ab4 db5 ab4 db5!2 c5!2",
  N: "gb4 ab4 db5 gb4!2 ab4 db5!2", O: "gb4 ab4 db5 gb4 ab4 db5 f4 db5", P: "[eb4,ab4,db5]",
  Q: "[f4,bb4] ab4 db5 [ab4,db5]!2 [f4,ab4] [ab4,db5] [f4,db5]", // Bb5 Db5 Fm Db5 Db
  R: "[gb4,ab4] ~@2 f4!2 ~@2 ab4, eb4, db5 db5@2 db5, ~ ab4@4 ab4@2 ~", S: "f4 ab4 db5!3 f4 ab4 db5",
})).s("gm_distortion_guitar").gain(0.64)

// chords · violin · "sorry not a drummer"
const violin = note("<~@63 A B@2 C@7 D ~@34>".pickRestart({
  A: "[ab3,f4,c5]", B: "[[f4,db5] f5 ~ gb5, [ab3,bb4] [ab4,db5], ~ [f4,gb4]@2 ~, ~@5 [db4,c5]@3]/2",
  C: "[c5 ~@5 gb5@2 f4 ~@4 [c4,db6] ~@3 gb5 eb5 gb5 gb5!2 gb5@2 gb5 [ab4,ab5,eb6] [f5,bb5,f6] [bb4,bb5,f6], [gb3,gb4,eb5,c6]@2 eb5 bb4@2 [gb4,db5]@2 [c4,db6]@2 ~ ab3@2 ~@2, ~ [ab3,c5,bb5]@4 [eb4,c5,bb5]@4 [f4,db6]@4 [ab4,gb5]@4 [f4,c5,bb5]@4 [gb3,gb4,bb5]@4 ~@3, ~@2 [db4,ab5]@4 db6@3 ~@3 c5@3 [bb4,f5]@4 ~@9, ~@13 bb4 eb5@2 eb5@2 [ab4,eb6]@4 db4@4 ~@2]/7", // Dbmaj7 Ab5 Bb5 Cdim Gb5 Dbmaj7 Ab Cm7 …
  D: "[db4,c5]", // Dbmaj7
})).s("gm_violin").gain(0.64)

// other · electric guitar clean
const electric_guitar_clean = note("<~@96 A B C D C D C D C D C D>".pickRestart({
  A: "~@2 ab4 eb4 eb5 ab5!3", B: "ab5@3 eb5!2 ab5@3", C: "ab5@2 ab4 eb5!2 ab5!3", D: "ab5@2 ab4 eb5!2 ab5@3",
})).s("gm_electric_guitar_clean").gain(0.11)

stack(overdriven_guitar, bassoon, acoustic_guitar_steel, distortion_guitar, violin, electric_guitar_clean)

More by Goo Goo Dolls