Strudelify
KeyF majorTempo100 bpm
0:00/0:00
// Sundown — Gordon Lightfoot
// 100 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 1 acoustic guitar nylon (copy of ch 11 piano)
// note: Full arrangement: all 84 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · fretless bass
const bass = note(`<
  A B A C A B D E A F G E A F G E ~ A B D E A F G E A F G E A H@4 I@5 J@8 I@5 K@8 L@5 M@4 N@8 O@5 P@2
>`.pickRestart({
  A: "f2@4 ~@2 f2@2 c2@5 ~@3", B: "f2@2 ~ f2 c3@2 c2@2", C: "f2@2 ~ c2 c3@2 c2@2", D: "c2@4 ~@2 c2@2 g1@5 ~@3",
  E: "f2@2 ~ c2 a2@2 c2@2", F: "bb1@2 ~ bb1 f2@2 f1@2", G: "eb2@4 ~@2 eb2@2 bb1@5 ~@3",
  H: "[f2@2 ~ f2 c3@2 ~@10 f2@2 ~ f2 ~@4 f2@2 ~ f2 c3@2 c2@2, ~@3 c2@7 c2@5 ~]/4",
  I: "[c2@6 ~@2 g1@5 ~@3 f2@4 ~@4 a2@4 ~@4 f2@4 ~@2 f2@2 ~@8 bb1@4 ~@2 bb1@2 f2@4 f1@4 eb2@4 ~@2 eb2@2 bb1@5 ~@3, ~@3 c2@8 c2@3 c2@6 c2@20]/5",
  J: "[f2@4 ~@4 a2@4 ~@4 f2@4 ~@2 f2@2 ~@8 bb1@4 ~@2 bb1@2 f2@4 f1@4 eb2@4 ~@2 eb2@2 bb1@5 ~@3 f2@4 ~@4 a2@4 ~@20 f2@4 ~@2 f2@2 ~@8 f2@4 ~@2 f2@2 c3@4 c2@4, ~@3 c2@3 c2@6 c2@23 c2@3 c2@14 c2@10 ~@2]/8",
  K: "[f2@4 ~@4 a2@4 ~@4 f2@4 ~@2 f2@2 ~@8 bb1@4 ~@2 bb1@2 f2@4 f1@4 eb2@4 ~@2 eb2@2 bb1@5 ~@3 f2@4 ~@4 a2@4 ~@4 f2@4 ~@2 f2@2 ~@8 bb1@4 ~@2 bb1@2 f2@4 f1@4 eb2@4 ~@2 eb2@2 bb1@5 ~@3, ~@3 c2@3 c2@6 c2@23 c2@3 c2@6 c2@20]/8",
  L: "[f2@4 ~@4 a2@4 ~@20 f2@4 ~@2 f2@2 ~@8 bb1@4 ~@2 bb1@2 f2@4 f1@4 eb2@4 ~@2 eb2@2 bb1@5 ~@3, ~@3 c2@3 c2@14 c2@20]/5",
  M: "[f2@4 ~@4 a2@4 ~@4 f2@4 ~@2 f2@2 ~@8 bb1@4 ~@2 bb1@2 f2@4 f1@4 eb2@4 ~@2 eb2@2 bb1@5 ~@3, ~@3 c2@3 c2@6 c2@20]/4",
  N: "[f2@2 ~@2 a2@2 ~@2 f2@2 ~ f2 ~@4 f2@2 ~ f2 c3@2 ~@2 f2@2 ~ f2 ~@12 f2@2 ~ f2 ~@4 f2@2 ~ f2 c3@2 ~@2 f2@2 ~ f2 c2@4, ~@3 c2@3 c2@6 c2@10 c2@6 c2@16 c2@10 c2@6 ~@4]/8",
  O: "[f2@2 ~@2 a2@2 ~@2 f2@2 ~ f2 ~@4 f2@2 ~ f2 c3@2 ~@2 f2@2 ~ f2 ~@4 f2@2 ~@2 a2@2 ~@2, ~@3 c2@3 c2@6 c2@10 c2@6 c2@7 c2@5]/5",
  P: "[f2@15 ~]/2",
})).s("gm_fretless_bass").gain(0.38)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@32 A@2 B C D E F D C E F D ~@5 C E F D C E F D C E F D ~ C E F D C E F C ~@12 G@2
>`.pickRestart({
  A: "[f3,f4,a4]/2", B: "[c3,c4,g4]", C: "[f3,f4,a4,f5]", D: "[f3,f4,a4]", E: "[bb2,bb3,d4,bb4]", F: "[eb3,eb4,g4]",
  G: "[~ f5, [f3,f4,a4]]/2", // F
})).s("gm_string_ensemble_1").gain(0.25).pan(0.6)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<A@2 B C ~@80>".pickRestart({
  A: "[[c4,f4,a4]@22 ~@2 [f4,a4,c5]@7 ~]/2", B: "[a4,c5,f5]", C: "~@2 [f4,a4,c5]@3 ~ [f4,a4,c5]@3 ~ [a3,c4,f4]@5 ~",
})).s("gm_acoustic_guitar_steel").gain(0.35)

// chords · piano
const piano = note(`<
  A B C D E F G H I J K L I J K L D E F G H I J K M I J K N O P Q E F G H I J K L I J K L D E F G H I J K M I J K M I J
  K M R I J K M I J S T C D U D U D U D U D U D V@2
>`.pickRestart({
  A: "[c4,f4,c5]@2 [c4,f4,c5]@2 [c4,f4,c5] [c4,f4,c5]@2 [c4,f4,c5]", // F5
  B: "[c4,f4,c5]@2 [c4,f4,c5]@2 [c4,f4,c5] c2 eb2 [e2,c4,f4,c5], ~@5 [c4,f4,c5]@2 ~", // F5 Fmaj7 F5
  C: "[c4,f4,c5]@2 ~ f2 [c2,c4,f4,c5] c2 eb2 [e2,c4,f4,c5], f2@3 ~@5, ~@2 [c4,f4,c5]@2 ~ [c4,f4,c5]@2 ~", // F5 Fmaj7 F5
  D: "~ [c4,f4,c5]@2 f2 c2!2 [eb2,f4] [e2,g4], f2@3 [c4,f4,c5]@3 ~@2", // F5 Ebsus2 Em F5
  E: "[c4,f4,a4] a4!2 [f2,a4] c2!2 [eb2,g4] [e2,f4], f2@3 ~ [c4,f4,a4]@2 ~@2", // F Eb Fmaj7 F
  F: "g4@2 ~@5 g4 c2@2 ~@2 e4@2 f4@2, f2@3 f2 ~ c2@3, ~ [a3,c4,f4]@3 [c4,f4,a4]@2 ~@2", // F
  G: "[bb3,f4,g4]@2 g4 [c2,g4] [bb3,f4,g4] f4 g4 [c2,a4], c2@3 ~ c2@3 ~", // Gm7 C5 Gm7 F
  H: "[a3,c4,g4]@2 f4 f2 c2!2 eb2 e2, f2@3 [a3,c4,f4]@5", // Am7 F
  I: "~@3 f2 f2@2 ~ a4, f2@3 ~@3 c2@2, ~@2 [f4,a4,c5]@2 [f4,a4,c5]@3 ~", // F
  J: "[d4,f4,bb4] a4 g4 bb1 ~@2 [bb3,d4] [d2,f4], bb1@3 [bb3,d4,f4]@3 ~@2, ~@4 bb1@3 ~", // Bb Dm Bb
  K: "[bb3,eb4,g4]@2 [bb3,eb4,g4] [eb2,ab4] [eb2,bb3,eb4,g4] [bb1,f4] [eb2,eb4] [e2,d4], eb2@3 ~@5", // Eb Ab5 Eb Bb5 Eb E7
  L: "eb4 [a3,c4,f4]@2 f2 c2!2 eb2 e2, f2@3 [a3,c4,f4]@5", // F
  M: "eb4 [c4,f4] f4 f2 c2!2 eb2 e2, f2@3 ~@5, ~ a3@2 [a3,c4,f4]@5", N: "eb4 f4!2 f2 c2!2 eb2 e2, f2@3 [a3,c4,f4]@5",
  O: "~@3 f2 c2!2 eb2 e2, f2@3 ~@5, ~@2 [c4,f4,c5]@3 [c4,f4,c5]@3", // F5
  P: "~ [c4,f4,c5] ~ f2 c2!2 eb2 e2, f2@3 ~@5, ~@2 [c4,f4,c5]@3 [c4,f4,c5]@3", // F5
  Q: "~@3 f2 c2!2 [eb2,f4] [e2,g4], f2@3 ~@5, ~ [c4,f4,c5]@2 ~", // Ebsus2 Em F5
  R: "~ [c4,f4,c5]@2 f2 c2!2 eb2 e2, f2@3 [c4,f4,c5]@2 [c4,f4,c5]@3", // F5
  S: "[bb3,eb4,g4]@2 [bb3,eb4,g4] [eb2,ab4] [eb2,eb4,g4] [bb1,f4] [eb2,eb4] [e2,d4], eb2@3 ~@5", // Eb Ab5 Eb Bb5 Eb E7
  T: "[f2,eb4] [c2,f4] [eb2,f4] f2 c2!2 eb2 e2, ~@3 [a3,c4,f4]@5", // F7 F5 Ebsus2 F
  U: "[c4,f4,c5]@2 ~ f2 [c2,c4,f4,c5] c2 eb2 [e2,c4,f4,c5], f2@3 ~@5, a4 ~ [c4,f4,c5]@2 ~ [c4,f4,c5]@2 ~", // F5 Fmaj7 F5
  V: "[f2,c4,f4,a4]/2", // F
})).s("gm_piano").gain(0.64)

// chords · acoustic guitar steel
const acoustic_guitar_steel_2 = note(`<
  ~@4 A@2 B C D E F C D E F C ~ A@2 B C D E F C D E F C A@2 ~ A@2 B C D E F C D E F C ~ A@2 B C D E F C D E F C D E F C
  ~ D E F C D E F C A@2 G ~ A@2 G C A@2 G C ~@2
>`.pickRestart({
  A: "[[c4,f4,a4]@22 ~@2 [f4,a4,c5]@7 ~]/2", B: "[f4,bb4,c5]", C: "~@2 [f4,a4,c5]@3 ~ [f4,a4,c5]@3 ~ [a3,c4,f4]@5 ~",
  D: "[c4,f4,a4]", E: "[f4,bb4,d5]@6 ~@2 [bb4,d5,f5]@7 ~", F: "[g4,bb4,eb5]", G: "[a4,c5,f5]",
})).s("gm_acoustic_guitar_steel").gain(0.35)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@4 A@2 B A@2 C D A@2 C D A ~ A@2 B A@2 C D A@2 C D A@3 ~ A@2 B A@2 C D A@2 C D A ~ A@2 B A@2 C D A@2 C D A@2 C D A ~
  A C D A@2 C D A@4 ~ A@8 ~@2
>`.pickRestart({
  A: "~@4 [f4,a4,c5] ~@7 [f4,a4,c5] ~@3", B: "~@4 [c4,f4,g4,bb4] ~@7 [c4,f4,g4,bb4] ~@3",
  C: "~@4 [bb4,d5,f5] ~@7 [bb4,d5,f5] ~@3", D: "~@4 [eb4,g4,bb4] ~@7 [eb4,g4,bb4] ~@3",
})).s("gm_electric_guitar_clean").gain(0.3)

// bass · electric bass finger
const bass_2 = note("<~@16 A ~@14 A ~@12 A ~@16 A ~@11 A ~@10>".pickRestart({
  A: "f2@4 ~@2 f2@2 c2 ~ c2@2 c3 a2 c2 ~",
})).s("gm_electric_bass_finger").gain(0.38)

// chords · violin
const violin = note("<~@16 A ~@14 A ~@12 A ~@16 A ~@11 A ~@10>".pickRestart({
  A: "[c4,f4,a4]", // F
})).s("gm_violin").gain(0.2)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x!2 ~@3]!82 ~@2>").gain(0.45)

// drums · snare
const snare = s("sd").struct("<A@16 B A@14 B A@12 B A@16 B A@11 B A@8 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@5 x!3 ~@3",
})).gain(0.4)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 A ~@14 A ~@12 A ~@16 A ~@11 A ~@10>".pickRestart({
  A: "~@7 x",
})).gain(0.35)

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

// drums · ride bell
const ride_bell = s("rd").struct("<~@16 A ~@14 A ~@12 A ~@16 A ~@11 A ~@10>".pickRestart({
  A: "x ~ x!3 ~ x!5 ~ x!3 ~",
})).gain(0.3)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~ A B C ~ A B C ~ A B C ~ A B C ~@2 A B C ~ A B C ~ A B C ~ A ~@2 A B C ~ A B C ~ A B C ~@2 A B C ~ A B C ~ A B C ~ A
  B C ~@2 A B C ~ A B C ~ A B ~@2 A B C ~ A B C ~@2
>`.pickRestart({
  A: "~@5 x!3", B: "x", C: "~ x",
})).gain(1.01)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@3 A ~@3 A ~@3 A ~@3 A ~@4 A ~@3 A ~@3 A ~@6 A ~@3 A ~@3 A ~@4 A ~@3 A ~@3 A ~@3 A ~@4 A ~@3 A ~@7 A ~@3 A ~@2
>`.pickRestart({
  A: "~@3 x",
})).gain(0.43)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct(`<
  ~@3 A ~@3 A ~@3 A ~@3 A ~@4 A ~@3 A ~@3 A ~@6 A ~@3 A ~@3 A ~@4 A ~@3 A ~@3 A ~@3 A ~@4 A ~@3 A ~@7 A ~@3 A ~@2
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(0.43)

// drums · shaker
const shaker = s("sh").struct(`<
  ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@2 A ~ B ~ A ~ B ~ A ~ B ~ A ~@2 A ~ B ~ A ~ B ~ A ~ B ~@2 A ~ B ~ A ~ B ~ A ~ B ~ A
  ~ B ~@2 A ~ B ~ A ~ B ~ A ~@3 A ~ B ~ A ~ B ~@2
>`.pickRestart({
  A: "~@11 x ~@3 x", B: "~@9 x ~@6",
})).gain(0.3)

stack(
  bass, string_ensemble_1, acoustic_guitar_steel, piano, acoustic_guitar_steel_2, electric_guitar_clean, bass_2, violin,
  kick, snare, hihat, mid_tom, open_hat, ride_bell, cabasa, woodblocks, woodblocks_2, shaker
)

More by Gordon Lightfoot