Strudelify

A New Day Yesterday

Jethro Tull

KeyE minorTempo91 bpm
0:00/0:00
// A New Day Yesterday — Jethro Tull
// 91 bpm, 6/8, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 9 "STEEL GTR" acoustic guitar steel (copy of ch 6 "OVERDRIVE" overdriven guitar)
// note: Full arrangement: all 124 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(91/3)

// 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 · slap bass 1 · "SLAPBASS 1"
const bass = note(`<
  A B@12 C@8 D E F G H I F J@2 B@2 C@8 K L F M H I F N A B@6 O P Q R S T U V B@32 C@8 K L F M H I W X H I W X H I Y ~ A
  Z AA@2 AB
>`.pickRestart({
  A: "~ a1 a#1 b1 d2 d#2", B: "[e2@4 e2@2 e2 d2 b1@2 g2@4 a1@2 a#1@2 b1@2 d2@2 d#2@2]/2",
  C: "[e2@4 e2@2 e2 d2 b1@2 g2@4 c3@2 b2@2 a2@2 b2@2 g2@2]/2", D: "a2@2 a2 e3!3", E: "e3@2 e3 b2 e2 d2",
  F: "c2@2 c2 g2 c2 d2", G: "e2@2 e2 b2 e2 f#2", H: "g2@2 g2 d3@2 g2", I: "a2@2 a2 e2!2 d2",
  J: "[e2@2 e2 e2@2 e2@2 a1 a#1 b1 d2 d#2]/2", K: "a2@4 a2@2 e2@2 e2@2 a2 g2", L: "e2@2 e2 g2 e2 d2",
  M: "e2@2 e2 b2 e2!2", N: "e2@2 e2 e2@2 g2", O: "e2@2 e2 a2@2 g#2", P: "e2@2 e2 e3 d3 b2",
  Q: "e2@4 e3@2 d3@2 b2@2 g2 a2", R: "e2!3 d2 b1 d2", S: "e2@4 e2@2 a2 b2 d3@2 e3@2", T: "e3@3 d3 b2@2 a#2@2 a2@2 g2@2",
  U: "e2!3 d2 b1 e2", V: "e2 a1 a#1 b1 d2 d#2", W: "e2@2 e2@2 e2@2 e2 d2 b1@2 g2@2", X: "a1 a#1 b1 d2 d#2 e2",
  Y: "~ c3@5", Z: "e2@4 e2@2 e2 d2 b1@2 e2@2", AA: "[e2@2 d2@2 b1@2 d2@2 e2@2 e2@2 e2 f#2 ~ g2@21 e2!12]/2",
  AB: "e2!8 e2@4 ~@12",
})).s("gm_slap_bass_1").gain(0.64)

// other · piano · "A.PIANO 2"
const piano = note(`<
  ~@13 A B C@2 D E F@2 G@2 H I J K L M ~@3 N O P@2 Q R F@2 S@2 T U J K V M ~@47 N O P@2 Q R F@2 S@2 T U J W ~@2 X Y ~@2
  X Z AA@2 ~@5
>`.pickRestart({
  A: "~@2 e5!2 d5 e5", B: "d5@2 a4@2 a4 b4@3 ~@4", C: "[~@8 e4@3 e4 g4@4 a4@4 a4@2 b4@6 ~@20]/2",
  D: "~@4 e5@2 e5@2 d5@2 e5 d5", E: "b4@3 a4 b4@2 ~@6", F: "[~@3 e4!3 g4@2 a4@2 a4 b4@3 ~@10]/2",
  G: "[~@6 e5@8 e5@2 e5 d5 e5@2 d5@2 a4 b4]/2", H: "~@4 b4 a4", I: "g4 a4@3 a4 b4@3 ~ g4!2 a4", J: "b4@3 ~ d5!2",
  K: "e5@2 a#4@2 a4@2 g4 a4 ~ e4 g4 a4", L: "a#4@4 a4!2", M: "e4 ~", N: "~@4 e5!2 e5@2 d5@3 a4", O: "a4 d5@3 ~@8",
  P: "[~@4 e4!2 g4@2 a4@2 a4 b4@3 ~@10]/2", Q: "~@8 e5@5 e5@3 d5@3 e5@2 d5@3", R: "a4@2 a4 b4@3 ~@6",
  S: "[~@8 e5@6 e5 d5 e5@4 d5@2 a4 b4]/2", T: "~@8 b4@5 b4@3 a4@3 g4@2 a4@3", U: "b4@3 b4 ~@5 e4 g4 a4",
  V: "a#4@8 a4@2 ~ g4, ~@5 a4", W: "e5@2 a#4@2 a4@2 g4 a4@3 ~@2", X: "~@3 b4!3 d5@2 d5@2 e5@2", Y: "a#4 a4 g4 a4@2 ~",
  Z: "a#4@2 a4@2 g4 a4 ~@3 e4 g4 a4", AA: "[g4 a4@3 g4 a4@3 e4@16]/2",
})).s("gm_piano").gain(0.8)

// other · harmonica
const harmonica = note("<~@9 A B C B ~@38 A B C B D E F@5 ~ G B C H ~@24 A B C B ~@28 I>".pickRestart({
  A: "e4@4 ~@2 e4 ~ b3@2 g4@2", B: "e4@2 ~@6 a4@4 a#4@4 b4@4 d5 c5 b4 ~, ~@3 g4@2 ~", C: "~@4 e4@2 e4 d4 b3@2 g4@2",
  D: "~@2 e4@2 e4@2 e4 d4 ~@4", E: "~@2 e4@2 e4@2 e4 d4 ~ b3@2 d4", F: "b3 ~ e4@2 e4@2 d4 e4 ~ b3@2 d4",
  G: "~@6 e4 ~ b3@2 g4@2", H: "e4 ~@3 a4@2 a#4@2 b4@2 d5@2, ~@3 g4@2 ~", I: "~@2 b3 ~@3",
})).s("gm_harmonica").gain(0.52)

// other · harmonica · soft notes
const harmonica_soft = note("<~@9 A B ~ B ~@38 A B ~ B ~@8 A B ~@26 A B ~ B ~@29>".pickRestart({
  A: "~@7 d4 ~@4", B: "~@23 a4",
})).s("gm_harmonica").gain(0.3)

// other · flute
const flute = note("<~@67 A B C D E F G H I J@2 K L M N O P ~@40>".pickRestart({
  A: "a4 a#4 b4 c5 b4 c5 b4 c5 b4 c5 b4 c5 b4 c5 b4 c5 a4 ~ g4 ~@5", B: "~ a4!2 g4 a4 g4 a4 g4 a#4 a4 g4 a4",
  C: "g4 a4 g4 a4 e4@3 d4 ~@4 e4@2 g4 a4 g4 a4 g4 a4 e4@2 ~@2", D: "~ e4 f#4 g4 a4 ~ a4 ~ a4 g4 a4 ~",
  E: "a4 a#4 b4@2 ~@4 b4@2 b4@2 e5@2 d5@2 b4@2 e5@2 d5@2 b4@2", F: "e5 d5 b4 e5 d5 b4 e5 d5 e5@2 d5 ~",
  G: "g5 a5 g5 a5 g5 a5 g5 a5 e5 f#5@3 e5 d5 ~ b4 d5@2 ~@2 a#4 b4 ~@2",
  H: "a4@2 g4@2 a4@2 g4@2 a#4 a4 ~ g4 a4 ~ g4 ~ a4@2 g4@2 e4@4",
  I: "g4 a4 g4 a4 g4 a4 g4 a4 e4@2 d4@2 e4@2 g4 a4 g4 a4 g4 a4 e4@2 ~@2", J: "[~@8 f#5 e5@11 a4@20 g4@4 e4 ~ g4 ~]/2",
  K: "~@2 e4 g4 ~ e4 g4 ~ e4 g4 e4@2", L: "e4@8 e4@3 d4 e4@2 g4@2 f#4@4 a4@2 g4@2",
  M: "e4@3 g4 e4@3 d4 e4@4 a#4 b4@3 a#4 b4@3 a#4 b4@3", N: "~@2 d#5 e5 d5@2 b4@2 a#4 b4 e5@2 d5@4 a#4 b4@3 a4 g4 ~ a4",
  O: "g4@4 e4@2 ~@2 [g4,a4] [a4,a#4] ~ g4 a4 ~ g4 ~ e4@2 g4@2 e4@4", // Gsus2 A#maj7
  P: "e4 f4 e4 f4 e4 f4 e4 f4 e4 f4 e4 f4 e4 f4 e4 f4 g4@4 ~@4",
})).s("gm_flute").gain(0.8)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@55 A@2 B C D@2 E F ~@61>".pickRestart({
  A: "[e5 ~ d5 ~@3 e5 ~ d5 ~@3 d5 e5@3 g5@4 e5@8 a5 b5@3 e6@2 d6@2 e6@2 a5 b5 a5@2 g5@2 a5@2 b4@2]/2",
  B: "d5@2 a4 b4 d5 e5 g5@2 b4@4", C: "a4 b4 ~ a4 g4@2 e4@2 g4@2 b4@2 d5 e5 ~ d5 g5 a5 ~ g5 a5 b5 ~ a5",
  D: "[a5 b5 ~ d6 a5 b5 ~ b5 d6 b5 ~ b5!2 d6 ~ b5 a5 b5 ~ d6 b5 d6 ~ e6@5 b5@4 g6 a6@3 g6 g6@7 g6@4]/2",
  E: "[b5,e6]@2 [b5,e6]@2 d6@2 b5@2 b5@2 a5@2 g5 a5 g5@2 g5@4 b4@4", F: "d5 e5 [g5,b5]@2 e5@2 e5@6",
})).s("gm_overdriven_guitar").gain(0.5)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@5 A@16 ~@7 A@12 ~@7 B@8 ~@8 B@6 ~@18 B@8 A@8 ~@6 A@2 ~@2 A@2 ~@6 C@2 D
>`.pickRestart({
  A: "[[e4,b4,e5]@12 [d#4,a#4,d#5,e5] [d4,d5] d5@2 ~@4 g5@16 ~@12]/2", // E5 D# D
  B: "[[e4,b4,e5]@12 [d#4,a#4,d#5,e5] [d4,d5] d5@2 b4@4 g5@16 ~@12]/2", // E5 D# D
  C: "[[e4,b4,e5]@12 [d#4,a#4,d#5,e5] [d4,d5] d5@2 b4@4 [e4,g5]@16 ~@12]/2", D: "~@2 [e4,b4,e5] ~@3",
})).s("gm_electric_guitar_clean").gain(0.31)

// chords · electric guitar clean · "CLEAN GTR" · soft notes
const electric_guitar_clean_2 = note(`<
  ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@8 A ~ A ~ A ~ A ~ A ~ A ~@8 B ~ B ~ B ~ B ~@9 B ~ B ~ B ~@19 B ~ B ~ B ~ B ~ A ~ A
  ~ A ~ A ~@7 A ~@3 A ~@7 B ~@2
>`.pickRestart({
  A: "~@13 a4 ~@2 b4@4 ~@4", B: "~@13 a4 ~@10",
})).s("gm_electric_guitar_clean").gain(0.19)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A B C D E F C G C G C G C G C G C H I@2 C J I K J I B C D C D C B L M C H I K I K I@2 K@2 B C N C O C F I P I@3 Q
  I B C N C D C R C N C N C N C N C N C N C D K ~ A S C D C G C D C G C D C B L M C H I K I K@2 I@2 T K I U ~ K T@2 ~ V
  C ~@2 W
>`.pickRestart({
  A: "x!3", B: "~ x!5", C: "x ~ x ~ x!2", D: "~ x!2 ~@3", E: "x ~@3 x!2", F: "~@2 x ~ x ~ x!6", G: "~ x!2 ~@2 x",
  H: "~ x ~@4", I: "x ~ x ~@2 x", J: "x ~@3 x ~@2 x!4 ~", K: "x!2 ~", L: "x!2 ~@2 x!2", M: "~ x!3 ~@2", N: "~ x!3 ~ x",
  O: "~@4 x ~@3 x ~@3 x ~@7 x ~@2 x", P: "x ~ x!2 ~ x", Q: "x ~@3 x ~ x!6", R: "~@2 x ~ x ~ x ~@3 x!2", S: "x!6",
  T: "x", U: "x!3 ~@2 x", V: "~ x!2 ~ x ~ x ~ x ~ x ~", W: "~ x ~",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct(`<
  A B C D E F G H ~ I J I J I J I J I J I K I@5 L I@2 E M L I N M O P Q M R I@3 S I@2 T U B M V M W M ~ I ~ I@3 ~ I B M
  W M ~ M G M G M W M W F W M W M W M X I@2 Y ~ M ~ M I M Z M I@2 N M O P Q M R I@3 S AA I@2 AB AC I@2 AD AC AE ~@3 M
  ~@3
>`.pickRestart({
  A: "~@3 x!3", B: "x", C: "~@2 x ~ x!2", D: "~@3 x ~ x", E: "x!6", F: "~@11 x ~@12", G: "~@7 x!2 ~@3",
  H: "~@8 x ~@2 x!2 ~@11", I: "~ x", J: "~@2 x!2", K: "~@8 x ~@3 x!2 ~@10", L: "~@6 x ~@2 x!2 ~", M: "~@11 x!2 ~@11",
  N: "~@12 x ~@5 x ~ x!2 ~ x", O: "~@5 x ~@2", P: "~@5 x!2 ~@5", Q: "~@9 x!2 ~", R: "~@8 x ~@2 x!3 ~@10",
  S: "~@6 x!2 ~@2 x ~", T: "~@12 x ~@3 x!2 ~ x!2 ~ x ~", U: "~@11 x!2 ~ x ~ x ~@3 x ~@3", V: "~@3 x", W: "~@2 x",
  X: "~@4 x!2 ~@2", Y: "~@12 x ~@7 x ~ x!2", Z: "~@6 x!2 ~@4", AA: "~@12 x ~@3 x!2 ~ x!3 ~ x", AB: "x!2 ~ x!3",
  AC: "~@6 x ~ x!2 ~@2", AD: "x!2 ~ x!2 ~@3 x ~@7 x ~ x ~ x ~@3", AE: "~@8 x ~ x ~@2 x ~ x ~@8",
})).gain(0.56)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~ A B ~@2 C ~@3 D ~ D ~ D ~ D ~ D ~ D ~@12 D ~@42 C ~@6 E ~@12 D ~@14 F ~@5 C ~@7
>`.pickRestart({
  A: "~@2 x!4", B: "~ x ~ x ~@2", C: "~ x", D: "~@11 x ~@12", E: "~@13 x ~@10", F: "~ x ~",
})).gain(0.32)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@4 A B C B ~ B ~ B ~ B ~ B ~ B ~ B D ~@8 A B E B ~ B ~ B E B D ~ F ~ E ~@3 G ~ B ~ B C B ~@9 B C B H B C B C B C B C
  B C B C B C B I J K ~@2 B F B ~ B E B C B ~ B ~ B E B D ~ F ~ E ~@12 L B ~@3
>`.pickRestart({
  A: "~ x ~@6", B: "~@5 x ~@2", C: "~@19 x ~@4", D: "~@19 x!3 ~ x", E: "~@23 x", F: "~@10 x!2", G: "~@19 x ~@3 x",
  H: "~@7 x", I: "~@20 x!2 ~ x", J: "~@4 x!2", K: "~ x!2 ~@3", L: "~ x ~@22",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<~@123 [~ x ~]>").gain(0.8)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@4 A B C B ~ B ~ B ~ B ~ B ~ B ~ B D ~@8 A B E B ~ B ~ B E B F ~ G ~ H ~@3 I ~ B ~ B C B ~@9 B C B J B C B C B C B C
  B C B C B C B K ~@4 B G B L B E B M B ~ B ~ B E B F ~ G ~ H ~@3 N O ~@2 P Q K ~@2 R B ~ K R
>`.pickRestart({
  A: "~ x ~@22", B: "~@13 x ~@10", C: "~@17 x ~@6", D: "~@15 x!3 ~@6", E: "~@7 x", F: "~@16 x!2 ~@6", G: "~@8 x!2 ~@2",
  H: "~@16 x ~ x ~@2 x ~@2", I: "~@17 x ~@3 x ~@2", J: "~@16 x ~ x ~ x ~@2 x", K: "~@16 x!2 ~ x ~@4", L: "~@19 x ~@4",
  M: "~@3 x", N: "~@5 x", O: "~@20 x ~@2 x", P: "~@5 x ~@3 x ~@2 x!2 ~ x ~@8", Q: "~@10 x!2", R: "x",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ C ~@6 C A B D B E B E B E B ~ F@8 A B ~ B ~ B ~ F E@2 ~ E ~ E A B E B ~ C ~ G ~
  B ~ G ~ G ~ G ~@3 G ~@4 A H E B ~ B F B ~ B E B E B E B ~ F@6 C I F@3 C@3 F ~ A B C ~@2
>`.pickRestart({
  A: "~ x!5", B: "x ~@4 x", C: "x", D: "~@4 x!2", E: "~ x", F: "x!2", G: "~@5 x", H: "x!2 ~@3 x", I: "x!6",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@39 A ~ B ~@24 C ~@21 C ~ D ~ E ~@9 A ~ B ~@5 F G ~@2 H ~ I ~@5 I ~>".pickRestart({
  A: "~@5 x ~@2", B: "~@7 x ~@4", C: "~@6 x!2 ~@4", D: "~@3 x", E: "~@8 x!3 ~", F: "~@2 x", G: "~@7 x",
  H: "~@7 x ~@3 x ~@12", I: "~@20 x!2 ~ x",
})).gain(0.64)

// drums · crash
const crash = s("cr").struct("<~@117 [x!2] ~@2 [~@5 x] x ~@2>").gain(0.48)

// drums · ride
const ride = s("rd").struct(`<
  A B A C ~ D C E C E C E C E C E C E C E C F G H@5 I ~ E J D K E K E K E L M@7 E ~ E C E C E C N K@2 C K C K ~ E K E C
  D C E C E C O C O C O C@3 O L C A C ~ P L E Q E ~ E R D K E K E K E L M@4 ~@2 S ~@2 T U ~ V@2 ~@3 W X Y Z
>`.pickRestart({
  A: "~ x!5", B: "x ~ x!4", C: "x!6", D: "~ x!2 ~@3", E: "~@2 x!3 ~@7", F: "~@2 x!3 ~ x ~ x!3 ~",
  G: "x ~ x!3 ~ x ~ x!3 ~", H: "x ~ x!3 ~ x ~ x ~ x ~", I: "~@2 x ~ x ~ x ~ x!3 ~", J: "x!4 ~@2", K: "x!3 ~ x!2",
  L: "x!3 ~@3", M: "~@2 x!3 ~@3 x ~ x ~", N: "~ x!2 ~ x!2", O: "x ~ x!3 ~@7", P: "~ x ~", Q: "x!3 ~ x ~ x ~ x ~ x ~",
  R: "x!2 ~ x ~@2", S: "~@2 x!2 ~@2", T: "~@5 x", U: "~ x ~@3 x", V: "~ x!3 ~@2", W: "~@2 x!2 ~@8", X: "~@6 x!6",
  Y: "x!9 ~@3", Z: "x",
})).gain(0.48)

stack(
  bass, piano, harmonica, harmonica_soft, flute, overdriven_guitar, electric_guitar_clean, electric_guitar_clean_2,
  kick, snare, snare_soft, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride
)

More by Jethro Tull