Strudelify
Simon Says cover art
KeyE majorTempo135 bpm
0:00/0:00
// Simon Says — 1910 Fruitgum Company
// 135 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 6 "12 String" named as a guitar, played on acoustic guitar steel (its piano patch is not one)
// note: duplicate parts dropped: ch 8 "Brass" brass section (copy of ch 9 "Syn Vox" voice oohs)
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): 12 String.
setcpm(135/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 · rock organ · "Organ"
const rock_organ = note(`<
  ~ A B C@5 D E C@2 D F G F@2 C@2 F@2 H B C D E C@2 D F G F@2 C@2 F@2 H B C D E C@2 D F G F@2 C@2 F@2 H B C D E C@2 D F
  G F@2 C@2 F@2 C@2 F@2 C@2 F@2 C@2 F@2 C@2 F@2 H B I ~
>`.pickRestart({
  A: "~@4 [c#4,c#5,c#6]@4 [d4,d5] ~ [f#4,f#5,f#6]@3 ~ [e4,e5,e6]@2, ~@4 d6 ~@3", // C# D F# E
  B: "~@2 [e4,g#4,b4] ~ [e4,g#4,b4]@2 ~@2 [e4,g#4,b4] ~ [e4,g#4,b4]@3 ~ [e4,g#4,b4] ~", // E
  C: "[a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~", // A
  D: "[b4,d5,f#5] ~ [b4,d5,f#5] ~ [b4,d5,f#5] ~ [b4,d5,f#5] ~ [b4,d5,f#5] ~ [b4,d5,f#5] ~ [b4,d5,f#5] ~ [b4,d5,f#5] ~", // Bm
  E: "[g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5,f5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~", // E
  F: "[g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~", // E
  G: "[a4,c#5,e5] ~@15", H: "[a4,c#5,e5] ~@3 [c#4,c#5,c#6]@4 [d4,d5] ~ [f#4,f#5,f#6]@3 ~ [e4,e5,e6]@2, ~@4 d6 ~@3",
  I: "[a4,c#5,e5]", // A
})).s("gm_rock_organ").gain(0.42).pan(0.7)

// bass · electric bass pick · "Bass"
const bass = note(`<
  ~ A B C@3 D C E F G C E H I J K L M J K N B C E F G C E H I J K L M J K N B C E F G C E H I J K L M J K N B C E F G C
  E H I J K L M J K L M J K O M J K L M J K L M J K N B P I
>`.pickRestart({
  A: "~@4 c#2@3 ~ d2@2 f#2@3 ~ e2@2", B: "~@2 e1 ~ e1@3 ~ e1 ~ e1@2 ~@2 e1 ~", C: "a1@2 e1 f#1 a1@2 e1 f#1",
  D: "a1@4 e1@2 f#1@2 a1@4 e1@2 f#1 ~", E: "b1@2 f#1 a1 b1@2 f#1 a1", F: "e2@4 b1@2 c#2@2 e2@4 b1@2 c#2 ~",
  G: "a1@2 e1 f#1 a1 f#1 e1 f#1", H: "e2@2 b1 c#2 e2@2 c#2 b1", I: "a1 ~@7", J: "e2@2 b1 c#2 e2@2 b1 c#2",
  K: "e2@3 ~ b1@2 c#2@2 e2@4 c#2@2 b1 ~", L: "a1@4 e1@2 f#1 ~ a1@4 e1@2 f#1 ~",
  M: "a1@4 e1@2 f#1@2 a1@2 f#1@2 e1@2 f#1 ~", N: "a1@2 ~@2 c#2@3 ~ d2@2 f#2@3 ~ e2@2",
  O: "a1@4 e1@2 f#1 ~ a1@4 e1@2 f#1@2", P: "a1@15 ~",
})).s("gm_electric_bass_pick").gain(0.54)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@3 A@5 B C@3 B D E F@2 G@2 F@2 H ~ I B C@3 B D E F@2 G@2 F@2 H ~ I B C@3 B D E F@2 G@2 F@2 H ~ I B C@3 B D E F@2 G@2
  F@2 G@2 F@2 G@2 F@2 G@2 F@2 G@2 F@2 H ~ I ~
>`.pickRestart({
  A: "[[c#4,e4,a4]@79 ~]/5", B: "[b3,d4,f#4]@15 ~", C: "[[b3,g#4]@15 ~ [c#4,a4]@31 ~, e4@47 ~]/3",
  D: "[b3,e4,g#4]@15 ~", E: "[c#4,e4,a4] ~@15", F: "[[e4,g#4,b4]@31 ~]/2", G: "[[e4,a4,c#5]@31 ~]/2",
  H: "[e4,a4,c#5] ~@15", I: "[e4,a4,c#5]",
})).s("gm_string_ensemble_1").gain(0.06).pan(0.3)

// chords · acoustic guitar steel · "6 String"
const acoustic_guitar_steel = note(`<
  ~@3 A B@3 C D E B F G H I J K L M N O I ~ C D E B F G H I J K L M N O I ~ C D E B F G H I J K L M N O I ~ C D E B F G
  H I J K L M J K L M J K L M J K L M J K L M N O I ~@3
>`.pickRestart({
  A: "a2@4 ~@2 a3@2 ~@2 a3 ~@3 a3@2, ~@2 [c#4,e4]@2 a2@3 ~, ~@3 [c#4,e4]", // C#m
  B: "~@2 a3 ~@3 a3@2 ~@2 a3 ~@3 a3@2, a2@3 ~ a2@3 ~, ~ [c#4,e4] ~ [c#4,e4]", // C#m
  C: "~@2 a3 ~@3 a3@2 ~@2 a3 ~@3 a3@2, a2@6 ~@2 a2@5 ~@3, ~ [c#4,e4] ~ [c#4,e4]", // C#m
  D: "~@2 b3 ~@3 b3@2 ~@2 b3 ~@3 b3@2, b2@3 ~ b2@3 ~, ~ [d4,f#4] ~ [d4,f#4]", // D
  E: "~@2 b3 ~@3 b3@2 ~@2 b3 ~ [e4,g#4]@2 b3@2, e3@4 [e4,g#4]@4 e3@7 ~", // E
  F: "~@2 a3 ~@3 a3@2 ~@2 a3 ~@3 a3@2, a2@3 ~ a2@3 ~, ~@4 [c#4,e4]@5 ~@3 [c#4,e4]@4", // C#m
  G: "~@2 b3 ~@3 b3@2 ~@2 b3 ~@3 b3@2, b2 [d4,f#4] b2 [d4,f#4]", // D
  H: "~@2 b3 ~@3 b3@2 ~@2 b3@2 [e4,g#4]@2 b3 ~, e3 [e4,g#4] e3@2", I: "[a2,a3,c#4,e4] ~@15",
  J: "~ b3 ~ b3 ~ b3 ~ b3, e3@3 ~ e3@3 ~, ~ [e4,g#4] ~ [e4,g#4]", // E
  K: "~@2 b3 ~@3 b3@2 ~@2 b3 ~ [e4,g#4]@2 b3@2, e3@4 [e4,g#4]@4 e3@5 ~@3", // E
  L: "~ a3 ~ a3 ~ a3 ~ a3, a2@6 ~@2 a2@5 ~@3, ~ [c#4,e4] ~ [c#4,e4]", // C#m
  M: "~@2 a3 ~@3 a3@2 ~@2 a3 ~ [c#4,e4]@2 a3 ~, a2@2 [c#4,e4]@2 a2@3 ~", // C#m
  N: "~ b3 [e4,g#4] b3 ~ b3 ~ b3, e3@5 ~@3 e3@4 [e4,g#4]@4", // E
  O: "~@2 b3 ~@3 b3@2 ~@2 b3 ~ [e4,g#4]@2 b3 ~, e3@3 ~ e3@4, ~ [e4,g#4] ~@2", // E
})).s("gm_acoustic_guitar_steel").gain(0.13).pan(0)

// chords · acoustic guitar steel · "12 String"
const acoustic_guitar_steel_2 = note(`<
  ~@3 A ~@5 B C D E ~@2 F G H I J K ~@4 B C D E ~@2 F G H I J K ~@4 B C D E ~@2 F G H I J K ~@4 B C D E ~@2 F G H I F G
  H I F G H I F G H I F G H I J K ~@4
>`.pickRestart({
  A: "~@4 a3 ~@11", B: "~@12 b3 ~@3", C: "~@4 a3 ~@7 a3 ~@3", D: "~@12 a3 ~@3", E: "~@4 b3 ~@11", F: "~ b3 ~ b3",
  G: "~@4 b3@4 ~@4 b3@3 ~", H: "~ a3 ~ a3", I: "~@4 a3@3 ~@5 a3@3 ~", J: "~@4 b3@3 ~@5 b3@4",
  K: "~@4 b3@3 ~@5 b3@2 ~@2",
})).s("gm_acoustic_guitar_steel").gain(0.15).pan(1)

// chords · acoustic guitar steel · "12 String" · soft notes
const acoustic_guitar_steel_3 = note("<~@3 A ~@5 B ~@15 B ~@15 B ~@15 B ~@31>".pickRestart({
  A: "~@2 a3 ~@13", B: "~@4 b3 ~@11",
})).s("gm_acoustic_guitar_steel").gain(0.08).pan(1)

// chords · piano · "Chips"
const piano = note(`<
  ~@3 A@5 B C A@2 B C D C@2 E@2 C@2 F ~ A B C A@2 B C D C@2 E@2 C@2 F ~ A B C A@2 B C D C@2 E@2 C@2 F ~ A B C A@2 B C D
  C@2 E@2 C@2 E@2 C@2 E@2 C@2 E@2 C@2 E@2 C@2 F ~@3
>`.pickRestart({
  A: "~@4 [e4,a4,c#5] ~@7 [e4,a4,c#5] ~@3", B: "~@4 [f#4,b4,d5] ~@7 [f#4,b4,d5] ~@3",
  C: "~@4 [g#4,b4,e5] ~@7 [g#4,b4,e5] ~@3", D: "[e4,a4,c#5] ~@15", E: "~@4 [a4,c#5,e5] ~@7 [a4,c#5,e5] ~@3",
  F: "[a4,c#5,e5] ~@15", // A
})).s("gm_piano").gain(0.45).pan(0.6)

// chords · drawbar organ · "Solo Organ"
const drawbar_organ = note("<~@38 A B C D@2 E F G ~@24 A ~@18>".pickRestart({
  A: "~@7 e5", B: "c#6 ~ [e5,c#6] ~ [e5,b5] ~ [e5,b5] ~ a5@4 b5@2 c#6 ~, ~@8 e5@7 ~",
  C: "c#6@2 b5@2 ~@2 [f#5,b5]@3 ~ f#5@2 a5 ~ [e5,c#6]@2, f#5 ~@3", // B5 C#m
  D: "[~@2 [e5,c#6] ~ [e5,b5] ~ [e5,b5] ~ [e5,a5]@4 [e5,b5] ~ [c#5,e5]@6 c#6@4 b5 ~ a5@3 ~ e5@2]/2", // C#m E5 A5 E5 C#m
  E: "[e5,c#6]@3 ~ [e5,b5] ~ [e5,b5] ~ [e5,a5] ~ [e5,a5] ~ [e5,b5] ~ [e5,c#6] ~", // C#m E5 A5 E5 C#m
  F: "c#6 ~ b5@3 ~ [f#5,b5]@3 ~ [d5,f#5] ~ [d5,f#5]@2 [f#5,a5] ~, f#5 ~@3, ~@2 a#5 ~@13", // B5 D F#m
  G: "[e5,c#6] ~ [e5,c#6] ~ [e5,b5] ~ [e5,b5] ~ [e5,a5] ~ [e5,b5]@3 ~ [e5,a5]@2", // C#m E5 A5 E5 A5
})).s("gm_drawbar_organ").gain(0.53).pan(0.4)

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

// drums · clap
const clap = s("cp").struct("<~@3 A@11 ~ A@6 ~@2 A@7 ~ A@6 ~@2 A@7 ~ A@6 ~@2 A@7 ~ B@16 A@6 ~@4>".pickRestart({
  A: "~ x ~ x", B: "~@2 x!2 ~@2 x ~",
})).gain(0.7)

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

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@5 A ~ B C ~@3 D ~@2 B C ~@2 B C ~@2 B C ~@3 D ~@2 B C ~@2 B C ~@2 B C ~@3 D ~@2 B C ~@2 B C ~@2 B C ~@3 D ~@2 B C
  ~@2 B C ~@2 B C ~@2 B C ~@2 B C ~@2 B C ~@4
>`.pickRestart({
  A: "~ x ~ x ~@4", B: "~ x ~@5 x", C: "~@5 x ~ x", D: "~@3 x ~@4",
})).gain(0.42)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@26 A ~@15 A ~@15 A ~@28 B ~>".pickRestart({
  A: "~@12 x!4", B: "~@3 x",
})).gain(0.63)

// drums · open hat
const open_hat = s("oh").struct("<~@13 A ~@15 A ~@15 A ~@15 A ~@27>".pickRestart({
  A: "~@7 x",
})).gain(0.56)

// drums · high tom
const high_tom = s("ht").struct("<~@26 [~@8 x!4 ~@4] ~@15 [~@8 x!4 ~@4] ~@15 [~@8 x!4 ~@4] ~@30>").gain(0.63)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@2 A@2 ~@3 A ~@3 A ~@3 A ~@2 A@2 ~@3 A ~@3 A ~@3 A ~@2 A@2 ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A@2
>`.pickRestart({
  A: "x",
})).gain(0.7)

stack(
  rock_organ, bass, string_ensemble_1, acoustic_guitar_steel, acoustic_guitar_steel_2, acoustic_guitar_steel_3, piano,
  drawbar_organ, kick, clap, snare, hihat, hihat_soft, low_tom, mid_tom, open_hat, high_tom, crash
)