Strudelify

This Flight Tonight

Nazareth

KeyG majorTempo135 bpm
0:00/0:00
// This Flight Tonight — Nazareth
// 135 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 7 electric guitar muted (copy of ch 9 overdriven guitar); ch 11 distortion guitar (copy of ch 8 overdriven guitar)
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(135/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 · fretless bass
const bass = note(`<
  A@3 B C D@3 E F@3 G D@5 E F@3 G D@5 E F@3 G D@5 E F@3 G D@7 H I J D@17 K L D@4 M N O P D Q D@4 R@4 D@8 S T D@2 S T U@2
>`.pickRestart({
  A: "g1 ~ g1!3 ~ g1!3 ~ g1!3 ~ g1!2", B: "g1 ~ g1!3 ~ g1!2 g1@2 g1!2 g1@2 g1!2", C: "g1@4 f1@3 ~ g1@2 g1!2 g1@2 g1!2",
  D: "g1@2 g1!2 g1@2 g1!2 g1@2 g1!2 g1@2 g1!2", E: "g1@2 g1!2 g1@2 g1!2 a#1 b1 c2 ~ c2@2 c2!2",
  F: "c2@2 c2!2 c2@2 g1!2 a#1 b1 c2 ~ c2@2 c2!2", G: "c2@2 c2!2 c2@2 g1!2 g1@2 g1!2 g1@2 g1!2",
  H: "g1@2 g1!2 g1@2 g1!2 f1@2 f1!2 f1@2 f1!2", I: "f1@2 f1!2 f1@2 f1!2 c2@2 c2!2 c2@2 c2!2",
  J: "c2@2 c2!2 c2@2 c2!2 g1@2 g1!2 g1@2 g1!2", K: "g1@2 g1!2 g1@2 g1!2 g1@4 f1@3 ~", L: "g1 ~@3",
  M: "c2 c3 [e2,f#2] c3 g2 c3 [f2,g#2] e2", N: "c2 c3 e2 c3 f2 c3 f#2 g2", O: "c2 c3 e2 c3 g2 c3 f2 e2",
  P: "c3!2 a2!2 g2!2 e2 g2", Q: "g1 ~ g1!2 g1@2 g1!2 g1@2 g1!2 g1@2 g1!2",
  R: "a#1 b1 c2 ~ c2@2 c2!2 c2@2 c2!2 c2@2 g1!2", S: "f1@2 f1!2 f1@2 f1!2 f1@2 f1!2 f1@2 f1!2",
  T: "c2@2 c2!2 c2@2 c2!2 c2@2 c2!2 c2@2 c2!2", U: "g1/2",
})).s("gm_fretless_bass").gain(0.45)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~ A@4 ~@19 B@8 ~@2 C@4 D@4 E@6 ~@2 F ~@4 G@5 H@4 I@7 ~ J@8 ~@2 K@4 ~@4 L@5 ~@9 M@2
>`.pickRestart({
  A: "[~@4 [d3,g5]@47 ~@13]/4", B: "[~@12 [d3,g5]@47 ~@69, ~@3 g4@29]/8", C: "[~@3 g4@7 f4@6, ~@12 [d3,g5]@47 ~@5]/4",
  D: "[~@5 c5@3, ~ e4@7]/4", E: "[~@3 g4@2 g4@16 ~@3, ~@12 [d3,g5]@47 ~@37]/6", F: "~@6 [g2,d3]!2 ~@8",
  G: "[g4@6 a4 d4@3]/5", H: "[d3 ~@3 a4 d4@3, ~ g3@7]/4",
  I: "[~@28 c3@4 c3@8 g3@20 a3@12 g3@4 d3@29 ~@7, ~@8 c3@19 ~@85, ~@16 g4@35 ~@61]/7",
  J: "[~@4 [d3,g5]@47 ~@77, ~ g4@31]/8", K: "[~@4 [d3,g5]@47 ~@13, ~ g4@7 ~@8]/4", L: "[~@3 g4@16 ~]/5",
  M: "[[d3,g5]@7 ~]/2", // G5
})).s("gm_overdriven_guitar").gain(0.5)

// chords · overdriven guitar · soft notes
const overdriven_guitar_soft = note("<~@43 A ~@11 B ~@28 C@2 ~@4 D ~@15>".pickRestart({
  A: "~@4 d4 ~@11", B: "d4 ~@15", C: "f4/2", D: "~@12 d4 ~@3",
})).s("gm_overdriven_guitar").gain(0.07)

// chords · overdriven guitar
const overdriven_guitar_2 = note(`<
  A@4 B A@3 C D@3 E A@5 C D@3 E A@5 C D@3 E A@5 C D@3 E A@7 F G H ~ I A@15 J K A@4 ~@4 D A@5 D@4 A@8 L D ~ M L D ~@2
>`.pickRestart({
  A: "[g2,d3] ~ [g2,d3]!3 ~ [g2,d3]!3 ~ [g2,d3]!3 ~ [g2,d3]!2", B: "~@8 [g2,d3] ~ [g2,d3]!3 ~ [g2,d3]!2",
  C: "[g2,d3] ~ [g2,d3]!3 ~ [g2,d3]!2 [c3,g3] ~ [c3,g3]!3 ~ [c3,g3]!2", // G5 C5
  D: "[c3,g3] ~ [c3,g3]!3 ~ [c3,g3]!3 ~ [c3,g3]!3 ~ [c3,g3]!2", // C5
  E: "[c3,g3] ~ [c3,g3]!3 ~ [c3,g3]!2 [g2,d3] ~ [g2,d3]!3 ~ [g2,d3]!2", // C5 G5
  F: "[g2,d3] ~ [g2,d3]!3 ~ [g2,d3]!2 [f2,c3] ~ [f2,c3]!3 ~ [f2,c3]!2", // G5 F5
  G: "[f2,c3] ~ [f2,c3]!3 ~ [f2,c3]!2 [c3,g3] ~ [c3,g3]!3 ~ [c3,g3]!2", H: "[c3,g3] ~ [c3,g3]!3 ~ [c3,g3]!2 ~@8",
  I: "~@6 [g3,d4]!2 [g2,d3] ~ [g2,d3]!3 ~ [g2,d3]!2", J: "[g2,d3] ~ [g2,d3]!3 ~ [g2,d3]!2 ~@8",
  K: "~@4 [g2,g3,d4]@8 [d3,e3,f3] [a2,b2,c3] ~@2", L: "[f2,c3] ~ [f2,c3]!3 ~ [f2,c3]!3 ~ [f2,c3]!3 ~ [f2,c3]!2",
  M: "~@14 [g3,d4]!2", // G5
})).s("gm_overdriven_guitar").gain(0.28)

// chords · overdriven guitar
const overdriven_guitar_3 = note(`<
  ~@3 A B@4 C D E@2 ~@6 C D E@2 F@5 ~ C D E@2 G@5 ~ C D E@2 H@6 I@7 ~@15 J K@3 ~@2 L M N O P@5 Q R S T U V@6 W X Y Z
  AA@2 Y Z AB@2
>`.pickRestart({
  A: "~@11 d3 [a2,b2,c3] [e2,f2,g2] [a1,b1,c2] [e1,f#1,g1]", B: "[[d3,g3] [c3,f3] [g3,d4]@12 ~@2, f1 ~@63]/4",
  C: "~@6 e3!3 f3 g3 ~@5", D: "~@6 e3!3 ~ g3@2 ~@4", E: "~@6 e3!3 f3 g3@2 ~@4",
  F: "[~@3 d3 a2 [e2,f2,g2] [a1,b1,c2] [e1,f#1,g1] f1 ~@3 [g3,d4,d5]@64 ~@4, ~ g2@8 ~]/5", // Em Am Em G5
  G: "[~@3 d3 [a2,b2,c3] [e2,f2,g2] [a1,b1,c2] [e1,f#1,g1] f1 ~@3 [g3,d4,d5]@64 ~@4, ~ g2@8 ~]/5", // Am Em Am Em G5
  H: "[~@3 d3 [a2,b2,c3] [e2,f2,g2] [a1,b1,c2] [e1,f#1,g1] f1 ~@3 [g3,d4]@28 [g2,g3,b3,d4]@16 [g2,g3,c4,d4]@16 [g2,b3]@24, ~@2 g2@8 ~@8 [g3,d4] ~@5, ~@3 d5@16 ~@5]/6", // Am Em Am Em G5 G Gsus4 G …
  I: "[~@8 [g2,g3,b3,d4]@16 [g2,g3,c4,d4]@16 [f2,a3,c4,f4]@16 [c3,g3,c4,e4]@16 [g3,d4,g4]@31 ~@9]/7", // G Gsus4 F C G5
  J: "~@2 [d3,g3] [c3,f3]", K: "[g3,d4]/3", L: "[c3,g3] ~ c3 ~ [c3,a3] ~ c3 ~ [c3,g3] ~@3 [c3,a3] ~ [c3,g3] ~",
  M: "~@2 [c3,g3] ~ [c3,a3] ~@3 [c3,g3] ~@3 [c3,a3]@2 ~@2", // C5 F C5 F
  N: "[c3,g3] ~@3 [c3,a3] ~@3 [c3,g3] ~@3 [c3,a3]@2 [c3,a#3]@2", // C5 F C5 F C7
  O: "~@2 [c3,a#3]@2 [c3,a3] ~@3 [c3,g3] ~@3 [c3,a3]@2 ~@2", P: "[~ [g3,d4,d5]@16 ~@3, g2@4 ~]/5", Q: "~@14 e3!2",
  R: "e3 f3 g3 ~@11 e3!2", S: "e3 ~ g3@2 ~@10 e3!2", T: "e3 f3 g3@2 ~@10 e3!2",
  U: "e3 f3 g3@2 ~@7 d3 [a2,b2,c3] [e2,f2,g2] [a1,b1,c2] [e1,f#1,g1]", // Am Em Am Em
  V: "[f1 ~@3 [g3,d4]@28 [g2,g3,b3,d4]@16 [g2,g3,c4,d4]@16 [g2,b3]@32, g2@8 ~@8 [g3,d4] ~@7, ~ d5@16 ~@7]/6", // G5 G Gsus4 G G5
  W: "[g2,g3,b3,d4]", X: "[g2,g3,c4,d4]", Y: "[f2,a3,c4,f4]", Z: "[c3,g3,c4,e4]", AA: "[[g3,d4,g4]@31 ~]/2",
  AB: "[[g3,d4]@27 ~@5]/2", // G5
})).s("gm_overdriven_guitar").gain(0.48)

// chords · overdriven guitar · soft notes
const overdriven_guitar_soft_2 = note(`<
  ~@8 A B C B ~@6 A B C B ~@6 A B C B ~@6 A B C B ~@36 D ~@7 E F G F ~@14 H@2
>`.pickRestart({
  A: "~@10 f#3 ~@5", B: "~@9 f#3 ~@6", C: "~@5 f#3 ~@2", D: "~@2 g3 ~@13", E: "~@2 f#3 ~@13", F: "~ f#3 ~@14",
  G: "~ f#3 ~@6", H: "[g4@27 ~@5]/2",
})).s("gm_overdriven_guitar").gain(0.24)

// drums · kick
const kick = s("bd").struct("<A@4 B ~@39 C B@9 A C@16 ~ A@32 B ~>".pickRestart({
  A: "x!2", B: "x", C: "~ x",
})).gain(0.39)

// drums · snare
const snare = s("sd").struct("<A@4 B ~@50 C@15 D C A@3 E A@3 E A@21 F A G ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x!2 ~", C: "x", D: "x ~@2 x", E: "~@2 x ~@2 x!3", F: "~@4 x ~@5 x!3 ~ x ~",
  G: "~@4 x ~@7 x!2 ~@2",
})).gain(0.44)

// drums · open hat
const open_hat = s("oh").struct(`<
  A B@2 C ~@40 D E@3 F E F@3 E F E@15 G ~ E@3 H I J@3 K E@5 K E@3 K E L E K E K E K@3 M K@2 N ~
>`.pickRestart({
  A: "~@2 x ~@2 x!4 ~ x ~@2 x!3", B: "x ~ x ~@2 x!4 ~ x ~@2 x!3", C: "x ~ x ~@2 x!4 ~ x ~@5", D: "~@10 x!3 ~ x!2",
  E: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", F: "x ~ x!3 ~ x!2 ~@2 x!3 ~ x!2", G: "x ~ x!3 ~ x!2 ~@8", H: "x ~ x!3 ~ x!3 ~@7",
  I: "~ x!7", J: "x!8", K: "~@2 x!3 ~ x!3 ~ x!3 ~ x!2", L: "~@2 x!3 ~@2 x!2 ~ x!3 ~ x!2",
  M: "x ~ x!3 ~ x!3 ~ x!3 ~@2 x", N: "x",
})).gain(0.22)

// drums · crash
const crash = s("cr").struct(`<
  A ~@3 B ~@39 C ~@3 C ~ C@3 ~ D ~@15 E A ~@4 A ~@3 A ~@5 A ~@3 A ~ F ~ A ~ A ~ A@3 G A@3 ~
>`.pickRestart({
  A: "x", B: "x!3 ~", C: "~ x", D: "~@4 x!2 ~@2", E: "~@2 x!2", F: "x ~@2 x ~@4", G: "~@7 x",
})).gain(0.22)

// drums · tambourine
const tambourine = s("tb").struct("<~@45 A B@2 A@2 B@4 C D@15 E ~ F@3 G ~@4 F@21 G F@2 H ~>".pickRestart({
  A: "x!2 ~@14", B: "x!2 ~@13 x", C: "x!2 ~@6 x ~ x!6", D: "x!2 ~ x!6 ~ x!6", E: "x!2 ~ x!5 ~@8", F: "x ~ x!8 ~ x!5",
  G: "x ~ x!7 ~@7", H: "x",
})).gain(0.18)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@44 A B C@2 B@2 C@4 D@16 C ~ E@3 F ~@4 E@21 F E@2 ~@2>".pickRestart({
  A: "~@15 x", B: "~@2 x ~@12 x", C: "~ x ~@6", D: "~@2 x ~@6 x ~@6", E: "~ x ~@8 x ~@5", F: "~ x ~@14",
})).gain(0.13)

stack(
  bass, overdriven_guitar, overdriven_guitar_soft, overdriven_guitar_2, overdriven_guitar_3, overdriven_guitar_soft_2,
  kick, snare, open_hat, crash, tambourine, tambourine_soft
)

More by Nazareth