Strudelify

Halfway to the Hudson

Lucky ChopsArrgt: G.Moutchatchou

KeyE majorTempo120 bpm
0:00/0:00
// Halfway to the Hudson — Lucky ChopsArrgt: G.Moutchatchou
// 120 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5858522; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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.

// other · trumpet · "Trompette en Si♭"
const trumpet = note(`<
  ~@21 A ~@3 A ~@19 B C D E@2 F G E@2 H ~@16 D E@2 F G E@2 H D I@2 J D I@2 K ~@10 A ~@3 L M D E@2 F G E@2 H D I@2 J D
  I@2 N
>`.pickRestart({
  A: "~@7 d4", B: "a4@2 a4@2 a4!2 ~ b4", C: "~ b4!3 b4@2 ~@2", D: "~ d5!4 ~ d5!2",
  E: "[d5 c#5!3 ~@3 c#5@2 b4!2 a4!2 f#4!3]/2", F: "a4 b4 ~ b4 ~@2 b4 c#5", G: "d5!5 ~ d5!2", H: "a4 b4 ~ b4 ~@4",
  I: "d5 c#5 a4!2 ~@3 d5", J: "d5@2 c#5@2 b4@2 b4@2 ~@2 c#5 ~@3 d5 ~", K: "d5 c#5 b4!2 ~@4",
  L: "c#5@2 ~@2 c#5@2 ~@2 c#5 ~ c#5@2 ~@2 d5@2", M: "~@2 d5 ~ d5@2 ~@2 d5@4 ~@4", N: "d5 c#5 b4!2 ~ c#5 ~ d5",
})).s("gm_trumpet").gain(0.5)

// other · trumpet · "Trompette en Si♭" · soft notes
const trumpet_soft = note("<~@19 A B C D E B C D ~@12 F G H I F G ~@23 J@3 ~@24 A B C D E B ~@18>".pickRestart({
  A: "f#4", B: "e4", C: "c#4@2 ~@2 c#4@2 ~@2 c#4 ~ e4@2 ~@4", D: "~@2 d4 ~ d4@2 ~@2 d4@4 ~@4", E: "f#4@6 a4 ~",
  F: "f#4!4 f#4@2 f#4!2", G: "f#4 e4!2 e4@4 ~", H: "c#4", I: "d4", J: "f#4/3",
})).s("gm_trumpet").gain(0.3)

// other · baritone sax · "Saxophone Baryton"
const baritone_sax = note(`<
  ~ A@3 B C D A B C D E F G H E F G H ~@2 I J ~@2 I J K@3 L ~@12 M N O P A B C D A B C D ~@16 A B C D A B C D A B C D A
  B C D ~@12 M N O Q A B C D A B C D A B C D A B C R
>`.pickRestart({
  A: "b2 ~ b2 ~ b2 ~ b2 ~", B: "a2 ~ a2 ~ a2 ~ a2 ~", C: "f#2 ~ f#2 ~ f#2 ~ f#2 ~", D: "g2 ~ g2 ~ g2 ~ g2 ~",
  E: "b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2@2", F: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2@2",
  G: "f#2 ~ f#2@3 ~ f#2@2 f#2@2 f#2!2 ~ f#2 a2!2", H: "g2@2 g2@4 g2@2 g2!2 g2@2 a2!2 a2@2",
  I: "~@2 f#2 f#2@2 f#2 f#2@2 ~@2 f#2 f#2@2 f#2 f#2@2", J: "~@2 g2 g2@2 g2 g2@2 ~@2 g2 g2@2 g2 a2@2",
  K: "~@2 a2@2 ~@2 a2@2 a2@2 a2 b2 c#3 d3 f#3 f#2", L: "~ a2 ~ a2!2 ~@3", M: "b2", N: "a2", O: "f#3 ~ f#3 ~ f#3!2 ~ g3",
  P: "~ g3!4 ~@3", Q: "~ g3!4 f#2 a2 b2", R: "g2 ~ g2 ~@2 e3 ~ f#3",
})).s("gm_baritone_sax").gain(0.4)

// other · trombone
const trombone = note(`<
  ~@19 A B C D E B C D ~@3 F G H@2 I J K@2 I G H@2 I J K@2 L M N@2 O P N@2 Q ~@16 M N@2 O P N@2 Q M R@2 S M R@2 T ~@8 A
  B C D E B U D M N@2 O P N@2 Q M R@2 S M R@2 V
>`.pickRestart({
  A: "d4", B: "c#4", C: "a3@2 ~@2 a3@2 ~@2 a3 ~ c#4@2 ~@2 b3@2", D: "~@2 b3 ~ b3@2 ~@2 b3@4 ~@4", E: "d4@6 a4 ~",
  F: "~@6 b3 c#4", G: "d4!4 d4@2 d4!2", H: "[d4 c#4!2 c#4@4 c#4@2 b3!2 a3!2 f#3!3]/2", I: "a3 b3@2 b3@3 b3 c#4",
  J: "d4!4 d4@2 d4 e4", K: "[d4 c#4 b3 c#4@4 c#4@2 b3!2 a3!2 f#3!3]/2", L: "a3 b3@2 b3@3 ~@2", M: "~ f#4!4 ~ f#4!2",
  N: "[f#4 e4!3 ~@3 e4@2 c#4!2 b3!2 a3!3]/2", O: "b3!2 ~ d4 ~@2 d4 e4", P: "f#4!5 ~ f#4!2", Q: "b3!2 ~ b3 ~@4",
  R: "f#4 e4 c#4!2 ~@3 f#4", S: "f#4@2 e4@2 d4@2 d4@2 ~@2 e4 ~@3 f#4 ~", T: "f#4 e4 d4!2 ~@4",
  U: "a3@2 ~@2 a3@2 ~@2 a3 ~ a3@2 ~@2 b3@2", V: "f#4 e4 d4!2 ~ e4 ~ f#4",
})).s("gm_trombone").gain(0.3)

// bass · tuba · "Tuba en Si♭ (clef de sol)"
const bass = note(`<
  ~ A@3 B C D A B C D E F G H E F I J K L M N K L M N ~@4 O P Q R O P Q R S T U V S T M W X B C D A B C D Y Z@2 AA Y Z@2
  AA ~ Z@2 AA Y Z@2 AA A B C D A B C D A B C D A B C D E F AB AC E F AD AC E F AD AC E F AD AE A B C D A B C D A B C D A
  B C AF
>`.pickRestart({
  A: "b1 b2 b1 b2 b1 b2 b1 b2", B: "a1 a2 a1 a2 a1 a2 a1 a2", C: "f#1 f#2 f#1 f#2 f#1 f#2 f#1 f#2",
  D: "g1 g2 g1 g2 g1 g2 g1 a2", E: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1@2",
  F: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1@2", G: "f#2@4 f#2@4 f#2@3 f#2@3 f#2@2",
  H: "~@2 g2@2 g2@2 ~ g2@2 g2 ~@2 g2@2 a2@2", I: "f#2@2 f#2@2 f#2!2 ~ f#2", J: "g2!2 ~ g2!3 ~ a2", K: "b1!8", L: "a1!8",
  M: "f#2 ~ f#2 ~ f#2!2 ~ g2", N: "~ g2!2 ~ g2 ~ g2 a2", O: "~ b2 ~ b2 ~ b2 ~ b2", P: "~ a2 ~ a2 ~ a2 ~ a2",
  Q: "~ f#2 ~ f#2 ~ f#2 ~ f#2", R: "~ g2 ~ g2 ~ g2 ~ a2", S: "b2!8", T: "a2!8", U: "f#2!8", V: "g2!7 a2",
  W: "~@2 g2@2 g2@2 g2@2 g2@2 ~@2 [a3,a#3,b3] [d#3,e3,f3,f#3,g3,g#3] [a2,a#2,b2,c3,c#3,d3] [d#2,e2,f2,f#2,g2,g#2]",
  X: "[c2,c#2,d2] ~ b2@2 b1@2 b2@2 b1@2 b2@2 b1@2 b2@2, b1 ~@7", Y: "b1 d2 g2 b2 d3 b2 g2 d2",
  Z: "a1 c#2 e2 a2 c#3 a2 f#2 c#2", AA: "g1 b1 d2 g2 b2 g2 e2 b1", AB: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ a1@2",
  AC: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ a1@2", AD: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1@2",
  AE: "~ g1!4 f#2 a2 b2", AF: "g1 g2 g1 g2 ~ a2 ~ b2",
})).s("gm_tuba").gain(0.45)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@31 [x!4]!11 x ~@76>").gain(0.2)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@31 [~ x ~ x]!8 ~@80>").gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<~@30 [~@8 x!3 ~@5] ~@88>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@5 B A@4 C D C D C D C D E@3 F E@4 ~@15 G D@3 ~ E@7 H ~@8 I J@5 ~@2 E@16 J@15 ~ E@15 H
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~@4", C: "~ x!7", D: "x!8", E: "~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2",
  F: "x ~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2", G: "~ x!2 ~ x!3 ~ x!3 ~ x!3 ~", H: "~@2 x!2 ~@2 x!2 ~@8", I: "~@8 x!3 ~ x!3 ~",
  J: "x!3 ~ x!3 ~ x!3 ~ x!3 ~",
})).gain(0.45)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@31 [~ x ~ x ~ x ~ x]!8 [x!8]!2 [x!3 ~ x!3 ~ x!3 ~ x!3 ~] x ~@76>").gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@12 x!4] ~@25 [~@5 x!3] ~@3 [~@4 x!3 ~@9] ~@88>").gain(0.3)

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

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

// drums · ride
const ride = s("rd").struct(`<
  ~@27
  [~@2 x!2 ~@2 x!2 ~@2 x ~@2 x ~@2]
  [x ~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]
  [~@2 x!2 ~@2 x!2 ~@2 x ~@2 x ~@2]
  ~@89
>`).gain(0.3)

stack(
  trumpet, trumpet_soft, baritone_sax, trombone, bass, kick, kick_soft, snare, snare_soft, low_tom, hihat, hihat_soft,
  mid_tom, open_hat, crash, ride
)