Strudelify

Sheila

Tommy Roe

KeyC majorTempo144 bpm
0:00/0:00
// Sheila — Tommy Roe
// 144.2 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 68 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(144.2/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.

// bass · electric bass finger · "BASS"
const bass = note(`<
  A B C D E F E G H I J G D K L C M N O P H Q R S T U V W X Y Z C AA AB AC AA D K L C M N AD P M AE R AF AG AH Z AI AJ
  AK V C M AL AC AM AN AO AP AQ AD AR O AS
>`.pickRestart({
  A: "c2 ~ c2 ~ c2 ~ c2 c1 c2 ~ c2 ~ c2 ~ c2 ~", B: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~",
  C: "c2 ~ c2 ~ c2 ~ c2 c1 c2 ~ c2 ~ c2@2 b1 ~", D: "c2 ~ c2@2 c2 ~ f#2 ~ g2 g1 g2 ~ g2 ~ g2 ~",
  E: "c2 c1 c2 ~ c2 ~ c2 ~ f2 ~ f2@2 f2 ~ b1 ~", F: "c2 ~ c2@2 c2 ~ c2 c1 g2 ~ g2@2 g2 ~ b1 ~",
  G: "c2 c1 c2 ~ c2 ~ c2 ~ g2 ~ g2@2 g2 ~ b1 ~", H: "c2 ~ c2@2 c2 ~ f#2 ~ g2 ~ g2@2 g2 ~ e2 ~",
  I: "f2 ~ f2@2 f2 ~ f#2 ~ g2 ~ g2@2 g2 ~ g2 g1", J: "c2 c1 c2 ~ c2 ~ c2 ~ f2 ~ f2@2 f2 ~ f2 f1",
  K: "f2 f1 f2 ~ f2 ~ f2 ~ g2 ~ g2@2 g2 ~ b1 ~", L: "c2 ~ c2@2 c2 ~ c2 c1 f2 ~ f2@2 f2 ~ f2 f1",
  M: "c2 ~ c2@2 c2 ~ c2 c1 g2 ~ g2@2 g2 ~ e2 ~", N: "f2 f1 f2 ~ f2 ~ f2 ~ g2 ~ g2@2 g2 ~ g2 g1",
  O: "c2 ~ c2@2 c2 ~ e2 ~ f2 ~ f2@2 f2 ~ b1 ~", P: "c2 ~ c2@2 c2 ~ f#2 ~ g2 ~ g2@2 g2 ~ b1 ~",
  Q: "f2 ~ f2@2 f2 ~ f2 f1 g2 ~ g2@2 g2 ~ b1 ~", R: "c2 ~ c2@2 c2 ~ c2 c1 f2 ~ f2@2 f2 ~ b1 ~",
  S: "c2 ~ c2 ~ c2 ~ c2@2 c2 ~ c2 ~ c2 ~ c2 c1", T: "g2 ~ g2 ~ g2 ~ g2@2 g2 ~ g2 ~ g2 ~ g2 g1",
  U: "g2 ~ g2 ~ g2 ~ g2 g1 g2 ~ g2 ~ g2 ~ e2 ~", V: "f2 ~ f2 ~ f2 ~ f2@2 f2 ~ f2 ~ f2 ~ f2 f1",
  W: "c2 ~ c2 ~ c2 ~ c2 c1 c2 ~ c2 ~ c2@2 f#2 ~", X: "g2 ~ g2@2 g2 ~ g2@2 g2 ~ g2@2 g2 ~ g2@2",
  Y: "g2 ~ g2@2 g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~", Z: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2@2 b1 ~",
  AA: "c2 c1 c2 ~ c2 ~ c2 ~ g2 ~ g2@2 g2 ~ g2 g1", AB: "f2 ~ f2@2 f2 ~ f#2 ~ g2 g1 g2 ~ g2 ~ g2 ~",
  AC: "c2 c1 c2 ~ c2 ~ c2 ~ f2 f1 f2 ~ f2 ~ f2 ~", AD: "c2 ~ c2@2 c2 ~ c2 c1 f2 f1 f2 ~ f2 ~ f2 ~",
  AE: "f2 ~ f2@2 f2 ~ f2 f1 g2 g1 g2 ~ g2 ~ g2 ~", AF: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2 f#2 ~",
  AG: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2@2", AH: "g2 ~ g2 ~ g2 ~ g2@2 g2 ~ g2@2 g2 ~ g2 ~",
  AI: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2", AJ: "g2 ~ g2 ~ g2 ~ g2 g1 g2 ~ g2 ~ g2 ~ g2 ~",
  AK: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~", AL: "f2 ~ f2@2 f2 ~ f#2 ~ g2 ~ g2@2 g2 ~ b1 ~",
  AM: "c2 ~ c2@2 c2 ~ c2 c1 g2 ~ g2@2 g2 ~ g2 g1", AN: "c2 ~ c2@2 c2 ~ f#2 ~ g2 ~ g2@2 g2 ~ g2 g1",
  AO: "f2 f1 f2 ~ f2 ~ f2 ~ g2 g1 g2 ~ g2 ~ g2 ~", AP: "c2 ~ c2@2 c2 ~ e2 ~ f2 ~ f2@2 f2 ~ f2 f1",
  AQ: "c2 ~ c2 ~ c2 ~ c2@2 c2 ~ c2 ~ c2 ~ c2 ~", AR: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 c1 c2 c1 c2!2", AS: "c2 ~@15",
})).s("gm_electric_bass_finger").gain(0.5)

// chords · acoustic guitar steel · "GUITAR"
const acoustic_guitar_steel = note(`<
  A@2 B C D E F G H I J K L M N O P Q R S@2 T U V W@2 X Y Z@2 AA AB AC AD AE L AF T AG B AH AI AJ G L AK R AL AM@2 AN AO
  AM@2 X Y AP I AQ AR AF AS F V R AT R AU
>`.pickRestart({
  A: "[[g4,c5,e5,g5]@7 ~ [g4,c5,e5,g5] ~@3 [g4,e5,g5] ~ [g4,c5,e5,g5]@5 ~ [g4,c5,e5,g5] ~ [g4,c5,e5,g5]@4 c3 ~ [g4,c5,e5,g5]@2 ~@2]/2", // C
  B: "[g4,c5,e5]@9 ~ [g4,e5] ~ [g4,c5,e5,g5] ~ [g4,c5,e5,g5] ~, g5@5 ~@3", C: "[g4,e5,g5]@7 ~ [b4,d5,g5,b5]@8",
  D: "[g4,e5] [a4,f5]", E: "[g4,e5]@8 [b4,g5,b5]@7 ~", F: "~ [c5,e5] ~@2 [a4,f5]@4", G: "[g4,c5,e5,g5] [b4,d5,g5,b5]",
  H: "[g4,c5,e5,g5]@8 [b4,g5,b5]@7 ~", I: "[a4,c5,f5,a5]@8 [b4,g5,b5]@7 ~", J: "~@2 [c5,e5]@2 ~@4 [a4,f5,a5]@7 ~",
  K: "~@2 [c5,e5]@2 ~@4 [b4,g5,b5]@7 ~", L: "[g4,e5]@4 ~ [d5,g5] ~@2", M: "[a4,f5,a5]@7 ~@3 [d5,g5]@2 ~@4",
  N: "[g4,e5,g5]@7 ~ [a4,c5,f5,a5]@8", O: "g4 ~@5 c6@7 ~@3, e5@13 ~@3, ~ g4@6 ~, ~@4 g5@9 ~@3",
  P: "~ [c5,e5] ~@2 [b4,d5,g5,b5]@4", Q: "~@2 [c5,f5]@2 ~@4 [b4,g5,b5]@7 ~", R: "[g4,e5,g5]@7 ~ [a4,f5,a5]@7 ~",
  S: "~ [c5,e5] ~@3 [d5,g5] ~@2", T: "[a4,c5,f5,a5] [b4,d5,g5,b5]", U: "[g4,e5,g5]@7 ~@3 [c5,f5]@2 ~@4",
  V: "d5@4 [g4,d5,e5] ~@3 [g4,d5]@3 ~ [g4,d5,e5] ~@3, a4 ~@15", // Em7 G5 Em7
  W: "[~@7 d6@6 ~ [g5,b5,d6] ~, ~@2 b4@23 ~ b4@4 ~@2, ~@2 d5@13 ~, ~@6 [g5,b5]@21 ~@5]/2", // G
  X: "[f5,a5,c6] ~@2 [c5,f5,a5,c6]@4 ~", Y: "[c5,e5]@10 ~@4 e5 c5, g4, g5@9 ~ g5@2 c5@2 ~@2, ~@11 e5@2 g5@2 ~",
  Z: "[[d5,g5,b5]@26 g2!2 [b4,d5,g5]@2 g2@2]/2", AA: "~@3 a5@4 ~, ~ a4@6 ~, ~@2 c5@5 ~",
  AB: "~@3 g5@4 ~, ~ g4@6 ~, ~@2 c5@5 ~", AC: "[g4,e5,g5]@7 ~ [b4,g5,b5]@7 ~", AD: "[a4,c5,f5,a5]@4 ~ [d5,g5] ~@2",
  AE: "~ [c5,e5] ~@2 [a4,c5,f5,a5]@4", AF: "[g4,c5,e5,g5]@4 ~ [d5,g5] ~@2", AG: "[g4,e5,g5]@7 ~ [a4,f5]@8",
  AH: "[g4,e5] [b4,g5]", AI: "[a4,f5]@4 ~ [d5,g5] ~@2", AJ: "[g4,e5] [a4,c5,f5,a5]", AK: "[a4,f5] [b4,g5]",
  AL: "[g4,c5,e5,g5]@9 ~ [g4,c5,e5,g5] ~ c3 [g4,c5,e5,g5] ~@2", // C
  AM: "[[d4,g4,b4]@13 ~ [d4,g4,a4]@6 [d4,g4,b4] ~ d4 ~ [d4,g4,a4]@4 b4 ~@3]/2", // G Dsus4 G Dsus4
  AN: "[a4,c5,f5,a5]@5 f2 [a4,c5,f5,a5] ~", AO: "[g4,c5,e5,g5]@5 c3 [g4,c5,e5,g5] ~", AP: "[g4,e5,g5]@7 ~ [b4,g5]@8",
  AQ: "~ [c5,e5] ~@3 [c5,f5] ~@2", AR: "[g4,c5,e5,g5] [b4,g5]", AS: "[a4,f5,a5]@7 ~ [b4,g5,b5]@7 ~",
  AT: "[g4,c5,e5,g5]@15 ~", AU: "[c5,e5,g5]@15 ~",
})).s("gm_acoustic_guitar_steel").gain(0.52)

// chords · acoustic guitar steel · "GUITAR" · soft notes
const acoustic_guitar_steel_2 = note(`<
  A ~ B ~@3 C ~@3 D@2 E@2 ~@2 D C ~ F G ~ H I ~@2 J ~ K@2 L M ~ E C N E ~@2 B ~ E ~@2 E ~@4 O ~@3 O J ~@3 P ~ N ~ C I
  ~@4
>`.pickRestart({
  A: "~@12 c5 ~@3", B: "~@10 c5 ~@5", C: "~@3 c4 ~@4", D: "~@6 c4 ~@9", E: "~@14 d4 ~", F: "~@6 c4 ~@7 d4 ~",
  G: "~@6 c4@2 ~@6 d4 ~", H: "~@14 c4 ~", I: "g4 ~@3", J: "c5 ~@7", K: "[b4@13 ~@3]/2", L: "~@5 f5@9 ~@2",
  M: "~@5 e5@9 ~@2", N: "~@7 d4", O: "~@4 a4 ~@11", P: "~@6 c4 ~@7 c4 ~",
})).s("gm_acoustic_guitar_steel").gain(0.29)

// chords · electric guitar clean · "GUITAR"
const electric_guitar_clean = note(`<
  ~@4 A B A C B D A B@2 D A E B F G H I D J@2 K L M N O P M Q B R S B@2 D A T B U A V@2 R A W V P M N P@2 M N B D A B@2
  D A N B X A Y
>`.pickRestart({
  A: "[c4,e4,g4]@5 ~@3 [c4,f4,a4]@5 ~@3", B: "[c4,e4,g4]@5 ~@3 [d4,g4,b4]@5 ~@3",
  C: "[c4,e4,g4]@4 ~@4 [d4,g4,b4]@5 ~@3", D: "[c4,f4,a4]@5 ~@3 [d4,g4,b4]@5 ~@3", E: "[c4,e4,g4] ~",
  F: "[c4,f4,a4]@5 ~@3 [d4,g4,b4]@6 ~@2", G: "[c4,e4,g4]@5 ~@3 [c4,f4,a4]@5 ~@3, ~@8 d4 ~@7",
  H: "[c4,e4,g4]@4 ~@3 [d4,g4,b4]@6 ~@3", I: "[c4,e4,g4]@6 ~@2 [d4,g4,b4]@5 ~@3",
  J: "[[c4,e4,g4]@5 ~@3 [c4,f4,a4]@5 ~@3 [c4,e4]@13 ~@3, ~@15 g4@13 ~@4]/2", K: "[d4,g4,b4]@3 ~ [d4,g4,b4]@3 ~",
  L: "[d4,g4,b4]@6 ~@2 [d4,g4,b4]@5 ~@3", M: "[c4,f4,a4]@5 ~@3 [c4,f4,a4]@5 ~@3",
  N: "[c4,e4,g4]@5 ~@3 [c4,e4,g4]@5 ~@3", O: "[d4,g4,b4]@5 ~@3 [d4,g4,b4]@6 ~@2",
  P: "[d4,g4,b4]@5 ~@3 [d4,g4,b4]@5 ~@3", Q: "[c4,e4,g4]@5 ~@3 [c4,e4,g4]@6 ~@2",
  R: "[c4,f4,a4]@6 ~@2 [d4,g4,b4]@5 ~@3", S: "[c4,e4,g4]@5 ~@3 [d4,g4,a4,b4] ~@2 c4@2 ~@3, ~@8 f4@5 ~@3, ~@9 a4@4 ~@3",
  T: "[c4,e4,g4]@5 ~@11", U: "[c4,f4,a4]@3 ~ [d4,g4,b4]@3 ~", V: "[c4,e4,g4]@5 ~@3 [d4,g4,b4]@6 ~@2",
  W: "[c4,e4,g4]@7 ~", X: "[c4,e4,g4]@6 ~@2 [c4,e4,g4]@5 ~@3", Y: "[c4,e4,g4]@3 ~@5",
})).s("gm_electric_guitar_clean").gain(0.36)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@51 [~@12 x!4] ~@16>").gain(0.6)

// drums · hihat
const hihat = s("hh").struct(`<
  A@2 B C A B A C A@7 C A@7 C A@4 B A@2 C A@3 B@2 A@2 C A@6 B C A B A ~ A@3 C A ~@11
>`.pickRestart({
  A: "x!8", B: "x!3 ~ x!4", C: "x!2 ~@6",
})).gain(0.53)

// drums · mid tom
const mid_tom = s("mt").struct("<~@51 [~@8 x!2 ~@6] ~@16>").gain(0.6)

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

// drums · high tom
const high_tom = s("ht").struct("<~@51 [~@4 x!2 ~@10] ~@16>").gain(0.6)

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

// drums · tambourine
const tambourine = s("tb").struct("<A@3 B A@3 B A@7 B A@7 B@9 A@7 B A@7 B@4 A B@4 A ~@11>".pickRestart({
  A: "x!8", B: "x!4",
})).gain(0.53)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<A@3 B A@3 B A@7 B A@7 B@9 A@7 B A@7 B@9 A ~@11>".pickRestart({
  A: "x!8", B: "x!4",
})).gain(2.71)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@3 A ~@3 A ~@7 A ~@7 A@9 ~@7 A ~@7 A@9 ~@12>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(1.69)

// drums · shaker
const shaker = s("sh").struct("<[x!4]!57 ~@11>").gain(0.53)

stack(
  bass, acoustic_guitar_steel, acoustic_guitar_steel_2, electric_guitar_clean, kick, snare, low_tom, hihat, mid_tom,
  open_hat, high_tom, crash, tambourine, cabasa, cabasa_soft, shaker
)

More by Tommy Roe