Strudelify

Black Cow

Steely Dan

KeyG majorTempo94 bpm
0:00/0:00
// Black Cow — Steely Dan
// 94 bpm, 4/4, key G major. 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 117 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(94/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.

// chords · epiano1 · "untitled"
const epiano1 = note(`<
  ~ A B A B C@2 D@2 E@2 F@2 G H I J@2 K@2 G H I L@2 M N O P Q R S T U@2 V@2 E@2 W@2 G H I J@2 K@2 G H I L@2 M N O P Q R
  S T U@2 V@2 X@2 Y Z AA@2 AB AC AD@3 AE AF AG AH AI AJ@2 AK AL O P AM AN AO T AP AL O AQ AR AL O AQ AR AL O AQ AR AL O
  AQ AR AL O AQ AR AL O AS@2 ~
>`.pickRestart({
  A: "c3@3 c2 ~@2 c2 ~@9", B: "a2@3 c2 ~@2 c2 ~@9", C: "[[a#3,e4,a4,c5]@31 ~]/2", D: "[[a#3,e4,a4,c5]@15 ~]/2",
  E: "[[e4,a4]@3 [d4,g4]@8 ~ [a#3,e4,a4]@2 ~@2 [e4,a4]@3 [d4,g4]@12 ~, [a#3,c5]@12 ~@2 c5@17 ~, ~@16 a#3@15 ~]/2", // A5 G5 A A5 G5 A#sus2
  F: "[[e4,a4]@3 [d4,g4]@9 [e4,a4]@2 ~@2 [e4,a4]@3 [d4,g4]@5 [c4,c#4,f4]@8, a#3@13 ~ c5@10 ~@8, ~@16 a#3@7 ~ g3@6 ~@2]/2", // A5 G5 A5 G5 C#maj7
  G: "[g3,b3,c4,e4]", H: "[g#3,d4,g4]@15 ~", I: "[g3,a#3,d4,g4]@15 ~",
  J: "[[e4,a4]@3 [d4,g4]@9 [e4,a4]@2 ~@2 [e4,a4]@3 [d4,g4]@13, a#3@14 ~@2 a#3@15 ~, c5@6 ~ c5@9, g4 ~@31]/2", // A5 G5 A5 G5
  K: "[[e4,a4]@3 ~@9 [e4,a4] ~ c5 ~ [d4,e4] ~@2 [d4,g4]@5 [c4,c#4,f4]@8, [a#3,c5]@6 a#3@3 ~@3 g3@3 ~, ~@3 [d4,g4]@11 ~@2 c5@16, ~@16 a4@3 ~@13]/2", // A5 Dsus2 G5 C#maj7 A#sus2 G5
  L: "[[f#4,a4]@13 ~@3 a4@15 ~, [a3,d4], ~@15 f#5@8 ~@9, ~@15 a5@6 ~@11, ~@16 d5@9 ~@7]/2", M: "[b3,e4], g#4@7 ~",
  N: "[d4,f#4,g4,b4]", O: "[g3,b3,c4,e4]@15 ~", P: "[b3,e4,g#4]@3 [a3,d4,f#4]", Q: "[g#3,c#4,e4]@7 ~@3 [f#3,b3,e4]@5 ~",
  R: "[g#3,c#4,e4]@6 [g3,c#4,f#4]@9 ~", S: "[a3,d4,f#4]@5 ~ [b3,e4,a4]@9 ~",
  T: "[c#4,e4,a4] ~@2 [b3,e4,g#4] ~@2 [c#4,e4,a4]@9 ~", // A E A
  U: "[~ b5, [g3,b3,c4,e4]@15 g5@17, ~@12 b4@19 ~, ~@13 c5@18 ~, ~@7 e5@9]/2", // Cmaj7
  V: "[~@16 d6@8 ~@2 [a#3,d4,g4]@2 ~ [a#3,d#4,g#4] ~@2, [a#3,d4,d#4,g4]@25 ~@7, ~@3 d5@3 ~@2, ~@13 d#5@2 a#5@10 ~@7, ~@14 g5@11 ~@7]/2", // Gm D#sus4 D#maj7
  W: "[[e4,a4]@3 [d4,g4]@9 [e4,a4]@2 ~@2 [e4,a4]@3 [d4,g4]@5 ~ g3@6 ~, a#3@13 ~ c5@10 ~@8, ~@16 a#3@7 ~ [c4,c#4,f4]@8]/2", // A5 G5 A5 G5 C#maj7
  X: "[[f3,b3,e4]@31 ~]/2", Y: "~@4 d5!2 ~ d5 e5@2 d5 ~ b4@2 a4 ~, [f3,a3,d4]@15 ~, ~@8 d5 ~@3 a4 ~@3",
  Z: "f4 ~ f4 g4 e4@2 d4 ~@2 a3 b3 d4 ~@4, ~@4 d4 ~@11",
  AA: "[e4 f#4 g4 a4 b4 c#5 d5 e5 f#5@2 e5 a5 [e5,f#5] ~ e5 f#5 b4 c#5 d5 c#5 ~ a4 b4@2 g4@2 f#4@2 e4@4, g3@11 ~@5, c#4@7 ~@9, ~@8 e5 ~@23]/2", // Esus2
  AB: "[g4,g5]@7 ~ [f#4,f5,f#5] [e4,e5]@6 [f#4,f#5], ~@9 f4 ~@6", AC: "[d#4,d#5]@15 ~",
  AD: "[~ e5 a5!2 e5!2 g5 ~ e5@2 f#5 ~ d5@2 a4 ~@3 d5 ~ a4 b4 e4 g4 f#4@2 a4 ~ d4 ~ e4 f#4 ~@3 [g4,b4]@2 ~@2 [c5,e5]@2 f#5 g5 ~ [d5,f#5]@3 [b4,e5], g3@7 ~, [b3,c4]@11 ~@5, e4@21 ~@12 [e4,g4]@3 ~@2 [b4,d5]@3 d5@2 ~@5, ~@17 a4@2 ~@15 [f#4,a4]@3 [a4,c5]@3 ~@8]/3", // G C D E5 Cmaj7 Em Bm F#m …
  AE: "f#5 b4@2 d5 e5 d5@2 c5 d5 ~@3 [a4,b4] a4@2 ~, e5@3 ~ a4@4 ~ [g4,c5]@5 ~@2", // Asus2 C5
  AF: "g#4 ~ g#4 ~ [f#4,g4] ~ [e4,f#4] e4 g#4@2 b4 ~ e5 ~@2 f#5, ~@8 f#4 ~@7", // Gmaj7 Esus2
  AG: "d5@2 c#5 ~ b4 e4 f#4 e4 g#4@2 e4 ~ e4@4", AH: "[d5,d6]@7 c#6 [c#5,c6] b5@6 [c#5,c#6], ~@4 b4@3 ~",
  AI: "~@9 [d4,d#4]@6 ~, a#4, ~ a#5@15, ~@4 g4@3 ~", AJ: "[~ [c#5,d5,f#5,a5], [c#4,d4,f#4,a4]@5 ~@3]/2",
  AK: "[b3,e4,g#4]@15 ~", AL: "[d4,f#4,g4,b4]@15 ~", AM: "[g#3,c#4,e4]@9 ~ [f#3,b3,e4]@6",
  AN: "[g#3,c#4,e4]@5 ~ [g3,c#4,f#4]@9 ~", AO: "[a3,d4,f#4]@5 ~ [b3,e4,a4]@8 ~@2", AP: "[b3,e4,g#4,b4]",
  AQ: "[b3,e4,g#4]@4 ~ [a3,d4,f#4]@3", AR: "[e4,g#4,b4]@15 ~", AS: "[[b3,c#4,e4,g#4,b4]@27 ~@5]/2",
})).s("gm_epiano1").gain(0.22)

// bass · electric bass finger
const bass = note(`<
  ~@8 A B C D E F G H I D J K L M N O P Q R S T U V W X Y Z AA AB AC C D E F G H AD D J K L M N O P Q R S T U V W X Y Z
  AA AE ~@2 AF AG AH AI AJ AK AL ~@5 AM AN ~@2 AO AP AQ AR AS ~@2 AT AU AV AW AX AY@2 AZ AX BA BB BC BD BE BF BG BH R BI
  BJ AX Q BK BJ BL@2 ~
>`.pickRestart({
  A: "~@6 c2 ~@9", B: "[c2,c3]@3 c2 ~@2 c2 ~@4 c2 c3@2 g1 ~", C: "c2 ~@2 c2 ~@2 c2 ~@4 c2 g1@2 a1@2",
  D: "c2 ~@2 c2 ~@2 c2 ~@4 c2 c3@2 g1@2", E: "c2 ~@2 c2 ~@2 c2@2 a1@8",
  F: "d2 ~@2 d2 ~@2 d2 ~@5 d3@2 d2 ~, ~@12 d2 ~@3", G: "e2 ~@3 e2 ~@2 e2 ~@3 e1 e2@2 e1@2",
  H: "d#2 ~@2 d#2 ~@2 d#2 ~@4 d#3@3 d#2@2, ~@11 d#2 ~@4", I: "c2 ~@2 c2 ~@2 c2 ~@4 c2 c3@2 c2 ~",
  J: "c2 ~@2 c2 ~@2 c2 ~@4 c2 c3@2 g1 ~", K: "c2 ~@2 c2 ~@2 c2 ~ a1@6 ~@2", L: "d2 ~@2 d2 ~@2 d2 ~@5 c2@2 d2 ~",
  M: "e2 ~@2 e2 ~@2 e2 ~@3 e1 e2@2 ~ e1@2", N: "d#2 ~@2 d#2 ~@2 d#2 ~@4 d#2 d#3@2 d#2 ~",
  O: "d2 ~@2 e2 ~@2 e2 ~@4 b1 e2@2 b1@2", P: "e2 ~@2 e2 ~@2 e2 ~@4 e1 b1@2 e2@2",
  Q: "a1 ~@2 a1 ~@2 a1@2 ~@3 a1 a2@2 e1@2", R: "a1 ~@2 a1 ~@2 a1 ~@4 a1 a2@2 e1@2",
  S: "d2 ~@2 d2 ~@2 d2 ~@2 d2 c3@2 d3@4", T: "a1 ~@2 a1 ~@2 a1@2 ~@4 g1@3 ~", U: "f#1 ~@2 f#1 ~@2 f#1 ~@4 f#1@5",
  V: "e1 ~@2 e1@3 d#2@9 ~", W: "e2@5 ~ c#2@9 ~", X: "f#2 ~@2 e2 ~@2 d2@6 ~@4", Y: "d2@2 ~ d2 ~@2 d2 ~@2 d2 c3 ~ d3@3 ~",
  Z: "d2 ~@2 d2 ~@2 d2 ~@2 d2 c3 ~ d3@2 d2 ~", AA: "f2 ~@2 f2 ~@2 f2 ~@2 e1 d#2 ~ f2@3 ~", AB: "f2 ~@2 f2 ~@2 f2 ~@9",
  AC: "~@3 c2 ~@2 c2 ~@4 c2 c3@2 g1 ~", AD: "c2 ~@5 c2 ~@4 c2 c3@2 c2 ~", AE: "f2 ~@2 f2 ~@2 f2 ~@4 a#1@2 ~ b1@2",
  AF: "g1 ~@2 g1 ~@2 g1 ~@4 d2 d2@2 f2 ~", AG: "g1@2 ~ g1 ~@2 g1 ~@4 g1 g2@2 g1 ~",
  AH: "a1 ~@2 a1 ~@2 a1 ~@4 a1 e1@2 g1@2", AI: "a1 ~@2 a1 ~@2 a1@2 ~@4 a1@3 ~", AJ: "a#1 d2", AK: "a#1@12 ~@2 a#1 ~",
  AL: "a1 ~@15", AM: "f2 a2", AN: "f2@15 ~", AO: "a1 ~@2 a1 ~@2 a1 ~@4 a1 a2@2 a1 ~",
  AP: "a1 ~@2 a1 ~@2 a1 ~@4 e2 a2@2 e2@2", AQ: "d2 ~@2 d2 ~@2 d2@2 ~ a1 c2 ~ d2@4", AR: "a1 ~@2 a1 ~@2 a1@2 ~@4 g1@4",
  AS: "f#1 ~@2 f#1 ~@2 f#1@2 ~@2 f#1@5 ~", AT: "f#2 ~@2 e2 ~@2 d2@8 ~@2", AU: "a1 ~@2 a1 ~@2 a1@6 ~@4",
  AV: "a1 ~@2 a1 ~@2 a1@7 ~@3", AW: "d2 ~@2 d2 ~@2 d2@4 ~@2 d3@2 d2 ~, ~@12 d2 ~@3", AX: "a1 ~@2 a1 ~@2 a1 ~@3 g1@6",
  AY: "[a1 ~@2 a1 ~@2 a1@4 ~@2 a2@2 ~@2 a1 ~@2 a1 ~@2 a1@4 ~@2 a2@2 a1 ~, ~@12 a1 ~@2 e1@2 ~@11 a1 ~@3]/2",
  AZ: "d2 ~@2 d2 ~@2 d2@3 ~@2 d2 d3@2 a1 ~", BA: "a1 ~@2 a1 ~@2 a1@4 ~ a1 a2@2 e1@2",
  BB: "a1 ~@2 a1 ~@2 a1@4 ~ a1 a2@2 e1 ~", BC: "d2 ~@2 d2 ~@2 d2@2 ~@3 d2 d3@2 a1@2", BD: "a1 ~@2 a1 ~@2 a1 ~@3 g1@5 ~",
  BE: "a1 ~@2 a1 ~@2 a1 ~@4 a1 e1@2 f1 ~", BF: "a1 ~@2 a1 ~@2 a1 ~@4 a1 b1@2 a1@2",
  BG: "d2 ~@2 d2 ~@2 d2 ~@4 d2 d3@2 d2 ~", BH: "a1@2 ~ a1 ~@2 a1 ~@3 g1@6", BI: "a1 ~@2 a1 ~@2 a1@2 ~@3 a1 a2@2 a1@2",
  BJ: "d2 ~@2 d2 ~@2 d2 ~@4 d2 d3@2 d2@2", BK: "a1 ~@2 a1 ~@2 a1@2 ~@4 a2@2 a1@2, ~@12 a1 ~@3",
  BL: "[a1@2 ~ a1 ~@3 a1@6 ~ e1@4 a1@10 ~@4]/2",
})).s("gm_electric_bass_finger").gain(0.26)

// bass · electric bass finger
const bass_2 = note("<~ A B A B C B A B ~@56 D@2 ~@6 E F G H I J ~@2 K J ~@5 L M ~@27>".pickRestart({
  A: "c3@3 c2 ~@2 c2 ~@9", B: "a2@3 c2 ~@2 c2 ~@9", C: "c3@2 ~ c2 ~@2 c2 ~@9", D: "g1 ~@2 g1 ~@2 g1 ~@4 d2 e2@2 d2@2",
  E: "d2 ~@2 d2 ~@2 d2 ~@4 d2 a1@2 b1@2", F: "d2 ~@2 d2 ~@2 d2 ~@4 a2 d3@2 a2@2",
  G: "d2 ~@2 d2 ~@2 d2@2 ~@3 d2 a1@2 b1@2", H: "d2 ~@2 d2 ~@2 d2 ~@4 a2 d3@2 a2 ~",
  I: "e2 ~@2 e2 ~@2 e2@2 ~@3 e2 b1@2 c#2@2", J: "e2 ~@2 e2 ~@2 e2 ~@4 b2 e3!2 b2 ~",
  K: "e2 ~@2 e2 ~@2 e2 ~@4 e2 b1@2 c#2@2", L: "e1@6 d#2@9 ~", M: "e2@3 c#2@4 ~",
})).s("gm_electric_bass_finger").gain(0.3)

// bass · lead 5 charang
const bass_3 = note("<~ A B A B C B A B ~@108>".pickRestart({
  A: "c3@3 c2 ~@2 c2 ~@9", B: "a2@3 c2 ~@2 c2 ~@9", C: "c3@2 ~ c2 ~@2 c2 ~@9",
})).s("gm_lead_5_charang").gain(0.05)

// chords · epiano1 · Gsus2 Csus2 Fsus2 Dsus2
const epiano1_2 = note(`<
  ~@65
  [~@4 f4 [g4,a4] b4 [c5,d5] e5 [f5,g5] e5@3 d5 ~ g5]
  [e5@3 d5 ~ g5 e5@3 d5 ~ [f5,g5] [d5,e5] ~ d5 ~, d5 ~@5 d5 ~@9]
  ~@50
>`).s("gm_epiano1").gain(0.46)

// bass · slap bass 1
const bass_4 = note("<~@36 [~@10 a#1@3 b1@3] [c2 ~@15] ~@79>").s("gm_slap_bass_1").gain(0.39)

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

// drums · snare
const snare = s("sd").struct("<~ A@70 ~@2 A@6 ~@4 A@31 B C ~>".pickRestart({
  A: "~ x ~ x", B: "~@5 x ~@8 x ~", C: "~@15 x",
})).gain(0.34)

// drums · low tom
const low_tom = s("lt").struct("<~@2 A ~ A ~ A ~@3 A ~@5 A ~ A ~@5 B ~@28 C ~@29 C ~@31 D ~>".pickRestart({
  A: "~@3 x", B: "~@13 x ~@2", C: "x", D: "~@15 x",
})).gain(0.29)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@24 [~@5 x ~@2] ~@27 [~@10 x ~@2 x ~@2] ~@29 [~@10 x ~@2 x ~@2] ~@34>").gain(0.29)

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

// drums · high tom
const high_tom = s("ht").struct("<~@24 [~@5 x ~@2] ~@92>").gain(0.29)

// drums · crash
const crash = s("cr").struct(`<
  ~@25 A ~@4 B@2 C ~@2 A ~@17 A ~@4 B@2 C ~@10 D A ~@6 D A ~@2 A ~@4 B@2 C ~@26
>`.pickRestart({
  A: "x", B: "x ~@2 x ~@4", C: "x ~@2 x ~@2 x ~@9", D: "x!2",
})).gain(0.24)

// drums · ride
const ride = s("rd").struct("<~@65 [x!8]!5 [x!7 ~] ~@2 [x!8]!5 [x!7 ~] ~@38>").gain(0.24)

// drums · cowbell
const cowbell = s("cb").struct("<A B@24 C@7 ~@3 C@3 B@15 C@7 ~ B C@9 ~@2 C@6 ~@3 B C@7 B C@23 D ~@2>".pickRestart({
  A: "x!4", B: "~@3 x", C: "~ x ~ x", D: "~@5 x ~@8 x ~",
})).gain(0.49)

stack(
  epiano1, bass, bass_2, bass_3, epiano1_2, bass_4, kick, snare, low_tom, pedal_hat, mid_tom, open_hat, high_tom, crash,
  ride, cowbell
)

More by Steely Dan