Strudelify
KeyF majorTempo132 bpm
0:00/0:00
// Windy — The Association
// 132 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 5 "Guitar(s)" electric guitar jazz (copy of ch 2 "Piano(s)" epiano2)
// note: Full arrangement: all 83 bars on a 16-step grid, each part at one level. 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.

// other · piano · "Piano(s)"
const piano = note("<~ A B A C D E F G ~@74>".pickRestart({
  A: "a2@2 c3 a2 g2@2 f2 d3", B: "~@2 d3@2 c3@4 g2@2 a2@2 c3@3 ~", C: "~@2 d3@2 c3@2 ~@2 g2@7 ~",
  D: "a3@4 c4@2 a3@2 g3@3 ~ f3@2 d4@2", E: "~@2 d4@2 c4@3 ~ g3@2 a3@2 c4@3 ~", F: "a3@4 c4@2 a3@2 g3@3 ~ f3 ~ g3@2",
  G: "~@4 f3@9 ~@3",
})).s("gm_piano").gain(0.17).pan(0.1)

// chords · piano · "Piano(s)"
const piano_2 = note(`<
  ~@9 A@4 B@2 C D E A@4 B@2 C D E F G@2 H@2 I@2 ~@12 E F G@2 H@2 I@2 ~@4 A@4 B@2 C D A@4 B@2 C D A@4 B@2 C J ~
>`.pickRestart({
  A: "[[f3,a3,c4]@6 ~@2 [eb3,g3,bb3]@5 ~ [d3,f3,bb3]@8 ~@2 [e3,g3,c4]@7 ~]/2", // F Eb Bb C
  B: "[[f3,a3,c4]@6 ~@2 [eb3,g3,bb3]@5 ~ [d3,f3,bb3]@7 ~@3 [e3,g3,c4]@7 ~]/2", // F Eb Bb C
  C: "[f3,a3,c4]@3 ~ [eb3,g3,bb3]@2 ~ [d3,f3,bb3]", D: "~@4 [c3,f3,a3]@9 ~@3", E: "c2 ~ c2 ~ c2 ~ c2 ~",
  F: "c2@2 ~@2 f4 ~ a4 ~@3 c5 ~ f5 ~@3",
  G: "[[g3,bb3,d4,f4,g4,bb4,d5]@5 ~ [g3,bb3,d4,f4,g4,bb4,d5]@5 ~ [f4,a4,c5,e5]@17 ~@3, ~@12 [f3,a3,c4,e4]@7 ~@13]/2", // Gm7 Fmaj7
  H: "[[bb3,d4,f4]@5 ~ [bb3,d4,f4]@4 ~@2 [c3,bb3,c4,f4,g4]@17 ~@3]/2", // Bb Csus4
  I: "[[g3,bb3,d4,f4]@5 ~ [g3,bb3,d4,f4,bb4]@5 ~ [f3,a3,c4,e4,a4]@18 ~@2]/2", J: "~ [c3,f3,a3]@3",
})).s("gm_piano").gain(0.4).pan(0.1)

// other · epiano1 · "Piano(s)"
const epiano1 = note("<~@34 A@4 ~@45>".pickRestart({
  A: "[~@6 f5 ~ f5 ~ f5@3 ~ c5@22 ~@2 c5@2 d5@2 f5@3 ~ g5@17 ~]/4",
})).s("gm_epiano1").gain(0.64).pan(0.1)

// chords · epiano2 · "Piano(s)"
const epiano2 = note("<~@38 A@4 B@2 C D ~@37>".pickRestart({
  A: "[[f3,a3,c4]@6 ~@2 [eb3,g3,bb3]@5 ~ [d3,f3,bb3]@8 ~@2 [e3,g3,c4]@7 ~]/2", // F Eb Bb C
  B: "[[f3,a3,c4]@6 ~@2 [eb3,g3,bb3]@5 ~ [d3,f3,bb3]@7 ~@3 [e3,g3,c4]@7 ~]/2", // F Eb Bb C
  C: "[f3,a3,c4]@3 ~ [eb3,g3,bb3]@2 ~ [d3,f3,bb3]", D: "~@4 [c3,f3,a3]@9 ~@3",
})).s("gm_epiano2").gain(0.45).pan(0.1)

// chords · piano · "Piano(s)"
const piano_3 = note("<~@54 A@2 B@2 ~@25>".pickRestart({
  A: "[~@6 [f3,bb3,d4] ~ [f3,bb3,d4] ~ [f3,bb3,d4]@3 ~ [g3,bb3,d4,f4]@18]/2", // Bb Gm7
  B: "[~@6 [f3,bb3,d4] ~ [f3,bb3,d4] ~ [f3,bb3,d4]@3 ~ [g3,bb3,d4,f4]@17 ~]/2", // Bb Gm7
})).s("gm_piano").gain(0.57).pan(0.1)

// other · vibraphone · "Vibes (organ)"
const vibraphone = note(`<
  ~@9 A B C D E F G H ~ A B C D E F G H ~ I J@2 K@2 L@3 M@3 ~@9 I J@2 K@2 L@3 M@3 A B C D E F G H A B C D E F G H ~@9
>`.pickRestart({
  A: "a4@4 c5 ~ a4 ~ g4@4 f4 ~ d5 ~", B: "~@2 d5 ~ c5@3 ~ a4@3 ~ c5 ~@3", C: "a4@3 ~ c5 ~ a4 ~ g4@3 ~ f4 ~ d5 ~",
  D: "~@2 d5 ~ c5@3 ~ g4@5 ~@3", E: "a4@3 ~ c5 ~ a4 ~ g4@4 f4 ~ d5 ~", F: "~@2 d5 ~ c5@2 ~@2 a4@3 ~ c5 ~@3",
  G: "a4@3 ~ c5 ~ a4 ~ g4@3 ~ f4 ~ g4 ~", H: "~@4 f4@9 ~@3", I: "~@4 f4@2 a4@3 ~ c5 ~ f5@3 ~",
  J: "[d5@5 ~ bb4@4 ~@2 c5@7 ~ f4@2 a4@3 ~ c5 ~ f5@3 ~]/2", K: "[d5@5 ~ bb4@5 ~ g4@6 ~@2 f4@2 a4@4 c5 ~ f5@3 ~]/2",
  L: "[d5@5 ~ bb4@4 ~@2 c5@7 ~ a4@3 ~ a4 ~ a4@3 ~ g4@17 ~]/3", M: "[~@6 d5 ~ d5 ~ d5@2 ~@2 c5@22 ~@12]/3",
})).s("gm_vibraphone").gain(0.45).pan(0.4)

// other · drawbar organ · "Vibes (organ)"
const drawbar_organ = note("<~@74 A B C D E F G H ~>".pickRestart({
  A: "a5@2 g5 ~ f5 ~ d5 ~ f5@3 ~ f5 ~ f5@2", B: "~@2 f5 ~ f5@3 ~ g5@4 f5 ~ a5@2",
  C: "~@2 g5 ~ f5@2 ~@2 f5@3 ~ f5 ~ f5@2", D: "~@2 f5 ~ f5 ~ g5@6 ~@4", E: "a5@2 g5 ~ f5 ~ d5 ~ f5@3 ~ d5 ~ f5@2",
  F: "~@2 f5 ~ f5@2 ~@2 g5@3 ~ f5@2 ~@2", G: "a5@2 g5@2 f5@2 d5 ~ f5@4 d5 ~ f5@2", H: "~@4 [c5,f5]@11 ~",
})).s("gm_drawbar_organ").gain(0.45).pan(0.4)

// other · overdriven guitar · "Guitar(s)"
const overdriven_guitar = note(`<
  ~@5
  [a3@4 c4@2 a3@2 g3@3 ~ f3@2 d4@2]
  [~@2 d4@2 c4@3 ~ g3@2 a3@2 c4@3 ~]
  [a3@4 c4@2 a3@2 g3@3 ~ f3 ~ g3@2]
  [~@4 f3@9 ~@3]
  ~@74
>`).s("gm_overdriven_guitar").gain(0.3).pan(0.9)

// chords · acoustic guitar steel · "Guitar(s)"
const acoustic_guitar_steel = note(`<
  ~@9 A@4 B@2 C D E A@4 B@2 C D E F G H I J K H J@4 L@8 E F G H I J K H J@4 M@4 N@2 O@2 M@4 N@2 O@2 M@4 P@5
>`.pickRestart({
  A: "[[f3,a3,c4]@6 ~@2 [eb3,g3,bb3]@4 ~@2 [d3,f3,bb3]@8 ~@2 [e3,g3,c4]@7 ~]/2", // F Eb Bb C
  B: "[[f3,a3,c4]@6 ~@2 [eb3,g3,bb3]@4 ~@2 [d3,f3,bb3]@7 ~@3 [e3,g3,c4]@7 ~]/2", // F Eb Bb C
  C: "[f3,a3,c4]@3 ~ [eb3,g3,bb3]@2 ~ [d3,f3,bb3]", D: "~@4 [c3,f3,a3]@9 ~@3", E: "c2 ~ c2 ~ c2 ~ c2 ~", F: "c2 ~@7",
  G: "[bb4,d5] f4 [bb4,d5] f4 [bb4,d5] f4 [g4,c5] f4, ~@14 g4 ~", // Bb C5
  H: "[g4,a4,c5] f4 [g4,a4,c5] f4 [g4,a4,c5] f4 [g4,a4,c5] f4", I: "[bb4,d5] f4 [bb4,d5] f4 [bb4,d5] f4 [bb4,d5] g4",
  J: "[bb4,d5] g4 [bb4,d5] g4 [bb4,d5] g4 [bb4,d5] g4", // Bb
  K: "[bb4,d5]@2 f4@2 [bb4,d5]@2 f4@2 [bb4,d5]@2 f4@2 ~ a4 f4@2, ~@12 [g4,c5]@3 ~", L: "[f3,a3,c4]/8",
  M: "[~@8 [eb3,g3,bb3]@4 ~@2 [d3,bb3]@8 ~@2 [e3,g3,c4]@7 ~, a3, c4@3 ~, f3@7 f3@9]/2", // Eb Gm C
  N: "[~@8 [eb3,g3,bb3]@4 ~@2 [d3,bb3]@7 ~@3 [e3,g3,c4]@7 ~, a3, c4@3 ~, f3@7 f3@9]/2", // Eb Gm C
  O: "[~@4 [eb3,g3,bb3]@2 ~ [d3,bb3] ~@2 [f3,a3]@6, c4, a3@5 ~@3, f3@7 f3@3 c3@4 ~@2]/2", // Eb Gm F
  P: "[~@8 [eb3,g3,bb3]@4 ~@2 [d3,bb3]@7 ~@3 [e3,g3]@7 ~@9 [eb3,g3,bb3]@4 ~@2 [d3,bb3]@2 ~@4 c3@12 ~@16, a3@32 a3@33 ~@15, c4@12 c4@7 ~@21, f3@14 f3@18 f3@14 f3@19 ~@15]/5", // Eb Gm Em Eb Gm
})).s("gm_acoustic_guitar_steel").gain(0.32).pan(0.9)

// other · piccolo
const piccolo = note("<~@38 A B A C A B D E ~@37>".pickRestart({
  A: "a5@4 c6 ~ a5 ~ g5@3 ~ f5 ~ d6 ~", B: "~@2 d6 ~ c6@3 ~ a5@4 c6 ~@3", C: "~@2 d6 ~ c6@3 ~ g5@6 ~@2",
  D: "a5@4 c6 ~ a5 ~ g5@3 ~ f5 ~ g5 ~", E: "~@4 f5@9 ~@3",
})).s("gm_piccolo").gain(0.32).pan(1)

// other · flute
const flute = note("<~@18 A@6 B C ~ D ~ D ~ D ~@6 E F E G E F H I ~@28 J@2 K@2 J@2 L M ~>".pickRestart({
  A: "[f4@23 ~ c4@5 ~ f4@25 ~ c4@5 ~ f4@25 ~ c4@6 ~@2]/6", B: "f4@7 ~ eb4@4 ~@2 c4 ~", C: "~ c4@2 ~",
  D: "~@4 f4 ~ a4 ~@3 c5 ~ f5 ~@3", E: "a5@4 c6 ~ a5 ~ g5@3 ~ f5 ~ d6 ~", F: "~@2 d6 ~ c6@3 ~ a5@4 c6 ~@3",
  G: "~@2 d6 ~ c6@3 ~ g5@6 ~@2", H: "a5@4 c6 ~ a5 ~ g5@3 ~ f5 ~ g5 ~", I: "~@4 f5@9 ~@3",
  J: "[~@4 f5 ~ f5 ~ a5 ~ bb5 ~ c6 ~ f6@6 eb6 ~ d6 ~ eb6@2 d6@2 c6@3 ~]/2",
  K: "[~@4 f5 ~ f5 ~ a5 ~ bb5 ~ c6 ~ f6@11 ~ c6 ~ d6@2 c6@2]/2", L: "~@4 a5 ~ c6 ~ bb5@2 a5@4 bb5@2", M: "~ a5@3",
})).s("gm_flute").gain(0.42).pan(0.1)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A B A C A D E F G H G I G J K L M G H G I G J K L N O P@2 Q@2 R@2 S@2 T U G H G I G J K L N O P@2 Q@2 R@2 S@2 T U G
  H G I G J K L G H G I G J K L V W V W V W X Y@2
>`.pickRestart({
  A: "a1@2 c2 a1 g1@2 f1 d2", B: "~@2 d2@2 c2@4 g1@2 a1@2 c2@3 ~", C: "~@2 d2@2 c2@2 ~@2 g1@7 ~",
  D: "~@2 d2@2 c2@3 ~ g1@2 a1@2 c2@3 ~", E: "a1@4 c2@2 a1@2 g1@3 ~ f1 ~ g1@2", F: "~@2 f1@5 ~",
  G: "f2@5 ~ f2@2 eb2@5 ~ bb1@2", H: "~@2 bb1@2 d2@3 ~ c2@5 ~ e2@2", I: "~@2 bb1@2 d2@3 ~ c2@3 ~ c2@3 ~",
  J: "~@2 bb1@2 d2@4 c2@3 ~ c2@3 ~", K: "f2@5 ~ f2@2 eb2@6 c2@2", L: "~@4 f2@9 ~@3",
  M: "c2@2 ~@2 c2@3 ~ c2@2 ~@2 c2@2 ~@2", N: "c2@3 ~ c2@3 ~ c2@2 ~@2 c2@2 ~@2", O: "c2@3 ~@13",
  P: "[g1@5 ~ c2@5 ~ f2@19 ~]/2", Q: "[g2@6 d2@5 ~ c2@19 ~]/2", R: "[g1@6 c2@5 ~ f2@19 ~]/2",
  S: "[c2@5 ~ c2 ~ c2@5 ~ c2@7 ~ c2 ~ c2@6 g1@2]/2", T: "c2@5 ~ c2 ~ c2@7 ~", U: "c2@5 ~ c2 ~ c2@6 ~@2",
  V: "f2@3 ~ f2@3 ~ eb2@3 ~ eb2@2 bb1@2", W: "~@2 bb1@2 d2@3 ~ c2@4 d2@2 e2 ~", X: "f2@3 ~ f2@3 ~ eb2@4 ~@2 c2@2",
  Y: "[~@2 f1@13 ~]/2",
})).s("gm_electric_bass_finger").gain(0.61)

// other · synth strings 1 · "Chorus Strings"
const synth_strings_1 = note(`<
  ~@27 A B@2 C@2 D@3 E@3 ~@9 A B@2 C@2 D@3 E@3 F G H I J K L M F G H I J K L M ~@9
>`.pickRestart({
  A: "~@4 f4@2 a4@3 ~ c5 ~ f5@3 ~", B: "[d5@5 ~ bb4@4 ~@2 c5@7 ~ f4@2 a4@3 ~ c5 ~ f5@3 ~]/2",
  C: "[d5@5 ~ bb4@5 ~ g4@6 ~@2 f4@2 a4@4 c5 ~ f5@3 ~]/2", D: "[d5@5 ~ bb4@4 ~@2 c5@7 ~ a4@3 ~ a4 ~ a4@3 ~ g4@17 ~]/3",
  E: "[~@6 d5 ~ d5 ~ d5@2 ~@2 c5@22 ~@12]/3", F: "a4@4 c5 ~ a4 ~ g4@4 f4 ~ d5 ~", G: "~@2 d5 ~ c5@3 ~ a4@3 ~ c5 ~@3",
  H: "a4@3 ~ c5 ~ a4 ~ g4@3 ~ f4 ~ d5 ~", I: "~@2 d5 ~ c5@3 ~ g4@5 ~@3", J: "a4@3 ~ c5 ~ a4 ~ g4@4 f4 ~ d5 ~",
  K: "~@2 d5 ~ c5@2 ~@2 a4@3 ~ c5 ~@3", L: "a4@3 ~ c5 ~ a4 ~ g4@3 ~ f4 ~ g4 ~", M: "~@4 f4@9 ~@3",
})).s("gm_synth_strings_1").gain(0.39).pan(0.6)

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

// drums · rim
const rim = s("rim").struct("<~@29 A ~ A ~ A B@3 C ~@11 A ~ A ~ A B@3 C ~@25>".pickRestart({
  A: "~ x ~@2", B: "~ x ~ x", C: "~@3 x",
})).gain(0.78)

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

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@28 B ~@19 B ~@7 C ~@15 D ~>".pickRestart({
  A: "~@3 x", B: "~@14 x!2", C: "~@7 x", D: "~ x ~@2",
})).gain(0.78)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A ~@3 B ~@16 B ~@11 C ~@19 C ~@7 A ~@7 B ~@6 D ~@2>".pickRestart({
  A: "~@3 x", B: "~@10 x!2 ~@4", C: "~@12 x!2 ~@2", D: "~@7 x",
})).gain(0.78)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@7 A ~@2 A ~ A ~ A@2 B ~@2 A ~ A ~ A@2 B ~@2 C ~ C ~ C ~@6 A ~ A ~ A@2 B ~@2 C ~ C ~ C ~@6 A ~ A ~ A@2 B ~ A ~ A ~
  A@2 B ~ A ~ A ~ A@2 ~@2
>`.pickRestart({
  A: "~@7 x", B: "~@2 x ~@4 x", C: "x ~@2 x ~@2 x ~",
})).gain(0.7)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A ~@11 B ~@8 C ~ C ~@9 D ~@7 B ~ C ~@9 D ~@15 C ~@9>".pickRestart({
  A: "~@5 x ~@2", B: "~@5 x!2 ~", C: "~@3 x", D: "~@8 x!4 ~@4",
})).gain(0.78)

// drums · crash
const crash = s("cr").struct("<~@38 A ~@19 A ~@7 A ~@7 A ~@8>".pickRestart({
  A: "x",
})).gain(0.78)

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

// … 16 more lines

More by The Association