Strudelify
Gypsy cover art

1982 · Mirage

Gypsy

Fleetwood Mac

KeyF majorTempo131 bpm
0:00/0:00
// Gypsy — Fleetwood Mac
// 131 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 1) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 146 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Guitar 5.
setcpm(131/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 · electric bass finger · "Bass"
const bass = note(`<
  ~ A@2 B C D E D E C F C@2 D G D H I J A C D E D K D L A@2 B C D E D E C F C M D G D H I J A M D E D K D L A@2 B C N@2
  E O M C D@2 P Q E R C F D S P Q E T C F C M D G D H I J A M D E D K D L D L C F C@2 D G D H C F C@2 D G D H C F C M D
  G D H C F C@2 D G D H C F C@2 D G D H C F C M D G D H U
>`.pickRestart({
  A: "f1@4 ~@2 f1 ~ f1@5 ~@3", B: "f1@4 ~@2 f1 ~ f1@4 ~@4", C: "f1@4 ~@2 f1 ~ f1@4 ~@2 f1 ~",
  D: "bb1@4 ~@2 bb1 ~ bb1@4 ~@2 bb1 ~", E: "c2@4 ~@2 c2 ~ c2@4 ~@2 c2 ~", F: "f1@4 ~@2 f1 ~ f1@5 ~ f1 ~",
  G: "c2@4 ~@2 c2 ~ c2@5 ~ c2 ~", H: "c2@4 ~@2 c2 ~ c2@2 d2 ~ c2@4", I: "f1@3 ~@3 f1 ~ f1@4 ~@4",
  J: "f1@5 ~ f1 ~ f1@4 ~@4", K: "c2@4 ~@2 c2 ~ c2@2 d2 ~ c2@3 ~", L: "c2@4 ~@2 c2 ~ c2@6 ~@2",
  M: "f1@5 ~ f1 ~ f1@4 ~@2 f1 ~", N: "d2@4 ~@2 d2 ~ d2@5 ~ d2 ~", O: "c2@4 ~@2 c2 ~ c2@6 d2 ~",
  P: "d2@4 ~@2 d2 ~ d2@4 ~@2 d2 ~", Q: "d2@4 ~@2 d2 ~ d2@4 ~@2 d2@2", R: "c2@4 ~@2 c2 ~ c2@4 ~@2 c2@2",
  S: "bb1@5 ~ bb1 ~ bb1@4 ~@2 bb1 ~", T: "c2@4 ~@2 c2 ~ c2@5 ~ c2@2", U: "f1@11 ~@5",
})).s("gm_electric_bass_finger").gain(0.42)

// chords · celesta · "Keyboard"
const celesta = note("<~@81 A B C D ~@4 E@8 ~@4 F@4 ~@4 G@4 ~@4 G@4 ~@4 G@4 ~@4 H@4 ~@4 G@4 ~>".pickRestart({
  A: "a5@3 ~ c6 ~@3 d6 ~@3 f6 ~@3", B: "d6 ~@3 c6 ~@3 a5@2 ~@2 g5 ~@3", C: "a5 ~@3 c6 ~@3 d6 ~@3 f6 ~@3",
  D: "d6 ~@3 c6 ~@3 a5 ~@3 g5 ~@3",
  E: "[~@124 g5@3 ~, a5@24 a5@4 g5@28 a5@4 g5@28 a5@4 g5@28 a5@7 ~, ~@4 c6@16 c6@12 a5@20 c6@12 a5@20 c6@12 a5@20 c6@11 ~, ~@8 d6@8 d6@20 c6@12 d6@20 c6@12 d6@20 c6@12 d6@15 ~, ~@12 f6@28 d6@4 f6@28 d6@4 f6@28 d6@4 f6@19 ~]/8",
  F: "[~@15 g5, a5@6 a5 g5@7 a5@2, ~ c6@4 c6@3 a5@5 c6@3, ~@2 d6@2 d6@5 c6@3 d6@4, ~@3 f6@7 d6 f6@5]/4",
  G: "[~@60 g5@3 ~, a5@24 a5@4 g5@28 a5@7 ~, ~@4 c6@16 c6@12 a5@20 c6@11 ~, ~@8 d6@8 d6@20 c6@12 d6@15 ~, ~@12 f6@28 d6@4 f6@19 ~]/4",
  H: "[~@60 g5@3 ~, a5@6 a5 g5@7 a5@2, ~ c6@4 c6@3 a5@5 c6@3, ~@8 d6@8 d6@20 c6@12 d6@15 ~, ~@12 f6@28 d6@4 f6@19 ~]/4",
})).s("gm_celesta").gain(0.42)

// other · electric guitar clean · "Guitar 1"
const electric_guitar_clean = note(`<
  ~ A B C ~@5 A B C ~@5 A B C ~@5 D ~ A B C ~@5 A B C ~@5 A B C ~@5 D ~ A B C ~ E F G H I J K L E F G H I J K L M N O P
  Q B C ~@5 A B C ~@5 D ~@3 A B C ~@5 A B C ~@5 A B C ~@5 A B C ~@5 A B C ~@5 A B C ~@5 D
>`.pickRestart({
  A: "a4@13 ~@3", B: "c5@7 ~", C: "f4", D: "a4 ~", E: "~@8 d3 ~ f3 ~ a3 ~ d4 ~", F: "f4 ~ c5@2 e5 ~ f5@2 ~@8",
  G: "~@8 c3 ~ e3 ~ g3 ~ c4 ~", H: "g4 ~ c5 ~ d5 ~ e5@2 ~@8", I: "~@8 f3 ~ a3 ~ c4 ~ f4 ~", J: "f4 ~ a4 ~ c5 ~ f5 ~@9",
  K: "~@8 bb3 ~ d4 ~ f4@2 g4 ~", L: "f4@2 bb4 ~ d5@2 f5@2 ~@8", M: "~@8 d4 ~ f4 ~ a4@2 d5 ~",
  N: "f4 ~ a4 ~ c5 ~ f5@2 e5@2 d5@2 ~@4", O: "~@8 c3 ~ e3 ~ g3@2 c4 ~", P: "c4@2 e4 ~ g4@2 c5 ~ e5 ~ d5@2 f4@2 g4@2",
  Q: "a4@13 ~@3, f4@9 ~@7",
})).s("gm_electric_guitar_clean").gain(0.48)

// chords · acoustic guitar steel · "Guitar 2"
const acoustic_guitar_steel = note(`<
  ~ A B C D E F G H A I C D E A J A@2 I C D E K G L M@2 A B C D E F G H A I C D E A J A@2 I C D E K G L M@2 A B C N@3 O
  P Q R G S T U V W X@2 Y G T U V Z A I C D E A J A@2 I C D E K G L M@4 A I C D E A J A@2 I C D E A J A@2 I C D E A J
  A@2 I C D E A J A@2 I C D E A J A@2 I C D E A J A AA
>`.pickRestart({
  A: "[c4,f4,a4]", B: "~@7 c4, [a4,c5]", C: "[c4,f4]", D: "[a3,c4]", E: "[bb3,d4,f4,a4]", F: "~@7 bb3, [c4,f4,a4]",
  G: "[bb3,d4,f4]", H: "[c4,f4,a4]@15 ~", I: "[a4,c5]", J: "[bb3,d4,f4,a4]@7 c4", K: "[c4,f4,a4]@13 ~@3",
  L: "[c4,f4,a4]@7 ~", M: "[[bb3,d4,f4]@14 ~@2 [f4,a4]@13 ~@3, ~@7 c4@7 ~@2]/2", N: "[a3 [a3,d4,f4,a4]@2, c4@2 ~]/3",
  O: "[g3,c4,e4]@7 [g3,c4,e4], g4", P: "[c4,e4,g4]@13 ~@3", Q: "[f3,a3,c4]@7 [f3,a3,c4], f4", R: "[f3,a3,c4,f4]@15 ~",
  S: "[bb3,d4,f4]@15 ~", T: "[a3,d4,f4]@7 [a3,d4,f4]", U: "[a3,d4,f4]", V: "[g3,c4,e4]@7 [g3,c4,e4]",
  W: "[g3,c4,e4]@11 ~@5", X: "[[a3,c4,f4] [a3,c4,f4], f3]/2", Y: "[bb3,d4]@7 [bb3,d4,f4]", Z: "[g3,c4,e4]@7 ~",
  AA: "f4@3 ~",
})).s("gm_acoustic_guitar_steel").gain(0.48)

// other · electric guitar muted · "Guitar 3"
const electric_guitar_muted = note(`<
  A B C B C B C B D B E B C B F B G B C B E B H B I B C B C B C B C B D B E B C B J B G B C B E B H B I B K B C B C ~@20
  L E B C B J B G B C B E B H B I B K B K L E B C B F B D B E B C B F B G B E B C B J B G B E B C B F B D B E B C B F B
  G B E B C B J B G M
>`.pickRestart({
  A: "~@10 c3 ~ d3 ~ f3 ~", B: "f3@4 ~@2 f3 ~ f3@4 ~@2 f3 ~", C: "f3@4 ~@2 f3 ~@3 f3 ~ g3 ~ a3 ~",
  D: "f3@4 ~@2 f3 ~@3 f3 ~ a3 ~ g3 ~", E: "f3@5 ~ f3 ~@3 f3 ~ g3 ~ a3 ~", F: "f3@4 ~@2 f3 ~@3 f3@2 g3 ~ a3 ~",
  G: "f3@4 ~@2 f3 ~@3 f3@2 a3 ~ g3 ~", H: "f3@5 ~ a3 ~@3 a3@2 g3@2 f3 ~", I: "f3@5 ~ a3 ~@3 a3@2 g3 ~ f3 ~",
  J: "f3@5 ~ f3 ~@3 f3@2 g3 ~ a3 ~", K: "f3@4 ~@2 f3 ~@3 f3 ~ g3@2 a3 ~", L: "~@6 f3 ~ f3@4 ~@2 f3 ~", M: "f3 ~@3",
})).s("gm_electric_guitar_muted").gain(0.28).pan(0)

// chords · acoustic guitar nylon · "Guitar 4"
const acoustic_guitar_nylon = note(`<
  ~@5 A@4 B ~@3 A@4 ~@4 C@6 ~@4 A@4 B ~@3 A@4 ~@4 C@6 ~@24 D@2 ~@2 A@4 ~@4 E@6 F@2 B ~@3 G@6 ~@2 G@6 ~@2 G@6 ~@2 G@6 ~@2
  G@6 ~@2 H@5
>`.pickRestart({
  A: "[~@15 g4, a4@6 a4 g4@7 a4@2, ~ c5@4 c5@3 a4@5 c5@3, ~@2 d5@2 d5@5 c5@3 d5@4, ~@3 f5@7 d5 f5@5]/4", B: "a4@3 ~",
  C: "[~@92 g4@3 ~, a4@24 a4@4 g4@28 a4@4 g4@28 a4@7 ~, ~@4 c5@16 c5@12 a4@20 c5@12 a4@20 c5@11 ~, ~@8 d5@8 d5@20 c5@12 d5@20 c5@12 d5@15 ~, ~@12 f5@28 d5@4 f5@28 d5@4 f5@19 ~]/6",
  D: "a4/2", E: "[~@28 g4@3 ~, a4@24 a4@7 ~, ~@4 c5@16 c5@11 ~, ~@8 d5@8 d5@15 ~, ~@12 f5@19 ~]/2",
  F: "[~@7 g4, a4@3 a4, ~ c5@4 c5@3, ~ d5 d5@2, ~@3 f5@5]/2",
  G: "[~@2 a4, a4@6 a4 g4@7 a4 g4@8 ~, ~ c5@4 c5@3 a4@5 c5@8 ~@3, ~@2 d5@2 d5@5 c5@3 d5@8 ~@4, ~@3 f5@7 d5 f5@8 ~@5]/6",
  H: "[~@3 g4, a4@6 a4 g4@7 a4@6, ~ c5@4 c5@3 a4@5 c5@7, ~@2 d5@2 d5@5 c5@3 d5@8, ~@3 f5@7 d5 f5@8 ~]/5",
})).s("gm_acoustic_guitar_nylon").gain(0.48).pan(0.7)

// chords · synth strings 2 · "Strings"
const synth_strings_2 = note(`<
  ~ A@2 B C D@2 E F G@2 B H I F I F J@3 H I K I F I K A@2 B C D@2 E F G@2 B H I F I F J@3 H I K I F I K A@2 B C L@2 M@4
  N@4 M@4 N@4 O@2 ~ P B H I F I F J@3 H I K I F I K ~ K ~ P B H I F I F Q@3 H I F I F Q@3 H I F I F Q@3 H I F I F Q@3 H
  I F I F Q@3 H I F I F ~
>`.pickRestart({
  A: "[f3@15 ~ c4@15 ~, a3@31 ~]/2", B: "[c3,f3]", C: "[a3,c4]@13 ~@3", D: "[[bb3,d4]@15 e4@16 ~, ~@15 c4@13 ~@4]/2",
  E: "[bb3,d4]@15 ~", F: "[c4,e4]", G: "[f3 c4, a3]/2", H: "[a3,c4]", I: "[bb3,d4]", J: "[f3 c4 f3, a3@47 ~]/3",
  K: "[c4,e4]@15 ~", L: "[d4,f4]/2", M: "[e4 a3, c4]/4", N: "[bb3 f4, d4]/4", O: "[[c4,e4]@15 ~]/2", P: "c4",
  Q: "[~ c4 [c3,f3], a3@47 ~]/3", // F5
})).s("gm_synth_strings_2").gain(0.14)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A@21
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B ~
>`.pickRestart({
  A: "x ~@4 x ~@2", B: "x ~@3 x!2 ~@2",
})).gain(0.48)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!83 [~ x!3] [x!2 ~ x] [~ x ~ x]!59 ~>").gain(0.48)

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

// drums · open hat
const open_hat = s("oh").struct("<~@46 [~@3 x] ~@41 [~@3 x] ~@57>").gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@57 A ~@19 A ~@30 B ~@3 B ~@11 C ~@3 B ~@5 B ~@5 B ~@4 A>".pickRestart({
  A: "x", B: "~@3 x", C: "~ x ~@2",
})).gain(0.24)

// drums · tambourine
const tambourine = s("tb").struct("<~@100 [~@3 x] ~ [~@3 x] ~ [~ x ~@2] ~@41>").gain(0.36)

// drums · shaker
const shaker = s("sh").struct("<~ [x!8]!144 ~>").gain(0.3)

stack(
  bass, celesta, electric_guitar_clean, acoustic_guitar_steel, electric_guitar_muted, acoustic_guitar_nylon,
  synth_strings_2, kick, snare, hihat, open_hat, crash, tambourine, shaker
)

More by Fleetwood Mac