Strudelify

Little Sister

Ry Cooder

KeyE majorTempo154 bpm
0:00/0:00
// Little Sister — Ry Cooder
// 154 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 95 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(154/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
const piano = note(`<
  ~@25 A B C ~ D E C F G H I J K@2 L M N O P Q R S T U V W X Y Z ~@7 L AA@2 M AB E C F G H I J K@2 L M AC AD AE Q AF S
  AG AH AI AD AE AJ AK AL ~ AM@3
>`.pickRestart({
  A: "[b4,d5]@2 ~@2 [b4,d5] ~ [b4,d5] ~ [b4,d5]@2 ~@2 [b4,d5] ~ [b4,d5]@2, a#4 ~@7 a#4 ~@5 a#4 ~", // Bm
  B: "~@2 b4@2 ~@2 a4@2 ~@2 g4 ~ e4@2 d4@2, ~@6 b4 ~@9", C: "[b3,d4,e4]@2 ~@2 [b3,d4,e4]@9 ~ [b3,d4,e4]@2, a#3 ~@15",
  D: "[e3,g3,a3]@2 ~@2 [e3,g3,a3]@5 ~ [e3,g3,a3] ~@3 [e3,g3,a3]@2, d#3 ~@15", // A7
  E: "~@2 [e3,g3,a3] ~ [e3,g3,a3]@2 ~@2 [e3,g3,a3] ~ [e3,g3,a3]@2 ~@2 [e3,g3,a3] ~", // A7
  F: "~ e3!2 ~ [a#3,b3,d4,e4] ~ [b3,d4,e4]@2 c#4@2 d4@2 d#4@2 e4 ~, ~@6 a#3 ~@9", // E7
  G: "[e4,g4,a4]@2 ~@2 [e4,g4,a4]@5 ~ [e4,g4,a4] ~@3 [e4,g4,a4]@2, d#4 ~@15", // A7
  H: "~@2 [e4,g4,a4] ~ [e4,g4,a4]@2 ~@2 [e4,g4,a4] ~ [e4,g4,a4]@2 ~@2 [e4,g4,a4] ~", // A7
  I: "~@4 [f#4,a4,b4]@2 ~@2 [f#4,a4,b4]@2 ~ [f#4,a4,b4]@2 d#4 b3 ~, ~@4 f4 ~@3 f4 ~@7", // B7
  J: "~@2 [f#5,a5,b5] ~ [f#5,a5,b5]@2 ~@2 b5@2 c#6@2 d6@2 d#6 ~, ~@8 [f#5,a5]@5 ~@3", // B7 F#m
  K: "[[b5,d6]@2 ~@2 [b5,d6] ~ [b5,d6] ~ [b5,d6]@2 ~@2 [b5,d6] ~ [b5,d6]@10 ~@2 [b5,d6] ~ [b5,d6] ~ [b5,d6] ~, a#5 ~@7 a#5 ~@5 a#5 ~@17]/2", // Bm
  L: "~@2 [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~", // Bm
  M: "[b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~, e2 e3 f#2 f#3 g2 g3 g#2 g#3", // Bm
  N: "[e5,g5,a5]@2 [e5,g5,a5]!2 ~ [e5,g5,a5]!2 ~ [e5,a5]@2 [e5,g5,a5] ~ [e5,a5]@2 [e5,g5,a5] ~, d#5 ~@7 [d#5,g5] ~@3 [d#5,g5] ~@3", // A7 A5 A7 A5 A7 D#
  O: "[e5,a5]@2 [e5,g5,a5] ~ [b5,e6] ~ [b5,e6] ~ [a#5,b5,e6] ~ [b5,e6] ~ [g#5,a5,e6] ~ [g5,e6] ~, [d#5,g5] ~@15", // A5 A7 E5 E E5 Amaj7 C D#
  P: "[b5,d6,e6]@2 ~@2 e5 ~ e5 ~ [b5,d6,e6]@2 ~@2 e5 ~ e5 ~, a#5 ~@7 a#5 ~@7", // E7
  Q: "~ e4!2 ~ [a#4,b4,d5,e5] ~ [b4,d5,e5]@2 c#5@2 d5@2 d#5@2 e5 ~, ~@6 a#4 ~@9", // E7
  R: "[e5,g5,a5]@2 ~@2 [e5,g5,a5]@5 ~ [e5,g5,a5] ~@3 [e5,g5,a5]@2, d#5 ~@15", // A7
  S: "~@2 [e5,g5,a5] ~ [e5,g5,a5]@2 ~@2 [e5,g5,a5] ~ [e5,g5,a5]@2 ~@2 [e5,g5,a5] ~", // A7
  T: "~@2 [b5,d6,e6]@2 [b5,d6,e6]@2 ~@4 [b5,d6,e6] ~ [b5,d6,e6] ~ [b5,d6,e6] ~", // E7
  U: "~@2 [b5,d6,e6]@2 [b5,d6,e6]@2 ~@2 [b5,d6,e6] ~@2 [b5,d6,e6] ~@2 [b5,d6,e6] ~", // E7
  V: "~@2 [b5,e6] ~ [b5,e6] ~ [a#5,b5,e6] ~ [b5,e6] ~ [g#5,a5,e6] ~ [g5,e6] ~ e5 ~", // E5 E E5 Amaj7 C
  W: "[b5,e6] ~ [b5,e6] ~ [a#5,b5,e6] ~ [b5,e6] ~ [g#5,a5,e6] ~ [g5,e6] ~ e5 ~ d5 ~", // E5 E E5 Amaj7 C
  X: "[a#5,b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [a#5,b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~", // A# Bm A# Bm
  Y: "[b5,d6] ~ [d5,e5] ~ [b4,d5]@2 ~@2 [b4,d5] ~@2 [b4,d5] ~@2 [b4,d5] ~", Z: "[g#4,d5,e5] ~@15",
  AA: "~@2 [b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [a#5,b5,d6] ~ [b5,d6] ~ [b5,d6] ~ [b5,d6] ~", // Bm A# Bm
  AB: "[e3,g3,a3]@2 ~@2 [e3,g3,a3]@5 ~ [e3,g3,a3] ~@3 [e3,g3,a3]@2", // A7
  AC: "[e4,g4,a4]@2 ~@2 [e4,g4,a4]@2 ~@2 [e4,g4,a4]@2 ~ [e4,g4,a4] ~ [e4,f#4,a4]@2 ~, d#4 ~@15", // A7 F#m7
  AD: "~@2 [e4,g4,a4] ~ [e4,g4,a4]@2 ~@2 [e4,g4,a4]@2 ~ [e4,g4,a4] ~ [e4,f#4,a4]@2 ~", // A7 F#m7
  AE: "[b4,d5,e5]@2 ~@2 [b4,d5,e5]@2 ~@2 [b4,d5,e5]@2 ~ [b4,d5,e5] ~ [b4,c#5,e5]@2 ~, a#4 ~@15", // E7 C#m7
  AF: "[e5,g5,a5]@2 ~@2 [e5,g5,a5]@2 ~@2 [e5,g5,a5]@2 [e5,g5,a5] a4 ~ [e5,f#5,a5]@2 ~, d#5 ~@15", // A7 F#m7
  AG: "~@2 [b5,d6] ~ [b5,d6] ~ e5 ~ [b5,d6]@2 [b5,d6] e5 ~ [b5,c#6]@2 ~, ~@8 c#6 ~@7", // Bm Bsus2
  AH: "~@2 [b4,d5] ~ [b4,d5] ~ e4 ~ [b4,d5]@2 [b4,d5] e4 ~ [b4,c#5]@2 ~, ~@8 c#5 ~@7", // Bm Bsus2
  AI: "[e4,g4,a4]@2 ~@2 [e4,g4,a4]@2 ~@2 [e4,g4,a4]@2 ~ [e4,g4,a4] ~ [e4,f#4,a4]@2 ~", // A7 F#m7
  AJ: "~ e5!2 ~ [b5,d6]@2 [b5,d6] ~ [b5,d6]@2 [b5,d6] ~ [a5,d6]@2 [g5,d6] ~, ~@4 a#5 ~@3 a#5 ~@7", // Bm D5 G5
  AK: "[b5,d6]@2 [b5,d6] ~ [b5,d6]@2 [b5,d6] ~ [b5,d6]@2 [b5,d6] ~ [a#5,d6]@2 [a#5,d6] ~", AL: "[a5,d6] ~@7",
  AM: "[~@12 [e3,e4,b4,d5,e5]@25 ~ [e3,e4,b4,d5,e5] ~@9, ~@12 c#5 ~@35]/3", // E7
})).s("gm_piano").gain(0.54)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A B@5 C@2 D@2 E ~ A B@5 C@2 D@2 E ~ A B@2 F G H I B G H J K B@3 F G H L B M C L N O P I Q B@2 C@2 D@2 E ~ A B@2 F G
  H I B G H J K B@3 F G H L B M C L B M C L N D R S T@3
>`.pickRestart({
  A: "e1@3 ~ g#1@2 e1 ~ b1@2 e1 ~ a1@2 g#1@2", B: "e1@2 e1@2 g#1@2 e1 ~ b1@2 e1 ~ a1@2 g#1@2",
  C: "a1@2 a1@2 c#2@2 a1 ~ e2@2 a1 ~ d2@2 c#2@2", D: "b1@2 b1@2 d#2@2 b1 ~ f#2@2 b1 ~ e2@2 d#2@2", E: "a1 ~@7",
  F: "e1!2 f#1!2 g1!2 g#1!2", G: "a1!2 c#2!2 e2!2 f#2!2", H: "g2!2 f#2!2 e2!2 c#2!2",
  I: "e1@2 e1@2 g#1@2 e1 ~ b1@2 e1 ~ c#2@2 b1@2", J: "b1!2 d#2!2 f#2!2 g#2!2", K: "b2!2 a2!2 g#2!2 f#2!2",
  L: "e1@2 e1@2 g#1@2 e1 ~ b1@2 e1 ~ c#2@2 e2@2", M: "a1@2 a1@2 c#2@2 a1 ~ e2@2 a1 ~ f#2@2 a2@2",
  N: "e1@2 e1@2 g#1@2 e1 ~ b1@2 e1 ~ a1@2 a#1@2", O: "b1@2 b1@2 d#2@2 b1 ~ f#2@2 f#2@2 e2@2 d#2@2",
  P: "a1@2 a1@2 c#2@2 a1 ~ e2@2 e2@2 d2@2 c#2@2", Q: "~ b1!7", R: "a1@3 ~@13", S: "~ e1 g#1!2 a1!2 a#1!2",
  T: "[b1 c#2 d#2 e2 ~@2 e1@12 ~ e1 ~@4]/3",
})).s("gm_electric_bass_finger").gain(0.45)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B A B A B ~ C D A B A@2 B A B A@2 E F D A B G A B H B H B H B H@3 I D B H B H B H B H B H@2 A B A B A@2 E
  J D A B G A B H B H B H B H@2 A K H B H B H B H L H@4 M E ~ N O P
>`.pickRestart({
  A: "x ~@3 x ~@2 x", B: "x!2", C: "~@3 x ~ x!2 ~", D: "x ~@2 x!2 ~@3", E: "x", F: "~@3 x", G: "~ x ~@2 x ~@2 x",
  H: "x!2 ~@2 x ~@3", I: "x ~@2 x ~@4", J: "~@7 x", K: "x ~@3 x ~ x!2", L: "x ~@4 x ~@2", M: "x!2 ~@2 x ~ x ~",
  N: "~ x!2 ~@3 x ~", O: "~@7 x ~@3 x ~@3 x", P: "~@3 x ~@4",
})).gain(0.54)

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

// drums · low tom
const low_tom = s("lt").struct("<~@53 [x!2]!6 x ~@33 [~@3 x ~ x ~ x] ~>").gain(0.54)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@53 [~@3 x ~@4] [~@3 x ~@3 x] [~@3 x ~@4] [~@3 x ~@3 x] [~@3 x ~@4]!2 ~@36>")
  .gain(0.36)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@93 [~@5 x ~@3 x ~@3 x ~@2] ~>").gain(0.42)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A ~@20 B ~@11 B ~@6 C ~@7 B ~@8 B ~@9 B ~@4 C ~@10>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~@6 x!2",
})).gain(0.54)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@7 A ~@3 A ~@7 A ~@3 A ~@7 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~@9 A ~@3 A ~@7 A ~@3 A ~@7 A ~@6 B ~ C
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@3 x ~@4",
})).gain(0.48)

// drums · ride
const ride = s("rd").struct("<~@94 [~@3 x ~@4]>").gain(0.54)

stack(piano, bass, kick, snare, low_tom, low_tom_soft, hihat, mid_tom, open_hat, crash, ride)