Strudelify

The Black Page #1

Zappa

KeyG majorTempo60 bpm
0:00/0:00
// The Black Page #1 — Zappa
// 60 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 4 "Bass Notes" named as a bass, played on electric bass finger (its piano patch is not one)
// note: Full arrangement: all 60 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(60/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 · piano
const piano = note("<A B C D E F G H I J K L M N O P Q R D E S G T U V W X Y Z AA ~@30>".pickRestart({
  A: "b4!8 f#5!2 c#5 b4 a5@5 c6 g5@2 e5@6 a5@4 f#5@2",
  B: "g5 c6 ~ f5 a5@4 e5 ~@2 d5 c6@7 a5@3 g5@3 ~ e5@3 d5@3, ~@19 c6 ~@12", C: "c#5@6 d5 g5 e5!24",
  D: "c5 e5 d5 f5 e5 g4 f5 d5 a5 c6 ~ e5!2 f5 [d5,e5] a4 a#4 c5!2 d5 ~ d5 e5 f5 g#5 g4!2 d5 ~ f4!2 e4", // Dsus2
  E: "b4!17 c#5!2 b4 d5 f5 a4!2 ~ a#4 c#5 e5 [a5,a#5] f5 c5 g4", F: "a4!9 [a4,a5] a5!20 a4!2",
  G: "a4!8 b5!10 c#5!10 e5!4", H: "e5!6 c#5!10 a#4 c5!2 a4 d5 d#5 g4!2 ~ a4 f4 e4 g4 e4!2 d5", I: "c#5!32",
  J: "c#5!8 a#4@5 a4 g#4 d5 e4 b4 ~ a4 c#5 a4 [a4,b4] g#4 ~@3 f#4@2 ~ g#4@2, ~@26 c5@2 ~ b4@2 ~", // Asus2
  K: "g#5@2 ~ c#5@2 ~ f#4@2 g#5@2 ~ c#5@2 ~ f#4!18, ~@2 f#5@2 ~ e5@2 ~@3 f#5@2 ~ e5@2 ~@17",
  L: "f#4!16 g#5 a5 g#5 ~ g#5 a5 f#5 ~ g#5 ~ b4 a5 f#5 c#5 b5 f#5",
  M: "g#5 e5!2 c#5 f#5 g#5!2 b5 a5 g#5!2 b5 f#5 f#4!2 b4 c#5 a4 b4 e5 g#5 f#4 b4 c#5 d5 a5 f#5 e5 f#5 g#5 e5 b4",
  N: "~@4 f#5 g#5 e5 b4 ~@8 f#5 g#5 e5 b4 ~@8 f#5 g#5 e5 b4",
  O: "a5!5 g#5@3 f#5@3 e6@3 f#5@3 ~ b5@2 ~ c#6 ~ b5!2 a5 ~ g#5 a5 f#5 e5!2, ~@5 a5 ~@11 f#5@2 ~ g#5@2 ~@10",
  P: "f#5!8 f#4 b4!2 a4 b4@5 ~ [b4,c#5] ~ f#4@6 g#4@4 b3@2", // Bsus2
  Q: "c4 a#4 ~ f4 d#5@4 c#5 ~@2 a#4 c5!7 g#4@3 c#5@3 ~ f5@3 a#4@3, ~@19 d#5 ~@12", R: "d#5!6 c#5 f5 c5!24",
  S: "a4!10 a5!20 a4!2", T: "e5!6 c#5!10 a#4 c5!2 a4 d5 d#5 g4!2 ~ a4 f4 e4 g4 e4!2 a#4", U: "b4!32",
  V: "b4!8 g#4@5 g4 f#4 c5 d4 a4 ~ g4 b4 g4 [g4,a4] f#4 ~@3 e4@2 ~ f#4@2, ~@26 a#4@2 ~ a4@2 ~", // Gsus2
  W: "f#5@2 ~ b4@2 ~ e4@2 f#5@2 ~ b4@2 ~ e4!18, ~@2 e5@2 ~ d5@2 ~@3 e5@2 ~ d5@2 ~@17",
  X: "~@5 f#4 [g4,c5] b4 f5 f#5 [d#5,a5] f#5 g5 f#5!2 d#5 a5 [a5,d6] b5 c6 [b5,e6] b5 c6 [d5,a5] b5 e5 g5!2 [f#5,d6] f#5 a5 [b4,e5]", // C5 D#dim D5 E5 D5 D E5
  Y: "g#5!5 ~ c5!10 g5!16",
  Z: "~ d#5 a#5 g#5 f5!2 g5 d#5 ~ a#4 g#5 c6 a#5 g#5!2 f5 a#5 f#5 f5 g#5 c#5 d#5 b4 [f5,g#5] f5 [d#5,f#5] c#5 f5 [d#5,g#5] c#5 f#5 [d#4,f4]", // Fm D#m G#5 D#sus2
  AA: "c5!32",
})).s("gm_piano").gain(0.2)

// bass · electric bass finger · "Bass Notes"
const bass = note("<~@30 A B A C A C A C D@4 E@2 F G H I J K L M C N O ~ P@2 Q R>".pickRestart({
  A: "[g2,g3]", B: "[a#2,a#3]@31 ~", C: "[a#2,a#3]", D: "[[d3,d4]@63 ~]/2", E: "[[d3,d4]@11 ~@5]/2", F: "[d3,d4]@31 ~",
  G: "[d3,d4]", H: "[f#2,f#3]@31 ~", I: "f#2@15 ~ f#2@15 ~, f#3@31 ~", J: "[a#2,a#3]!2", K: "[g2,g3]@31 ~",
  L: "[a#2,a#3]@15 ~ [a#2,a#3]@16", M: "[g2,g3]@27 ~@5", N: "[c3,c4]@31 ~", O: "[c3,c4]", P: "[c3,c4]/2",
  Q: "[c#3,c#4] [b2,b3]", R: "[g#2,g#3]",
})).s("gm_electric_bass_finger").gain(0.26)

// drums · kick
const kick = s("bd").struct("<~@15 [~@15 x] x ~@28 [~@15 x] x ~@13>").gain(0.41)

// drums · snare
const snare = s("sd").struct("<~@3 A ~@3 B ~ C ~@8 A ~@3 B ~ D E ~@7 A ~@3 B ~ C ~@8 A ~@3 B ~ D E ~@4>".pickRestart({
  A: "~@31 x", B: "~@27 x ~ x!2 ~", C: "~ x", D: "~@16 x ~@10 x ~@4", E: "~@3 x ~@3 x ~@8",
})).gain(0.41)

// drums · clap
const clap = s("cp").struct("<~@28 [~@31 x] ~ [~@6 x ~@6 x!2 ~]!28 [~@12 x ~@13 x ~ x ~@2 x] ~>").gain(0.26)

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

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A B ~@2 A ~ C ~@6 D ~ A B ~@2 E ~ F ~@3 G ~@4 A B ~@2 A ~ C ~@6 D ~ A B ~@2 E ~ F ~@3 G ~
>`.pickRestart({
  A: "~ x", B: "~@25 x ~@6", C: "~ x ~@2", D: "~ x ~@9 x ~@17 x ~@2", E: "~@16 x ~@14 x", F: "~@13 x ~@2",
  G: "~@9 x ~@22",
})).gain(0.41)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~ A B C D ~@2 E ~ F ~@2 G ~@3 H I C D ~@2 J ~ K L M N ~ O ~ A B C D ~@2 E ~ F ~@2 G ~@3 H I C D ~@2 J ~ K L M N ~ O
>`.pickRestart({
  A: "~@11 x ~@17 x ~@2", B: "~@3 x ~@12", C: "x ~ x ~@4 x ~@6 x ~@2 x!3 ~ x ~@5 x ~@4", D: "~@10 x ~@4 x",
  E: "~@17 x!2 ~ x ~@10 x", F: "~@15 x ~@10 x ~@5", G: "~@3 x", H: "~@3 x ~@4", I: "~ x ~@2", J: "~@17 x!2 ~ x ~@11",
  K: "~@15 x ~@16", L: "~@5 x ~@7 x ~@18", M: "~@6 x ~@16 x ~@8", N: "~@5 x ~@5 x ~@20", O: "x",
})).gain(0.41)

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

// drums · ride
const ride = s("rd").struct(`<
  ~ A ~ B C ~ D E ~@3 F G ~ H ~ I J B C ~ D E ~@3 K ~ L ~@2 A ~ B C ~ D E ~@3 F G ~ H ~ I J B C ~ D E ~@3 K ~ L ~
>`.pickRestart({
  A: "~@3 x ~@28", B: "~@3 x ~@2 x ~@6 x ~@9 x ~@8", C: "~@21 x ~@7 x ~@2", D: "~ x ~@2", E: "~@21 x ~@10", F: "~@15 x",
  G: "~@7 x ~@3 x ~@20", H: "~@18 x ~@4 x!2 ~@7", I: "~@4 x ~@14 x ~@6 x ~@5", J: "x ~@6 x ~@24",
  K: "~@8 x ~ x ~@4 x ~@2 x ~ x!2 ~@2 x ~@7", L: "~ x ~@2 x!2 ~ x ~@7 x ~@2 x ~@2 x ~ x!3 ~ x!2 ~@3",
})).gain(0.41)

// drums · tambourine
const tambourine = s("tb").struct("<A ~@9 B C D E F G ~@9 H I ~ J ~ A ~@9 B C D E F G ~@9 H I ~ J ~>".pickRestart({
  A: "~@8 x!2 ~@20 x ~", B: "~ x ~@3 x ~@10", C: "~@22 x ~@5 x ~@2 x", D: "~@2 x ~@3 x ~@6 x!2 ~", E: "~ x ~@2 x ~@2 x",
  F: "~@8 x ~@5 x ~@2 x ~@11 x ~@2", G: "x", H: "x!2 ~@2", I: "~@9 x ~ x ~ x!2 ~@13 x!2 ~@2", J: "~@17 x ~@7 x ~@4 x ~",
})).gain(0.41)

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

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@4 A ~@9 B ~@4 A ~@8 C ~@5 A ~@9 B ~@4 A ~@8 C ~>".pickRestart({
  A: "~@7 x", B: "x", C: "~ x ~@4 x ~ x ~@7",
})).gain(4.81)

// drums · bongos
const bongos = s("bongo:4").struct("<A B ~ C ~@14 C ~@7 D ~ E ~ A B ~ C ~@14 C ~@7 D ~ E ~>".pickRestart({
  A: "~@17 x ~@14", B: "~ x ~@10 x ~@6 x ~@12", C: "~@9 x ~@22", D: "~@19 x ~@2 x ~@9", E: "~@11 x ~@20",
})).gain(1.08)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@14 [~@21 x ~@10] ~@29 [~@21 x ~@10] ~@15>").gain(1.08)

// drums · congas
const congas = s("conga:13").struct("<~@26 [~@17 x ~@10 x ~@3] ~@29 [~@17 x ~@10 x ~@3] ~@3>").gain(1.31)

// drums · congas
const congas_2 = s("conga:33").struct("<~@14 A ~@11 B ~@17 A ~@11 B ~@3>".pickRestart({
  A: "~@11 x ~@20", B: "~@5 x ~@2",
})).gain(1.31)

stack(
  piano, bass, kick, snare, clap, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride, tambourine, cowbell,
  vibraslap, bongos, bongos_2, congas, congas_2
)

More by Zappa