Strudelify

Brown Eyed Woman

Bill Medley

KeyE majorTempo69 bpm
0:00/0:00
// Brown Eyed Woman — Bill Medley
// 69 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 9 "CLARINET" clarinet (copy of ch 8 "FLUTE" flute)
// note: Full arrangement: all 56 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(69/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 · piano · "A.PIANO 1"
const piano = note(`<
  A B C D E F G H I J K L M N O P Q R S T A B U V U W X Y Z AA K L M N O P Q R S T AB AC@2 AD A B AE AF AE AF AE AF AG
  AH AI@2
>`.pickRestart({
  A: "[b3,g#4]@7 ~ f#4@2 ~ e4@2 f#4@2 ~, ~@8 b3@7 ~", B: "[a3,c#4]@5 b3 ~ c#4 [a3,c#4,e4]@4 ~ [e3,a3,c#4]@3",
  C: "[b3,e4,g#4]@7 ~@5 [c5,c#5] b4 ~ g#4, ~@8 [f#3,b3,d#4,f#4]@7 ~", // E C#maj7 B
  D: "c#5@5 ~@7 [c#5,e5]@2 ~ [a4,e5], [a3,c#4,e4], ~@12 b4 ~@3", // C#m A5 A
  E: "[b3,e4,g#4]@7 ~@5 [d5,d#5] c#5 ~ b4, ~ [b3,d#4,f#4], ~@3 f#5", // E D#maj7 B
  F: "~@5 c2 ~ c#2 g4@4 [g5,g#5] c5 e5 ~, [g#4,b4,c#5,e5]@8 [d2,a3,c4,e4]@7 ~, ~@12 f#4@3 ~", // G#maj7 C#m7 Am
  G: "[b3,e4,g#4]@7 ~@5 [d5,d#5] b4 c#5 ~, g#5@5 ~@7 f#5@2 ~@2, g5 ~@7 [f#3,b3,d#4,f#4]@8", // E D#maj7 B
  H: "[g#3,c#4,e4,c#5,e5]@8 ~@3 g#4 [c#5,e5] g#4 ~ b4, ~@8 [g#3,b3,c#4,e4]@7 ~", // C#m C#m7
  I: "[c#4,e4,c#5,e5]@3 ~ [f#3,b3,d#4,f#4]@4, [f#3,a3] ~", // C#m B F#m
  J: "[a3,c#4,e4]@4 [a3,c#4,e4]@3 ~ [b3,d#4,f#4]@3 ~ [b3,d#4,f#4]@2 ~@2", // A B
  K: "[f#4,a4,c#5]@4 [f#4,a4,c#5]@3 ~ [e4,a4,c#5]@3 ~ [e4,a4,c#5]@3 ~", // F#m A
  L: "[g#4,b4,e5]@4 [g#4,b4,e5]@3 ~ [g#4,b4,e5]@3 ~ [g#4,b4,e5]@3 ~", // E
  M: "[f#4,a4,c#5]@3 ~ [f#4,a4,c#5]@3 ~ [e4,a4,c#5]@3 ~ [e4,a4,c#5]@3 ~", // F#m A
  N: "[e4,g#4,b4]@3 ~ [e4,g#4,b4]@3 ~ [e4,g#4,b4]@3 ~ [e4,g#4,b4]@3 ~", // E
  O: "[f#4,a4,c#5]@3 ~ [f#4,a4,c#5]@2 ~@2 [a4,c#5,e5]@3 ~ [a4,c#5,e5]@4", // F#m A
  P: "[b4,e5,g#5]@3 ~ [b4,d#5,f#5]@3 ~ [g#4,c#5,e5]@3 ~ [g#4,b4,d#5]@3 ~", Q: "[a3,c#4,e4]@3 ~@5 [g#3,b3,e4]@2 ~@6",
  R: "[a3,c#4,e4]@3 ~@5 [g#3,b3,e4]@3 ~@5", S: "[e3,a3,c#4]@4 [e3,a3,c#4]@3 ~ [f#3,b3,d#4]@3 ~ [f#3,b3,d#4]@3 ~",
  T: "[a3,c#4,e4]@7 ~ [a3,c#4,e4]@7 ~", U: "[b3,e4,g#4]@8 [f#3,b3,d#4]@5 [f#3,b3,d#4]@3, ~ f#4",
  V: "[a3,c#4,e4] [f#3,a3,c#4,e4]", W: "~@6 c#2 ~ [c4,e4,g4,b4]@4 [c4,e4,f#4,a4]@4, [a3,c#4,e4]@7 ~@9, ~@5 c2@2 ~ d2@8",
  X: "[b3,e4,g#4] [f#3,b3,d#4,f#4]", Y: "[g#3,b3,c#4,e4]!2", Z: "[e3,a3,c#4]!2 [f#3,b3,d#4]!2",
  AA: "[a3,c#4,e4]!2 [b3,d#4,f#4]!2", AB: "g#4@5 ~@2 g#4, e4, c#5@3 c#5, ~@5 g#4@2 ~",
  AC: "[d#4@2 ~@2 e4@2 ~ a4, b4@7 b4 [a4,c#5]@4 e4@4, g#4@3 g#4@5, f#4@5 f#4@11, ~ d#4@3]/2", // A
  AD: "[a3,c#4,e4,f#4]@4 [c#4,e4,f#4,a4]@4 [e4,f#4,a4,c#5]@4 [f#4,a4,c#5,e5]@3 ~", AE: "[b3,e4,g#4]!2 [b3,d#4,f#4]!2",
  AF: "[a3,c#4,e4]!3 [a3,c#4,e4,f#4]", AG: "[b3,e4,g#4]!2 [b3,d#4]!2, ~ f#4",
  AH: "[a3,c#4,e4]@4 [a3,c#4,e4]@4 [a3,c#4,e4]@4 [a3,c#4,e4,f#4]@3 ~", AI: "[g#3,b3,e4]/2",
})).s("gm_piano").gain(0.38).pan(0.9)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C D E F E G H I J K L K M N O@2 P Q E R E S E F E T U V J K L K M N O@2 P Q W X Y Z AA AB E AC AD AE AF AG AH AI
  AJ ~
>`.pickRestart({
  A: "e2@3 ~ e2@3 ~ g#2@3 ~ g#2@4", B: "a2@4 a2@3 ~ b2@3 ~ b2@3 ~", C: "e2@3 ~ e2@4 g#2@4 g#2@3 ~",
  D: "a2@3 ~ a2@4 f#2@3 ~ f#2@3 ~", E: "e2@3 ~ e2@3 ~ g#2@3 ~ g#2@3 ~", F: "a2@3 ~ a2@3 ~ d2@3 ~ d2@3 ~",
  G: "a2@3 ~ a2@3 ~ g#2@4 g#2@3 ~", H: "f#2@3 ~ f#2@4 g#2@3 ~ g#2@4", I: "a2@3 ~ a2@2 a2@2 b2 ~ b2 ~ b2 ~ b2 e2",
  J: "f#2@3 ~ f#2@2 f#2@2 a2 ~ a2 ~ a2 ~ b2 ~", K: "e2@5 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~",
  L: "f#2@3 ~ f#2@2 f#2 ~ a2@2 a2@2 a2@2 b2@2", M: "f#2@3 ~ f#2@2 f#2 ~ a2@2 a2 ~ a2@2 b2 ~",
  N: "e3@3 ~ d#3@3 ~ c#3@4 b2@4", O: "a2@3 ~@5 e3@3 ~@5", P: "f#2@3 ~ f#2 ~ f#2 ~ g#2@3 ~ g#2@2 g#2 ~",
  Q: "a2@4 b2@3 ~", R: "a2@3 ~ a2@4 b2@3 ~ b2@3 ~", S: "a2@3 ~ a2@3 ~ f#2@3 ~ f#2@3 ~", T: "a2@3 ~ a2@4 g#2@3 ~ g#2@4",
  U: "f#2@4 f#2@3 ~ g#2@4 g#2@3 ~", V: "a2@3 ~ a2@2 a2@2 b2 ~ b2 ~ b2 ~ b2 ~", W: "c#2@5 ~ c#2 ~ c#2@8",
  X: "g#2@5 ~ g#2 ~ g#2@8", Y: "a2@5 ~ a2 ~ a2@6 a2 ~", Z: "b2@5 ~ b2 ~ b2 ~ b2 ~ b2@2 b2 ~",
  AA: "e2@7 ~ g#2@4 g#2@3 ~", AB: "a2@3 ~ a2@4 b2@3 ~ b1@3 ~", AC: "a2@3 ~ a2@3 ~ b2@4 b1@4",
  AD: "e2@5 ~ f#2@2 g#2@6 ~ g#2", AE: "a2@5 ~@3 b2 ~ b2 ~ b2 ~ b2@2", AF: "e2@6 e2@2 g#2@5 ~ g#2@2",
  AG: "a2@5 ~ a2@2 b2 ~ b2 ~ b2@2 b2@2", AH: "e2@5 ~ e2 ~ g#2@5 ~ g#2@2", AI: "a2@5 ~ a2 ~ b2@2 b2 ~ b2 ~ b2 ~",
  AJ: "e2@15 ~",
})).s("gm_acoustic_bass").gain(0.38)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@8 A B C D C E F G H ~ I J K L M N M O P Q A B C D C E F G H ~ I J R S T U K V W X Y@2 Z AA Z AA AB ~
>`.pickRestart({
  A: "~@5 g#2 b2 d#3, ~ g#3",
  B: "[e3,a3]@2 ~ c#4 [g#3,e4]@2 [a3,a4]@2 [a4,a#4] [b4,c5] [c#5,d5] [d#5,e5] [f5,f#5] [g5,g#5] [a5,a#5] [b5,c6], ~ f#3 ~@2 b3@4", // A5 C#m A A#maj7 Cmaj7 Dmaj7 Emaj7 F#maj7 …
  C: "c#6", D: "b5@2 g#6 b5", E: "b5", F: "a5 c#6", G: "e6 d#6 c#6 b5", H: "c#6 ~@15", I: "[a3,c#4,e4]@4 b3 d#4 f#4 b4",
  J: "[a4,c#5,e5]@15 ~", K: "~@6 b2 e3 g#3@4 b3@4", L: "e3", M: "[e3,b3,e4,g#4] [g#2,b3,d#4,f#4]",
  N: "[a2,b3,c#4,e4]@2 [c#4,e4] [d#4,f#4], ~ [b2,b3]", O: "[a2,b3,c#4]@2 [g4,b4] [f#4,a4], e4, ~ [d3,c4]",
  P: "[e3,e4,g#4] [g#2,d#4,f#4], b3", Q: "[a2,b3,c#4,e4] ~", R: "[g#4,c#5,e5]", S: "[g#4,b4,d#5]", T: "[a4,b4,c#5,e5]",
  U: "[a4,b4,c#5,e5,f#5]", V: "e3 b2", W: "e2 g#2", X: "a2 b2", Y: "[e2 g#2 a2 [b2,c#5], b4@3 ~]/2",
  Z: "e5 d#5, [b4,g#5]", AA: "[c#5,e5,a5]", AB: "[b4,e5,g#5]@3 ~",
})).s("gm_string_ensemble_1").gain(0.33).pan(0.4)

// chords · drawbar organ · "ORGAN 1"
const drawbar_organ = note("<~@2 A B@2 C D E F G@2 ~@45>".pickRestart({
  A: "[b3,e4] [d#4,f#4,b4], g#4", B: "[[e4,a4,c#5] [f#4,a4,c#5] b3 [d#4,f#4,b4], ~ e4@2 ~, ~ g#4]/2",
  C: "[e4,a4,c#5]@8 [g4,b4]@4 [f#4,a4]@3 ~, ~ e4", D: "[b3,e4,g#4] [f#4,g#4,b4,c#5]", E: "[e4,g#4,b4,c#5]",
  F: "[c#4,e4,f#4,a4] [d#4,f#4,g#4,b4]", G: "[[e4,g#4,a4,c#5] [f#4,b4,c#5]@3, ~ g#4 ~@2]/2",
})).s("gm_drawbar_organ").gain(0.04).pan(0.2)

// other · flute
const flute = note("<A B C ~@17 D E ~ F G H I@2 ~@16 J E K L M E N O N O P ~>".pickRestart({
  A: "g#4@8 f#4@3 e4@2 f#4@2 ~", B: "c#4@10 b3 c#4 e4@3 c#4", C: "e4@5 ~@11", D: "g#4@8 f#4@3 e4@2 f#4@3", E: "c#4",
  F: "~@5 b3 ~ c#4 e4@4 c#4@4", G: "b3", H: "~@5 b3 ~ c#4 e4@4 f#4@4", I: "g#4/2",
  J: "g#4@7 ~ f#4@3 e4@2 f#4@3, ~@8 f4 ~@7", K: "~@8 f#4@3 e4@3 f#4@2", L: "e4@15 ~", M: "g#4@7 ~ f#4@3 e4@2 f#4@2 ~",
  N: "~@4 f#4@2 g#4@8 f#4 e4", O: "f#4 c#4@7", P: "~@4 e4@11 ~",
})).s("gm_flute").gain(0.22).pan(0.7)

// chords · trombone
const trombone = note("<~@10 A B A B A C D ~@13 A B A B A C D ~@12 E F G ~@4>".pickRestart({
  A: "[f#3,a3,c#4] [a3,c#4,e4]", B: "[g#3,b3,e4]", C: "[b3,e4,g#4] [b3,d#4,f#4] [g#3,c#4,e4] [b3,e4,g#4]",
  D: "[c#4,e4,a4] ~@15", E: "[e3,a3,c#4]", F: "[g#3,b3,e4] [g#3,b3,d#4]", G: "[a3,c#4,e4]",
})).s("gm_trombone").gain(0.33).pan(0.4)

// other · vibraphone
const vibraphone = note("<~ A B C D E B E F G ~@6 H I J K ~ L M N O P O Q ~@8 H I J K ~@16>".pickRestart({
  A: "~@13 c#4 ~ e4", B: "g#4@7 ~ f#4@7 ~", C: "e4@7 ~ e4@3 ~ f#4@3 ~", D: "g#4@7 ~ f#4@7 ~, g4 ~@15", E: "e4@3 ~",
  F: "~@8 g#4@6 ~ b4", G: "c#5!2 ~@2", H: "c#5@3 ~ b4@3 ~", I: "a4@3 ~ g#4@3 ~", J: "a4 c#5 b4 d#5", K: "e5@3 ~",
  L: "~@9 b3 ~ c#4 e4 c#4 ~ e4", M: "g#4@5 ~@3 f#4@7 ~", N: "e4@7 ~ e4@3 ~ f#4@4", O: "g#4@7 ~ f#4@8",
  P: "e4@7 ~ b4@3 ~ a4@3 ~", Q: "e4@7 ~ c#4@8",
})).s("gm_vibraphone").gain(0.33).pan(0.4)

// other · baritone sax · "BARITONSAX"
const baritone_sax = note("<~@10 A B A B A ~ C ~@13 A B A B A ~ C ~@19>".pickRestart({
  A: "f#2 a2", B: "e2@15 ~", C: "a2 ~@7",
})).s("gm_baritone_sax").gain(0.38).pan(0.2)

// other · baritone sax · "BARITONSAX" · soft notes
const baritone_sax_soft = note("<~@15 [e3 d#3 c#3 b2] ~@19 [e3 d#3 c#3 b2] ~@20>")
  .s("gm_baritone_sax").gain(0.27).pan(0.2)

// other · french horn · "FR.HORN"
const french_horn = note("<~@40 A B C@2 ~@12>".pickRestart({
  A: "c#4@15 ~", B: "b3@15 ~", C: "[c#4@31 ~]/2",
})).s("gm_french_horn").gain(0.33).pan(0.1)

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

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

// drums · hihat
const hihat = s("hh").struct("<[~ x ~ x]!9 [x!2 ~@6] ~@10 [~ x ~ x]!9 [x!2 ~@6] ~@14 [~ x ~ x]!4 ~@8>").gain(0.38)

// drums · mid tom
const mid_tom = s("mt").struct("<~@9 A ~ A ~@5 A ~@13 A ~@5 A ~@11 B ~ C ~@4>".pickRestart({
  A: "~@7 x", B: "~@10 x!2 ~@2 x ~", C: "~@5 x ~@2",
})).gain(0.44)

// drums · open hat
const open_hat = s("oh").struct("<~@9 [~@2 x!3 ~@3] ~@19 [~@2 x!3 ~@3] ~@26>").gain(0.33)

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

// drums · ride
const ride = s("rd").struct(`<
  ~@2 A ~@7 B C D E F G H@2 I H A ~ A ~@7 B C D E F G H@2 I H J K D ~@5 L@2 M J F N ~@2
>`.pickRestart({
  A: "x", B: "~ x!7", C: "x!5 ~ x!2", D: "x!8", E: "x!4", F: "~@2 x ~ x!4", G: "x ~ x!5 ~", H: "x!2",
  I: "~@2 x ~ x ~ x!2", J: "x ~ x!3 ~ x ~", K: "x ~ x ~ x ~ x!2", L: "x!5 ~ x ~", M: "~@2 x!6", N: "x ~ x!3 ~@3",
})).gain(0.27)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@11 A ~ B C D ~@2 E ~@12 A ~ B C D ~@2 E ~ F B ~@6 G A H I C H ~@2>".pickRestart({
  A: "~@5 x ~@2", B: "~ x ~ x ~ x ~@2", C: "~@3 x ~@4", D: "~ x ~@5 x", E: "~@3 x ~ x ~@2", F: "~ x ~@3 x ~ x",
  G: "~@5 x ~ x", H: "~ x ~@6", I: "~ x ~@3 x ~@2",
})).gain(0.16)

stack(
  piano, bass, string_ensemble_1, drawbar_organ, flute, trombone, vibraphone, baritone_sax, baritone_sax_soft,
  french_horn, kick, snare, hihat, mid_tom, open_hat, crash, ride, ride_soft
)

More by Bill Medley