Strudelify

Show Me Heaven

Maria McKee

KeyA majorTempo80 bpm
0:00/0:00
// Show Me Heaven — Maria McKee
// 80 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 7 overdriven guitar (copy of ch 6 overdriven guitar, 0.083 beats late)
// note: Full arrangement: all 77 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.

// bass · synth bass 2
const bass = note(`<
  A ~ A ~ A ~ A ~ A ~ B C D E F E G E H I J K L M J N O P H Q H E H E B R H E F I G Q H I J K L M J N J Q A ~@3 J I J I
  J I J S J T J T J T J T J T J T U
>`.pickRestart({
  A: "a1@3 ~", B: "f#1@3 c#1@5", C: "d1@3 e1@5", D: "a1@3 a1 b1@4", E: "e1", F: "f#1@3 b1@5", G: "a1@3 b1@5", H: "b1",
  I: "d1 e1", J: "a1 b1", K: "d1@3 f#1 e1@4", L: "a1@3 b1 b1@4", M: "d1@3 d1 e1@3 e1", N: "d1@3 f#1 e1@3 e1",
  O: "a1@4 b1@3 d1", P: "d1@3 e1 e1@4", Q: "d1@4 e1@3 e1", R: "d1@3 e1@4 e1", S: "d1@2 d1@2 e1@2 e1!2",
  T: "d1@6 d1@2 e1@6 e1 f#1", U: "a1",
})).s("gm_synth_bass_2").gain(0.45).pan(0.3)

// chords · drawbar organ
const drawbar_organ = note("<A@8 B@2 C D@3 E@2 F G@7 H@8 I@2 C J@3 K@2 L@8 M@4 N@3 O P@8 Q@8 R@5>".pickRestart({
  A: "[[c#5,e5] [d5,f#5]@2 [g#5,b5] c#5 [d5,f#5]@2 [b4,g#5] [a4,c#5] [f#4,a4,d5]@2 [g#4,b4] c#5 [f#4,d5]@2 [g#4,b4,e5], a5@3 e5@2 ~@2 e5@2 ~@2 e5@2 ~@3, ~@4 a5@3 ~@5 a4@3 ~]/8", // C#m D G#m D E A D G#m …
  B: "[c#5 [f#4,d5]@2 [g#4,b4,e5], a4@3 ~]/2", C: "[c#5,f#5,a5]@3 [c#5,e5,g#5]@5",
  D: "[[a4,d5,f#5]@3 [b4,g#5]@5 c#5@4 ~@4 a4@4 [b4,e5,g#5]@4, ~@3 e5@9 [d5,f#5]@8 ~@4, ~ a5 ~]/3", // D E D
  E: "[[c#5,a5]@3 b4@5 a4@4 [g#4,b4,e5]@4, f#5@3 ~, ~@3 d5@9 ~@4]/2", F: "[c#5,e5]@3 [d5,f#5]@5, a4",
  G: "[[a4,d5,f#5] [g#4,b4] [a4,c#5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,e5,g#5], ~ e5@2 [d5,f#5]@2 e5@2 [d5,f#5]@2 e5@2 [d5,f#5]@2 ~]/7", // D G#m A E F#m E F#m E …
  H: "[[c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,g#5] c#5 [f#4,d5]@2 [g#4,b4] c#5 [f#4,d5] [d5,f#5] [g#4,b4,e5], ~ [d5,f#5]@2 e5@2 [d5,f#5]@2 e5@2 ~@2 e5@2 ~@3, ~@8 a4@3 ~ a4@3 ~]/8", // F#m E F#m E D G#m D E …
  I: "[c#5 [f#4,d5,f#5] [d5,f#5] [b4,e5,g#5], a4@3 ~]/2", // D E
  J: "[[a4,d5,f#5]@3 [b4,g#5]@5 [c#5,a5]@4 b4@4 a4@4 [b4,e5,g#5]@4, ~@3 e5@9 [d5,f#5]@8 ~@4]/3", // D E F#m E D
  K: "[[c#5,a5]@3 b4@5 a4@4 [b4,e5,g#5]@4, f#5@3 ~, ~@3 d5@9 ~@4]/2", // F#m E
  L: "[[c#5,a5]@3 [a4,d5,f#5]@9 [g#4,b4]@4 [a4,c#5]@4 b4@4 a5@4 [b4,g#5]@4 [c#5,a5]@4 b4@4 a4@4 [b4,g#5]@4 [c#5,a5]@4 b4@4 a4@4 [b4,e5,g#5]@4, ~@3 e5@2 [d5,f#5]@2 e5@2 [d5,f#5]@2 e5@2 [d5,f#5]@2 ~]/8", // F#m D G#m A E F#m E F#m …
  M: "[[c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,e5,g#5], ~ [d5,f#5]@2 e5@2 [d5,f#5]@2 ~]/4", // F#m E F#m E D
  N: "[e6 ~ d6, a5, c#6@2 ~, ~ f#6@2]/3", O: "[b5,e6,g#6]",
  P: "[[c#5,e5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,e5,g#5], ~ [d5,f#5]@2 e5@2 [d5,f#5]@2 e5@2 [d5,f#5]@2 e5@2 [d5,f#5]@2 ~]/8", // A E F#m E F#m E F#m E …
  Q: "[[c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,e5,g#5], ~ [d5,f#5]@2 e5@2 [d5,f#5]@2 e5@2 [d5,f#5]@2 e5@2 [d5,f#5]@2 ~]/8", // F#m E F#m E F#m E F#m E …
  R: "[[c#5,a5] b4 a4 [b4,g#5] [c#5,a5] b4 a4 [b4,g#5] [c#5,a5]@2, ~ [d5,f#5]@2 e5@2 [d5,f#5]@2 e5@3]/5", // F#m E F#m E F#m D
})).s("gm_drawbar_organ").gain(0.3).pan(0.3)

// chords · bassoon
const bassoon = note(`<
  ~ A B C D ~@2 E F ~@2 G H ~@2 I J E H ~@8 K F ~@4 L M N O ~@3 P@2 Q R ~@7 A S ~@24
>`.pickRestart({
  A: "~@2 a4 b4 c#5@2 b4@2", B: "a4", C: "~@2 [c#5,e5] [b4,d5]", D: "[a4,c#5,e5]@3 ~", E: "[f#4,a4] [g#4,b4]",
  F: "e4 ~", G: "[f#4,a4]@3 [g#4,b4]@5", H: "[a4,c#5] ~", I: "[f#4,a4] [e4,g#4]", J: "c#5@3 f#4@5, a4", K: "~@2 c#5 b4",
  L: "~ b4", M: "a4@3 g#4@5", N: "a4@3 b4@5", O: "c#5 ~", P: "[a4@3 ~]/2", Q: "c#5 e5", R: "a4 g#4", S: "[e4,a4]",
})).s("gm_bassoon").gain(0.3)

// other · string ensemble 1
const string_ensemble_1 = note("<~@36 A@4 B@2 C ~@10 D E F G ~@11 H@4 I@4 C>".pickRestart({
  A: "[e6@19 d6@9 b5@4]/4", B: "[e6@5 d6 c#6 b5]/2", C: "a5", D: "~ c#4", E: "d4 f#3",
  F: "~@2 e4@2 f#4@2 g#4@2 a4@2 b4@2 a4 b4 c#5 d5, e3", G: "e5",
  H: "[~@2 e5@2 a5@6 d6@2 c#6@2 b5@3 ~ a4 e5@3 d5 e5@3 a5@2 b5@4]/4",
  I: "[~@2 e5@2 a5@6 d6@2 c#6@2 b5@3 ~ a4 e5@3 d5 e5@3 a5@2 c#6@2 b5@2]/4",
})).s("gm_string_ensemble_1").gain(0.25)

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~@11 A B ~@6 A B C B C B C B ~@8 A B ~@6 A B C B C B C B ~@13 D E F E D E G ~ D E F E G
>`.pickRestart({
  A: "~@14 e2 f#2", B: "a2@3 ~", C: "~@7 e2", D: "~ c#3@3", E: "~ d3 c#3 b2", F: "c#3@3 a2@3 e2@2 f#2@8", G: "a2",
})).s("gm_overdriven_guitar").gain(0.25).pan(0.7)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<~@30 A B C ~@23 D E D E D E D E ~@13>".pickRestart({
  A: "~@14 a3!2", B: "a4@2 a3 a4 f#4 e4 f#4 e4@5 [b4,g#5]@4", C: "[c#5,a5] ~",
  D: "[c#4,e4,a4]@2 [c#4,e4,a4]!2 [c#4,e4,a4]@2 [c#4,e4,a4]!2 [d4,f#4,b4]@2 [d4,f#4,b4]!2 [d4,f#4,b4]@2 [d4,f#4,b4]!2", // A Bm
  E: "[d4,f#4,a4]@2 [d4,f#4,a4]!2 [d4,f#4,a4]@2 [d4,f#4,a4]!2 [e4,g#4,b4]@2 [e4,g#4,b4]!2 [e4,g#4,b4]@2 [e4,g#4,b4]!2", // D E
})).s("gm_acoustic_guitar_steel").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@20 [x ~@2 x ~@6 x ~@5]!8 ~@16 [x ~@2 x ~@6 x ~@5]!8 ~@4 [x ~@2 x ~@6 x ~@5]!20 x>")
  .gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  ~@19 A B@2 C B@4 D ~@15 E B@2 C B@2 F B G ~@3 H B@2 C F B@2 C I B@2 C B@7 C B J
>`.pickRestart({
  A: "~@6 x!2", B: "~ x ~ x", C: "~@4 x ~@4 x ~@2 x ~ x!2", D: "~@4 x ~@4 x ~@2 x ~ x ~", E: "~@12 x!3 ~",
  F: "~@4 x ~@7 x ~ x!2", G: "~@4 x ~@4 x ~@2 x!4", H: "~@9 x!7", I: "~@4 x!2 ~@4 x ~ x ~ x!2", J: "x",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<[~@5 x ~@2]!20 ~@8 [~@5 x ~@2]!16 ~@33>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B C@3 B C@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B C@7 ~@4 C@8 B C@3 B C@7 ~
>`.pickRestart({
  A: "~@5 x ~@10", B: "~@2 x!3 ~ x!3 ~ x!3 ~ x!2", C: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2",
})).gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A B A B A B A B A B A B A B A B A B A C ~@8 A B A B A B A B A B A B A B A C ~@33
>`.pickRestart({
  A: "x ~@2 x!2 ~ x ~@5 x ~@3", B: "~@3 x!2 ~ x ~@5 x ~@3", C: "~@3 x!2 ~ x ~@9",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@20 A ~@3 A ~@19 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A>".pickRestart({
  A: "x",
})).gain(0.45)

// drums · tambourine
const tambourine = s("tb").struct("<~@12 A@8 B@8 ~@8 A@5 C@3 B@8 D@3 E B@20 ~>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2", D: "x!4", E: "x!3 ~",
})).gain(0.3)

// drums · triangle
const triangle = s("triangles:35").struct("<[x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!52 ~@4 [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!20 x>")
  .gain(1.3)

stack(
  bass, drawbar_organ, bassoon, string_ensemble_1, overdriven_guitar, acoustic_guitar_steel, kick, snare, low_tom,
  hihat, mid_tom, crash, tambourine, triangle
)