Strudelify

Stairway to Heaven

Far Corporation

KeyA minorTempo80 bpm
0:00/0:00
// Stairway to Heaven — Far Corporation
// 80 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 81 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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 · acoustic guitar steel
const acoustic_guitar_steel = note("<~@36 A@2 B C A@2 B C ~@20 A@2 B C A@2 B C A@2 B C A@2 B C D>".pickRestart({
  A: "[[a2,c4,e4,g4]@3 ~ [c4,e4,g4]@2 [c4,e4,g4]@3 ~ [a2,c4,e4]@3 ~ c4@4 c4@2 [c4,f#4,a4]@3 d3 ~ d3@3 [c4,f#4,a4]@2 d3 ~, ~@3 a2@6 ~@5 d3@8 ~@10, ~@7 [f#4,a4]@3 ~@2 [c4,f#4,a4]@2 ~@2]/2", // Am7 C Am F#dim F#m F#dim
  B: "[a2,c4,g4]@3 e4 [c4,e4,g4] ~ [c4,e4,g4]@3 ~ [a2,c4,e4]@2 ~@2 [d3,e4,g4,b4]@2, ~@5 a2@4 ~@7", // Am7 C Am Em7
  C: "~@2 [d3,d4,f#4,a4]@3 ~ [d3,c4,e4,g4]@3 ~ [d3,f#4,a4]@4 d4 d3, ~@10 d4@3 ~@3", D: "[d3,a3,d4,f#4]@15 ~",
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.6)

// chords · acoustic guitar steel
const acoustic_guitar_steel_2 = note(`<
  A B C D A E C F G H I J G H K L A B C D A B C F G H I J G H K L A B C D ~@8 A E C D A B C F G H I J G H K L A B C D
  ~@17
>`.pickRestart({
  A: "~@6 a4 ~@7 b4@2, a3 g#3, ~@2 c4@7 ~ c4@6, ~ e4 b4 e4",
  B: "~@2 e4@2 ~@2 c5 ~@3 d4@2 a3@2 d4 ~, g3@8 [f#3,f#4]@7 ~, c5 g4 ~@2", // F#
  C: "a3@2 ~@4 e4@4 ~@2 c4@2 a3 ~, [f2,f3]@15 ~, e4@4 a3@9 ~@3, ~@2 c4@8 e4@5 ~", // F
  D: "[b2,g3,b3]@2 [a2,e3,a3] ~ a2@6 ~@2 f3@2 e3 ~, ~@2 c4@5 ~, ~ [e3,a3]@2 ~, ~@10 a2@5 ~", // Em A5
  E: "~@2 e4@2 ~@2 c5 ~@3 d4@2 a3@2 d4 ~, g3@8 [f#3,f#4]@7 ~, c5@3 ~@5, ~ g4 ~@2", // F#
  F: "[b2,g3,b3]@2 [a2,e3,a3,c4] ~ a2@8 a2@2 b2@2, ~@4 [e3,a3,c4]@11 ~", // Em Am
  G: "~@6 e4@2 ~@2 d4@2 ~@2 f#4 ~, c3 d3, ~ e3@3 ~@2 a3@2, ~@4 g3@4 f#4@5 ~@3",
  H: "a3@2 ~@4 e4@2 b3 c4 ~@2 a2@2 b2@2, f2@2 a2 ~, e4@2 a3@2 ~ a3@3, ~ c4@2 ~@5",
  I: "~@2 g3@2 ~@2 g3@2 ~@4 g4@2 d4 ~, [c3,c4] g2, ~@2 e3@2 ~ d3@3", // C
  J: "g4 f#4 d4 ~ g3@2 a3 g3 f#3 g3 a3@2 a2@2 b2@2, d3@3 ~ d3@8 ~@4",
  K: "~@6 c4@2 ~@4 d4@2 f#4 ~, c3@7 ~ d3@8, ~ e3@3 ~@4, ~@4 g3@4 ~@2 a3@5 ~",
  L: "e4@2 c4@2 ~@6 f3@2 e3@2 c3 ~, [f2,f3]@5 ~@3, a3@6 c4@9 ~, ~@4 e4@11 ~, ~@8 a3@7 ~", // F
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.7)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~@4 A@3 B C D E@2 C F G@2 A@3 B A@3 B C D E@2 C F G@2 A@3 B H I J@2 H I J@2 A@3 B A@3 B C D E@2 C F G@2 A@3 B H I J@2
  H I J@2 H I J@2 H I J@2 ~
>`.pickRestart({
  A: "[a3 g#3 g3 [f#3,a3] [f3,a3,e4]@2, c4, e4@2 ~]/3", B: "[g3,b3] ~ [a3,c4,e4] ~ [a3,c4,e4]@11 ~",
  C: "[c3,e4,g4] [d3,f#4,a4]", D: "f3 a2, [e4,a4,c5]", E: "[[c3,c4,e4] [g2,b3] [d3,a3,f#4]@2, g4 ~, ~@8 d4@23 ~]/2",
  F: "[c4,e4,a4]@4 ~@2 c5@2 [c4,e4,e5]@7 ~, ~@4 a4@11 ~, ~ [c4,e4] ~@2", // Am C
  G: "[[c3,c4,e4,g4] [d3,d4,f#4] [f3,c4,e4]@2, ~ a4@3]/2", H: "[a3,e4]", I: "[a3,d4]",
  J: "[[c4,e4]@13 ~ [e4,g4]@4 [d4,f#4]@4 [c4,e4]@4 [d4,f#4]@5 ~]/2", // C Em D C D
})).s("gm_string_ensemble_2").gain(0.2).pan(0.6)

// other · overdriven guitar
const overdriven_guitar = note("<~@47 A ~@3 B ~@7 C D@2 ~ E ~ F G H I J K L ~@6 M N ~>".pickRestart({
  A: "~@8 c5 a4@6 ~", B: "~@2 d4@2 g4 d4 f4 d4 g4 d4@2 e4 c4@3 ~", C: "~@11 a4 g5@3 ~",
  D: "[g5@8 ~@4 g5@2 e5 d5@3 c5 a4 c5 b4 a4 c5 b4 a4 g4@2 a4@3 ~]/2", E: "~@4 a5@2 b5 ~ b5@2 a5 e5 g5@3 ~",
  F: "~@12 a4 c5 d5 c5", G: "d5 ~ d5@8 ~@2 g5@2 g5 ~", H: "g5 f#5 ~ f#5!2 e5 ~ e5!2 d5 ~ c5 d5@2 c5 a4", I: "c5 ~@3",
  J: "~@12 g5@2 a5 ~", K: "c6 a5@5 d6 ~ c6@4 c6 ~ b5 ~", L: "a5 g5 a5@5 ~@9", M: "~@5 d5!7 d5@2 c5 a4",
  N: "c5 ~ a4@5 ~@9",
})).s("gm_overdriven_guitar").gain(0.35).pan(0.6)

// other · orchestra hit · G
const orchestra_hit = note("<~@35 [~@6 [g4,g5] ~] ~@27 [~@6 [g4,g5] ~] ~@17>").s("gm_orchestra_hit").gain(0.43)

// chords · percussive organ
const percussive_organ = note("<~@38 A B ~@2 A B ~@22 A B ~@2 A B ~@2 A B ~@2 A B C>".pickRestart({
  A: "~@7 [e5,g5,b5]", B: "~@2 [d5,f#5,a5]@3 ~ [c5,e5,g5]@4 [d5,f#5,a5]@5 ~", C: "[d3,a4,d5,f#5]",
})).s("gm_percussive_organ").gain(0.21).pan(0.7)

// chords · electric guitar jazz
const electric_guitar_jazz = note("<~@36 A@2 B C A@2 B C ~@20 A@2 B C A@2 B C A@2 B C A@2 B C ~>".pickRestart({
  A: "[[a3,c4,e4,g4]@3 ~ [e4,g4]@2 [a3,c4,e4,g4]@3 ~ [a3,c4,e4,g4]@2 ~@8 [d4,f#4]@3 a3 ~ a3@3 [d4,f#4]@2 a3 ~, ~@3 [a3,c4]@3 ~@8 [d4,f#4]@6 ~@4 [d4,f#4]@4 ~@4, ~@8 a3@3 ~@5]/2", // Am7 Em Am7 D Am D
  B: "[e4,g4]@3 ~ [e4,g4] ~ [e4,g4]@3 ~ [a3,c4,e4]@2 ~@2 [e4,g4,b4]@2, [a3,c4]@2 ~ [a3,c4]@5 ~@8", // Em Am Em Am
  C: "~@2 [d4,f#4,a4]@3 ~ [c4,e4,g4]@3 ~ [f#4,a4]@4 d4 ~, ~@10 d4@3 ~@3", // D C F#m
})).s("gm_electric_guitar_jazz").gain(0.23).pan(0.3)

// bass · electric bass finger
const bass = note(`<
  ~@35 A B C D@2 B C D@2 E F G H E F G H I J K L I J M N E F G H B C D@2 B C D@2 B C D@2 B C D@2 O
>`.pickRestart({
  A: "~@12 g1@3 ~", B: "a1@6 ~ a1 a1@5 ~ a1 ~", C: "d2@6 ~ d2 d2@6 g1 g#1",
  D: "[a1@6 ~ a1 a1@5 ~ d2@4 d1@4 d2@4 d1@4 d2 d1]/2", E: "a1 ~ a1@6 g#1@7 ~", F: "g1 ~ g1@6 d2@8", G: "f1 ~ f1@13 ~",
  H: "b1@2 a1 ~ a1@10 ~@2", I: "c2 ~ c2@6 d2@8", J: "f1 ~ f1@6 a1@4 a1@2 b1@2", K: "c2 ~ c2@6 g1@6 g1@2",
  L: "d1 ~ d1 ~@5 d2@4 a1@2 b1@2, ~ d1@2 ~", M: "c2 ~ c2@6 d2@7 ~", N: "f1 ~ f1 ~ f1@11 ~", O: "d1",
})).s("gm_electric_bass_finger").gain(0.51)

// chords · flute
const flute = note("<~@8 A B C D E F A G ~@65>".pickRestart({
  A: "[c5,e5] [d5,f#5]", B: "[e5,a5]@2 [d5,g5] f5 e5@2 c5 g5, ~@3 c5@3 e5@2", C: "e5 d5, g5",
  D: "[d5,g5]@2 [f#5,a5] ~ [f#5,a5]@11 ~", E: "~@4 a5@2 g5@2 g5@2 f#5@2 e5@2 d5 ~, [c5,e5]@8 d5@5 ~@3",
  F: "a5@4 c6@2 b5@2 c6@6 e5 d5", G: "[d5,g5]@2 a5@2 [e5,a5]@11 ~, ~@2 e5 ~@13",
})).s("gm_flute").gain(0.22).pan(0.3)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@39 A ~@3 A ~@23 B ~@3 C ~@3 B ~@3 C ~>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@12 x!2 ~ x", C: "~@13 x ~ x",
})).gain(0.44)

// drums · hihat
const hihat = s("hh").struct("<~@35 A B C D ~ B C D ~ C@20 B C D ~ B C D ~ B C D ~ B C D ~@2>".pickRestart({
  A: "~ x!2 ~", B: "~ x!15", C: "x!16", D: "x!14 ~@2",
})).gain(0.22)

// drums · mid tom
const mid_tom = s("mt").struct("<~@39 A ~@3 A ~@23 A ~@3 B ~@3 A ~@3 B ~>".pickRestart({
  A: "~@7 x", B: "~@6 x!2",
})).gain(0.44)

// drums · open hat
const open_hat = s("oh").struct("<~@35 A ~@2 B C ~@2 B C ~@22 B C ~@2 B C ~@2 B C ~@2 B C ~>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~ x ~ x!2 ~@3",
})).gain(0.33)

// drums · crash
const crash = s("cr").struct("<~@36 A ~ B ~ A ~ B ~@21 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.27)

// drums · bongos
const bongos = s("bongo:4").struct("<~@44 [~@5 x ~@5 x ~@4]!20 ~@17>").gain(0.72)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@44 [~@7 x ~@6 x ~]!20 ~@17>").gain(0.72)

// drums · claves
const claves = s("clave:2").struct("<~@44 [~@13 x ~@2]!20 ~@17>").gain(1.88)

stack(
  acoustic_guitar_steel, acoustic_guitar_steel_2, string_ensemble_2, overdriven_guitar, orchestra_hit, percussive_organ,
  electric_guitar_jazz, bass, flute, kick, snare, low_tom, hihat, mid_tom, open_hat, crash, bongos, bongos_2, claves
)