Strudelify

Midnight Special

Johnny Rivers

KeyF majorTempo150 bpm
0:00/0:00
// Midnight Special — Johnny Rivers
// 150 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(150/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 · "FingerE.Bass"
const bass = note(`<
  ~@2 A B C D E F C G A B C H E I C G A B C J E B C G K A C L M K C N A K O P E Q C N A K R S M K C N A K C T E K C G A
  B C J E U C G A K C V E W C G X@2
>`.pickRestart({
  A: "bb1@5 ~ bb1 ~ bb1@5 ~ bb1 ~", B: "bb1 ~ bb1@3 ~ bb1 ~ bb1 ~ bb1@2 f1@2 bb1@2", C: "f2@5 ~ f2 ~ f2@5 ~ f2 ~",
  D: "f2 ~ f2@3 ~ f2 ~ f2 ~ f2@2 c2@2 d2@2", E: "c2@5 ~ c2 ~ c2@5 ~ c2 ~", F: "bb1 ~ bb1@3 ~ bb1 ~ bb1@3 ~ f1@2 g2 ~",
  G: "f2@2 f2@2 d2@2 c2@2 g2 ~ f2@2 d2 ~ c2@2", H: "f2 ~ f2@3 ~ f2 ~ f2 ~ f2@2 c2@2 a1@2",
  I: "bb1 ~ bb1@3 ~ bb1 ~ bb1 ~ bb1@2 f1@2 bb2@2", J: "f2 ~ f2@3 ~ f2 ~ f2@3 ~ c2@2 a1 ~",
  K: "bb1 ~ bb1@3 ~ bb1 ~ bb1@3 ~ f1@2 bb1 ~", L: "f2 ~ f2@2 c2 ~ c2@2 g2 ~ f2@2 f2 ~ f2@2",
  M: "c2 ~ c2@3 ~ c2 ~ c2@3 ~ g1@2 c2 ~", N: "f2@3 ~@9 c2@4", O: "f2@5 ~ f2 ~ f2@5 ~ e2 ~",
  P: "f2@2 f2@2 d2@2 c2@2 g2 ~ f2@2 d2 ~ d2@2", Q: "bb1 ~ bb1@3 ~ bb1 ~ bb1@3 ~ f1@2 d2 ~",
  R: "f2@5 ~ f2 ~ f2@5 ~ a1 ~", S: "f2 ~ f2@3 ~ f2 ~ f2 ~ f2@2 c2@2 f1@2", T: "f2 ~ f2@3 ~ f2 ~ f2 ~ f2@2 c2@2 f2@2",
  U: "bb1 ~ bb1@3 ~ bb1 ~ bb1 ~ bb1@2 f1@2 g2@2", V: "f2 ~ f2@3 ~ f2 ~ f2@3 ~ c2@2 c2 ~",
  W: "bb1 ~ bb1@3 ~ bb1 ~ bb1 ~ bb1@2 f1@2 eb2@2", X: "f2/2",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · piano · "Bright Aco Piano"
const piano = note(`<
  ~@2 A@2 B C D E F G H I B C J I F G K@2 L M N H O@2 P@2 Q@2 R S T U P@2 V@2 R W T U P@2 X@2 Y W Z AA E AB B C AC I
  AD@2 H I B C D H AE@2 H I O@2 N E L@2 AF@2
>`.pickRestart({
  A: "[~@20 [ab3,d4]@7 ~ d4@2 c4@2, f3, ~@2 ab3@17 ~@9 ab3@4, ~@4 d4@15 ~@13, ~@3 f4@13]/2", // Abdim
  B: "[c4,f4]@3 ~ [c4,f4]@7 ~ [c4,f4]@4, a4", C: "~@3 c5@5, c4, ~ f4@7, ~ a4@3",
  D: "[g3,bb3]@3 ~ [g3,bb3]@7 ~ [g3,bb3]@4, e4", E: "[f3,ab3]@3 ~ [f3,ab3]@7 ~ [f3,ab3]@4, d4",
  F: "[c4,eb4]@3 ~ [c4,eb4]@7 ~ [c4,eb4]@4, a4", G: "~@3 c5@5, c4, ~ eb4@7, ~ a4@3",
  H: "[ab3,d4]@3 ~ [ab3,d4]@7 ~ d4@2 c4@2, [f3,f4], ~@3 ab3", I: "~ [f3,ab3]@3, d4", J: "~ [g3,bb3]@3, e4",
  K: "[~@4 [f3,ab3]@15 ~ [f3,ab3]@7 ~ [f3,ab3]@4, d4]/2", L: "[f4,a4]@3 ~ [f4,a4]@7 ~ a4@2 g4@2, [c4,c5], ~@3 f4",
  M: "~ [c4,f4]@3, a4", N: "[c4,e4]@3 ~ [c4,e4]@7 ~ e4@2 d4@2, [g3,g4], ~@3 c4",
  O: "[~@20 [f4,a4]@7 ~ a4@2 g4@2, c4, ~@2 f4@17 ~@9 f4@4, ~@4 a4@15 ~@13, ~@3 c5@13]/2", // F
  P: "[[ab3,d4]@18 ~@6 c4@3 ~ [c4,f4]@2 ab3@2, f4@5 d4 ~@2, c4 ~@17 ab3@10 ~@4, ~@11 f4@3 ~@2]/2", // Abdim F5
  Q: "[[f4,a4]@18 ~@6 g4@3 ~ [g4,c5]@2 f4@2, c5@5 a4 ~@2, g4 ~@17 f4@10 ~@4, ~@11 c5@3 ~@2]/2", // F C5
  R: "[bb3,e4,g4], d4 ~@15", S: "[d4,f4]@2 [d4,f4]@4 ~@2 [c4,f4]@3 ~ [c4,f4]@2 ab3@2, ab3@5 ~ ab3@6 ~@4",
  T: "[eb4,a4,c5]", U: "[c4,eb4,a4]@2 g4 [eb4,f4] [bb3,c4,d4] [g3,a3] f3 ~@9",
  V: "[[a4,c5]@18 [a4,c5]@4 ~@2 [g4,c5]@3 ~ [g4,c5]@2 f4@2, f4@21 ~ f4@6 ~@4, g4 ~@31]/2", // Am C5
  W: "[ab3,d4,f4]@4 f4@2 ~@6 c4@3 ~, ~@4 c5@11 ~, ~@6 ab4@9 ~, ~@8 f4@7 ~", // Ddim
  X: "[[f4,a4,c5]@20 c5@2 ~@6 g4@3 ~, g4 ~@19 g5@11 ~, ~@22 f5@9 ~, ~@24 c5@7 ~]/2", Y: "[c4,e4,g4], d4 ~@15",
  Z: "[f4,a4,c5]", AA: "[c4,f4,a4]@2 g4 f4 [bb3,c4,d4] [g3,a3] f3 ~@9", AB: "~@3 f4@5, f3, ~ ab3@7, ~ d4@3",
  AC: "[bb3,e4]@3 ~ [bb3,e4]@7 ~ e4@2 d4@2, [g3,g4], ~@3 bb3", AD: "[~@4 [c4,eb4]@15 ~ [c4,eb4]@7 ~ [c4,eb4]@4, a4]/2",
  AE: "[~@20 [eb4,a4]@7 ~ a4@2 g4@2, c4, ~@2 eb4@17 ~@9 eb4@4, ~@4 a4@15 ~@13, ~@3 c5@13]/2", // Ebdim
  AF: "[~@3 c5@13, c4, ~ eb4@15, ~ a4@7]/2",
})).s("gm_piano").gain(0.36).pan(0.4)

// chords · acoustic guitar steel · "SteelStrGuitar"
const acoustic_guitar_steel = note(`<
  ~@2 A B C D E B F G A B C D E B F G A B C D H B C D I@2 J K L M N O I@2 P@2 Q R N O S R T@2 U R J V A B C D E B F G A
  B C D E B F G A B C D H B C D W@2
>`.pickRestart({
  A: "[d4,f4]!3 [ab3,d4,f4] f4!2 [d4,f4] [ab3,d4,f4], ab3@3 ~ ab3@3 ~, ~@2 d4 ~", // Dm Ddim Dm Ddim
  B: "[d4,f4]!3 [ab3,d4,f4] [d4,f4]!4, ab3@3 ~ ab3@2 ab3@2", // Dm Ddim Dm
  C: "[a4,c5]!3 [f4,a4,c5] c5!2 [a4,c5] [f4,a4,c5], f4@3 ~ f4@3 ~, ~@2 a4 ~", // Am F Am F
  D: "[a4,c5]!3 a4!2 [a4,c5]!3, f4@3 f4@3 f4@2, ~@3 c5@2 ~@3", // Am
  E: "[e4,g4]!3 [bb3,e4,g4] g4!2 [e4,g4] [bb3,e4,g4], bb3@3 ~ bb3@3 ~, ~@2 e4 ~", // Em Edim Em Edim
  F: "[a4,c5]!3 [eb4,a4,c5] c5!2 [a4,c5] [eb4,a4,c5], eb4@3 ~ eb4@3 ~, ~@2 a4 ~", // Am Adim Am Adim
  G: "[a4,c5]!3 a4!2 [a4,c5]!3, eb4@3 eb4@3 eb4@2, ~@3 c5@2 ~@3", // Am
  H: "[e4,g4]!3 [c4,e4,g4] g4!2 [e4,g4] [c4,e4,g4], c4@3 ~ c4@3 ~, ~@2 e4 ~", // Em C Em C
  I: "[~@7 c4@9, ~ d4@5 d4@10, ~@2 f4@3 f4@11, ~@3 ab4@13]/2", J: "~@3 f5@5, ~ a4@7, ~ c5@3",
  K: "[a4,c5]@2 [a4,c5]@2 [a4,c5]@2 a4@2 a4@2 [a4,c5]@2 [a4,c5]@2 ~ c5, f4@3 f4@3 f4@2, ~@3 c5@2 ~@2 [a4,c5]", // Am
  L: "~@7 d4, ~ e4@5 e4@2, ~@2 g4@3 g4@3, ~@3 bb4@5", M: "[d4,f4,ab4]", N: "~@3 eb5@5, ~ a4@7, ~ c5@3",
  O: "[eb4,a4,c5] ~@7", P: "[~@6 f5@25 ~, ~@2 a4@29 ~, ~@4 c5@27 ~]/2", Q: "~@3 bb4@5, ~ e4@7, ~ g4@3",
  R: "[d4,f4]@2 [d4,f4]@2 [d4,f4]@2 d4@2 d4@2 [d4,f4]@2 [d4,f4]@2 ~ f4, ab3@3 ab3@3 ab3@2, ~@3 f4@2 ~@2 [d4,f4]", // Dm
  S: "~@3 ab4@5, ~ d4@7, ~ f4@3", T: "[~@7 g4@9, ~ a4@5 a4@10, ~@2 c5@3 c5@11, ~@3 f5@13]/2",
  U: "~@3 c5@5, ~ e4@7, ~ g4@3", V: "[f4,a4,c5] ~@7", W: "[eb4,a4,c5]/2",
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.6)

// chords · overdriven guitar · "OvrdrivGuit"
const overdriven_guitar = note(`<
  ~@2 A@2 B@2 C D E@2 A@2 B@2 C A E@2 A@2 B@2 F A B@2 G@2 H@2 I J K L G@2 H@2 I J K L G@2 H@2 M J N O D@2 B@2 C A E@2
  D@2 B@2 C A E@2 A@2 B@2 F A B@2 P@2
>`.pickRestart({
  A: "bb2 ~ [d4,f4,ab4,bb4]!2 f2 ~ [d4,f4,ab4,bb4]!2, ~@2 bb2@5 ~@3 f2@5 ~", // Bb7
  B: "f3 ~ [a3,c4,f4]!2 c3 ~ [a3,c4,f4]!2, ~@2 f3@5 ~@3 c3@5 ~", // F
  C: "c3 ~ [bb3,c4,e4,g4]!2 g2 ~ [bb3,c4,e4,g4]!2, ~@2 c3@5 ~@3 g2@5 ~", // C7
  D: "bb2 ~ [ab3,bb3,d4,f4]!2 f2 ~ [ab3,bb3,d4,f4]!2, ~@2 bb2@5 ~@3 f2@5 ~", // Bb7
  E: "f3 ~ [c4,eb4,f4,a4]!2 c3 ~ [c4,eb4,f4,a4]!2, ~@2 f3@5 ~@3 c3@5 ~", // F7
  F: "c3 ~ [g3,c4,e4]!2 g2 ~ [g3,c4,e4]!2, ~@2 c3@5 ~@3 g2@5 ~", // C
  G: "[~@4 [ab3,d4] ~@5 [ab3,d4] ~@3 [ab3,d4]@17 ~, bb2@15 ~]/2", // Abdim
  H: "[~@4 [f4,a4] ~@5 [f4,a4] ~@3 [f4,a4]@8 ~@2 [f4,a4]@8, f3@21 ~ f3@9 ~]/2", // F
  I: "~@4 [bb3,e4] ~@5 [bb3,e4] ~@3 [bb3,e4]@2, c3", J: "[ab3,d4], bb2@7 ~",
  K: "~@4 [eb4,a4] ~@5 [eb4,a4] ~@3 [eb4,a4]@2, f3", L: "[f3,c4,eb4]@3 ~@13",
  M: "~@4 [c4,e4] ~@5 [c4,e4] ~@3 [c4,e4]@2, c3", N: "~@4 [f4,a4] ~@5 [f4,a4] ~@3 [f4,a4]@2, f3",
  O: "[f3,c4,f4]@3 ~@13", P: "[f3,c4,eb4,f4,a4]/2",
})).s("gm_overdriven_guitar").gain(0.32).pan(0.7)

// chords · overdriven guitar · "Melody (OvrdriveGuitar)"
const overdriven_guitar_2 = note(`<
  ~ A B C D E F G H I J G H K@2 L@2 M N O@2 P Q R S ~@24 T B C D E F G H I J G H K@2 L@2 M N O@2 P Q R S T ~@2
>`.pickRestart({
  A: "~@2 [b3,ab4] ~ [b3,ab4] ~ [b3,ab4] ~ [b3,ab4] ~ f4 ~ [g4,ab4] ~ d4 ~", B: "[ab3,f4]@3 [ab3,f4]@4 ~",
  C: "~@2 [b3,ab4] ~ [b3,ab4] ~ f4 ~ [b3,ab4] ~ f4 ~ [bb3,g4]@2 ~ d4", D: "ab3 a3@5 [a3,f4] ~@9, f4@3 ~@5",
  E: "~@2 c4 ~ c4 ~ c4 ~ c4 ~ c4 ~ c4 ~ c4 ~", F: "eb4 e4@4 ~ [bb3,d4,g4]@9 ~, [c4,a4]@5 ~@11",
  G: "~@2 f4 ~ [b3,ab4]@2 f4 ~ [b3,ab4]@2 f4 ~ [bb3,g4]@2 d4 ~", H: "[a3,f4]@5 ~ [a3,f4] ~@9, ab3 ~@15",
  I: "~@2 [c4,a4] ~ [c4,a4] ~ [c4,a4] ~ [c4,a4] ~ [c4,a4] ~ [bb3,g4] ~ [bb3,g4] ~", J: "[ab3,f4]@5 ~ [ab3,f4]@2 ~@8",
  K: "[~@2 c4 ~ c4 ~ c4@3 ~ c4@3 ~@2 e4@2 ~ [b3,eb4,ab4]@3 ~ [bb3,d4,g4]@10, ~@7 [c4,eb4,a4] ~@8]/2", // Abm Gm Adim
  L: "[~@2 f4 ~ [b3,ab4]@2 f4 ~ [b3,ab4] ~ [bb3,g4]@2 ~@2 ab3 a3@10 ~@7, ~@7 f4@5 ~@4]/2", // E Eb
  M: "~@2 [b3,ab4] ~ [b3,ab4] ~ [b3,ab4] ~ [b3,ab4] ~ f4 ~ g4 ~@2 d4", N: "[ab3,f4]@5 ~ [ab3,f4]@6 ~@4",
  O: "[~@2 f4 ~ [b3,ab4]@2 f4 ~ [b3,ab4] ~ [bb3,g4]@3 ~ ab3 a3@14 ~@3, ~@7 f4@7 ~@2]/2", // E Eb
  P: "~@2 c4 ~ c4 ~ c4@3 ~ c4@3 ~@2 e4, ~@7 [c4,eb4,a4]", Q: "~@2 [b3,eb4,ab4] ~ [bb3,d4,g4]@12",
  R: "~@2 f4 ~ [b3,ab4]@2 f4 ~ [b3,ab4]@2 f4 ~ [b3,ab4]@2 f4 ~", S: "c5@2 ~@2 g4@2 f4@9 ~, ~@3 ab4@2 ~@11",
  T: "~@2 [b3,ab4] ~ [b3,ab4] ~ ab4 ~ [b3,ab4]@2 f4 ~ g4 ~ d4 ~", // E
})).s("gm_overdriven_guitar").gain(0.38).pan(0.7)

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

// drums · rim
const rim = s("rim").struct("<A B ~@24 C D E D F G H ~ H G ~ I ~ J ~ K L M N ~ C O E P ~@26>".pickRestart({
  A: "x!2", B: "x!4", C: "~@2 x ~@2 x ~@2", D: "~@5 x ~ x", E: "~ x ~@2", F: "~ x ~@6", G: "~@2 x ~@4 x",
  H: "~ x!2 ~@5", I: "~@5 x ~@2", J: "~@7 x", K: "~@2 x!2 ~@4", L: "~ x!2 ~@2 x ~@2", M: "~ x!2 ~@4 x",
  N: "~ x ~@3 x ~@2", O: "~ x ~@5 x", P: "~@3 x ~@4",
})).gain(0.54)

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

// drums · low tom
const low_tom = s("lt").struct("<~@9 A ~@7 A ~@7 A ~@7 B ~@7 B ~@7 B ~@7 A ~@7 A ~@7 A ~@2>".pickRestart({
  A: "~@7 x", B: "~@6 x!2",
})).gain(0.54)

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A ~ A ~@7 A ~@3 B ~@2 C A ~@3 B ~@11 D ~@7 D ~@6 A@2 C ~@3 C ~ A@2 ~@5 C A@2 ~@2 C ~ C E
>`.pickRestart({
  A: "~@3 x", B: "~ x ~@6", C: "x", D: "~@6 x!2", E: "~ x",
})).gain(0.54)

// drums · high tom
const high_tom = s("ht").struct("<~@2 A@7 B A@7 C A@7 C A@7 D A@7 E A@7 F A@7 G A@7 B A@7 B H ~>".pickRestart({
  A: "~ x ~ x", B: "~ x!3 ~@2 x ~", C: "~ x!3", D: "~@2 x!2", E: "~@4 x!3 ~", F: "~@6 x!3 ~@3 x ~@3",
  G: "~ x!3 ~ x!2 ~", H: "x",
})).gain(0.42)

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~@6 B A ~@7 A ~@7 A ~@6 A@2 ~@6 A@2 ~@6 A@2 ~@6 B A ~@6 B A ~@6 B A ~
>`.pickRestart({
  A: "x", B: "~ x ~ x ~ x ~@2",
})).gain(0.54)

// drums · ride
const ride = s("rd").struct("<~@26 [x!3 ~ x!3 ~]!7 x [x!3 ~ x!3 ~]!7 x [x!3 ~ x!3 ~]!7 x ~@26>").gain(0.42)

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

// drums · congas
const congas = s("conga:13").struct("<~@26 A B C B D C E F E G H B H I H J ~ E K I A L C E ~@26>".pickRestart({
  A: "~ x ~@6", B: "~ x!3 ~@4", C: "~ x ~@3 x ~@2", D: "~@2 x ~@2 x ~@2", E: "~@5 x ~@2", F: "~@4 x!4 ~@2 x ~@5",
  G: "~ x ~ x ~ x ~@2", H: "~ x!2 ~@2 x ~@2", I: "~ x!3 ~ x ~@2", J: "~@5 x ~ x ~@2 x ~@5", K: "~ x ~@2",
  L: "~@2 x!2 ~ x ~@2",
})).gain(1.73)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@26
  [~@6 x!2]!7
  [~@4 x ~ x!2]
  [~@6 x!2]!7
  [~@4 x ~ x!2]
  [~@6 x!2]!7
  [~@4 x ~ x!2]
  ~@26
>`).gain(1.73)

// drums · cabasa
// … 6 more lines

More by Johnny Rivers