Strudelify
Sara cover art

Tusk

Sara

Fleetwood Mac

KeyF majorTempo127 bpm
0:00/0:00
// Sara — Fleetwood Mac
// 127 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 190 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(127/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 · "Bass"
const bass = note(`<
  ~@20 A B C D E F G H I B J K E F G L M N J D E O P Q A R@2 S T U@2 V W@3 X U@3 Y Z W@3 AA AB AA AC R A I AD U AE T AF
  W@3 AG AA@3 AH AI AJ AK AL E AM P AN I B J K E F G L M N J D E O P Q A R@2 S T U@2 V W@3 X U@3 Y Z W@3 AA AB AA AC R A
  I AD U AE T AF AO AJ AK AL E AM P AN AI AJ AK AL E AM P AN AI AJ AK AL E AM P AN AI AJ AK AL E AM P AN AI AJ AK AL E
  AM P AN AI AJ AK AL E AM P AN AP@2
>`.pickRestart({
  A: "f1@4 ~@2 f1 ~ f1@5 ~ f1 ~", B: "f1@5 ~ f1 ~ f1@2 g1@2 a1@2 c2@2", C: "d2@5 ~ d2 ~ d2@6 a1@2",
  D: "d2@4 ~@2 d2 ~ d2@2 e2@2 f2@2 c2@2", E: "bb1@4 ~@2 bb1 ~ bb1@5 ~ bb1 ~", F: "bb1@4 ~@2 bb1 ~ bb1@3 ~ bb1@2 g1@2",
  G: "c2@5 ~ c2 ~ c2@5 ~ c2 ~", H: "c2@5 ~ c2 ~ c2@2 ~@2 c2@4", I: "f1@5 ~ f1 ~ f1@4 ~@2 f1 ~",
  J: "d2@4 ~@2 d2 ~ d2@6 a1@2", K: "d2@5 ~ d2 ~ d2@2 e2@2 f2@2 c2@2", L: "c2@5 ~ c2 ~ c2@3 ~ c2@4",
  M: "f1@4 ~@2 f1 ~ f1@4 ~@2 f1 ~", N: "f1@4 ~@2 f1 ~ f1@2 g1@2 a1@2 c2@2", O: "bb1@5 ~ bb1 ~ bb1@4 ~@2 bb1@2",
  P: "c2@4 ~@2 c2 ~ c2@5 ~ c2 ~", Q: "c2@5 ~ c2 ~ c2@3 ~ c2@3 ~", R: "f1@5 ~ f1 ~ f1@5 ~ f1 ~",
  S: "f1@5 ~ f1 ~ f1 ~ f1 ~ f1@2 g1 ~", T: "g1@5 ~ g1 ~ g1@4 ~@2 g1 ~", U: "g1@5 ~ g1 ~ g1@5 ~ g1 ~",
  V: "g1@5 ~ g1 ~ g1@2 a1@2 c2@2 d2 ~", W: "f2@5 ~ f2 ~ f2@5 ~ f2 ~", X: "f2@4 ~@2 f2 ~ f2@3 ~ f2@2 c2@2",
  Y: "g1@4 ~@2 g1 ~ g1@2 a1@2 c2@2 d2@2", Z: "f2@6 f2 ~ f2@5 ~ f2 ~", AA: "g2@5 ~ g2 ~ g2@5 ~ g2 ~",
  AB: "g2@4 ~@2 g2 ~ g2@5 ~ g2 ~", AC: "g2@3 ~ c2 d2 f2@2", AD: "f1@5 ~ f1 ~ f1@5 ~ g1 ~",
  AE: "g1@4 ~@2 g1 ~ g1@5 ~ g1 ~", AF: "g1@5 ~ g1 ~ g1@2 a1@2 c2@2 d2@2", AG: "f2@5 ~ f2 ~ f2@6 d2@2",
  AH: "g2@3 ~ g2 d2 c2 d2", AI: "f2@4 ~@2 f2@2 c2@3 ~ c2@4", AJ: "f2@6 c2@2 f2@3 ~ f2@2 c2@2",
  AK: "d2@2 ~ d2 a1@2 ~ a1", AL: "d2@5 ~ a2@2 d2@2 e2@2 f2@2 c2@2", AM: "bb1@4 ~@2 bb1 ~ bb1@3 ~ bb1@2 b1@2",
  AN: "c2@4 ~@2 c2 ~ c2@4 ~@2 c2@2", AO: "f2@5 ~ f2@2 c2@3 ~ c2@4", AP: "[f2@4 ~@2 f2@2 c2@3 ~ f1@16 ~@4]/2",
})).s("gm_fretless_bass").gain(0.52)

// chords · piano · "Keyboard"
const piano = note(`<
  A B C D A B E B F D C D A B E B F B E D G H I H I J K@2 L M N H L O@3 L H N H G P@3 Q@2 R@2 S@2 T@2 R@2 T@2 S@4 U@2
  S@6 V@2 S@2 U@2 W@2 T@2 S@2 T@2 R@2 G H I H I J K@2 L M N H L O@3 L H N H G P@3 Q@2 R@2 S@2 T@2 R@2 T@2 S@4 U@2 S@6
  V@2 S@2 U@2 W@2 G H I H I J K@2 G H I H I J K@2 G H I H I J K@2 G H I H I J K@2 G H I H I J K@2 G H I H I J K@2 X ~
>`.pickRestart({
  A: "~@3 a4@5, f3@15 ~, ~ c4@7, ~ f4@3", B: "~@3 b4@5, f3@15 ~, ~ d4@7, ~ g4@3",
  C: "~@3 c5@5, f3@15 ~, ~ e4@7, ~ a4@3", D: "~@3 b4@5, f3@7 ~, ~ d4@7, ~ g4@3", E: "~@3 c5@5, f3@7 ~, ~ e4@7, ~ a4@3",
  F: "~@3 a4@5, f3@7 ~, ~ c4@7, ~ f4@3", G: "[c4,f4,a4]@4 ~@2 [c4,e4,g4]@5 ~ [c4,f4,a4]@4",
  H: "~@2 [c4,e4,g4]@4 ~@2 [c4,f4,a4]@3 ~ [c4,e4,g4]@2 ~@2", I: "[c4,f4,a4]@5 ~ [c4,e4,g4]@4 ~@2 [c4,f4,a4]@4",
  J: "~@2 [c4,e4,g4]@4 ~@2 [c4,f4,a4]@3 ~ [c4,e4,g4]@4", // C F C
  K: "[~@2 [c4,f4,a4] ~ [c4,e4,g4]@2 ~ [c4,f4,a4]@2 ~ [c4,e4,g4]@5 ~]/2", // F C F C
  L: "[c4,f4,a4]@2 ~ [c4,e4,g4]@2 ~ [c4,f4,a4]@2", M: "~@2 [c4,e4,g4]@4 ~@2 [c4,f4,a4]@3 ~ [c4,e4,g4]@3 ~",
  N: "[c4,f4,a4]@5 ~ [c4,e4,g4]@5 ~ [c4,f4,a4]@4", // F C F
  O: "[~@2 [c4,e4,g4]@4 ~@2 [c4,f4,a4]@2 ~@2 [c4,e4,g4]@7 ~ [c4,f4,a4]@2 ~@2 [c4,e4,g4]@4 ~@2 [c4,f4,a4]@4 ~@2 [c4,e4,g4]@10 ~@2]/3", // C F C F C F C
  P: "[~@2 [c4,e4,g4]@4 ~@2 [c4,f4,a4]@3 ~ [c4,e4,g4]@6 ~@2 [c4,f4,a4]@2 ~@2 [c4,e4,g4]@5 ~ [c4,f4,a4]@16 ~@2]/3", // C F C F C F
  Q: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@4 ~@2 [e4,a4,c5]@17 ~@3]/2", // F G Am
  R: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 [e4,a4,c5]@17 ~@3]/2", // F G Am
  S: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 [e4,a4,c5]@18 ~@2]/2", T: "[[c4,f4,a4]@2 ~ [d4,g4,b4]@2 ~ [e4,a4,c5]@9 ~]/2",
  U: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@5 ~ [e4,a4,c5]@18 ~@2]/2", V: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@5 ~ [e4,a4,c5]@18 ~@2]/2",
  W: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@3 ~@3 [e4,a4,c5]@18 ~@2]/2", X: "[c4,f4,a4]@4 ~@2 [c4,e4,g4]@5 ~@5",
})).s("gm_piano").gain(0.36).pan(0.7)

// chords · acoustic guitar steel · "Guitar 1"
const acoustic_guitar_steel = note(`<
  A B C D A E F B A E G H A B C B I@2 J B K L@2 M N O@2 P@4 Q@2 P@2 R@2 P@2 S@2 P@2 T U@2 V@2 W@2 X@2 Y@2 Z@2 U@2 AA@2
  X@2 U@2 AB@2 AC@2 AD@2 AE@2 AF AG AH@2 AI AJ AK AL AM AN AO AP K L@2 M N O@2 P@4 Q@2 P@2 R@2 P@2 S@2 P@2 T V@2 AQ@2
  AR@2 AQ@2 V@2 AS@2 AT@2 AU@2 AQ@2 V@2 AV@2 V@2 AF AW AF AW AO AJ AO AX K L@2 M N O@2 AY K L@2 M N O@2 AY K L@2 M N O@2
  AY K L@2 M N O@2 AY K L@2 M N O@2 AY K L@2 M N O@2 AY AZ@2
>`.pickRestart({
  A: "~@7 f4, f3, ~ c4@4 c4@3, ~@2 f4@5 ~, ~@3 a4@5", B: "~@3 d4, f3, ~ d4@5 ~@2, ~@2 g4@3 g4@3, ~@3 b4@5",
  C: "~@7 a4, f3, ~ e4@5 e4@2, ~@2 a4@3 a4@2 ~, ~@3 c5@5", D: "~@3 g4, f3, ~ d4@4 d4@3, ~ g4@2 ~, ~@3 b4@5",
  E: "~@7 g4, f3, ~ d4@5 d4@2, ~@2 g4@3 g4@2 ~, ~@3 b4@5", F: "~@3 e4, f3, ~ e4@5 ~@2, ~@2 a4@3 a4@3, ~@3 c5@5",
  G: "~@12 e4@3 ~, f3@15 ~, ~ e4@5 ~@2, ~@4 a4@6 a4@5 ~, ~@6 c5@9 ~", H: "~@3 d4, f3, ~ d4@5 ~@2, ~ g4@3, ~@3 b4@5",
  I: "[~@18 d4 ~@9 d4@4, f3 f3, ~ c4@4 c4@4 ~@7, ~@2 f4@5 f4@2 ~ g4@3 g4@3, ~@3 a4@6 ~@2 b4@5]/2",
  J: "~@3 a4, f3, ~ e4@4 e4@3, ~ a4@2 ~, ~@3 c5@5", K: "[f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@2, c4@2 ~@2 c4@4 ~@2 c4@5 ~",
  L: "[c4 [e4,g4]@2 ~ [f4,a4] c4 [e4,g4] ~ [f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@2, ~@7 c4@2 ~@7]/2", // Em F Em F Em F
  M: "~ [e4,g4]@2 ~ [f4,a4] c4 [e4,g4] ~", N: "[f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@2, ~ c4 ~@2",
  O: "[~ [e4,g4]@2 c4 [f4,a4] c4 [e4,g4] ~ [f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@2, ~@14 c4@4 ~@2 c4@5 ~ c4@4 ~@2]/2", // Em F Em F Em F
  P: "[~ [e4,g4]@2 c4 [f4,a4] c4 [e4,g4] ~ [f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@2, c4@2 ~@5 c4@2 ~ c4@2 ~ c4@2 ~]/2", // Em F Em F Em F
  Q: "[c4 [e4,g4]@2 c4 [f4,a4] c4 [e4,g4] ~ [f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@2, ~@14 c4@4 ~@2 c4@5 ~ c4@5 ~]/2", // Em F Em F Em F
  R: "[~ [e4,g4]@2 ~ [f4,a4] c4 [e4,g4] ~ [f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@2, ~@7 c4@2 ~ c4@2 ~ c4@2 ~]/2", // Em F Em F Em F
  S: "[~ [e4,g4]@2 c4 [f4,a4] c4 [e4,g4] ~ [f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@2, ~@7 c4@2 ~ c4@2 ~ c4@2 ~]/2", // Em F Em F Em F
  T: "~@2 [e4,g4]@4 c4@2 [f4,a4]@2 c4@2 [e4,g4]@3 ~, c4 ~@3", U: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@5 ~ [e4,a4,c5]@18 ~@2]/2",
  V: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 [e4,a4,c5]@18 ~@2]/2", // F G Am
  W: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 e4@8 ~@6 a4@5 ~, ~@12 c5@19 ~, ~@3 a4@3 ~@2, ~@22 e4@9 ~]/2", // F G
  X: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@5 ~ [e4,a4,c5]@18 ~@2]/2", // F G Am
  Y: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@5 ~ e4@10 a4@4 e4@4 a4 ~, ~@6 c5@9 ~, ~@3 a4@2 ~@3]/2", // F G
  Z: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@5 ~ [a4,c5]@13 ~@3 a4@2 ~@2, ~@12 e4@19 ~, ~@13 c5@2 ~]/2", // F G Am
  AA: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 [e4,a4]@10 ~@4 c5@4 ~@2, ~@6 c5@6 a4@3 ~, ~@11 e4@4 ~]/2", // F G A5
  AB: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 a4@10 ~@4 c5@4 ~@2, ~@6 c5@6 a4@3 ~, ~@12 e4@9 ~ e4@8 ~@2]/2", // F G
  AC: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@5 ~ [e4,a4,c5]@13 ~ [e4,a4,c5]@2 ~@2 [c4,a4] ~]/2", // F G Am F
  AD: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 [a4,c5]@10 ~@4 c5@4 ~@2, ~@6 e4@4 ~ e4@4 ~, ~@12 a4@3 ~]/2", // F G Am
  AE: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@5 ~ [e4,a4]@6 ~@8 c5@4 ~@2, ~@6 c5@5 a4@4 ~, ~@9 e4@6 ~]/2", // F G A5
  AF: "[c4,f4,a4]@2 ~ [d4,g4,b4]@2 ~ [e4,a4,c5]@2", AG: "~ [f4,b4,d5]@2 ~ [e4,a4,c5] ~ [d4,b4] ~",
  AH: "[[c4,a4]@4 ~@2 [d4,g4,b4]@4 ~@2 [e4,a4,c5]@13 ~ [e4,a4,c5]@4 ~@2]/2", // F G Am
  AI: "[c4,f4,a4]@4 ~@2 [d4,g4,b4]@5 ~ [e4,a4,c5]@4", AJ: "~ [f4,b4,d5]@2 ~ [e4,a4,c5] ~ [d4,g4,b4] ~",
  AK: "[c4,f4,a4]@5 ~ [d4,g4,b4]@5 ~ [e4,a4,c5]@4", AL: "~ [f4,b4,d5]@2 ~ [e4,a4] ~ [d4,b4] ~",
  AM: "[c4,a4]@2 ~ [d4,g4,b4]@2 ~ [e4,a4,c5]@2", AN: "~ [d4,g4,b4]@2 ~ [e4,a4,c5] ~ [d4,g4,b4] ~",
  AO: "[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 [e4,a4,c5]@4", AP: "~@2 [d4,g4,b4]@4 ~@2 [e4,a4,c5]@3 ~ [f4,b4,d5]@4",
  AQ: "[[c4,f4,a4]@2 ~ [d4,g4,b4]@2 ~ [e4,a4,c5]@9 ~]/2", // F G Am
  AR: "[[c4,f4,a4]@2 ~ [d4,g4,b4]@2 ~ [e4,a4]@5 ~@2 a4@2 ~, ~@6 c5@9 ~, ~@11 e4@4 ~]/2", // F G A5
  AS: "[[c4,f4,a4]@2 ~ [d4,g4,b4]@2 ~ [e4,a4]@5 ~@3 c5 ~, ~@6 c5@7 a4@2 ~, ~@22 e4@9 ~]/2", // F G A5
  AT: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@4 ~@2 [e4,a4,c5]@13 ~ [e4,a4,c5] ~@5]/2", // F G Am
  AU: "[[c4,f4,a4]@5 ~ [d4,g4,b4]@4 ~@2 [e4,a4,c5]@13 ~ [e4,a4,c5]@4 ~@2, ~@6 a4 ~@25]/2", // F G Am
  AV: "[[c4,f4,a4]@4 ~@2 [d4,g4,b4]@5 ~ [e4,a4]@9 ~@7 c5@2 ~@2, ~@6 c5@7 a4@2 ~, ~@22 e4@9 ~]/2", // F G A5
  AW: "~ [d4,g4,b4]@2 ~ [e4,a4,c5]@3 ~", AX: "~@2 [d4,g4,b4]@4 ~@2 [e4,a4,c5]@3 ~ [d4,g4,b4]@3 ~",
  AY: "~ [e4,g4]@2 c4 [f4,a4] c4 [e4,g4] c4, c4 ~@3", // Em F Em
  AZ: "[[f4,a4]@2 ~ [e4,g4]@2 ~ [f4,a4]@8 ~@2, c4@2 ~@2 c4@4 ~@2 c4@5 ~@17]/2", // F Em F
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.3)

// chords · acoustic guitar steel · "Guitar 1" · soft notes
const acoustic_guitar_steel_2 = note(`<
  ~@21 A B C@2 D ~@9 E ~@3 D ~@33 F G ~@4 H G ~@4 A B C@2 D ~@9 E ~@3 D ~@37 A B C@2 D ~@3 A B C@2 D ~@3 A B C@2 D ~@3 A
  B C@2 D ~@3 A B C@2 D ~@3 A B C@2 D ~@4
>`.pickRestart({
  A: "~@6 c4@3 ~@7", B: "~@2 c4@2 ~ c4@2 ~", C: "[c4@4 ~@2 c4@3 ~@5 c4@4 ~@8 c4@4 ~@2]/2", D: "c4 ~@3",
  E: "c4@3 ~@3 c4@3 ~@7", F: "~@6 g4 ~", G: "f4 ~@3", H: "~@4 c5 ~ g4 ~",
})).s("gm_acoustic_guitar_steel").gain(0.24).pan(0.3)

// chords · electric guitar clean · "Guitar 2" · C5 D5 C5 D5
const electric_guitar_clean = note("<~@43 [[g4,c5]@6 [a4,d5]@9 ~] ~@63 [[g4,c5]@6 [a4,d5]@9 ~] ~@82>")
  .s("gm_electric_guitar_clean").gain(0.26).pan(0.7)

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

// drums · rim
const rim = s("rim").struct("<~@19 A ~@15 A ~@15 A ~@15 A ~@15 A ~@15 A ~@15 A ~@15 A ~@58>".pickRestart({
  A: "~@3 x",
})).gain(0.6)

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

// drums · clap
const clap = s("cp").struct("<~@20 A@39 B C A@62 B C A@64 ~>".pickRestart({
  A: "~ x ~ x", B: "~ x!3", C: "x!2 ~ x",
})).gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@44 A@7 B A@7 B A@24 ~@24 A@7 B A@7 B A@16 ~@50>".pickRestart({
  A: "~@2 x!2 ~@2 x!2", B: "~@2 x!2 ~@4",
})).gain(0.3)

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

stack(
  bass, piano, acoustic_guitar_steel, acoustic_guitar_steel_2, electric_guitar_clean, kick, rim, snare, clap, low_tom,
  mid_tom
)

More by Fleetwood Mac