Strudelify

Popular

Nada Surf

KeyG majorTempo96 bpm
0:00/0:00
// Popular — Nada Surf
// 96 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 82 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(96/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · overdriven guitar · "Gtr.2 (w/slight dist.)"
const overdriven_guitar = note("<~@55 [c3 f#3@2 a3@2 g3@2 f#3] [b2 f#3@2 b3@2 a3@3] ~@25>")
  .s("gm_overdriven_guitar").gain(0.8)

// chords · distortion guitar · "Gtr.3 (w/heavy dist.)"
const distortion_guitar = note("<~@31 A B ~@14 A B ~@8 C D E F E G H I ~@6 A B ~@6 A B ~>".pickRestart({
  A: "[b3,b4] [a3,a4] [a3,a4]@5 [g3,g4]", B: "[a3,a4] [g3,g4] [g3,g4]@4 [g3,g4] ~",
  C: "[c3,e3]!2 b3!2 [c3,e3] c3 b3 a2", D: "[b2,e3] b2 b3!2 e2@2 b3 [a2,d3]", E: "[c3,e3]!2 b3@2 [c3,e3]!2 b3@2",
  F: "[e2,b2]!2 b3!2 [e2,b2] e2 b3 e2", G: "[b2,e3] [e2,b2] b3!2 [e2,b2] e2 [e3,b3] [a2,d3]", H: "[c3,f#3,a3]!8",
  I: "[b2,f#3,b3]!3 [b2,e3,b3] [b2,f#3,b3]!3 a2", // B5 E5 B5
})).s("gm_distortion_guitar").gain(0.8)

// chords · distortion guitar · "Gtr.4 (w/heavy dist.)"
const distortion_guitar_2 = note(`<
  ~@25 A B C D E F G H ~@8 I J K L M J N O ~@16 A B C D E F G P Q R K S T U V W X
>`.pickRestart({
  A: "[a2,e3,a3,c4]!2 [a2,e3,a3,c4,e4,a4] [a2,e3,a3,c4]!4 [g2,d3]", // Am G5
  B: "[g2,d3,g3,b3]!2 [g2,d3,g3,b3,d4,g4] [g2,d3,g3,b3]!3 [g2,d3,g3,b3,d4,g4] [g2,d3,g3,b3]", // G
  C: "[a2,e3,a3,c4,e4] [a2,e3,a3,c4] [a2,e3,a3,c4,e4,a4] [a2,e3,a3,c4]!3 [a2,e3,a3,c4,e4,a4] [a2,e3,a3,c4]", // Am
  D: "[g2,d3,g3,b3]!2 [g2,d3,g3,b3,d4,g4] [g2,d3,g3,b3]!4 [a2,e3]", // G A5
  E: "[a2,e3,a3,c4,e4,a4] a2 [a2,e3,a3,c4] [a2,e3,a3]!3 [a2,e3,a3,c4,e4] [a2,e3,a3]", // Am A5 Am A5
  F: "[g2,d3,g3,b3]!2 [g2,d3,g3,b3,d4,g4] [g2,d3,g3]!3 [g2,d3,g3,b3,d4,g4]@2", G: "[g2,d3,g3] [f2,c3,f3]!7",
  H: "[f2,c3] [c3,g3]!2 [b2,g3] [c3,g3]!2 [c3,g3]@2", // F5 C5 Em C5
  I: "[a2,e3,a3,c4]!2 [a2,e3,a3,c4,e4,a4] [a2,e3,a3,c4]!4 [g2,d3,g3]", // Am G5
  J: "[g2,d3,g3]!2 [g2,d3,g3,b3,d4,g4] [g2,d3,g3]!5", // G5 G G5
  K: "[a2,e3,a3,c4]@2 [a2,e3,a3]@2 [a2,e3,a3,c4,e4]@2 [a2,e3,a3]@2 [a2,e3,a3,c4]@2 [a2,e3,a3]@2 [a2,e3,a3]@2 [e2,d3] g2", // Am A5 Am A5 Am A5 E7
  L: "[g2,d3,g3]@2 [g2,d3,g3]@2 [g2,d3,g3,b3,d4,g4]@2 [g2,d3,g3]@2 [g2,d3,g3]@2 [g2,d3,g3]@2 [g2,d3,g3]@2 [a2,e3]!2", // G5 G G5 A5
  M: "[a2,e3,a3,c4]@2 [a2,e3,a3,c4]@2 [a2,e3,a3,c4]@2 [a2,e3,a3,c4]@2 [a2,e3,a3,c4]@2 [a2,e3,a3,c4]@2 [a2,e3,a3,c4]@2 [g2,d3]!2", // Am G5
  N: "[g2,d3,g3] [f2,c3] [f2,c3,f3]@2 [f2,c3]!4", O: "[f2,c3] [c3,g3]!2 [b2,g3] [c3,g3]!4", P: "[f2,c3] [c3,g3]!6 a2",
  Q: "[a2,e3,a3,c4]!2 [a2,e3,a3,c4,e4,a4] [a2,e3,a3,c4]!3 [a2,e3,a3,c4,e4,a4] [a2,e3,a3,c4]", // Am
  R: "[g2,d3,g3]!2 [g2,d3,g3,b3,d4,g4] [g2,d3,g3]!3 [g2,d3,g3,b3,d4,g4] [g2,d3,g3]", S: "[g2,d3,g3,b3]!7 [a2,e3]",
  T: "[a2,e3,a3,c4] [a2,e3,a3] [a2,e3,a3,c4] [a2,e3,a3] [a2,e3,a3,c4]!3 [e2,e3,a3]", U: "[g2,d3,g3,b3]!8",
  V: "[g2,d3,g3] [f2,c3,f3] [f2,c3,f3]@2 [f2,c3,f3]!4", W: "[f2,c3] [c3,g3]!2 [b2,g3] [c3,g3]!3 e2", X: "[a2,e3,a3]",
})).s("gm_distortion_guitar").gain(0.8)

// bass · electric bass finger · "Bass (fingerstyle)"
const bass = note(`<
  ~@2 A B C D E F G H I J K H I L M N K H K H I L M O P Q P Q P R S T I T K T K L M U V U V U V W X A Y C D Z I F G AA
  AB AA AB AA AB AC AD O P Q P Q P R AE AF P AF P AF P W AG AH
>`.pickRestart({
  A: "b2 c3@7", B: "b2 c3 b2 g2 e2@4", C: "b2 c3 g3@2 g3@4", D: "b2 c3 b2 e2@5", E: "b1 c2@5 c2@2", F: "f#1@3 f#1",
  G: "b1", H: "b1 c2!7", I: "b1 c2 b1 e1!3 e1@2", J: "c2!8", K: "b1 c2 b1 e1!5", L: "f#1!7 b1", M: "b1!8",
  N: "b1 c2 c2@2 c2!4", O: "g1 a1!3 a1@4 a1@2 a1@2 a1@4", P: "g1@2 g1@2 g1@2 g1 e1 g1@2 g1@2 g1@2 g1@2",
  Q: "a1@2 a1!2 a1@4 a1@2 a1@2 a1@4", R: "g1 f1!5 f1@2", S: "f1 c2!5 c2@2", T: "c2!2 c2@2 c2!2 c2@2",
  U: "a1!2 a1@2 a1!2 a1@2", V: "g1@2 g1@2 g1@2 g1 e1 g1!2 g1@2 g1@2 g1@2", W: "g1 f1!7", X: "f1 c2!7",
  Y: "b2 c3 b2 g2 e2 f2 e2@2", Z: "c2 c2@3 c2 c2@3", AA: "b1 c2 c2@2 c2!2 c2@2", AB: "b1 c2 b1 e1@5", AC: "f#1!8",
  AD: "b1!2 b1@2 b1!2 b1@2", AE: "f1 c2!6 g1", AF: "a1!8", AG: "f1 c2!6 e1", AH: "a1",
})).s("gm_electric_bass_finger").gain(0.8)

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

// drums · snare
const snare = s("sd").struct("<~@4 A@21 B@6 C@2 A@8 B@6 C@2 ~@4 A@11 D B@6 C@2 B@6 C@2 ~>".pickRestart({
  A: "~ x ~ x", B: "x!4", C: "~@3 x ~@3 x", D: "x ~ x!14",
})).gain(0.8)

// drums · low tom
const low_tom = s("lt").struct("<~@3 [~@11 x!2 ~@3] ~@48 [~@13 x!2 ~] ~@29>").gain(0.8)

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

// drums · open hat
const open_hat = s("oh").struct("<~@4 [x!8]!45 ~@4 [x!8]!11 ~ [x!8]!16 ~>").gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@12 A ~@7 B@6 C@2 A ~@7 B@6 C@2 A ~@3 A ~@3 A ~@5 A@2 B@6 C@2 B@6 C@2 A
>`.pickRestart({
  A: "x", B: "x!4", C: "~@3 x ~@3 x",
})).gain(0.8)

stack(overdriven_guitar, distortion_guitar, distortion_guitar_2, bass, kick, snare, low_tom, mid_tom, open_hat, crash)