Strudelify

Sweet Dreams

Jethro Tull

KeyE minorTempo108 bpm
0:00/0:00
// Sweet Dreams — Jethro Tull
// 108 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 106 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(108/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@2 B@2 C@2 D E F G H@2 I J K L M@2 B@2 N O P Q M@2 B@2 C@2 D E ~@2 R@2 S@2 T@2 U@2 M@2 V@2 W@2 X Y Z G AA@2 I AB AC L
  AD@2 V@2 AE AF P AG AD@2 V@2 W@2 X Y ~@2 R@2 S@2 T@2 U@2 R@2 S@2 T@2 U@2 ~@8 M@2 B@2 AH@2
>`.pickRestart({
  A: "[~ e2 ~@2 e2 ~@2 e2@13 g2@11 f#2@13 f2@12 e2@6 ~@2, ~@44 e2 ~@19]/2",
  B: "[e2 ~@2 e2 ~ e2 ~@2 e2@12 g2@11 f#2@14 f2@11 e2@5 ~@2 e2, ~@56 f2 ~@7]/2",
  C: "[~@2 e2 ~ e2 ~ e2@15 g2@10 f#2@14 f2@10 ~ e2@4 ~@4, ~@31 a2 ~@32]/2", D: "e2 ~ e2 ~ e2 ~@2 e2@13 g2@11 ~",
  E: "f#2@13 f2@10 e2@4 ~@4 e2", F: "~@2 e2 ~ e2 ~@2 e2@14 g2@11", G: "f#2@11 f2@12 ~ e2@4 ~@3 e2, ~@24 f2 ~@7",
  H: "[~@2 e2 ~ e2 ~@2 e2@14 g2@10 f#2@13 f2@12 e2@4 ~@4]/2", I: "e2 ~ e2 ~@2 e2 ~ e2@13 g2@12",
  J: "f#2@12 f2@12 e2@2 ~@5 e2", K: "~ a2@5 ~@2 a2@6 ~@3 g2@3 a2@10 ~@2, ~@8 a2 ~@7",
  L: "~@4 b2 ~@2 b2@2 a2@2 b2@5 ~@4 g2@4 a2@7 ~", M: "[e2!2 ~@2 e2 ~@2 e2@13 g2@11 f#2@13 f2@12 e2@6 ~@2]/2",
  N: "a2 ~@2 a2 ~@3 a2 ~@3 a2 ~@3 a2 ~@3 a2 ~@3 a2 ~@2 a2 ~@3 g2 ~",
  O: "~@3 g2 ~@3 g2 ~@3 g2 ~@3 g2 ~@3 g2 ~@3 g2 ~@3 g2@2 ~@2 e2",
  P: "~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 e2 ~@3 d2",
  Q: "~@3 d2 ~@3 d2 ~@3 d2 ~@3 d2 ~@3 d2 ~@3 d2 ~@3 d2 ~@4", R: "[a1@12 c2@11 d2@16 g1@8 ~ a1@4 g1@4 a1@4 ~@4]/2",
  S: "[a1@12 c2@11 d2@15 ~ g2@8 ~ e2@3 d2@4 c2@5 ~@4]/2", T: "[~ a1@11 c2@12 d2@14 g1@9 a1@4 g1@4 ~ a1@4 ~@4]/2",
  U: "[a1@12 c2@11 d2@15 g2@10 e2@4 d2@4 c2@2 ~@6]/2",
  V: "[e2 ~@2 e2 ~ e2 ~@2 e2@12 g2@11 f#2@14 f2@11 e2@5 ~@3, ~@56 f2 ~@7]/2",
  W: "[e2 ~ e2 ~ e2 ~@2 e2@14 g2@10 f#2@14 f2@10 ~ e2@5 ~@3, ~@31 a2 ~@32]/2", X: "e2 ~ e2 ~ e2 ~@2 e2@13 g2@12",
  Y: "f#2@13 f2@11 e2@4 ~@4", Z: "e2 ~ e2 ~@2 e2 ~ e2@14 g2@11",
  AA: "[~@2 e2 ~ e2 ~@2 e2@14 g2@10 f#2@13 f2@11 ~ e2@4 ~@4]/2", AB: "f#2@13 f2@11 e2@2 ~@5 e2",
  AC: "~ a2@6 ~ a2@6 ~@2 a2@2 g2@2 a2@10 ~@2", AD: "[e2 ~ e2 ~ e2 ~@2 e2@13 g2@11 f#2@13 f2@12 e2@6 ~@2]/2",
  AE: "[e2,a2] ~@2 a2 ~@3 a2 ~@3 a2 ~@3 a2 ~@3 a2 ~@3 a2 ~@3 a2 ~@3 g2", // A5
  AF: "~@3 g2 ~@3 g2 ~@3 g2 ~@3 g2 ~@3 g2 ~@3 g2 ~@3 g2 ~@3 e2",
  AG: "~@3 d2 ~@3 d2 ~@3 d2 ~@3 d2 ~@3 d2 ~@3 d2 ~@4 d2 ~@3",
  AH: "[~@2 e2 ~ e2 ~ e2@15 g2@10 f#2@14 f2@10 ~ e2@5 ~@3, ~@31 a2 ~@32]/2",
})).s("gm_fretless_bass").gain(0.36)

// chords · pad poly
const pad_poly = note(`<
  A@2 B@2 C@2 D@2 E@2 F@2 G@2 H I A@2 B@2 J@3 K A@2 B@2 C@2 D@2 ~@2 L@2 M@2 N@2 O@2 A@2 B@2 P@2 Q R S@2 F@2 T@2 H I A@2
  B@2 U@3 V A@2 B@2 P@2 Q R ~@2 L@2 M@2 N@2 O@2 L@2 M@2 N@2 O@2 W@4 X Y Z AA@3 B@2 AB AC
>`.pickRestart({
  A: "[e3 ~@2 e3 ~ e3 ~ e3@13 g3@10 f#3@14 f3@12 e3@5 ~@2 e3]/2",
  B: "[~@2 e3 ~ e3 ~@2 e3@13 g3@11 a3@12 d3@13 e3@6 ~@2]/2",
  C: "[e3 ~ e3 ~@2 e3 ~ e3@13 g3@11 f#3@13 f3@12 e3@3 ~@4 e3]/2",
  D: "[~@2 e3 ~ e3 ~ e3@14 g3@11 a3@12 ~ d3@11 e3@5 ~@4]/2",
  E: "[e3 ~ e3 ~ e3@2 ~ e3@13 g3@11 f#3@13 f3@12 e3@4 ~@3 e3, ~@7 f3 ~@56]/2",
  F: "[~@2 e3 ~@2 e3 ~ e3@13 g3@11 a3@12 ~ d3@11 e3@5 ~@3 e3]/2",
  G: "[~ e3 ~@2 e3 ~ e3@14 g3@11 f#3@12 f3@12 e3@3 ~@4 e3 ~]/2", H: "a3@5 ~@3 a3@7 ~ a3@3 g3@2 a3@10 ~",
  I: "~@4 b3 ~@2 b3@2 a3@2 b3@6 ~@3 g3@4 a3@8",
  J: "[[a2,c3,e3] ~@2 [a2,e3] c3 ~@2 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [g#3,b3] b3 ~@2 [e3,g#3,b3] ~@3 [e3,g#3,b3] ~@3 [e3,g#3,b3] ~@3 [e3,g#3,b3] ~@4 [e3,g#3,b3] ~@3 [e3,g#3,b3] ~@3 [d3,f#3,a3] ~@3, ~@31 c3@2 ~@30 e3@2 ~@31]/3", // Am A5 Am Em C G#m E D
  K: "[d3,f#3,a3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@2 a3 [d3,f#3] ~@7", // D
  L: "[[c4,e4]@11 ~@2 [a3,c4]@9 ~@2 [b3,d4]@16 g4@2 ~@5 [c4,e4]@2 ~@2 d4@2 ~@3 [a3,c4]@2 ~@6, ~@51 b3 ~@12]/2", // C Am Bm C Am
  M: "[[c4,e4]@9 ~@3 [a3,c4]@9 ~@2 [b3,d4]@14 g4@7 ~@3 a4@4 g4@4 ~ a4@2 ~@6]/2", // C Am Bm
  N: "[[c4,e4]@9 ~@4 [a3,c4]@8 ~@3 b3@15 g4@6 ~@2 [c4,e4]@2 ~@2 [b3,d4]@2 ~@3 c4@2 ~@6, ~@23 d4@16 ~@16 a3@3 ~@6]/2", // C Am C Bm
  O: "[~ [c4,e4]@8 ~@4 [a3,c4]@8 ~@3 [b3,d4]@14 g4@6 ~@3 a4@3 ~ g4@3 ~@2 a4@3 ~@5]/2", // C Am Bm
  P: "[e3 ~@2 e3 ~ e3 ~ e3@13 g3@11 f#3@13 f3@12 e3@4 ~@3 e3]/2", Q: "~@2 e3 ~ e3 ~@2 e3@13 g3@11 ~",
  R: "a3@12 d3@11 e3@5 ~@4", S: "[e3 ~ e3 ~ e3@2 ~ e3@14 g3@10 f#3@13 f3@12 e3@4 ~@3 e3, ~@7 f3 ~@56]/2",
  T: "[~@2 e3 ~ e3 ~ e3@14 g3@11 f#3@12 f3@12 e3@3 ~@4 e3@2]/2",
  U: "[[a2,c3,e3] ~@3 [a2,c3,e3] ~@2 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [a2,c3,e3] ~@3 [e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [c3,e3,g3] ~@3 [g#3,b3] b3 ~@2 [e3,g#3,b3] ~@3 [e3,g#3,b3] ~@3 [e3,g#3,b3] ~@3 [e3,g#3,b3] ~@4 [e3,g#3,b3] ~@3 [e3,g#3,b3] ~@3 [d3,f#3,a3] ~@3, ~@31 c3@2 ~@30 e3@2 ~@31]/3", // Am Em C G#m E D
  V: "[d3,f#3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@3 [d3,f#3,a3] ~@7, a3 ~@15", // D
  W: "[[c5,e5]@10 ~@4 a4@8 ~@2 [b4,d5]@14 ~@3 [g4,b4]@4 ~@19 [c5,e5]@10 ~@3 [a4,c5]@7 ~@4 [a4,d5]@12 ~@4 [d5,g5]@5 ~@4 [c5,e5]@15, ~@13 c5@8 ~@27 [e4,a4]@26 ~@54]/4", // C Bm G C Am D5 G5 C …
  X: "[c5,e5] ~@7 [d5,f5]@3 ~@5 [c5,e5]@4 ~@4 [a4,c5]@4 ~@4", Y: "[c5,e5]@4 ~@4 [d5,f5]@4 ~@4 [c5,e5]@9 ~@7",
  Z: "[c5,e5]@3 ~@5 [d5,f5]@2 ~@6 [c5,e5]@2 ~@6 [a4,c5]@2 ~@6", // C Dm C Am
  AA: "[[a4,c5]@5 ~@3 [g4,b4]@5 ~@19 e3 ~@2 e3 ~ e3 ~ e3@13 g3@10 f#3@14 f3@12 e3@5 ~@2 e3, ~@4 [e4,g#4,b4]@7 ~@13]/3", // Am G E
  AB: "e3 ~ e3 ~@2 e3 ~ e3@13 g3@11 ~", AC: "f#3@12 f3@12 e3@3 ~@5",
})).s("gm_pad_poly").gain(0.36)

// other · muted trumpet
const muted_trumpet = note(`<
  A@2 B C D E F G H I J@2 K@2 L M N@2 B C O@4 N@2 B C D E F G ~@2 P@2 Q@2 R@2 S@2 N@2 B C D E F G H I J@2 K@2 L M N@2 B
  C O@4 N@2 B C D E F T ~@2 P@2 Q@2 R@2 U@2 P@2 Q@2 R@2 U@2 ~@8 N@2 B C D V
>`.pickRestart({
  A: "[~@2 e4 ~ e4 ~@2 e4@13 g4@11 f#4@13 f4@12 e4@5 ~@3]/2", B: "e4 ~ e4 ~@2 e4 ~ e4@14 g4@11",
  C: "f#4@13 f4@11 e4@5 ~@3", D: "e4 ~ e4 ~ e4 ~@2 e4@14 g4@11", E: "f#4@12 f4@11 e4@6 ~@3",
  F: "e4 ~ e4 ~ e4 ~@2 e4@15 g4@10", G: "f#4@12 f4@12 e4@4 ~@3 e4", H: "~@2 e4 ~@2 e4 ~ e4@13 ~ g4@11",
  I: "f#4@12 f4@11 e4@6 ~@2 e4", J: "[~@2 e4 ~ e4 ~@2 e4@13 g4@11 f#4@12 f4@12 ~ e4@7 ~]/2",
  K: "[e4 ~ e4 ~@2 e4 ~ e4@14 g4@10 f#4@13 f4@12 e4@6 ~@2]/2", L: "a4@5 ~@2 a4@6 ~@3 a4@2 g4@2 a4@5 ~@7",
  M: "~@3 b4 ~@3 b4@2 a4@2 b4@5 ~@4 g4@4 a4@5 ~@3", N: "[e4 ~ e4 ~ e4 ~@2 e4@13 g4@11 f#4@13 f4@12 e4@5 ~@3]/2",
  O: "[[a2,c3,e3]@28 ~@4 [c3,e3]@28 ~@4 g#3@25 ~@5 b3 e3 ~ e3 ~@30, e4 ~@30 g3@29 ~@3 [e3,b3]@27 ~@4 [f#3,a3]@24 ~@10, ~@95 d3@23 ~@10]/4", // Am C E5 F#m
  P: "[[a3,c4,e4]@9 ~@3 [c4,e4,g4]@9 ~@4 g3@14 ~@8 [d4,f#4,a4,b4]@11 ~@6, ~@24 [b3,d4]@15 ~@25, ~@25 a3 ~@38]/2", // Am C Bm7 Bm
  Q: "[~ [a3,e4]@9 ~@3 [c4,e4,g4]@6 ~@5 a3@2 ~@21 b4@2 ~@15, c4@9 ~@14 [g3,b3,d4]@16 ~@7 [d4,f#4,a4]@14 ~@4]/2", // A5 C G D
  R: "[~ e4@10 ~@2 [c4,e4,g4]@9 ~@2 [g3,b3,d4]@17 ~@6 [f#4,a4]@13 ~@4, [a3,c4]@5 ~@27, ~ d4 ~@44 d4@13 ~@5]/2", // C G F#m Am
  S: "[[a3,c4,e4]@9 ~@4 [c4,e4,g4]@8 ~@4 [g3,b3,d4]@16 ~@6 a#4 a4@10 ~@6, ~@23 [d4,f#4]@6 ~@3, ~@47 b4@11 ~@6]/2", // Am C G D
  T: "f#4@3 f4@3 e4 ~",
  U: "[[a3,c4,e4]@10 ~@3 [c4,e4,g4]@8 ~@4 [g3,b3,d4]@16 ~@6 a#4 a4@10 ~@6, ~@23 [d4,f#4]@6 ~@3, ~@47 b4@11 ~@6]/2", // Am C G D
  V: "f#4@12 f4@11 ~ e5@6 ~@2",
})).s("gm_muted_trumpet").gain(0.36)

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

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

// drums · clap
const clap = s("cp").struct("<~@81 [~ x ~ x] ~@2 [~ x ~ x]!4 ~@2 [~ x ~ x] ~@15>").gain(0.46)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@33 [~@5 x ~@2] ~@41 [~@5 x ~@2] ~@30>").gain(0.46)

// drums · open hat
const open_hat = s("oh").struct(`<
  A ~ A ~ A ~ A B A ~ A B A ~@8 A C@2 A ~ A ~ A@2 ~@4 D@8 A ~ A ~ A ~ A B A ~ A B A ~@3 A ~@4 A C@2 A ~ A ~ A ~ A B ~@2
  D@16 ~@8 A ~ A ~ D ~
>`.pickRestart({
  A: "~@7 x", B: "~@8 x ~@3 x ~@2 x", C: "x!4", D: "~ x ~@3 x ~@2",
})).gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 A ~@15 A ~ B ~@23 A ~@17 B ~@30>".pickRestart({
  A: "~ x!2 ~ x!2 ~ x", B: "~ x",
})).gain(0.36)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@15
  [x!2 ~@4 x!2 ~@4 x!2 ~@2]
  ~@15
  [x!2 ~@4 x!2 ~@4 x!2 ~@2]
  ~@25
  [x!2 ~@4 x!2 ~@4 x!2 ~@2]
  ~@48
>`).gain(0.41)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A ~@11 A B ~@5 C ~@4 A ~@3 A B ~ B ~@3 B ~@3 B ~@2 A ~@11 A B ~@5 C ~@4 A ~@6 B ~@4 B ~@2 B ~@3 B ~@2 B@2 ~@10 A ~
  B
>`.pickRestart({
  A: "~@3 x", B: "x", C: "x!4",
})).gain(0.36)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@23 [x!4] ~@41 [x!4] ~@40>").gain(0.2)

stack(
  bass, pad_poly, muted_trumpet, kick, snare, clap, hihat, hihat_soft, low_tom, open_hat, mid_tom, high_tom, crash,
  crash_soft
)

More by Jethro Tull