Strudelify

Sweet Child O'Mine

Guns N' Roses

KeyG♭ majorTempo128 bpm
0:00/0:00
// Sweet Child O'Mine — Guns N' Roses
// 128 bpm, 4/4, key Gb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 175 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/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 · overdriven guitar
const overdriven_guitar = note(`<
  A@2 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 D E@5 ~@12 F G A@2 F G H@2 I@2 J@2 K L@2 M@2 ~@14 N F G A@2 F G H@2 I@2 J@2 O P@3
  ~@3 Q ~@12 R S T U V W X Y@3 Z AA AB AC AD AE AF AG@2 AH AI AJ AK@2 AL AM@2 AN AO AP AQ@2 AR AS ~@34 AT@3
>`.pickRestart({
  A: "db4 db5 ab4 gb4 gb5 ab4 f5 ab4", B: "eb4 db5 ab4 gb4 gb5 ab4 f5 ab4", C: "gb4 db5 ab4 gb4 gb5 ab4 f5 ab4",
  D: "eb5 ab4 db5 ab4 eb5 ab4 f5 ab4", E: "[gb5 ab4 f5 ab4 eb5 ab4 db5 ab4@33]/5", F: "c5!2 ab4 eb4 db5 ab4 b4 ab4",
  G: "b4!2 gb4 eb4 eb5 gb4 db5 gb4", H: "[ab4 [ab4,db5]@13 ~ ab4]/2", I: "gb4@3 f4@3 ~ ab4", J: "gb4@3 eb4@3 ~ ab4",
  K: "gb4@5 ab4@3", L: "[bb4@4 db5 ~ eb5@6 db5 ~ f4@14 ab3@4]/2", M: "[gb4@3 f4@6 ~@7]/2", N: "gb4@2 f4 ~ gb4 ~ f4@10",
  O: "gb4@6 ~ ab4", P: "[gb4@4 gb4@2 db4 gb4@6 db5 gb4@8 ~@2]/3", Q: "gb4@2 f4 ~ eb4 ~ f4@10", R: "bb5@14 gb5 ~",
  S: "f5@13 ~ gb5 ~", T: "e5@9 ~ eb5@3 ~ f5 ~", U: "c5@4 bb4 ~ ab4@4 gb4 ~ f4@4", V: "eb4@9 ~ f4@2 ~ ab4 b4@2",
  W: "bb4@5 db5@3", X: "b4@2 bb4 bb4@4 b4", Y: "[bb4@2 ab4 gb5@4 f4@3 eb4 eb4@4 f4@3 eb4 eb4@3 eb4@2]/3",
  Z: "d4@2 bb3 f4@4 gb4", AA: "f4@2 eb4 b3@2 bb3@2 b3", AB: "eb4@6 ~ gb4", AC: "f4@2 eb4 eb4@3 eb4@2",
  AD: "d4@2 bb3 f4@2 f4@2 ~", AE: "~@2 db4 eb4 bb4@4 db5 bb4@2 db5 e5@2 db5 eb5",
  AF: "f5@2 eb5 f5 gb5 f5@2 db5 f5 db5 eb5 f5 db5 eb5 eb5@2", AG: "eb5@4 eb5@8 db5@2 bb4 ab4", AH: "f5 f5@2 c5",
  AI: "f5@2 f5 eb5@3 eb5@2", AJ: "eb5@3 db5@2 eb5 db5 bb4",
  AK: "[ab4@4 ab4@4 ab4@4 gb4@2 bb4@4 gb4@2 ab4@2 gb4@2 ab4@2 db5 ab4@2 db5 ab4@2]/2",
  AL: "db5 ab4@2 db5 ab4@2 db5 ab4@4 eb4 ab4@2 eb4@2", AM: "gb4@4 eb4@4 eb4@2 [db4,gb4,bb4]!2 gb4@3 eb4",
  AN: "gb4@2 eb4@2 ab4 ab4@3 bb4!2 ab4@2 db5 b4@2 ab4", AO: "eb5!2 b4@2 gb5 f5@2 db5 gb5@2 f5@2 ab5 gb5 eb5@2",
  AP: "~ eb5 b4@2 ab4@2 eb5 b4 db5@2 eb5 b4 ab4@2 eb5 b4",
  AQ: "[db5@2 eb5 b4 ab4 eb5 b4 db5@3 gb5@2 ab4 b4@2 ab5@9 a5@2 gb5@2 f5@2 db5 eb5]/2",
  AR: "eb5!2 b4@2 ab4@2 gb4 bb4@2 db5 ab4@2 gb4 eb4 ab4@2", AS: "[eb3,f3,eb4,f4] ~@15",
  AT: "[~@4 eb3 bb3 eb4 g4@13 ~@4]/3",
})).s("gm_overdriven_guitar").gain(0.32)

// chords · overdriven guitar
const overdriven_guitar_2 = note(`<
  ~@8 A@2 B@2 C@2 D E F@2 G@2 H@2 I J K L M N O P@2 Q K L R S O T@2 U V W@3 X@3 Y L@2 Z N O AA@2 AB K L M N O P@2 Q K L
  R S O T@2 AB V AC@3 X@3 Y L@2 N@2 O AD@3 V AC@3 X@3 J ~@6 AE ~@20 AF ~@16 AG ~@3 AG ~@3 AH ~@3 AH ~@3 AH ~@3 AH ~@14
>`.pickRestart({
  A: "[db4,f4,ab4,db5]/2", B: "[b3,eb4,gb4,b4]/2", C: "[bb3,db4,gb4,bb4]/2", D: "[ab3,db4,ab4]", E: "[ab3,db4,f4,ab4]",
  F: "[ab3,db4,f4]@3 [ab3,db4,f4]@5", G: "[gb3,b3,eb4]@3 [gb3,b3,eb4]@5", H: "[gb3,bb3,db4]@3 [gb3,bb3,db4]@4 ~",
  I: "[ab3,db4,f4]@3 [ab3,db4,f4]@4 ~", J: "[ab3,db4,f4]@11 ~@5", K: "[db4,f4]@11 ~@5", L: "db4@11 ~@5",
  M: "eb4 ~@5 eb4@4 ~@6, b3@11 ~@5", N: "b3@11 ~@5", O: "bb3@11 ~@5", P: "[bb3@12 ~@2 [ab3,db4]@13 ~@5]/2",
  Q: "gb4 ~ f4@3 ~ [ab3,db4]@7 ~@3, [ab3,db4]@2 ~ f4@5", R: "eb4 ~@5 eb4@3 ~@7, b3@11 ~@5",
  S: "[b3,eb4]@4 ~@2 [b3,eb4]@7 ~@3", T: "[bb3@13 ~ [ab3,db4]@13 ~@5]/2",
  U: "gb4 ~ f4 ~ gb4 ~ [ab3,db4,f4]@7 ~@3, [ab3,db4] ~@3", V: "[c4,eb4]@11 ~@5",
  W: "[[b3,eb4]@3 ~ [b3,eb4]@3 ~ [b3,eb4]@4 ~@2 [ab3,db4]@14 ~@4 gb4 ~ f4 ~ eb4 ~ f4@7 ~@3, ~@30 ab3@13 ~@5, ~@32 db4@11 ~@5]/3", // B Db5
  X: "[[c4,eb4]@4 ~@2 [c4,eb4]@5 ~@3 b3@7 ~@3 b3@4 ~@2 ab3@13 ~@5, ~@14 eb4@3 ~@31]/3", Y: "[db4,ab4,db5] ~",
  Z: "b3@3 ~", AA: "[gb4@4 ~@3 db4@5 ~@4]/2", AB: "[ab3,db4]@4 ~@2 [ab3,db4]@7 ~@3",
  AC: "[[b3,eb4]@3 ~ [b3,eb4]@3 ~ [b3,eb4]@4 ~@2 [ab3,db4]@14 ~@4 db4@11 ~@5, ~@30 ab3@13 ~@5]/3", // B Db5
  AD: "[bb3@8 ~@4 db4@16 ~@2 db4@13 ~@5]/3", AE: "ab3@11 ~@5", AF: "~@3 f5",
  AG: "~@2 [gb3,b3,eb4] ~ [gb3,b3,eb4] ~ [gb3,b3,eb4] ~ [ab3,db4,f4]@3 ~ [gb3,bb3,db4]@3 ~", // B Db Gb
  AH: "[eb4,gb4] ~ [eb4,gb4] ~ [eb4,gb4] ~ [eb4,gb4] ~ [db4,f4]@3 ~ [bb3,db4]@3 ~", // Ebm Db Bbm
})).s("gm_overdriven_guitar").gain(0.24)

// bass · electric bass finger
const bass = note(`<
  ~@6 A B C D E F G H I@2 J K L M N O J P Q R S@2 T U V W Q R S@2 T U V X ~@2 Q Y ~@2 Z AA Q@2 S@2 T@2 V AB Q R S@2 T U
  V W Q R S@2 T U V X ~@2 Q Y ~@2 Z AA Q@2 S@2 T@2 Q AC ~@2 Q Y ~@2 Z AD ~@2 AE AF ~@2 AC ~@4 AG ~@3 AG ~@3 AG ~@3 AH AI
  ~@19 AJ ~@3 AJ ~@24 AK AL AM@3 ~
>`.pickRestart({
  A: "~@8 [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~", // Db5
  B: "[db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ db3@2 db3@2 ab2 ~, ~@10 ab3 ~ ab3 ~@3", // Db5
  C: "db3@3 f3@2 db3 f3 gb3", D: "ab3@2 bb3 ab3 gb3 f3 db3 ab2", E: "b2@3 gb3@3 ~ b2", F: "e3 eb3 b2 e3@2 eb3 b2 db2",
  G: "gb2@7 db3", H: "gb3@7 db3", I: "[gb3 f3 db3 gb3@2 f3 db3@3 db3!7]/2", J: "db2@3 db2 db2@3 db2",
  K: "db2@3 db2 f2 ab2 f2 ab1", L: "b1@3 b1 b1@3 b1", M: "b1@3 b1 e2 eb2 db2 b1", N: "gb1@3 gb1 gb1@3 gb1",
  O: "gb1 db2 eb2 f2 gb2 eb2 bb1 c2", P: "f2 ab2 eb2 db2 gb2@2 f2@2", Q: "db2@4 ~@2 db2 ~ db2@5 ~@3",
  R: "db2@4 ~@2 db2 ~ db2@3 ~ bb1@3 ~", S: "b1@4 ~@2 b1 ~ b1@5 ~@3", T: "gb2@4 ~@2 gb2 ~ gb2@5 ~@3",
  U: "gb2@4 ~@2 gb2 ~ gb2@3 ~ ab2@3 ~", V: "db2@4 ~@2 db2 ~ db2@4 ~@2 db2 ~",
  W: "db2 ~ db3 ~ ab2 ~ db3 ~ gb3@3 ~ f3@3 ~", X: "db2@4 ~@2 db2@3 ~ eb2 ~ f2 ~ gb2 ~",
  Y: "db2@4 ~@2 db2 ~ ab2 ~ gb2 ~ f2 ~ db2 ~", Z: "db2@4 ~@2 db2 ~ db2@4 ~@2 b2 c3",
  AA: "db3 ~ db3 ~ db3 ~ db3 ~ db3@3 ~ db2 ~ db2 ~", AB: "db2 ~ db2@3 ~ db2 ~ gb2@3 ~ f2@3 ~",
  AC: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~", AD: "db3 ~ eb2 ~ f2 ~ eb2 ~ gb2 ~ eb2 ~ g2 ~ eb2 ~",
  AE: "db3@4 ~@2 db3 ~ db3@4 ~@2 db3 ~", AF: "db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~",
  AG: "~@6 ab1@3 ~ eb2 ~ gb2 ~ f2 ~", AH: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ gb2 ~",
  AI: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ gb2 ~ eb2 ~ db2 ~", AJ: "~@2 b2 ~ b2 ~ b2 ~ db3@3 ~ gb2@3 ~", AK: "eb2",
  AL: "ab2 gb2", AM: "eb2/3",
})).s("gm_electric_bass_finger").gain(0.24)

// bass · electric bass finger
const bass_2 = note(`<
  ~@24 A@2 B@2 C@2 A ~ A@2 B@2 C@2 A ~ D E F@2 G E H ~ A@2 B@2 C@2 A@4 B@2 C@2 A ~ A@2 B@2 C@2 A ~ D E F@2 G E H ~ A@2
  B@2 C I J A D E F@2 G E H ~ K L M@2 G L A N O P Q R O P Q R O P Q R O P Q S T U V W X U V W X U V W X U V W X Y Z AA ~
  Y Z AA ~ U AB AC AD U AB AC AD U AB AC AD U AB AC AD U AE AC AF U AB AG AH AI@2 AJ@3 ~
>`.pickRestart({
  A: "[ab2,db3]@11 ~@5", B: "[gb2,b2]@11 ~@5", C: "[db3,gb3]@11 ~@5", D: "[ab2,eb3,ab3] ~@5 [ab2,eb3,ab3]@5 ~@3 bb2 ~",
  E: "[b2,gb3] ~@5 [b2,gb3]@7 ~@3", F: "[[ab2,db3]@21 ~@11]/2", G: "[ab2,eb3,ab3] ~@5 [ab2,eb3,ab3]@7 ~@3",
  H: "[ab2,db3]@3 ~", I: "db3@11 ~@5", J: "ab2@11 ~@5", K: "[ab2,eb3,ab3] ~@5 [ab2,eb3,ab3]@5 ~@3 [bb2,f3,bb3] ~",
  L: "[b2,gb3,b3] ~@5 [b2,gb3,b3]@7 ~@3", M: "[ab3,db4]@11 ~@5",
  N: "[db2,db3,ab3] ~ [db2,db3,ab3] ~ [db2,db3,ab3] ~ [db2,db3,ab3] ~ [db2,db3,ab3] ~ [db2,db3,ab3] ~ [d2,d3,a3] ~@3", // Db5 D5
  O: "[eb2,eb3,bb3,eb4]@4 ~@2 [eb2,eb3,bb3,eb4]@7 ~@3", P: "[b1,b2,gb3,b3]@4 ~@2 [b1,b2,gb3,b3]@7 ~@3",
  Q: "[bb1,bb2,f3,bb3]@4 ~@2 [bb1,bb2,f3,bb3]@7 ~@3", R: "[ab1,ab2,eb3,ab3]@4 ~@2 [ab2,eb3,ab3]@7 ~@3",
  S: "[eb3,ab3]@3 ~ [eb3,ab3]@3 ~ [eb3,ab3]@3 ~ [eb3,ab3]@3 ~", T: "[eb3,ab3]@3 ~ [eb3,ab3]@3 ~ [eb3,ab3]@7 ~",
  U: "[eb2,bb2,eb3]@4 ~@2 [eb2,bb2,eb3]@5 ~@3 [f2,c3,f3] ~", V: "[gb2,db3,gb3]@4 ~@2 [gb2,db3,gb3]@5 ~@3 [eb2,eb3] ~",
  W: "[ab2,eb3,ab3]@4 ~@2 [ab2,eb3,ab3]@9 ~", // Ab5
  X: "[b2,gb3,b3] ~ [b2,gb3,b3] ~ [b2,gb3,b3] ~ [b2,gb3,b3] ~ [db3,ab3,db4]@3 ~ [gb2,db3,gb3]@3 ~", // B5 Db5 Gb5
  Y: "[eb2,bb2,eb3]@3 ~@3 [eb2,bb2,eb3] ~@7 [c3,f3] ~, ~@7 f2", Z: "[gb2,db3,gb3]@3 ~@3 [gb2,db3,gb3] ~@9",
  AA: "[ab2,eb3,ab3]@3 ~@3 [ab2,eb3] ~@9", AB: "[gb2,db3,gb3]@4 ~@2 [gb2,db3,gb3]@7 ~@3",
  AC: "[ab2,eb3,ab3]@4 ~@2 [ab2,eb3,ab3]@7 ~@3", // Ab5
  AD: "[b2,gb3,b3] ~ [b2,gb3,b3] ~ [b2,gb3,b3] ~ [b2,gb3,b3] ~ [db3,ab3]@3 ~ [gb2,db3,gb3]@3 ~", // B5 Db5 Gb5
  AE: "[gb2,db3,gb3]@4 ~@2 [gb2,db3,gb3]@9 ~", // Gb5
  AF: "[eb3,bb3,eb4]@3 [db3,ab3,db4]@2 [bb2,gb3,bb3]@3 [a2,e3,a3]@3 [ab2,eb3,ab3]@2 [gb2,db3,gb3]@3", // Eb5 Db5 Ebm A5 Ab5 Gb5
  AG: "[ab2,eb3,ab3]@11 ~@5", AH: "[b2,gb3,b3]@5 ~@3 [db3,ab3,db4]@5 ~@3", AI: "[bb2,eb3]/2", AJ: "[bb2,eb3]/3",
})).s("gm_electric_bass_finger").gain(0.08)

// drums · snare
const snare = s("sd").struct("<~@8 [x!16]!161 ~@6>").gain(0.08)

stack(overdriven_guitar, overdriven_guitar_2, bass, bass_2, snare)

More by Guns N' Roses