Strudelify

The Fonz

Smash Mouth

KeyD♭ majorTempo98 bpm
0:00/0:00
// The Fonz — Smash Mouth
// 98 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 84 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(98/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 · "guitar"
const overdriven_guitar = note(`<
  A B A B C D E F G H I J K L M N A B A B O P Q R S Q R T U V W X A B A B A B A B Y Z Y AA Y Z Y AB@2 A B A B C D E F G
  H I J K L AC AD@2 ~@7 AE AF B A B A B A B AG@2
>`.pickRestart({
  A: "[ab2,eb3,ab3]@4 [ab2,eb3,ab3]@3 [ab2,eb3,ab3]!2 [db3,ab3,db4] [db3,ab3,db4]@2 [db3,ab3,db4]@4", // Ab5 Db5
  B: "[bb2,f3,bb3]@4 [bb2,f3,bb3]@3 [bb2,f3,bb3]!2 [a2,e3,a3] [a2,e3,a3]@2 [a2,e3,a3]@4", C: "[ab2,eb3], ab3@7 ~",
  D: "d3!8", E: "db3!8", F: "ab2@2 ab2@2 ab2@2 ab2@2 ab2@2 ab2@2 ab2@2 ab2 g2",
  G: "gb2@2 gb2@2 gb2@2 gb2@2 gb2@2 gb2@2 gb2@2 gb2 c3", H: "db3@2 db3@2 db3@2 db3@2 db3@2 db3@2 db3@2 db3 eb3",
  I: "ab2!8", J: "ab2!4 [ab2,eb3] [g2,d3] [ab2,eb3] [a2,e3]", K: "[bb2,f3]!8", L: "[eb3,bb3]!8",
  M: "[gb2,db3]@2 [gb2,db3]@2 [gb2,db3]@2 [gb2,db3]@2 [gb2,db3]@2 [gb2,db3]@2 [gb2,db3]@2 ~ c3, ~@7 [gb2,db3]", // Gb5
  N: "[ab2,db3]", O: "[ab2,eb3,ab3]", P: "[d3,ab3,d4]@4 [d3,ab3,d4]@3 [d3,ab3,d4]!3 [d3,ab3,d4]@2 [d3,ab3,d4]@4",
  Q: "[db3,ab3,db4]@4 [db3,ab3,db4]@3 [db3,ab3,db4]!3 [db3,ab3,db4]@2 [db3,ab3,db4]@4", // Db5
  R: "[ab2,eb3,ab3]@4 [ab2,eb3,ab3]@3 [ab2,eb3,ab3]!3 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@4", // Ab5
  S: "[gb2,db3,gb3]@4 [gb2,db3,gb3]@3 [gb2,db3,gb3]!3 [gb2,db3,gb3]@2 [gb2,db3,gb3]@4", // Gb5
  T: "[ab2,eb3,ab3]@4 [ab2,eb3,ab3]@3 [ab2,eb3,ab3]!3 [g2,d3,g3]@2 [ab2,eb3,ab3]@2 [a2,e3,a3]@2", // Ab5 G5 Ab5 A5
  U: "[bb2,f3,bb3]@4 [bb2,f3,bb3]@3 [bb2,f3,bb3]!3 [bb2,f3,bb3]@2 [bb2,f3,bb3]@4", // Bb5
  V: "[eb3,bb3,eb4]@4 [eb3,bb3,eb4]@3 [eb3,bb3,eb4]!3 [eb3,bb3,eb4]@2 [eb3,bb3,eb4]@4", // Eb5
  W: "[gb3,db4,gb4]@4 [gb3,db4,gb4]@3 [gb3,db4,gb4]!3 [gb3,db4,gb4]@2 [gb3,db4,gb4]@4", X: "[db3,ab3,db4]",
  Y: "[bb2,f3,bb3]!2 [c3,g3,c4]!2 [db3,ab3,db4]!2 [f3,c4,f4]!2", Z: "[eb3,bb3,eb4]!8", AA: "[gb3,db4,gb4]!8",
  AB: "[db3,gb3,db4]!8", AC: "[gb3,db4]!8", AD: "[db2,db3,ab3]/2", AE: "~@14 [eb2,e2,eb3,e3] [f2,gb2,f3,gb3]",
  AF: "[ab2,eb3,ab3]@4 [ab2,eb3,ab3]@3 [ab2,eb3,ab3]!2 [db3,ab3,db4] [db3,ab3,db4]@2 [db3,ab3,db4]@4, [g2,g3] ~@15", // Ab5 Db5 G
  AG: "[ab2,eb3,ab3]/2", // Ab5
})).s("gm_overdriven_guitar").gain(0.45)

// chords · electric guitar jazz · "guitar"
const electric_guitar_jazz = note(`<
  A B A B C D E F G H I J K L G M N O N O P D E F G H I J K L G M N O N O N O N O Q R Q S Q R Q S@2 A B A B T D E F G H
  I J K L G M ~@9 N O N O N O N O U@2
>`.pickRestart({
  A: "[ab1,ab2]@4 [ab1,ab2]@3 [ab1,ab2]!2 [db2,db3] [db2,db3]@2 [db2,db3]@4", // Ab Db
  B: "[bb1,bb2]@4 [bb1,bb2]@3 [bb1,bb2]!2 [a1,a2] [a1,a2]@2 [a1,a2]@4", C: "~@7 [eb3,ab3]", D: "[ab3,d4]!8",
  E: "[ab3,db4]!8", // Db5
  F: "[eb3,ab3]@2 [eb3,ab3]@2 [eb3,ab3]@2 [eb3,ab3]@2 [eb3,ab3]@2 [eb3,ab3]@2 [eb3,ab3]@2 ~ g3, ~@7 [eb3,ab3]", // Ab5
  G: "[db3,gb3]@2 [db3,gb3]@2 [db3,gb3]@2 [db3,gb3]@2 [db3,gb3]@2 [db3,gb3]@2 [db3,gb3]@2 ~ c4, ~@7 [db3,gb3]", // Gb5
  H: "[ab3,db4]@2 [ab3,db4]@2 [ab3,db4]@2 [ab3,db4]@2 [ab3,db4]@2 [ab3,db4]@2 [ab3,db4]@2 ~ eb4, ~@7 [ab3,db4]", // Db5
  I: "[eb3,ab3]!8", J: "[eb3,ab3]!5 [d3,g3] [eb3,ab3] [e3,a3]", K: "[f3,bb3]!8", L: "[bb3,eb4]!8", M: "[db3,ab3,db4] ~",
  N: "[ab2,eb3]!4 [ab2,db3,eb3,ab3] [db3,ab3]@3", O: "[bb2,f3]!4 [a2,bb2,e3,f3] [a2,e3]@3",
  P: "[ab2,eb3]@2 ~@5 [eb3,ab3]", Q: "[bb2,f3,bb3]!2 [c3,g3,c4]!2 [db3,ab3,db4]!2 [f3,c4,f4]!2", R: "[eb3,bb3,eb4]!8",
  S: "[gb3,db4,gb4]!8", T: "[ab1,ab2]@3 ~@4 [eb3,ab3]", U: "[ab2,eb3]/2",
})).s("gm_electric_guitar_jazz").gain(0.45)

// chords · electric guitar clean · "guitar"
const electric_guitar_clean = note(`<
  ~@16 A B A B C ~@11 A B A B A B A B ~@26 A B A B A B A B A B A B A B A B C ~
>`.pickRestart({
  A: "~@4 [ab3,eb4,ab4,eb5] ~@5 [db4,ab4,db5,ab5] ~ [db4,ab4,db5,ab5] ~@3", // Ab5 Db5
  B: "~@4 [bb3,f4,bb4,f5] ~@5 [a3,e4,a4,e5] ~ [a3,e4,a4,e5] ~@3", C: "[ab3,eb4,ab4,eb5] ~@15",
})).s("gm_electric_guitar_clean").gain(0.45)

// other · distortion guitar · "guitar" · Ab C Eb F Db Ab F Ab …
const distortion_guitar = note(`<
  ~@49
  [[ab3,ab4] [c4,c5] [eb4,eb5]@2 [f4,f5] [db4,db5] [ab3,ab4] [f4,f5]]
  [[ab3,ab4] [d4,d5] [f4,f5]@2 [e4,e5] [db4,db5] [g3,g4] [e4,e5]]
  [[ab3,ab4] [c4,c5] [eb4,eb5]@2 [f4,f5] [db4,db5] [ab3,ab4] [f4,f5]]
  [[ab3,ab4] [d4,d5] [f4,f5]@2 [e4,e5] [db4,db5] [g3,g4] [e4,e5]]
  [[ab3,ab4]@7 ~]
  ~@30
>`).s("gm_distortion_guitar").gain(0.45)

// bass · electric bass pick · "bass"
const bass = note(`<
  A B A B ~ C D E F G H I J K F L M N M N O C D E F G H I J K F P M N M N M N M N Q K Q R Q K Q R@2 A B A B S C D E F G
  H I J K F T@2 U V U V U V U V U V U V U V U V W@2
>`.pickRestart({
  A: "ab1@4 ab1@3 ab1!2 db2 db2@2 db2@4", B: "bb1@4 bb1@3 bb1!2 a1 a1@2 a1@4", C: "d2!8", D: "db2!8",
  E: "ab1@2 ab1@2 ab1@2 ab1@2 ab1@2 ab1@2 ab1@2 ab1 g1", F: "gb1@2 gb1@2 gb1@2 gb1@2 gb1@2 gb1@2 gb1@2 gb1 c2",
  G: "db2@2 db2@2 db2@2 db2@2 db2@2 db2@2 db2@2 db2 eb2", H: "ab1!8", I: "ab1!5 g1 ab1 a1", J: "bb1!8", K: "eb2!8",
  L: "db2 ~", M: "ab1!5 db2!3", N: "bb1!5 a1!3", O: "ab1 ~@3", P: "db2", Q: "bb1!2 c2!2 db2!2 f2!2", R: "gb2!8",
  S: "ab1", T: "db2/2", U: "ab1@4 ab1@2 ab1!3 db2 db2@2 db2@2 db2@2", V: "bb1@4 bb1@2 bb1!3 a1 a1@2 a1@2 a1@2",
  W: "ab1/2",
})).s("gm_electric_bass_pick").gain(0.45)

// drums · kick
const kick = s("bd").struct("<A@4 B A@10 B A@4 B A@10 B A@7 B A@7 C@2 A@4 B A@10 B ~ A@16 B ~>".pickRestart({
  A: "x ~@3 x!2 ~@2", B: "x", C: "x!8",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<A@4 B C@10 B C@4 B A@10 B C@7 D A@7 ~ E A@4 B C@10 B ~ C@16 B ~>".pickRestart({
  A: "~@4 x ~@2 x ~@4 x ~@3", B: "x", C: "~ x ~ x", D: "~@4 x ~@2 x!9", E: "~@8 x ~@3 x!3 ~",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@47 [~ x!7] [x!4 ~ x!3] ~@35>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@5 A@10 ~ A@4 ~@34 A@10 ~@2 A@8 ~@10>".pickRestart({
  A: "x!8",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@47 [x!6 ~@2] ~@36>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<A@4 B ~@10 B ~@4 B A@10 B A@15 ~@2 A@4 B ~@10 B ~@9 A@8 B ~>".pickRestart({
  A: "x!8", B: "x",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@4 A ~@10 A ~@4 A ~@10 A ~@21 A ~@10 A ~@9 A ~@7 A ~>".pickRestart({
  A: "x",
})).gain(0.45)

// drums · ride
const ride = s("rd").struct("<~@40 [x!8]!7 ~@37>").gain(0.45)

stack(
  overdriven_guitar, electric_guitar_jazz, electric_guitar_clean, distortion_guitar, bass, kick, snare, low_tom, hihat,
  mid_tom, open_hat, crash, ride
)

More by Smash Mouth