Strudelify

Hold On

Stone & Stone

KeyB majorTempo92 bpm
0:00/0:00
// Hold On — Stone & Stone
// 92 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 24, guitar program 29.
setcpm(92/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.

// bass · electric bass finger
const bass = note(`<
  ~@3 A B C B D E F B G H I J K H I H L B M N O N P N Q H I J K H I H R S T S U S T S V W X Y Z AA AB AC AD AA AB AE AF
  AG AH AG AI AG AJ AG AK AG AH AG AI AG AL AG AM
>`.pickRestart({
  A: "~@14 c#2 e2", B: "f#2 e2", C: "b1@7 ~ b1!2 b1@3 ~ b1@2", D: "a1@6 a1@2 e3 d3 c#3@2 a2@4",
  E: "f#2@5 ~ f#2@2 e2@5 ~ e2@2", F: "b1@5 ~ b1@2 b1!2 b1@3 ~ b1@2", G: "b1@5 ~ a1 b1 ~ a1 b1 ~ b1 ~ b1 c#2",
  H: "e2 a1", I: "b1@7 b1!3 b1@3 ~ b1@2", J: "e2@8 a1@6 b1 c#2", K: "d2@4 c#2@4 b1@6 b2 b1", L: "d2 c#2 b1@2",
  M: "b1@6 ~ b1!3 b1@3 ~ b1@2", N: "f#2@5 ~ f#2@2 e2@8", O: "a1@6 ~ a1!3 b1@2 c#2@2 e2 c#2",
  P: "b1@6 ~ b1!3 a1 f#1 a1@2 b1 ~", Q: "b1@6 ~ b1!3 b1@2 c#2!2 e2 c#2", R: "d2@2 c#2@2 b1@3 f#2", S: "c#3 a2", T: "b2",
  U: "~@6 f#3 b3 c#4@4 b3@3 ~, b2", V: "b1@3 ~ b1@3 ~ b1@3 ~ d3@3 ~", W: "d2@5 ~ d2@2 c#2@5 ~ c#2@2",
  X: "b1@5 ~ e1@2 f#1 e1 g#1 e1 a1 e1 b1 c#2", Y: "d2 ~ d2@3 ~ d2@2 c#2 ~ c#2@3 ~ c#2@2",
  Z: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1@2 g#1 f#1", AA: "e1 ~ e1@2 ~@4 a1 ~ a1@2 ~@4",
  AB: "b1 ~ b1@2 ~@3 b1!3 b1@2 ~@2 b1@2", AC: "e1 ~ e1@2 ~@4 a1 ~ a1 ~@3 b1 c#2", AD: "d2@4 c#2@4 b1@4 ~@2 b1!2",
  AE: "e1 ~ e1@2 ~@4 a1 ~ a1 ~@3 a1@2", AF: "d2@4 c#2@4 b1@7 ~", AG: "f#1 ~ f#1@2 ~@4 b1 ~ b1@2 ~@4",
  AH: "c#2 ~ c#2@2 ~@3 c#2!4 g#1 b1@2 c#2@2", AI: "e2@4 d#2@4 c#2@3 ~@5",
  AJ: "c#2 ~ c#2@2 ~@3 c#2!3 c#2@2 f2 f#2 g#2@2", AK: "e2@4 d#2@4 c#2!2 f2 g#2 a#2 g#2 f2 c#2",
  AL: "c#2 ~ c#2@2 ~@3 c#2!3 c#2@2 c#2!2 c#2@2", AM: "e2@4 d#2@4 c#2!2 f2 g#2 a#2 g#2 f2 ~",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · piano
const piano = note(`<
  ~@4 A B A C D B A B E F E G E F E H A B A C D B A B E F E G E F E H I J I K I J I L M N M N E F E G E F E H O P O Q O
  P O R O P O Q O P O R
>`.pickRestart({
  A: "~@4 [a#3,c#4,f#4]@3 ~@5 [b3,e4,g#4]@3 ~", B: "~@4 [b3,d#4,f#4]@3 ~@3 [b3,d#4,f#4]!2 ~@2 [b3,d#4,f#4] ~",
  C: "~@4 [c#4,e4,a4]@3 ~@3 [c#4,e4,a4]!2 ~@2 [c#4,e4,a4] ~", D: "~@4 [a#3,c#4,f#4]@3 ~@5 [b3,e4,g#4]@2 ~@2",
  E: "~@4 [b3,e4,g#4]@3 ~@5 [c#4,e4,a4]@3 ~", F: "~@4 [b3,d#4,f#4]@3 ~@3 [b3,d#4,f#4]!2 ~ [b3,d#4,f#4] ~ [b3,d#4,f#4]",
  G: "~@2 [d4,f#4,a4]@2 ~@2 [e4,a4]@2 ~@2 [b3,e4,f#4]@2 ~@2 [b3,d#4,f#4] ~, ~@6 c#4 ~@9", // D A5 Bsus4 B
  H: "[d4,f#4,a4]@3 ~ [c#4,e4,a4]@3 ~ [b3,d#4,f#4]@7 ~", I: "[c#4,e4] a3 [c#4,e4] a3 [c#4,e4] a3 [c#4,e4] a3",
  J: "[b3,d#4] f#3 [b3,d#4] f#3 [b3,d#4] f#3 [b3,d#4] f#3", // B
  K: "[b3,e4]@2 f#3@2 [b3,e4]@2 f#3@2 [b3,d#4]@2 f#3@2 [b3,d#4] ~ d#4 f#4", // E5 B
  L: "[b3,e4]@2 f#3@2 [b3,e4]@2 f#3@2 [b3,d#4]@2 f#3@2 [b3,d#4]@2 f#3 ~", // E5 B
  M: "[a3,d4,f#4]@3 ~ [a3,d4,f#4]@3 ~ [a3,c#4,e4]@3 ~ [a3,c#4,e4]@3 ~", // D A
  N: "[f#3,b3,e4]@4 [f#3,b3,e4]@3 ~ [f#3,b3,d#4]@3 ~ [f#3,b3,d#4]@3 ~", O: "~@4 [c#4,f#4,a#4]@3 ~@5 [d#4,f#4,b4]@3 ~",
  P: "~@4 [c#4,f4,g#4]@3 ~@3 [c#4,f4,g#4]!2 ~ [c#4,f4,g#4] ~ [c#4,f4,g#4]", // C#
  Q: "~@2 [e4,g#4,b4]@2 ~@2 [f#4,b4]@2 ~@2 [c#4,f#4,g#4]@2 ~@2 [c#4,f4,g#4] ~, ~@6 d#4 ~@9", // E B5 C#sus4 C#
  R: "[e4,g#4,b4]@3 ~ [d#4,f#4,b4]@3 ~ [c#4,f4,g#4]@7 ~", // E B C#
})).s("gm_piano").gain(0.36).pan(0.4)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  A B A B A B A C A B A B D E F@2 D E D G A B A C A B A B D E F@2 D E D G H I H J H K H L M N M O D E F@2 D E D G P Q
  R@2 P Q P S P Q R@2 P Q P S
>`.pickRestart({
  A: "[c#4,f#4,a#4,c#5]@2 [c#4,f#4,a#4,c#5]@2 [c#4,f#4,a#4,c#5]@2 [c#4,f#4,a#4,c#5]!2 [e4,g#4,b4,e5]@2 [e4,g#4,b4,e5]@2 [e4,g#4,b4,e5]@2 [e4,g#4,b4,e5]!2", // F# E
  B: "[d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5]!4 [d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5]!2", // B
  C: "[e4,a4,c#5,e5]@2 [e4,a4,c#5,e5]@2 [e4,a4,c#5,e5]@2 [e4,a4,c#5,e5]!4 [e4,a4,c#5,e5]@2 [e4,a4,c#5,e5]@2 [e4,a4,c#5,e5]!2", // A
  D: "[b3,e4,g#4,b4]@2 [b3,e4,g#4,b4]!2 [b3,e4,g#4,b4]@2 [b3,e4,g#4,b4]!2 [c#4,e4,a4,c#5]@2 [c#4,e4,a4,c#5]!2 [c#4,e4,a4,c#5]@2 [c#4,e4,a4,c#5]!2", // E A
  E: "[b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]!2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]!4 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]@2 [b3,d#4,f#4,b4]!2", // B
  F: "[[b3,e4,g#4,b4]@2 [b3,e4,g#4,b4]!2 [b3,e4,g#4,b4]@2 [b3,e4,g#4,b4]!2 [c#4,e4,a4,c#5]@2 [c#4,e4,a4,c#5]!2 [c#4,e4,a4,c#5]@2 [c#4,e4,a4,c#5] [c#4,e4,a4,c#5]@2 ~ [d4,f#4,a4,d5]@2 ~@2 [c#4,e4,a4,c#5]@2 ~@2 [b3,e4,f#4,b4]@2 ~@2 [b3,d#4,f#4,b4]@2]/2", // E A D A Bsus4 B
  G: "[d4,f#4,a4,d5]@4 [c#4,e4,a4,c#5]@4 [b3,d#4,f#4,b4]@7 ~", H: "[a3,c#4,e4,a4]!2", I: "[f#3,b3,d#4,f#4]",
  J: "[f#3,b3,e4,f#4] [f#3,b3,d#4,f#4]", K: "[f#3,b3,d#4,f#4]!2", L: "[f#3,b3,e4,f#4]@3 [f#3,b3,d#4,f#4]!5",
  M: "[a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]@2 [a3,c#4,e4,a4]!2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2", // D A
  N: "[f#3,b3,e4,f#4]@2 [f#3,b3,e4,f#4]!2 [f#3,b3,e4,f#4]@2 [f#3,b3,e4,f#4]@2 [f#3,b3,d#4,f#4]!2 [f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4] [f#3,d#4,f#4] [f#3,b3,d#4,f#4]@2", // Esus2 B D#m B
  O: "[f#3,b3,e4,f#4]@2 [f#3,b3,e4,f#4]!2 [f#3,b3,e4,f#4]@2 [f#3,b3,e4,f#4]@2 [f#3,b3,d#4,f#4]!2 [f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4]!2 [f#3,b3,d#4,f#4]@2", // Esus2 B
  P: "[c#4,f#4,a#4,c#5]@2 [c#4,f#4,a#4,c#5]!2 [c#4,f#4,a#4,c#5]@2 [c#4,f#4,a#4,c#5]!2 [d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5]!2 [d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5]!2", // F# B
  Q: "[c#4,f4,g#4,c#5]@2 [c#4,f4,g#4,c#5]!2 [c#4,f4,g#4,c#5]@2 [c#4,f4,g#4,c#5]!4 [c#4,f4,g#4,c#5]@2 [c#4,f4,g#4,c#5]@2 [c#4,f4,g#4,c#5]!2", // C#
  R: "[[c#4,f#4,a#4,c#5]@2 [c#4,f#4,a#4,c#5]!2 [c#4,f#4,a#4,c#5]@2 [c#4,f#4,a#4,c#5]!2 [d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5]!2 [d#4,f#4,b4,d#5]@2 [d#4,f#4,b4,d#5] [d#4,f#4,b4,d#5]@2 ~ [e4,g#4,b4,e5]@2 ~@2 [d#4,f#4,b4,d#5]@2 ~@2 [c#4,f#4,g#4,c#5]@2 ~@2 [c#4,f4,g#4,c#5]@2]/2", // F# B E B C#sus4 C#
  S: "[e4,g#4,b4,e5]@4 [d#4,f#4,b4,d#5]@4 [c#4,f4,g#4,c#5]@7 ~", // E B C#
})).s("gm_acoustic_guitar_nylon").gain(0.08).pan(0.7)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@12 A B A C A B A D ~@8 A B A C A B A D E F E G E F E H I H I H A B A C A B A D J K J L J K J M J K J L J K J M
>`.pickRestart({
  A: "[b3,e4,g#4] [c#4,e4,a4]", B: "[b3,d#4,f#4]", C: "[d4,f#4,a4] [c#4,e4,a4] [b3,e4,f#4] [b3,d#4,f#4]",
  D: "[d4,f#4,a4] [c#4,e4,a4] [b3,d#4,f#4]@2", E: "[a3,c#4,e4]", F: "[f#3,b3,d#4]", G: "[b3,e4,f#4] [b3,d#4,f#4]",
  H: "[f#3,b3,e4] [f#3,b3,d#4]", I: "[a3,d4,f#4] [a3,c#4,e4]", J: "[c#4,f#4,a#4] [d#4,f#4,b4]", K: "[c#4,f4,g#4]",
  L: "[e4,g#4,b4] [d#4,f#4,b4] [c#4,f#4,g#4] [c#4,f4,g#4]", M: "[e4,g#4,b4] [d#4,f#4,b4] [c#4,f4,g#4]@2",
})).s("gm_synth_strings_1").gain(0.22).pan(0.6)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon_2 = note("<~@13 A ~ B ~ A ~ C ~@9 A ~ B ~ A ~ C D E D F D G D H ~@28>".pickRestart({
  A: "~@13 [f#3,b3,d#4,f#4] ~@2", // B
  B: "[d3,d4,f#4,a4]!2 ~@2 [c#3,c#4,e4,a4]!2 ~@2 [b2,b3,e4,f#4]!2 ~@2 [b2,b3,d#4,f#4]!2 ~@2", // D A Bsus4 B
  C: "~ [d3,d4,f#4,a4] [d3,d4,f#4,a4]@2 ~ [c#3,c#4,e4,a4] [c#3,c#4,e4,a4]@2 ~@8", D: "~ c#4 e4 f#4 ~ c#4 e4 f#4",
  E: "~@2 b3@2 c#4@2 ~@2 b3 c#4 ~ e4 f#4 g#4 f#4 d#4, ~@6 d#4@4 d#4@5 ~", F: "~ b3 c#4 d#4@5",
  G: "~@2 b3@2 c#4@2 d#4@3 c#4 ~ e4 f#4 g#4 f#4 d#4, ~@10 d#4@5 ~", H: "~ b3 c#4 ~@5",
})).s("gm_acoustic_guitar_nylon").gain(0.16).pan(0.3)

// other · electric guitar clean
const electric_guitar_clean = note("<~@21 A B C ~ D E F ~@44>".pickRestart({
  A: "~@6 c#4 e4 f#4 a4 f#4 e4 f#4 e4 c#4 a#3", B: "f#3@5 ~@3",
  C: "~@2 c#4 e4 f#4 c#5 e4 [d4,b4]!2 d4 [c#4,a4] [c#4,a4]@3 ~@2", D: "~@4 c#4@2 e4@2 c#4!2 b3 a3 b3 a3 f#3 e3",
  E: "f#3@5 ~@11", F: "~@2 e3 ~ f#3 ~@3 e3 ~ f#3 ~ e3 ~ f#3 ~",
})).s("gm_electric_guitar_clean").gain(0.32).pan(0.2)

// other · overdriven guitar
const overdriven_guitar = note("<~@44 A@2 B@2 C ~@6 D ~@7 E F G H I J@2 K ~>".pickRestart({
  A: "[d5@8 c#5@2 b4@2 a4@2 b4@15 ~@3]/2",
  B: "[d5@6 e5@2 c#5@2 b4@2 a4@2 b4@10 [c#4,d#4] [d#4,e4] [e4,f#4] [f#4,g#4] [g#4,a4] [a4,b4] [b4,c#5] [c#5,f#5]]/2", // C#sus2 Emaj7 Esus2 F#sus2 Amaj7 Asus2 Bsus2 F#5
  C: "b5", D: "d5@4 c#5@4 b4 a4 b4 c#5 b4@4", E: "~ a#5 g#5 f#5 a#5!2 g#5@2", F: "[f#4,c#5]!16",
  G: "c#5 ~ c#5@2 a#4 g#4 f#4 g#4 a#4@2 g#4 f#4 g#4@2 f4@2", H: "f#4 g#4 f4@2 f#4@2 ~@2",
  I: "e5@4 d#5@4 c#5 b4 c#5 d#5 c#5@4", J: "[~@4 a#5@2 a#5@5 a#5@7 a#5@3 a#5@3 a#5@3 a#5@3 a#5@2]/2",
  K: "a#5@2 g#5 [f#5,g#5] ~ f#5@9 ~@2", // F#sus2
})).s("gm_overdriven_guitar").gain(0.33).pan(0.9)

// chords · overdriven guitar
const overdriven_guitar_2 = note("<~@49 A ~ B ~ C ~ D ~ E ~ F ~ G ~ H ~ E ~ F ~ G ~ H>".pickRestart({
  A: "~@11 [b2,f#3,b3]@2 b2 ~@2", B: "[d3,a3,d4]@3 ~ [c#3,g#3,c#4]@3 ~ [b2,f#3,b3]@6 ~@2",
  C: "~@11 [b2,f#3,b3] ~ b2 ~@2", D: "~@4 g#3@3 ~@9", E: "~@11 [c#3,g#3,c#4]@2 c#3 ~@2",
  F: "[e3,b3,e4]@3 ~ [d#3,a#3,d#4]@3 ~ [c#3,g#3,c#4]@6 ~@2", G: "~@11 [c#3,g#3,c#4] ~ c#3 ~@2", H: "~@4 a#3@3 ~@9",
})).s("gm_overdriven_guitar").gain(0.22).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~@4 A@32 ~@8 B C B@2 D E D F D E G H D E D F D E G H D E D F D E G H>".pickRestart({
  A: "x!2", B: "x ~@2 x!2 ~@3", C: "x ~@5 x ~ x ~@2 x ~@2 x ~", D: "x!2 ~@2 x!2 ~@2", E: "x ~ x ~@5 x ~@2 x ~@2 x ~",
  F: "x!2 ~@2 x ~@3", G: "x!3 ~@5 x ~ x ~@5", H: "x ~@5 x!2 ~@8",
})).gain(0.5)

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

// drums · low tom
const low_tom = s("lt").struct("<~@43 A ~@3 A ~@3 B ~@3 C ~@3 B ~@3 D ~@3 D ~@3 C>".pickRestart({
  A: "~@7 x", B: "~@15 x", C: "~@12 x!3 ~", D: "~@14 x!2",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@4 A B C D A B C D A B C D A B E F A B C D A B C D A B C D A B E F ~@8 A B C D A B C D A B E D A B C D A B E D A B C
  D A B E D
>`.pickRestart({
  A: "x ~ x ~ x ~ x ~ x!3 ~ x ~ x!2", B: "x!3 ~ x ~ x ~ x ~ x ~ x!3 ~", C: "x ~ x ~ x ~ x ~ x!3 ~ x ~ x ~",
  D: "x ~ x!3 ~ x ~ x!3 ~ x!3 ~", E: "x!3 ~ x ~ x ~ x!3 ~ x ~ x ~", F: "x!3 ~ x!3 ~@9",
})).gain(0.5)

// drums · mid tom
const mid_tom = s("mt").struct("<~@43 A ~@3 B ~@3 C ~@3 D ~@3 C ~@3 E ~@3 F ~@3 D>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@6 x ~ x!3 ~ x!2 ~@2", C: "~@12 x!3 ~", D: "~@4 x ~ x!5 ~@5", E: "~@13 x ~@2",
  F: "~@6 x!5 ~ x!2 ~@2",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~@11 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~@15 x",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@43 A ~@3 B ~@3 C ~@3 D ~@3 C ~@3 E ~@3 F ~@3 D>".pickRestart({
  A: "~@2 x ~ x!2 ~@2 x!2 ~@6", B: "x ~ x!3 ~@11", C: "~@2 x!3 ~ x!3 ~ x ~@5", D: "x!2 ~ x ~@12", E: "~@8 x!3 ~@5",
  F: "x!5 ~@11",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct(`<
  ~@12 A ~@3 A ~@2 B ~@8 A ~@3 A ~@2 B ~@8 A ~@3 A ~@3 A ~ C ~ A ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "x", B: "~ x", C: "~ x ~@2",
})).gain(0.5)

stack(
  bass, piano, acoustic_guitar_nylon, synth_strings_1, acoustic_guitar_nylon_2, electric_guitar_clean,
  overdriven_guitar, overdriven_guitar_2, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash
)