Strudelify

Skinnie Minnie

Haley

KeyF majorTempo132 bpm
0:00/0:00
// Skinnie Minnie — Haley
// 132 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 90 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A ~ A B C B C D E B C D E B C D F G H I J B C D K L M N@2 B C B C D E B C D E B C D F G H I J B C D K L M N@2 B C B
  C D E B C D E B C D F G H I J B C D K L M N@2 B C B C D E O@2
>`.pickRestart({
  A: "~@6 f1@2 ~ f1@2 ~ f1@3 ~@9", B: "f1@7 ~@2 f1@3 a1@5 ~ c2@3 e1@3", C: "f1@7 ~@2 f1@3 a1@6 c2@3 e1@3",
  D: "f2@2 ~ f2@2 ~ f2@2 ~ f2@2 ~ eb2@2 ~ eb2@2 ~ eb2@2 ~ e2@3", E: "f2@2 ~@4 f1@2 ~ f1@2 ~ f1@3 ~@9",
  F: "f2@4 ~@2 f2@2 ~ f2@2 ~ f2@3 f2@3 g2@3 a2@3", G: "bb2@5 ~ bb2@3 bb2@2 ~ f2@2 ~ f2@2 ~ ab2@2 ~ a2@2 ~",
  H: "bb2@5 ~ bb2@3 bb2@2 ~ f2@2 ~ f2@2 ~ f2@2 ~ f2@3", I: "bb2@5 ~ bb2@2 ~ bb2@2 ~ ab2@2 ~ ab2@2 ~ ab2@2 ~ a2@3",
  J: "bb2@4 ~@2 bb2@2 ~ bb2@2 ~ bb2@2 ~ bb2@2 ~ a2@2 ~ g2@2 ~", K: "f2@4 ~@2 f2@2 ~ f2@2 ~ f2@3 f2@3 e2@3 d2@3",
  L: "c2@4 ~@2 c2@5 ~ c2@3 c2@2 ~ c2@3 b1@3", M: "bb1@5 ~ bb1@3 bb1@2 ~ bb1@3 bb1@3 c2@3 d2@3",
  N: "f2@5 ~ f2@3 f2@2 ~ a2@3 a2@3 bb2@3 c3@3", O: "[f1@43 ~@5]/2",
})).s("gm_acoustic_bass").gain(0.36)

// other · tenor sax
const tenor_sax = note(`<
  ~ A ~ B C D C E F G C E F H C E F I J K L M C E F N O P Q R C D C E F G C E F H C E F I J K L M C E F N O P Q R C D C
  E F G C E F H C E F I J K L M C E F N O P Q R C D C E F G ~@2
>`.pickRestart({
  A: "~@6 f3@2 ~ f3@2 ~ f3@2 ~@10", B: "~@6 f3@3 f3@3 f3@2 ~@10", C: "f3@4 ~@5 d4@9 c4@3 e3@3", D: "f3 ~@2 d4@3 c4 e3",
  E: "f3@4 ~@5 d4@8 ~ c4@3 e3@3", F: "f4 eb4", G: "f4@3 ~@3 f3@2 ~ f3@2 ~ f3@2 ~@10",
  H: "f4@3 ~@3 f3@2 ~ f3@2 ~ f3@2 ~@7 eb3@3", I: "f4@3 ~@3 f3@2 ~ f3@2 ~ f3@2 ~ f3@3 g3@3 a3@3",
  J: "bb3@4 ~@5 g4@9 f4@3 a3@3", K: "bb3@4 ~@5 g4@8 ~ f4@3 a3@3", L: "bb3 ab3",
  M: "bb3@3 ~@3 bb3@2 ~ bb3@2 ~ bb3@2 ~ bb3@3 a3@3 g3@3", N: "f4@3 ~@3 f3@2 ~ f3@2 ~ f3@2 ~ f4@3 e4@3 d4@3",
  O: "c4 ~@5 c4 b3", P: "bb3@3 ~@12 f3!2 ~ ab3@5 ~", Q: "f3@3 ~@12 f3!2 ~ ab3@6", R: "f3 ~@7",
})).s("gm_tenor_sax").gain(0.31).pan(0.2)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  A B A B C D C D A B C D A B C D A B E F G H C D A B I J K L C D C D A B C D A B C D A B E F G H C D A B I J K L C D C
  D A B C D A B C D A B E F G H C D A B I J K L C D C D A M@3
>`.pickRestart({
  A: "[a4,c5,f5] f5 [a4,c5] [c5,f5] [a4,c5,f5]!3 [a4,c5] f5 [a4,c5] [a4,c5,f5]!2 [g4,bb4,eb5] [bb4,eb5] [g4,bb4] eb5 [g4,bb4] [bb4,eb5] ~ eb5@5, ~@18 [g4,bb4]@5 ~", // F Am F5 F Am F Eb Eb5 …
  B: "[a4,c5,f5] ~@23", C: "f2@5 ~@4 c3@7 ~@2 c3@3 ~@3", D: "f2@5 ~@4 c3@6 ~@3 c3@3 ~@3",
  E: "bb2@5 ~@4 f2@7 ~@2 f2@3 ~@3", F: "bb2@5 ~@4 f2@6 ~@3 f2@3 ~@3",
  G: "[d4,f4,bb4] bb4 [d4,f4] [f4,bb4] [d4,f4,bb4]!3 [d4,f4] bb4 [d4,f4] [d4,f4,bb4]!2 [c4,eb4,ab4] [eb4,ab4] [c4,eb4] ab4 [c4,eb4] [eb4,ab4] ~ ab4@5, ~@18 [c4,eb4]@5 ~", // Bb Dm Bb5 Bb Dm Bb Ab Ab5 …
  H: "[d4,f4,bb4] ~@11", I: "~@6 [e3,bb3,c4,e4]@4 ~@5 [e3,bb3,c4,e4]@6 [bb3,c4,e4]@3",
  J: "[f3,ab3,bb3,d4]@3 ~@3 [f3,ab3,bb3,d4]@5 ~@4 [f3,ab3,bb3,d4]@5 ~ [f3,ab3,bb3,d4]@3", // Bb7
  K: "[f3,a3,c4]@3 ~@3 [f3,a3,c4]@5 ~@4 [f3,a3,c4]@8 ~", L: "[f3,a3,c4]@3 ~@3 [f3,a3,c4]@5 ~@4 [f3,a3,c4]@9",
  M: "[[a4,c5,f5] ~@23 [f3,a3,c4,f4]@45 ~@3, ~@23 c3@45 ~@4]/3", // F
})).s("gm_electric_guitar_clean").gain(0.19).pan(0.2)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean_2 = note(`<
  ~ A ~ B C@4 ~ A C@2 ~ A C@2 ~ A D@2 ~ E C@2 ~ A F G ~@2 C@4 ~ A C@2 ~ A C@2 ~ A D@2 ~ E C@2 ~ A F G ~@2 C@4 ~ A C@2 ~
  A C@2 ~ A D@2 ~ E C@2 ~ A F G ~@2 C@4 ~ A ~@2
>`.pickRestart({
  A: "~@6 [f4,a4,c5]@2 ~ [f4,a4,c5]@2 ~ [f4,a4,c5]@3 ~@9", // F
  B: "~@6 [f4,a4,c5]@2 ~ [f4,a4,c5]@2 ~ [f4,a4,c5]@3 [c4,f4]@2 [c4,f4]@4 [c4,f4]@2 ~", // F F5
  C: "[a3,c4,f4] ~@5 [a3,c4,f4] ~@5 [a3,c4,f4] ~@5 [a3,c4,f4] ~@5", // F
  D: "[bb3,d4,f4] ~@5 [bb3,d4,f4] ~@5 [bb3,d4,f4] ~@5 [bb3,d4,f4] ~@5", // Bb
  E: "~@6 [d4,f4,bb4]@2 ~ [d4,f4,bb4]@2 ~ [d4,f4,bb4]@3 ~@9", // Bb
  F: "[bb3,c4,e4] ~@5 [bb3,c4,e4] ~@5 [bb3,c4,e4] ~@5 [bb3,c4,e4] ~@5", // C7
  G: "[ab3,bb3,d4] ~@5 [ab3,bb3,d4] ~@5 [ab3,bb3,d4] ~@5 [ab3,bb3,d4] ~@5", // Bb7
})).s("gm_electric_guitar_clean").gain(0.17).pan(0.8)

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

// drums · clap
const clap = s("cp").struct(`<
  ~ A ~ A ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~@9 A ~@3 A ~@3 A ~@3 A ~@3 A ~@9 A ~@3 A ~@3 A ~@3 A ~@3 A ~@9 A ~@2
>`.pickRestart({
  A: "~@2 x!3 ~@3",
})).gain(0.43)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@3 A ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~@9 A ~@3 A ~@3 A ~@3 A ~@3 A ~@9 A ~@3 A ~@3 A ~@3 A ~@3 A ~@12
>`.pickRestart({
  A: "~@15 x!3 ~@6",
})).gain(0.24)

// drums · low tom
const low_tom = s("lt").struct("<~@29 A ~ A ~@23 A ~ A ~@23 A ~ A ~@6>".pickRestart({
  A: "~@21 x!2 ~",
})).gain(0.43)

// drums · mid tom
const mid_tom = s("mt").struct("<~@29 A ~ A ~ B ~@21 A ~ A ~ B ~@21 A ~ A ~ B ~@4>".pickRestart({
  A: "~@16 x ~ x!2 ~@4", B: "~@15 x!2 ~@7",
})).gain(0.43)

// drums · crash
const crash = s("cr").struct("<~@29 A B A B A B ~@20 A B A B A B ~@20 A B A B A B ~ B ~>".pickRestart({
  A: "~@3 x ~@4", B: "x",
})).gain(0.24)

// drums · ride
const ride = s("rd").struct(`<
  ~@4 A@5 B A@3 B A@3 B A@3 B A@3 B A@3 C D C D C D B A@3 B A@3 B A@3 B A@3 B A@3 C D C D C D B A@3 B A@3 B A@3 B A@3 B
  A@3 C D C D C D B ~@2
>`.pickRestart({
  A: "x!8", B: "x", C: "x!3 ~@5", D: "~ x!7",
})).gain(0.37)

stack(
  bass, tenor_sax, electric_guitar_clean, electric_guitar_clean_2, kick, clap, snare, snare_soft, low_tom, mid_tom,
  crash, ride
)

More by Haley