Strudelify

äºäæå æé¾åç徿² (Saxophone Quartet and Drum Set)

Wang Shi Xian Sun Shu Mei

KeyE majorTempo90 bpm
0:00/0:00
// äºäæå æé¾åç徿² (Saxophone Quartet and Drum Set) — Wang Shi Xian Sun Shu Mei
// 90 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Transcription provider: pdmx. https://musescore.com/score/2940901; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 46 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(90/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  A B C D E C F G H I J K L M N O P Q R S T U V U W X ~@2 Y Z ~@2 AA@2 ~ AB AC@2 AD AE AF AG I AH AI AJ
>`.pickRestart({
  A: "~@4 f#4 g4 [e4,f#4] f#4 e4 [d4,e4] d4 c#4 [b3,c#4] b3 a3 [f#3,g3]", B: "~ a#3 g#3 f#3", C: "f#4", D: "c#4",
  E: "b4@2 a4 g4", F: "e4@2 e4 f#4 g4@6 e4 f#4 g4 d5 c#5 b4", G: "f#4@2 f#4 e4 d4@6 b3 c#4 d4 b3 d4 f#4",
  H: "e4@6 d4 [d4,e4] c#4@2 ~@2 a4@4", I: "b4@3 ~", J: "b4@4 ~ f#4 b4 d5", K: "c#5@4 ~ b4 f#4 g4", L: "e4 ~",
  M: "b4@8 ~@2 f#5 e5 d5@2 b4@2", N: "e5 ~", O: "f#5@8 ~ b3 d4 f#4 b4@2 g4 f#4", P: "e4@4 ~ f#4 g4 ~",
  Q: "g4@6 g4@2 f#4@2 b3 ~ d4 ~ f#4 ~", R: "b4!3 c#5 d5@4", S: "c#5 e5 d5 c#5 b4@4", T: "e5 e5@2 f#5 g5@4",
  U: "f#5 e5 d5 e5 f#5@4", V: "e5!3 f#5 g5 e5@3", W: "~@2 e5!2 e5@2 d5@2 c#5@2 e5@2 d5@2 c#5@2", X: "c#5 b4@7",
  Y: "g4!3 b4 a4 a4@2 d4", Z: "e4 f#4@7", AA: "[g4!3 b4 c#5@2 b4 b4@2 c#5@7]/2", AB: "~@5 f#4 c#4 d4",
  AC: "[e4!3 f#4 g4 b4 a4 g4@2 f#4@7]/2", AD: "f#4@3 d4 b3 d4 f#4@2", AE: "e4@3 b3 c#4@4",
  AF: "f#4 f#4@2 f#4 a4 a4@2 a4", AG: "[b4,c#5] b4@15", AH: "~@10 b3 d4 f#4@4",
  AI: "~@2 e4 [e4,f#4] d4@2 b3@2 c#4@2 ~@2 f#3@4", AJ: "b3",
})).s("gm_alto_sax").gain(0.64)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note(`<
  A B C D E F G H I J K L M N O N P Q R S T U V W X Y Z AA ~@2 Z AB ~ AC AD AE ~@2 AF AG AH AI AJ ~ AK AL
>`.pickRestart({
  A: "~@4 f#4 g4 [e4,f#4] f#4 e4 [d4,e4] d4 c#4 [b3,c#4] b3 a3 [f#3,g3]", B: "f#3", C: "f#4@2 ~@3 c#4 d4 e4",
  D: "f#4@2 ~@3 b3 d4 f#4", E: "b4@2 ~@3 c#4 d4 e4", F: "f#4@4 ~@6 f#4 e4 c#4@2 f#3@2", G: "e3 f#3 g3@3 e3 g3 e3",
  H: "f#3@2 e3@2 d3@6 b2@2 d3@2 e3 f#3", I: "e3@3 d3 c#3 ~ a3@2", J: "b3@3 ~", K: "b3!3 c#4 d4@4",
  L: "c#4 e4 d4 c#4 b3@4", M: "e4 e4@2 f#4 g4@4", N: "f#4 e4 d4 e4 f#4@4", O: "e4@2 e4@2 e4 ~ f#4 ~ g4@2 e4@6",
  P: "~@2 e4!2 e4@2 f#4@2 g4@2 b4@2 a4@2 g4@2", Q: "g4 f#4@3 ~@4", R: "b3@4 ~ f#3 b3 d4", S: "c#4@4 ~ b3 f#3 g3",
  T: "e3 ~", U: "b3@8 ~@2 f#4 e4 d4@2 b3@2", V: "e3@3 e3 e3@4", W: "f#4@8 ~ b2 d3 f#3 b3@2 g3 f#3",
  X: "e3@4 ~ f#3 g3 ~", Y: "f#3@6 f#3@2 f#3@4 a3 c#4 e4 a4", Z: "b3@2 b3@2 b3@3 c#4", AA: "d4@3 e4 d4@2 c#4@2 b3@8",
  AB: "d4 e4 d4 c#4@2 b3@3", AC: "~@6 b3 e4 f#4@2 e4@2 c#4@2 f#3@2", AD: "f#3!3 e3 d3!2 c#3 b2", AE: "c#3",
  AF: "f#3@3 d3 b2 d3 f#3@2", AG: "e3@3 b2 c#3@4", AH: "a3 a3@2 a3 c#4 c#4@2 c#4", AI: "d4", AJ: "d4@3 ~",
  AK: "~@2 e3 [e3,f#3] d3@2 b2@2 c#3@2 ~@2 f#3@4", AL: "b2",
})).s("gm_tenor_sax").gain(0.64)

// other · baritone sax · "Baritone Saxophone"
const baritone_sax = note(`<
  ~ A B C D E F G H I B J K L K J M N B J K L K O P Q R S T U R V W X B Y Z AA AB AC AD AE AF AG AH AI
>`.pickRestart({
  A: "f#2", B: "b2@3 b2 b2@4", C: "f#2@7 f#2 b2@8", D: "e2@3 e2 a2@4", E: "d2@6 d2 e2 f#2@8", F: "e2@3 e2 e2@3 e2",
  G: "b2@7 b2 b2@8", H: "e2@3 e2!2 ~ a2@2", I: "b2@3 b2 b2@2 ~@2", J: "f#2@7 f#2 b2@2 b2@4 f#2@2", K: "e2@3 e2 e2@4",
  L: "b2@7 f#2 b2@2 b2@4 d2 f#2", M: "e2@6 e2@2 c#2@6 c#2 e2", N: "f#2@6 f#2@2 f#2 ~@7", O: "b2@7 b2 b2@2 b2@4 f#2@2",
  P: "e2@3 e2 f#2@3 f#2", Q: "b2@7 b2 b2@4 a2@4", R: "b2@7 b2 b2@4 f#2@4", S: "g2@3 g2 g2@3 g2",
  T: "e2@7 e2 a2@2 a2@4 a2@2", U: "d2@6 d2 e2 f#2@4 c#3@2 f#2@2", V: "g2@6 g2@2 g2@6 g2 f#2",
  W: "e2@7 e2 c#2@2 c#2@4 c#2@2", X: "f#2@6 b2 e3 f#3@2 e3@2 c#3@2 f#2@2", Y: "f#2@6 f#2@2 f#2@6 b2 f#2",
  Z: "e2@3 e2 e2@2 a2@2", AA: "d3@3 d3 d3@2 d3 a2", AB: "b2@3 b2 b2@2 f#2@2", AC: "a2@6 a2@2 a2@6 b2 a2",
  AD: "f#2@3 f#2 f#2@3 f#2", AE: "b2@6 b2@2 b2@2 b3 f#3 d3@2 b2@2", AF: "e2@6 e2@2 e2@6 e2 f#2",
  AG: "b2@7 b2 b2@6 f#2@2", AH: "g2@3 g2 f#2 ~ a2@2", AI: "b2",
})).s("gm_baritone_sax").gain(0.64)

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

// drums · rim
const rim = s("rim").struct("<~@2 A@3 B ~@4 A@7 C A@7 C ~@11 D ~@4 A@2 C ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x ~@6", C: "~ x ~@2", D: "~@5 x ~@2",
})).gain(0.48)

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

// drums · low tom
const low_tom = s("lt").struct("<~@45 [~ x]>").gain(0.48)

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

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

// drums · open hat
const open_hat = s("oh").struct("<~@3 A ~@11 A ~@5 A ~@15 A ~@8>".pickRestart({
  A: "~@7 x",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@5 A ~@19 B ~@3 C ~@3 A ~@7 A ~@3 D>".pickRestart({
  A: "~@10 x!2 ~@4", B: "~@3 x", C: "~@5 x ~@2", D: "~@3 x ~ x ~@10",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@6 A ~ B ~@16 C A ~@3 A ~@3 A ~@7 A ~ B D>".pickRestart({
  A: "x", B: "~@3 x", C: "~ x", D: "x!2",
})).gain(0.48)

// drums · ride
const ride = s("rd").struct("<[~@5 x ~@2] [x!16] ~@7 [~ x] ~@36>").gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@6 [~@3 x]!2 ~@18 [~ x ~ x]!8 [~@3 x]!8 ~@4>").gain(0.48)

stack(
  alto_sax, tenor_sax, baritone_sax, kick, rim, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride,
  tambourine
)