Strudelify
Son and Daughter cover art

Queen

Son and Daughter

Queen

KeyE minorTempo150 bpm
0:00/0:00
// Son and Daughter — Queen
// 150 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 171 bars on a 24-step grid, each part at one level. 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 · fretless bass · "bAIXO"
const bass = note(`<
  A@2 B@2 A C D E F C D E G H@2 I J C D E G H@2 I J C D E K L@2 M N O@2 P@2 H@2 I A@2 B@2 ~ A C D E F C D E G H@2 I J C
  D E G H@2 I J C D E K L@2 M N O@2 Q R H@2 I A@2 B@2 ~@2 S T I U V C D E K W@2 X@2 Y@2 Z AA AB@5 AC AD AE AF@2 AG AH@3
  AI AJ@3 AK AL@8 AM@5 AN@8 AO@2 AP@2 AQ@2 AR@8 AS AT@6 AU@5 ~
>`.pickRestart({
  A: "~ e1", B: "[~ e1@3]/2", C: "g1@3 e1 a1 g1@3", D: "e1@3 e1 b1 d2@3", E: "a1@3 g1@3 e1@3 a1@5 ~ e1@3 g1@6",
  F: "e1 d1 e1@2", G: "e1 d1 e2!2", H: "d2@3 d2 e2@2 e2@2", I: "d2@2 e2!2", J: "d2 e1", K: "e1 d1 b1!2",
  L: "a1@3 a1 b1@2 b1@2", M: "a1@2 b1!2", N: "a1@12 c#2@6 ~ c#2@5", O: "b1@9 ~ b1@2 c#2@6 c#2@6",
  P: "[b1@12 c#2@6 a1@8 ~ b1@9 e2@6 e2@6]/2", Q: "b1@2 c#2!2", R: "b1@2 e2!2", S: "~ e2", T: "d2 e2", U: "d2!2 e2!2",
  V: "d2!2 e1@2", W: "[b1@5 ~ b1@5 ~ b1@5 b1@5 ~ b1@5 b1@5 ~ b1@5 b1@5 b1@4]/2",
  X: "[~@2 b1@5 b1@5 a1@5 a1@4 ~ b1@4 b1@4 ~ b1@4 ~ b1@4 b1@4 ~ b1@3]/2",
  Y: "[~@2 b1@4 b1@4 b1@4 ~ b1@4 b1@4 b1@4 ~ b1@4 b1@4 b1@4 b1@4 b1@4]/2", Z: "b1@4 b1@4 b1@4 b1@4 ~ b1@4 b1@3",
  AA: "~ b1@4 b1@4 b1@4 b1@4 b1@4 b1@3",
  AB: "[~ b1@4 b1@4 b1@4 ~ b1@4 b1@4 b1@4 b1@4 d2@4 d2@4 c#2@4 c#2@4 c#2@4 c#2@4 c#2@4 ~ c#2@4 b1@4 b1@4 b1@4 b1@4 b1@4 b1@4 b1@4 b1@4 b1@4 b1@4 ~ b1@4 b1@4 b1@4 b1@4]/5",
  AC: "b1!6", AD: "b1@4 ~ b1@4 b1@4 b1@4 d2@4 d2@3", AE: "~ c#2@4 c#2@4 c#2@4 c#2@4 c#2@4 c#2@3",
  AF: "[~ c#2@4 e2@4 d2@2 d2@2 d2@2 d2@2 e2@2 e2@2 e2@2 d2@2 d2@2 d2 ~ e2@2 ~@2 d2@2 d2@2 d2 d2@2 e2@2 e2@2 e2@2 d2@2]/2",
  AG: "d2@2 d2@2 ~ e2@2 ~ d2@2 d2@2 d2@2 d2@2 e2@2 e2@2 e2@2 g2@2",
  AH: "[g2@2 g2@2 e3@4 d3@2 d3@2 d3 d3@2 a2@2 a2@2 a2@2 g2@2 g2@2 g2@2 e2@4 d2@2 d2@2 d2@2 d2@2 e2@2 e2@2 e2@2 d2@2 d2@2 d2 ~ e2@2 ~@2 d2 d2@2 d2@2 d2@2 e2@2 e2@2 e2@2 d2@2 d2@2]/3",
  AI: "d2 e2 ~ d2!4 e2!3 g2!2",
  AJ: "[g2@2 e3@4 d3 d3@2 d3@2 d3@2 a2@2 a2@2 a2@2 g2@2 g2@2 g2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2]/3",
  AK: "e2!12",
  AL: "[e2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 d2@14 d2@14 d2@7 d2@7 d2@6 d2@6 e1@12 g1@9 e1@3 a1@3 ~ g1@9 e1@8 e1@3 b1@3 ~ d2@9 a1@3 g1@2 e1@3 ~ a1@5 e1@3 g1@6 e1@6 d1@6 e1@12 g1@7]/8",
  AM: "[~@2 e1@3 a1@3 ~ g1@9 e1@8 e1@3 b1@3 ~ d2@9 a1@3 g1@2 e1@3 ~ a1@5 e1@3 g1@6 e1@6 d1@6 b1@6 ~ b1@5 a1@9 ~ a1@2 b1@6 b1@6 a1@7]/5",
  AN: "[~@3 a1@2 b1@6 b1@6 a1@12 b1@6 b1@6 a1@12 ~ c#2@6 c#2@6 b1@9 b1@3 c#2@6 c#2@6 b1@9 b1@3 c#2@6 c#2@6 b1@12 c#2@6 a1@8 b1@9 e2@6 ~ e2@5 d2@9 ~ d2@2 e2@6 e2@6 d2@7]/8",
  AO: "[~@3 d2@2 e2@6 e2@6 d2@12 e2@6 e2@6 ~@7]/2", AP: "~@5 e1@12 ~@7", AQ: "[~@5 e1@36 ~@7]/2",
  AR: "[~@11 d3@3 e3@3 d3@3 e3@3 e3@12 e3@3 d3@3 b2@3 a#2@3 a2@3 g2@3 f#2@6 e2@3 e2@3 e2@3 f#2@3 e2@12 e3@3 d3@3 b2@3 a#2@3 a2@3 g2@3 f#2@6 d3@3 e3@3 d3@3 e3@3 e3@12 e3@3 d3@3 b2@3 a#2@3 a2@3 g2@3 f#2@6 e3@3 d3@3 b2@3 a#2@3 a2@3 g2@3 f#2@6 b2@3 a#2@3 a2@4 g2@3]/8",
  AS: "f#2@3 f2@3 g2@4 f#2@3 f2@4 e2@3 g2@4",
  AT: "[f#2@4 f2@3 e2@4 g2@4 f#2@4 f2@4 e2@5 g2@4 f#2@5 f2@4 e2@5 g2@5 f#2@5 f2@5 e2@5 g2@5 f#2@6 f2@5 e2@6 g2@6 f#2@7 f2@6 e2@7 ~@7 f#2@8 ~@7 e2@8, ~@38 g2@3 ~@2 f2@3 ~@2]/6",
  AU: "[g2@9 f#2@9 f2@10 e2@18 e2@18 e2@38 ~@18]/5",
})).s("gm_fretless_bass").gain(0.72)

// chords · reed organ · "eSCALA #1"
const reed_organ = note("<~@64 A@2 ~@3 B@3 C@6 D E F G ~@89>".pickRestart({
  A: "[~ [e4,a4]@2 ~]/2", B: "[b3@11 ~ [d#5,f#5]@24 [c#5,e5]@24 [b4,d#5]@12]/3",
  C: "[d#5@12 [a4,c5]@23 ~ [c#5,e5]@24 [b4,d#5]@23 ~ [a#4,c#5]@23 [g#4,b4]@24 ~ [g5,b5]@12]/6", D: "[f#5,a#5] [e5,g#5]",
  E: "[d5,f#5] [c#5,f5]", F: "[b4,d#5] [a4,c#5]", G: "[g4,b4] ~",
})).s("gm_reed_organ").gain(0.64).pan(0.1)

// chords · rock organ · "eSCALA #2"
const rock_organ = note("<~@69 A@3 B@6 C D E F ~@89>".pickRestart({
  A: "[[b2,b3,b4]@11 ~ [d#6,f#6]@24 [c#6,e6]@24 [b5,d#6]@12]/3", // B D#m C#m B
  B: "[d#6@12 [a5,c6]@23 ~ [c#6,e6]@24 [b5,d#6]@23 ~ [a#5,c#6]@23 [g#5,b5]@24 ~ [g6,b6]@12]/6", C: "[f#6,a#6] [e6,g#6]",
  D: "[d6,f#6] [c#6,f6]", E: "[b5,d#6] [a5,c#6]", F: "[g5,b5] ~",
})).s("gm_rock_organ").gain(0.64).pan(1)

// drums · kick
const kick = s("bd").struct(`<
  A@3 ~ A B A C D B A C D E A C A B A C D E A C A B A C D B A C D B A F G B A C A@3 ~@2 A B A C D B A C D E A C A B A C
  D E A C A B A C D B A C D B A C D B A C A@3 ~@3 A H A ~ D B A C I J K L M N O P Q R S T U V W X@2 Y Z AA AB AC AD AE
  AF AG AH AI AJ AK AL AM AN AO AP AM AN AO AP AQ AN AO AP AQ AN AO AR AQ AN AO AP AM@3 ~ AS Y@6 AT AU AV AW AX AY AZ BA
  BB BC BD BE BF ~
>`.pickRestart({
  A: "~ x", B: "~@2 x!2", C: "~ x!2 ~@2 x ~@2", D: "~@4 x ~@2 x", E: "~@3 x!2 ~ x ~", F: "~ x!2 ~@2 x!2 ~",
  G: "~ x ~@2 x ~@2 x", H: "x", I: "~ x ~@4 x ~", J: "~@6 x ~@10 x ~@6", K: "~@4 x ~@10 x ~@8", L: "~ x ~@4 x ~@5",
  M: "~@2 x ~@9 x ~@8 x ~@2", N: "~@6 x ~@8 x ~@7 x", O: "~ x!2", P: "x ~@7 x ~@8 x ~@6", Q: "~ x ~@7 x ~@7 x ~@6",
  R: "~ x ~@7 x ~@8 x ~@5", S: "~ x ~@3 x ~@3 x ~@2", T: "~@2 x ~@8 x ~@7 x ~@4", U: "~@3 x ~@7 x ~@7 x ~@4",
  V: "~@3 x ~@8 x ~@7 x ~@3", W: "~ x ~ x ~ x", X: "~@5 x ~@7 x ~@7 x ~@2", Y: "~@5 x ~@5 x ~@5 x ~@5 x",
  Z: "~@5 x ~@5 x ~@4 x ~@5 x ~", AA: "~@2 x ~@2 x ~@2 x ~@2 x", AB: "~@4 x ~@5 x ~@4 x ~@5 x ~@2",
  AC: "~ x ~ x ~ x ~ x", AD: "~@3 x ~@4 x ~@5 x ~@5 x ~@3", AE: "~ x ~@2 x ~@2 x ~@2 x ~",
  AF: "~@2 x ~@4 x ~@5 x ~@5 x ~@4", AG: "~ x ~@5 x ~@5 x ~@5 x ~@4", AH: "~ x ~@4 x ~@5 x ~@5 x ~@5", AI: "x!4",
  AJ: "x ~@2 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x", AK: "~@13 x ~@10", AL: "~@3 x ~@6 x ~@13", AM: "~@5 x ~@18",
  AN: "~@5 x ~@5 x ~@12", AO: "~@5 x ~@15 x ~ x", AP: "~ x ~", AQ: "~@5 x ~@9 x ~@8", AR: "~@8 x ~@2 x ~@8 x ~@3",
  AS: "~@11 x ~@5 x ~@5 x", AT: "~@5 x ~@5 x ~@5 x ~@6", AU: "x ~@5 x ~@6 x ~@6 x ~@3", AV: "~@4 x ~@6 x ~@7 x ~@4",
  AW: "~@4 x ~@8 x ~@8 x ~", AX: "~@4 x ~@4 x ~@2", AY: "~@5 x ~@10 x ~@7", AZ: "~@5 x ~@12 x ~@5", BA: "~@3 x ~@4",
  BB: "x ~@2 x", BC: "~@2 x ~@4 x ~@3 x ~@4 x ~@3 x ~@3", BD: "~ x ~@3 x ~@4 x ~@3 x ~@4 x ~@3 x",
  BE: "~@4 x ~@3 x ~@4 x ~@3 x ~@4 x ~", BF: "~ x ~@10",
})).gain(0.49)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A D ~ B A E ~@5 A B A C A B A C A B A C A B A C A B A
  C A B A C A B A C A B A C A B A C ~@8 F A ~ B A C G H I J K L M N O P Q R S T U V W X Y@2 Z@2 AA@2 AB@2 AC@2 AD ~ AE
  AF AG AE AH AF AG AE AI AF AG AE AI AF AG AE AJ AF AG AE AK ~@4 AL AM AN AM AN AM AN AO AP AQ ~@4 AR AS ~@5
>`.pickRestart({
  A: "x", B: "x ~@4 x ~@2", C: "x ~@2 x ~@2 x ~", D: "x ~@2 x ~@4", E: "x ~@2 x ~@2 x!2", F: "~@18 x ~ x!2 ~ x",
  G: "x!3 ~", H: "x ~@11 x ~@10 x", I: "~@5 x ~@4 x ~", J: "~@7 x ~@9 x ~@4 x ~", K: "x ~@6 x ~@8 x ~ x!3 ~@3",
  L: "~ x ~@10", M: "~@2 x!2 ~@8", N: "~@6 x!2 ~@4", O: "~@5 x ~@7 x ~@7 x ~@2", P: "~@5 x ~@8 x ~@7 x ~",
  Q: "~@3 x ~@3 x ~@3 x", R: "~@6 x ~@8 x ~@7 x", S: "~@7 x ~@7 x ~@7 x", T: "~ x!2", U: "x!3", V: "x ~@8 x ~@7 x ~@6",
  W: "~ x ~@7 x ~@7 x ~@6", X: "~ x ~@17 x ~ x ~ x", Y: "~@9 x!3", Z: "~@17 x ~ x ~ x ~@2", AA: "~@8 x!3 ~",
  AB: "~@15 x ~ x ~ x ~@4", AC: "~@7 x!3 ~@2", AD: "x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2", AE: "~@17 x ~@6",
  AF: "~@3 x", AG: "~@9 x ~@7 x ~@6", AH: "~@3 x ~@7 x ~@5 x ~@2 x ~@3", AI: "~@3 x ~@7 x ~@5 x ~@6", AJ: "~ x ~@6",
  AK: "~@3 x ~@7 x ~@12", AL: "~@5 x ~@8 x ~@5 x ~@3", AM: "~ x ~@2 x ~@2 x!2 ~@3", AN: "~@7 x ~@2 x ~",
  AO: "~@2 x ~@5 x ~@5 x ~@6 x ~@2", AP: "~@3 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3",
  AQ: "x ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x ~@4", AR: "~ x ~@14 x ~@7", AS: "~@3 x ~@4",
})).gain(0.49)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@40 A ~@46 B C D E A ~@3 F G H I J K L M N O P Q R S T U N V W X Y Z AA AB AC AD AE AF ~@27 AG AH AI AH AJ AH AJ AK
  AL AM AN AO AP AQ AR AS ~@5
>`.pickRestart({
  A: "x!4 ~@4", B: "~@5 x!2 ~ x!2 ~ x ~@12", C: "~@4 x!2 ~@2", D: "~@3 x!2 ~@7", E: "~@15 x ~@2 x ~@2 x ~ x",
  F: "~@2 x!2", G: "x ~@5 x ~@5 x ~@4 x ~@5 x", H: "~@4 x ~@5 x ~@4 x ~@4 x ~@3", I: "~@2 x ~@4 x ~@4 x ~@4 x ~@6",
  J: "~@7 x ~@4 x ~@11", K: "~@2 x ~@3 x ~@12 x!5", L: "x ~ x!2 ~@8 x ~@3 x ~@7", M: "~@4 x ~ x ~ x ~ x ~@10 x ~@2",
  N: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2", O: "~ x ~@3 x ~@3 x ~@4 x ~@3 x ~@3 x ~", P: "~ x ~ x ~ x ~ x ~ x ~ x",
  Q: "~@2 x ~@3 x ~@4 x ~@3 x ~@3 x ~@3 x", R: "~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x",
  S: "~@3 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3", T: "x!6", U: "x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2",
  V: "~ x ~@5 x ~ x ~ x ~ x ~ x ~ x ~@6", W: "~ x ~ x ~@3 x ~ x ~ x ~ x ~ x!2 ~@7", X: "x!2 ~ x!6 ~@3",
  Y: "x ~ x ~@3 x ~ x ~ x ~ x!2 ~ x ~@7 x", Z: "~ x ~@3 x ~ x ~ x ~ x ~ x ~ x ~@7 x",
  AA: "~ x ~@3 x ~ x!2 ~ x ~ x ~ x ~@7 x ~", AB: "x ~ x!6 ~@3 x", AC: "x ~@3 x ~ x!2 ~ x ~ x ~ x ~@7 x ~ x",
  AD: "~@3 x ~ x ~ x ~ x ~ x ~ x ~@7 x ~ x", AE: "~@3 x!2 ~ x ~ x ~ x ~ x ~@7 x ~ x ~", AF: "~ x!6 ~@3 x!2",
  AG: "~@14 x ~@2 x ~@2 x ~@2 x", AH: "~@2 x ~@2 x ~@2 x ~@15", AI: "~@8 x ~ x ~@3 x ~@2 x ~@2 x ~@2 x",
  AJ: "~@2 x ~ x ~@3 x ~ x ~@3 x ~@2 x ~@2 x ~@2 x", AK: "~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@3 x ~@2",
  AL: "x ~@2 x ~@2 x ~@3 x ~@2 x ~@3 x ~@2 x ~@3", AM: "x ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x ~@4", AN: "~ x ~@8 x ~@8 x ~@4",
  AO: "~@5 x ~@9 x ~@8", AP: "~@2 x ~@10 x ~@10", AQ: "~@2 x ~@12 x ~@8", AR: "~@5 x ~@14 x ~@3", AS: "~@13 x ~@10",
})).gain(0.44)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A B@11 A B@7 A B@10 C A B@2 C ~@5 A B@11 A B@7 A B@15 ~@10 D B@3 E ~@30 F@3 G F@4 H F@3 H F@2 I F@3 J ~@25
>`.pickRestart({
  A: "~@2 x!2", B: "x!4", C: "x!3 ~", D: "~@3 x", E: "x", F: "~@5 x ~@5 x ~@5 x ~@5 x", G: "~@5 x ~@5 x ~@5 x ~@6",
  H: "~@11 x ~@5 x ~@5 x", I: "~@5 x ~@18", J: "~@5 x ~@5 x ~@12",
})).gain(0.49)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@4 A ~@3 B ~@3 B ~@3 A ~@3 B ~@3 A ~@3 B ~@3 B ~@12 A ~@3 B ~@3 B ~@3 A ~@3 B ~@3 A ~@3 B ~@3 B ~@3 B ~@12 C ~@34 D
  ~@7 E ~@3 E ~@33
>`.pickRestart({
  A: "~ x!2 ~@5", B: "~ x ~@6", C: "~@2 x!2 ~ x!2 ~ x ~@15", D: "~@20 x ~@2 x", E: "~@7 x",
})).gain(0.49)

// drums · crash
const crash = s("cr").struct(`<
  A@3 ~@32 B C ~@3 A@3 ~@38 A@3 ~@3 A D A ~ A ~@3 A ~@3 E ~ F G ~@9 H@2 I@2 C@2 J@2 K@2 D L M N H ~@7 H ~@3 H ~@2 O ~@4
  H@3 ~ P@7 ~@6 B Q R S T U J ~
>`.pickRestart({
  A: "~ x", B: "~@3 x", C: "~ x ~@6", D: "x", E: "~@2 x ~@18 x ~@2", F: "~ x ~", G: "~@17 x ~@6", H: "~@5 x ~@18",
  I: "~ x ~@4", J: "~ x ~@10", K: "~ x ~@22", L: "~@23 x", M: "~@13 x ~@10", N: "~@3 x ~@6 x ~@13",
  O: "~@11 x ~@9 x ~@2", P: "~@11 x ~@12", Q: "~@3 x ~@4", R: "x ~@2 x", S: "~@2 x ~@4 x ~@3 x ~@4 x ~@3 x ~@3",
  T: "~ x ~@3 x ~@4 x ~@3 x ~@4 x ~@3 x", U: "~@4 x ~@3 x ~@4 x ~@3 x ~@4 x ~",
})).gain(0.44)

stack(bass, reed_organ, rock_organ, kick, snare, low_tom, mid_tom, open_hat, high_tom, crash)

More by Queen