Strudelify

Surfer Girl

Home Grown

KeyB♭ minorTempo190 bpm
0:00/0:00
// Surfer Girl — Home Grown
// 190 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 3 "guitar" distortion guitar (copy of ch 2 "guitar" overdriven guitar)
// note: Full arrangement: all 186 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(190/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 · electric guitar clean · "guitar"
const electric_guitar_clean = note(`<
  A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C E ~ A B C D A B C D A B C D A B C D A B C D A B C D F G
  F G F G F H ~@16 A B C D A B C D A B C D A B C D A B C D A B C D F G F G F G F I ~@28 J@4 K@2 L M N@2 O@2 P Q R S T@4
  ~@4 T@4 ~@4 F G F G F G U H V@4 ~
>`.pickRestart({
  A: "[bb2,f3,bb3]@2 [bb2,f3,bb3] ~@3 [bb2,f3,bb3] ~@3 [bb2,f3,bb3] ~@3 [bb2,f3,bb3]@2", // Bb5
  B: "[db3,ab3,db4]@2 [db3,ab3,db4] ~@3 [db3,ab3,db4]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3] ~@3 [ab2,eb3,ab3]@2", // Db5 Ab5
  C: "[eb3,bb3,eb4]@2 [eb3,bb3,eb4] ~@3 [eb3,bb3,eb4] ~@3 [eb3,bb3,eb4] ~@3 [eb3,bb3,eb4]@2", // Eb5
  D: "[gb2,db3,gb3]@2 [gb2,db3,gb3] ~@3 [gb2,db3,gb3]@2 [f2,c3,f3]@2 [f2,c3,f3] ~@3 [f2,c3,f3]@2", // Gb5 F5
  E: "[gb2,db3,gb3]@3 [gb2,db3,gb3]@3 [gb2,db3,gb3]@3 [f2,c3,f3]@2 ~@5", // Gb5 F5
  F: "[gb2,db3,gb3]@2 [gb2,db3,gb3] ~@3 [gb2,db3,gb3] ~@3 [gb2,db3,gb3] ~@3 [gb2,db3,gb3]@2", // Gb5
  G: "[f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3]@4 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3]@4", // F5
  H: "[ab2,eb3,ab3] ~ [ab2,eb3,ab3] ~ [ab2,eb3,ab3] ~ [ab2,eb3,ab3] ~ [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2", // Ab5
  I: "[ab2,eb3,ab3] ~ [ab2,eb3,ab3] ~ [ab2,eb3,ab3]@2 [ab2,eb3,ab3] ~ [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2", // Ab5
  J: "[~ [f3,bb3]@63, bb2]/4", K: "[~ [db3,gb3]@31, gb2]/2", L: "~ [eb3,ab3]@15, ab2", M: "~ [c3,f3]@15, f2",
  N: "[~ [f3,bb3]@31, bb2]/2", O: "[~ ab4@15, bb2, ~ [f3,bb3]@31]/2",
  P: "[gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~", // Gb5
  Q: "[gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3]@2", // Gb5
  R: "[ab2,eb3,ab3]!8", S: "[f2,c3,f3]!8",
  T: "[bb2,f3] ~ [bb2,f3] ~ [bb2,f3,bb3]@4 [bb2,f3] ~ [bb2,f3] ~ [bb2,f3,bb3]@4", // Bb5
  U: "[gb2,db3,gb3]@2 [gb2,db3,gb3] ~@3 [gb2,db3,gb3] ~@3 [gb2,db3,gb3] ~@3 [gb2,db3,gb3] [g2,d3,g3]", // Gb5 G5
  V: "[[bb2,f3,bb3]@31 ~]/4", // Bb5
})).s("gm_electric_guitar_clean").gain(0.57)

// chords · overdriven guitar · "guitar"
const overdriven_guitar = note(`<
  ~@4 A B C D E C F G H I J K ~@15 L ~ M N O P Q R S G ~@17 T ~ T ~ T ~ U V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 X Y Z AA AB AC
  AD AE ~@17 T ~ T ~ T ~ AF V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 AG@2 AH@2 AI@2 AJ@2 AK@4 ~@12 AL AM AN AO AP@4 AQ@2 AR AS
  AP@4 AQ@2 AR AS ~ T ~ T ~ T AT U AU@5
>`.pickRestart({
  A: "bb3@6 c4 db4", B: "eb4 db4@2 c4 db4 c4@2 ab3", C: "bb3", D: "gb3 f3", E: "~@8 f4@6 eb4 db4",
  F: "db4 c4@2 bb3 eb4 f4@2 gb4", G: "f4@7 ~", H: "~@8 [f4,f5]@6 [eb4,eb5] [db4,db5]", I: "[eb4,eb5]",
  J: "[bb3,bb4] [db4,db5]@2 [db4,db5]!2 [eb4,eb5]@2 [db4,db5]", K: "[c4,c5]@7 ~",
  L: "[gb2,db3,gb3]@3 [gb2,db3,gb3]@3 [gb2,db3,gb3]@3 [f2,c3,f3]@2 ~@5", M: "f5 db5@2 bb4 f4 bb4@2 db5", N: "f5@7 ~",
  O: "f5 gb5@2 eb5 f5 db5@2 eb5", P: "c5@7 ~", Q: "db5@2 c5@2 ~@2 db5 c5 bb4@8", R: "ab4@2 gb4@2 ~@2 ab4 gb4 f4@8",
  S: "db4 c4@2 bb3 db4 f4@2 gb4", T: "[f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3]@4 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3]@4",
  U: "[ab2,eb3,ab3] ~ [ab2,eb3,ab3] ~ [ab2,eb3,ab3] ~ [ab2,eb3,ab3] ~ [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2", // Ab5
  V: "[[bb2,f3,bb3]@2 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2 [bb2,f3,bb3] [gb2,db3,gb3]@3 [gb2,db3,gb3]@2 [gb2,db3,gb3]@2 [gb2,db3,gb3]@2]/2", // Bb5 Gb5
  W: "[[db3,ab3,db4]@2 [db3,ab3,db4]@2 [db3,ab3,db4]@2 [db3,ab3,db4] [f2,c3,f3]@3 [f2,c3,f3]@2 [f2,c3,f3]@2 [f2,c3,f3]@2]/2", // Db5 F5
  X: "~@4 bb3@4 db4@3 ~ ab3@4", Y: "bb3@7 ~, a3 ~@15", Z: "bb2@2 db3@2 ~@2 eb3 f3 eb3@6 db3@2",
  AA: "eb3 ~ eb3 db3 bb2@3 ~", AB: "bb3@2 db4@2 ~@2 eb4 f4 eb4@2 db4@2 bb3@4",
  AC: "[bb3,db4]@2 ~ [f4,bb4]@2 [f4,bb4]@2 bb4", AD: "c5 db5 bb4@2 ab4@2 bb4@2 ab4@2 f4@2 eb4@2 db4@2",
  AE: "eb4@2 bb3 bb3@4 ~",
  AF: "[ab2,eb3,ab3] ~ [ab2,eb3,ab3] ~ [ab2,eb3,ab3]@2 [ab2,eb3,ab3] ~ [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2", // Ab5
  AG: "[[f2,c3,f3]@4 [f2,c3,f3]@4 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [gb2,db3,gb3]@4 [gb2,db3,gb3]@2 [gb2,db3,gb3]@4 [gb2,db3,gb3,c5,db5]@2 [gb2,db3,gb3,c5,db5]@2 [gb2,db3,gb3,ab4,a4]@2 [gb2,db3,gb3,ab4,a4]@2]/2", // F5 Gb5 Gb Gbm
  AH: "[[f2,c3,f3]@4 [f2,c3,f3]@4 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [gb2,db3,gb3]@4 [gb2,db3,gb3]@2 [gb2,db3,gb3]@4 [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~]/2", // F5 Gb5
  AI: "[[f2,c3,f3]@4 [f2,c3,f3]@4 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [gb2,db3,gb3]@4 [gb2,db3,gb3]@2 [gb2,db3,gb3]@4 [gb2,db3,gb3,a4,bb4]@2 [gb2,db3,gb3,a4,bb4]@2 [gb2,db3,gb3,ab4,a4]@2 [gb2,db3,gb3,ab4,a4]@2]/2", // F5 Gb5 Gb Gbm
  AJ: "[[f2,c3,f3]@4 [f2,c3,f3]@4 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [ab2,eb3,ab3]@4 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@4 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3]@2]/2", // F5 Ab5
  AK: "[bb3@31 ~, f3@27 ~@5, bb2@23 ~@9]/4",
  AL: "[gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~", // Gb5
  AM: "[gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3] ~ [gb2,db3,gb3]@2", // Gb5
  AN: "[ab2,eb3,ab3]!8", AO: "[f2,c3,f3]!8",
  AP: "[bb2,f3] ~ [bb2,f3] ~ [bb2,f3,bb3]@4 [bb2,f3] ~ [bb2,f3] ~ [bb2,f3,bb3]@4", AQ: "[db3,gb3,db4]!8",
  AR: "[c3,f3,c4]!8", AS: "[eb3,ab3,eb4]!8", AT: "~@14 [gb2,db3,gb3] [g2,d3,g3]",
  AU: "[bb3@39 ~, f3@31 ~@9, bb2@23 ~@17]/5",
})).s("gm_overdriven_guitar").gain(0.48).pan(0.3)

// bass · electric bass finger · "bass"
const bass = note(`<
  ~@4 A B C D E F G H E F G H E F G H E F G H E F G H E F G I J E F G H E F G H E F G H E F G H E F G H E F G H K L K L
  K L K M N@2 O@2 N@2 O@2 N@2 O@2 N@2 O@2 E F G H E F G H E F G H E F G H E F G H E F G H K L K L K L K P N@2 O@2 N@2
  O@2 N@2 O@2 N@2 O@2 Q@2 R@2 Q@2 S@2 T@2 U V ~@12 W X Y Z AA@4 AB@2 Z Y AA@4 AB@2 Z Y K L K L K L AC M AD@4 ~
>`.pickRestart({
  A: "bb1", B: "db2 ab1", C: "eb2", D: "gb1 f1", E: "bb1@2 bb1 ~@3 bb1 ~@3 bb1 ~@3 bb1@2",
  F: "db2@2 db2 ~@3 db2@2 ab1@2 ab1 ~@3 ab1@2", G: "eb2@2 eb2 ~@3 eb2 ~@3 eb2 ~@3 eb2@2",
  H: "gb1@2 gb1 ~@3 gb1@2 f1@2 f1 ~@3 f1@2", I: "gb1!3 f1 ~@4", J: "~@12 db2@2 c2 b1",
  K: "gb1@2 gb1 ~@3 gb1 ~@3 gb1 ~@3 gb1@2", L: "f1 ~ f1 ~ f1@4 f1 ~ f1 ~ f1@4",
  M: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1@2 ab1@2 ab1@2 ab1@2", N: "[bb1@2 bb1@2 bb1@2 bb1 gb1@3 gb1@2 gb1@2 gb1@2]/2",
  O: "[db2@2 db2@2 db2@2 db2 f1@3 f1@2 f1@2 f1@2]/2", P: "ab1 ~ ab1 ~ ab1@2 ab1 ~ ab1@2 ab1@2 ab1@2 ab1@2",
  Q: "[f1@4 f1@4 f1 ~ f1 ~ f1 ~ gb1@4 gb1@2 gb1@4 gb1@2 gb1@2 gb1@2 gb1@2]/2",
  R: "[f1@4 f1@4 f1 ~ f1 ~ f1 ~ gb1@4 gb1@2 gb1@4 gb1 ~ gb1 ~ gb1 ~ gb1 ~]/2",
  S: "[f1@4 f1@4 f1 ~ f1 ~ f1 ~ ab1@4 ab1@2 ab1@4 ab1@2 ab1@2 ab1@2 ab1@2]/2", T: "bb1/2", U: "eb2@3 db2@3 c2 ab1",
  V: "bb1@7 ~", W: "gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~",
  X: "gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1@2", Y: "ab1!8", Z: "f1!8",
  AA: "bb1 ~ bb1 ~ bb1@4 bb1 ~ bb1 ~ bb1@4", AB: "gb1!8", AC: "gb1@2 gb1 ~@3 gb1 ~@3 gb1 ~@3 gb1 g1",
  AD: "[bb1@31 ~]/4",
})).s("gm_electric_bass_finger").gain(0.8)

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

// drums · rim
const rim = s("rim").struct("<~@137 [~ x ~ x]!11 [~@3 x ~@2 x ~@2 x ~@2 x ~@2 x] [~ x ~ x]!4 ~@33>").gain(0.68)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@7 A ~@7 A ~@7 A ~@7 B ~@8 A ~@7 A ~@7 C ~@31 A ~@7 A ~@7 C ~@29 D ~@29 E ~@7 F ~@13
>`.pickRestart({
  A: "~@3 x", B: "~@9 x ~@6", C: "~@8 x!3 ~ x ~@3", D: "~@12 x!4", E: "x!4", F: "x ~@10 x!5",
})).gain(0.68)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@137 [~@3 x ~ x ~@2]!11 x [~@3 x ~ x ~@2]!4 ~@33>").gain(0.68)

// drums · mid tom
const mid_tom = s("mt").struct("<~@56 [x!2 ~ x ~@4] ~@47 [x!2 ~ x ~@4] ~@67 [~@7 x!4 ~@5] ~@13>").gain(0.68)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@8 A@23 ~ B A@23 C A D A D A D A C E ~ E ~ E ~ E ~ E ~ E ~ E ~ E ~ A@23 C A D A D A D A C E ~ E ~ E ~ E ~ E ~ E ~ E ~
  E ~ F G F H F G F I J B@10 ~ B@4 ~@4 D@4 A@3 K D@4 A@3 C A D A D A D A ~ C ~@4
>`.pickRestart({
  A: "x!4", B: "~@3 x", C: "x", D: "x!3 ~ x!3 ~", E: "x ~@6 x", F: "x ~ x ~ x ~ x!2", G: "~ x!2 ~", H: "~ x ~@2",
  I: "~ x!3", J: "x ~@2 x", K: "x!2",
})).gain(0.68)

// drums · high tom
const high_tom = s("ht").struct("<~@172 [~@3 x!4 ~@9] ~@13>").gain(0.68)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@2 B ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4 C ~ C ~ C ~ A D ~ D ~ D ~ D ~ D ~ D ~
  D ~ D ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4 C ~ C ~ C ~ A D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ D ~ A ~@19 C@4 A
  ~@3 C@4 A ~@4 C ~ C ~ C ~@2 A ~@4
>`.pickRestart({
  A: "x", B: "x ~@2 x ~@2 x ~@2 x ~@6", C: "~ x ~ x", D: "x ~@6 x",
})).gain(0.68)

// drums · ride
const ride = s("rd").struct(`<
  ~@57 A B A B A B A ~ C@16 ~@24 A B A B A B A ~ C@16 ~@28 B@4 ~@4 B@4 ~@4 A B A B A B A ~@6
>`.pickRestart({
  A: "x!4", B: "x!2", C: "~ x!3",
})).gain(0.68)

stack(
  electric_guitar_clean, overdriven_guitar, bass, kick, rim, snare, low_tom, pedal_hat, mid_tom, open_hat, high_tom,
  crash, ride
)