Strudelify

Spiderwebs

No Doubt

KeyB♭ majorTempo140 bpm
0:00/0:00
// Spiderwebs — No Doubt
// 140 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 3/4 at bar 92, 4/4 at bar 93) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 166 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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 · melodic tom · "Toms" · Gbsus2 Emaj7 Bsus2
const melodic_tom = note("<[~@6 [gb3,ab3]@2 [gb3,ab3]@3 [eb3,e3] ~@2 [b2,db3] ~] ~@47 [~@12 e3 c3 a2 e2] ~@117>")
  .s("gm_melodic_tom").gain(0.41)

// other · steel drums
const steel_drums = note("<~ A B C D E F G ~@126 A B C D E F H I E F H D E F H I E F H D J ~@11>".pickRestart({
  A: "~ [f4,bb4]!14 f4", B: "a4 [f4,a4]!14 f4", C: "bb4 [g4,bb4]!15", D: "[eb4,g4]!8 [d4,f4]!4 [c4,eb4]!2 [bb3,d4]!2",
  E: "[f4,bb4]!16", F: "[f4,a4]!16", G: "[g4,bb4]!15 g4", H: "[g4,bb4]!16",
  I: "[eb4,g4]!8 [d4,f4]!4 [c4,eb4]!2 [bb3,d4] bb3", J: "[f4,bb4]!11 f4 ~@4",
})).s("gm_steel_drums").gain(0.26).pan(0.7)

// other · steel drums · soft notes
const steel_drums_soft = note("<~ A B C ~@130 A B C ~@17 D E F G H E F I H E F G>".pickRestart({
  A: "[f4,bb4] ~@14 bb4", B: "f4 ~@14 a4", C: "g4 ~@15", D: "~@11 bb4 [f4,bb4]!4", E: "[f4,a4]!16", F: "[g4,bb4]!16",
  G: "[eb4,g4]!8 [d4,f4]!4 [c4,eb4]!2 [bb3,d4] bb3", H: "[f4,bb4]!16", I: "[eb4,g4]!8 [d4,f4]!4 [c4,eb4]!2 [bb3,d4]!2",
})).s("gm_steel_drums").gain(0.1).pan(0.7)

// other · trumpet
const trumpet = note("<~@2 A B C D E@2 ~@135 A B C D E@2 ~@2 A B C F ~@11>".pickRestart({
  A: "~ c5@2 c5", B: "c5 bb4", C: "~ g4 a4 bb4 c5 bb4 a4 bb4", D: "bb4@4 a4@5 ~ f4@2 g4@2 ~@2",
  E: "[g4@3 a4 f4@3 ~ eb4@3 ~ f4@16 ~@4, ~@4 g4 ~@27]/2", F: "bb4@4 a4@5 ~@7",
})).s("gm_trumpet").gain(0.31).pan(0.7)

// other · trumpet · soft notes
const trumpet_soft = note("<~@154 A B@2 ~@2 C D E F B@2 ~>".pickRestart({
  A: "~@5 f4 g4 ~", B: "[g4@3 a4 f4@3 ~ eb4@3 ~ f4@16 ~@4, ~@4 g4 ~@27]/2", C: "~ c5@2 c5", D: "c5 bb4",
  E: "~ g4 a4 bb4 c5 bb4 a4 bb4", F: "bb4@4 a4@5 ~ f4@2 g4@2 ~@2",
})).s("gm_trumpet").gain(0.1).pan(0.7)

// other · trombone
const trombone = note("<~@2 A B C D E@2 ~@135 A B C D E@2 ~@2 A B C F ~@11>".pickRestart({
  A: "~ ab3@2 a3", B: "a3 g3", C: "~ eb3 f3 g3 a3 g3 f3 g3", D: "g3@4 f3@5 ~ d3@2 eb3@2 ~@2",
  E: "[eb3@3 f3 d3@3 ~ c3@3 ~ d3@16 ~@4, ~@4 eb3 ~@27]/2", F: "g3 ~@3",
})).s("gm_trombone").gain(0.31).pan(0.6)

// other · trombone · soft notes
const trombone_soft = note("<~@154 A B@2 ~@2 C D E F B@2 ~>".pickRestart({
  A: "~@4 f3@5 ~ d3@2 eb3@2 ~@2", B: "[eb3@3 f3 d3@3 ~ c3@3 ~ d3@16 ~@4, ~@4 eb3 ~@27]/2", C: "~ ab3@2 a3", D: "a3 g3",
  E: "~ eb3 f3 g3 a3 g3 f3 g3", F: "g3@4 f3@5 ~ d3@2 eb3@2 ~@2",
})).s("gm_trombone").gain(0.1).pan(0.6)

// chords · distortion guitar · "Overdrive Guitar"
const distortion_guitar = note(`<
  ~ A B C D A B C E F G F G F G F G F G H I J K L M J N L O M E L O M E F G F G F G F G F G H I J K L M J N L O M E L O
  M E P Q R E P Q R E S ~ T ~ S ~ T ~ S ~ T ~ S ~ T ~ S ~ T ~ U V W X Y Z AA AB Y Z AA AC AD AE AF AC AD AE AF AB Y Z AA
  AB Y Z AA AB Y Z AA AB Y Z AA AG@4 AH@7 B C D A B C D A B C D A B C D AI ~@15
>`.pickRestart({
  A: "~ [bb3,f4,bb4] ~ [bb3,f4,bb4]", B: "~ [a3,f4,a4] ~ [a3,f4,a4]", C: "~ [bb3,eb4,bb4] ~ [bb3,eb4,bb4]",
  D: "~ [bb3,eb4,g4] ~ [bb3,eb4,g4]", E: "eb4!2 d4!2 c4!2 bb3 a3", F: "bb2 ~ bb2 ~ bb3@2 bb2 ~@3 bb2 ~ bb3@3 ~",
  G: "bb2 ~ bb2 ~ bb3@2 bb2 ~@3 bb2 ~ f4@3 ~", H: "bb2 ~ bb2 ~ bb3@2 bb2 ~@3 bb2 ~ bb3@2 f2 g2",
  I: "bb2@2 ~ c3@2 ~ d3@2 f3@2 ~ g3@2 ~ bb3@2", J: "[eb3,bb3,eb4]!8", K: "[f3,c4,f4]!8", L: "[bb2,f3,bb3]!8",
  M: "[g2,d3,g3]!8", N: "[f3,c4,f4]", O: "[f2,c3,f3]!8",
  P: "[bb2,f3,bb3] ~ [bb2,f3,bb3] ~ [bb2,f3,bb3] ~ [bb2,f3,bb3] ~", // Bb5
  Q: "[f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~", R: "[g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~",
  S: "[g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~@3", // G5
  T: "[g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~@3", // Eb
  U: "[g3,d4,g4]@2 ~ [g3,d4,g4]@2 ~ [g3,d4,g4]@2", V: "~ [g3,d4,g4]@2 ~ [g3,d4,g4]@2 [g3,d4,g4]@2",
  W: "eb3!3 f3!3 g3!2", X: "g3@2 a3@3 bb3@3 c4@4 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2", Y: "[bb2,f3,bb3]!6 [f2,c3,f3]!2",
  Z: "[f2,c3,f3]!6 [g2,d3,g3]!2", AA: "[g2,d3,g3]!6 eb4!2", AB: "d4!2 c4!2 bb3 a3 [bb2,f3,bb3]!2",
  AC: "d4!2 c4!2 bb3 a3 [bb2,f3,bb3] ~", AD: "[bb2,f3,bb3] ~ [bb2,f3,bb3] ~ [bb2,f3,bb3] ~ [f2,c3,f3] ~",
  AE: "[f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [g2,d3,g3] ~", AF: "[g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ eb4!2",
  AG: "[d4!2 c4!2 bb3 a3 [bb2,f3,bb3]@8 [f2,c3,f3]@8 [g2,d3,g3]@8 eb4!2]/4", // Bb5 F5 G5
  AH: "[d4@2 d4@2 c4@2 c4@2 bb3@2 a3@2 [bb2,f3,bb3]@16 [f2,c3,f3]@16 [g2,d3,g3]@16 eb4@8 d4@9 c4@9 ~ bb3@13 [f4,bb4]@4 ~@4 [bb3,f4,bb4]@4, ~@25 bb3@2 ~]/7", // Bb5 F5 G5 Bb5
  AI: "~ [bb3,f4,bb4] ~@2", // Bb5
})).s("gm_distortion_guitar").gain(0.41).pan(0.2)

// chords · distortion guitar · "Overdrive Guitar" · soft notes
const distortion_guitar_soft = note(`<
  ~@69 A B C D A B C D A B C D A B C D A B C D ~@61 E F G H I F G H I F G H I F G H
>`.pickRestart({
  A: "~@14 [g3,d4,g4] ~", // G5
  B: "[g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~ [g3,d4,g4] ~", // G5
  C: "~@14 [g3,bb3,eb4,g4] ~", // Eb
  D: "[g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~", // Eb
  E: "~@3 [bb3,f4,bb4]", F: "~ [a3,f4,a4] ~ [a3,f4,a4]", G: "~ [bb3,eb4,bb4] ~ [bb3,eb4,bb4]",
  H: "~ [bb3,eb4,g4] ~ [bb3,eb4,g4]", I: "~ [bb3,f4,bb4] ~ [bb3,f4,bb4]",
})).s("gm_distortion_guitar").gain(0.15).pan(0.2)

// other · guitar harmonics
const guitar_harmonics = note(`<
  ~@9 A B C D A B C D A B C ~@7 E F ~@2 E F ~@2 A B C D A B C D A B C ~@7 E F ~@2 E F ~@34 G H ~@2 G H ~@10 G H ~@2 G H
  ~@2 G H ~@2 G H ~@10 I@2 ~@31
>`.pickRestart({
  A: "~@4 bb3@3 ~@5 bb3@3 ~", B: "~@4 bb3@3 ~@5 f4@4", C: "~@4 d4@3 ~@5 bb3@3 ~", D: "~@4 bb3@3 ~@5 a4@4",
  E: "~@3 d4 bb3 f3 d3 bb2", F: "~@3 f3 c3 a2 f2 a2", G: "~ d4 bb3 f3 d3 bb2 ~@2", H: "~ f3 c3 a2 f2 a2 ~@2",
  I: "[~@7 bb3@21 ~@4]/2",
})).s("gm_guitar_harmonics").gain(0.41).pan(0.7)

// bass · electric bass pick · "Bass"
const bass = note(`<
  ~ A B C D A B C E F G F H F G F H F G F I J K L M J N O P Q E O P Q E F G F H F G F H F G F I J K L M J N O P Q E O P
  Q E R S T E R S T E U V W X U V Y Z U V W X U V Y Z U V W X AA AB AC AD AE AF AG AH AE AF AG AI AJ AK AL AI AJ AK AL
  AH AM AN AO AP AM AN AO AQ AM AN AO AP AM AN AO AQ AM AN AO AP AM AN AR AS@2 A B C D A B C D A B C D A B C D AT ~@15
>`.pickRestart({
  A: "bb1@5 ~ d2@2 f2@2 d2@2 bb1@2 ~@2", B: "f1@3 ~ f1@3 ~ a1@2 c2@2 f1@3 ~", C: "g1@5 ~ a1@2 bb1@2 a1@2 g1@2 a1@2",
  D: "eb2 d2 c2 d2 eb2 d2 c2 a1", E: "eb2!2 d2!2 c2!2 bb1 a1", F: "bb1@3 ~@3 f1 g1 bb1@3 ~@3 f1 g1",
  G: "bb1@3 ~@3 d2@3 ~ d2 ~ c2 ~@3", H: "bb1@3 ~@3 a2@3 ~ f2 ~ g2 ~@3", I: "bb1@2 ~ c2@2 ~ d2@2 f2@2 ~ g2@2 ~ bb2@2",
  J: "eb2!5 d2 eb2!2", K: "f2!3 g2@2 f2 d2 bb1", L: "bb1!5 d2 bb1!2", M: "g1!5 a1 bb1 d2", N: "f2", O: "bb1!8",
  P: "f2!8", Q: "g1!8", R: "bb1@2 ~@2 bb1@2 ~ a1 bb1@2 a1@2 bb1@2 f1@2", S: "f2@2 ~@2 f2@2 ~ e2 f2@2 e2@2 f2@2 gb2@2",
  T: "g1@2 ~@2 g1@2 ~ f1 g1@2 f1@2 g1@2 g1@2", U: "g1!4 bb1 g1!3", V: "bb1 g1!3 bb1 g1!3", W: "eb2!4 g2 eb2!3",
  X: "g2 eb2!3 g2 eb2!3", Y: "eb2!4 d2!4", Z: "c2!4 bb1 c2!2 bb1", AA: "g1@2 ~ g1@2 ~ g1@2", AB: "~ g1@2 ~ g1@2 g1@2",
  AC: "eb2!3 f2!3 g2!2", AD: "g2@2 a2@3 bb2@3 c3@4 bb1@2 bb1@2", AE: "bb1!6 f2!2", AF: "f2!6 g1!2", AG: "g1!6 eb2!2",
  AH: "d2!2 c2!2 bb1 a1 bb1!2", AI: "d2!2 c2!2 bb1 a1 bb1 ~", AJ: "bb1@2 ~ a1 bb1@2 a1@2 bb1@2 f1@2 f2@2 ~@2",
  AK: "f2@2 ~ e2 f2@2 e2@2 f2@2 gb2@2 g1@2 ~@2", AL: "g1@2 ~ f1 g1@2 f1@2 g1@2 g1@2 eb2@2 eb2@2",
  AM: "d2@2 f2@2 bb1@2 bb1!2 d2@2 f2@2 f1@2 f1@2", AN: "a1 c2 f1!2 a1 c2 g1!2", AO: "g1 a1 bb1 a1 g1 a1 eb2!2",
  AP: "d2!2 c2!2 eb2 c2 bb1!2", AQ: "d2@2 d2@2 c2@2 c2@2 ~ c2@2 ~ bb1@2 bb1@2, ~@4 eb2 ~@3",
  AR: "g1 a1 bb1 a1 g1 a1 eb2@2", AS: "[eb2@4 d2@5 d2@4 c2@5 c2@5 bb1@4 bb1@5]/2", AT: "bb1@5 ~ d2@2 f2@2 ~@6",
})).s("gm_electric_bass_pick").gain(0.51)

// bass · electric bass pick · "Bass" · soft notes
const bass_soft = note("<~@150 A B C D E B C D E B C D E B C D>".pickRestart({
  A: "~@5 d2 bb1 ~", B: "f1@3 ~ f1@3 ~ a1@2 c2@2 f1@3 ~", C: "g1@5 ~ a1@2 bb1@2 a1@2 g1@2 a1@2",
  D: "eb2 d2 c2 d2 eb2 d2 c2 a1", E: "bb1@5 ~ d2@2 f2@2 d2@2 bb1@2 ~@2",
})).s("gm_electric_bass_pick").gain(0.15)

// other · lead 2 sawtooth · "Sawtooth"
const lead_2_sawtooth = note(`<
  ~ A B A C A B A D E ~ E ~@9 F G H I F ~@8 D E ~ E ~@15 J K J K L@3 M ~@31 N O P O Q R@2 S Q ~@8 R@2 T R@3 S U R@2 T
  R@3 S U R@2 T R@4 ~@34
>`.pickRestart({
  A: "bb4", B: "a4", C: "g4", D: "g4 f4 g4 f4 g4 f4 g4 a4", E: "bb4 bb3 ~@6", F: "eb4", G: "f4", H: "bb3", I: "g3",
  J: "~ d5 eb5 d5 ~ d5 eb5 d5", K: "~ d5 eb5 d5 f5 d5 eb5 d5", L: "~ d5 eb5 d5", M: "f5 d5 eb5 d5 f5 d5 eb5 d5",
  N: "~@7 d5", O: "eb5 d5 ~ d5 eb5 d5 ~ d5", P: "eb5 d5 f5 d5 eb5 d5 ~ d5", Q: "eb5 d5 f5 d5 eb5 d5 ~@2",
  R: "d5 eb5 d5 ~", S: "d5@2 eb5@2 d5@2 f5 d5", T: "d5 eb5 d5 f5", U: "~ d5 f5 d5 eb5 d5 ~@2, eb5 ~@3",
})).s("gm_lead_2_sawtooth").gain(0.41).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B@2 C A B@2 ~ D@11 E D@5 ~@9 D@11 E D@5 ~@17 D@20 F G ~@17 H@8 I H@7 I H@6 J K L A B@2 C A B@2 C A B@2 C A B@2 C A
  ~@15
>`.pickRestart({
  A: "x ~@2 x ~@4", B: "x ~@2 x ~@2 x ~", C: "x ~ x!3 ~ x!2", D: "x!2 ~@2 x!2 ~@2", E: "x!2 ~ x!3 ~ x", F: "x!2",
  G: "~ x ~@2", H: "~@6 x!2", I: "~@2 x!2 ~@2 x!2", J: "~@3 x", K: "x ~@8 x ~@6", L: "~@2 x ~@8 x ~@4",
})).gain(0.41)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@151 A@2 B C A@2 B C A@2 B C A@2 B>".pickRestart({
  A: "x ~@2 x ~@2 x ~", B: "x ~ x!3 ~ x!2", C: "x ~@2 x ~@4",
})).gain(0.15)

// drums · snare
const snare = s("sd").struct(`<
  A B C@2 D B C@2 E F@11 G F@5 H I@7 E F@11 G F J F@3 H I@6 K I@9 F@20 L M N O I@15 P K@7 Q K@7 Q K@7 R S B C@2 D B C@2
  D B C@2 D B C@2 D ~@16
>`.pickRestart({
  A: "x!5 ~@11", B: "~ x", C: "~@4 x!2 ~@2", D: "~ x ~@3 x ~@2", E: "x!8", F: "~ x ~ x", G: "~@3 x ~@7 x ~@4", H: "x",
  I: "x!4", J: "~ x ~@2", K: "x!3 ~", L: "~@6 x!2 ~@4 x ~@3", M: "~@2 x!2 ~@4 x ~@3 x ~@3", N: "x ~@2 x ~@2 x ~",
  O: "~@2 x ~@2 x ~@2 x ~@3 x ~@3", P: "x ~@3 x ~@3 x!4 ~@4", Q: "x ~@7 x!4 ~@4", R: "~@4 x ~@8 x ~@2", S: "~@7 x ~@8",
})).gain(0.41)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@21 A@5 B A@7 ~@13 A@5 B A@6 C A D@8 ~@23 E A@7 F D@7 G A@7 H A@7 H A@6 F I J ~@32
>`.pickRestart({
  A: "x!8", B: "x", C: "x!6 ~@2", D: "x!4", E: "~@6 x!2", F: "x!7 ~", G: "x ~ x ~@3 x!2", H: "x!3 ~@3 x!2",
  I: "x ~@3 x ~@4 x ~@3 x ~@2", J: "~@2 x ~@4 x ~@3 x ~@4",
})).gain(0.41)

// drums · splash
const splash = s("cr").struct(`<
  ~ A@7 B A@12 ~@13 B A@12 ~@13 A@4 B A@3 B A@20 C D ~@8 E A@3 F G A@2 F H ~@6 E I ~@6 E I ~@9 A@16 I ~@15
>`.pickRestart({
  A: "x!4", B: "x!8", C: "x ~@2 x ~@2 x ~", D: "~ x ~@2 x ~ x ~", E: "~@3 x", F: "x ~ x ~ x ~ x!2", G: "x!7 ~",
  H: "x!4 ~@4", I: "x!2 ~@2",
})).gain(0.41)

// drums · splash · soft notes
const splash_soft = s("cr").struct("<~@150 [~@2 x!2] [x!4]!14 ~>").gain(0.15)

stack(
  melodic_tom, steel_drums, steel_drums_soft, trumpet, trumpet_soft, trombone, trombone_soft, distortion_guitar,
  distortion_guitar_soft, guitar_harmonics, bass, bass_soft, lead_2_sawtooth, kick, kick_soft, snare, snare_soft,
  open_hat, splash, splash_soft
)

More by No Doubt