Strudelify

Fu-Gee-La

Fugees

KeyC minorTempo90 bpm
0:00/0:00
// Fu-Gee-La — Fugees
// 90 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 98 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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 · piano
const piano = note("<~@19 A B C B ~@20 A B C B ~@51>".pickRestart({
  A: "~@14 [c4,eb5] [b3,d5]", B: "[c4,eb5] ~@31", C: "~@14 [c4,eb5] b3, ~@30 d5 ~",
})).s("gm_piano").gain(0.29)

// other · agogo
const agogo = note(`<
  ~@4 A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~
  A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2
>`.pickRestart({
  A: "[g3@7 ~@5 g3@6 ~@14]/2", B: "g3 ~@2 g3",
})).s("gm_agogo").gain(0.12)

// bass · fretless bass
const bass = 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 ~@4 A B C D A B C D A B C D A B C D ~ E@2 ~ A B C D A B C D A B C D A
  B C D ~@4 A B C D ~@4 A B C D A B C D A B C D A B C D A B C F ~@2
>`.pickRestart({
  A: "c2@23 ~ c2@8", B: "g1@11 ~ c2@9 ~@3 g1@4 g1 ~ bb1@2, ~@23 f1@2 ~@7", C: "c2@22 ~@2 c2@7 ~",
  D: "g1@11 ~ c2@10 ~@2 g1@3 ~ g1@2 bb1@2, ~@23 f1@2 ~@7", E: "[~@32 c2@13 ~@19, ~@31 bb1@2 ~@31]/2",
  F: "g1@11 ~ c2@20",
})).s("gm_fretless_bass").gain(0.6)

// other · pad bowed
const pad_bowed = note("<~@24 A@2 B ~ C D E ~@17 A@2 B ~ C D E ~@17 A@2 B ~ C D E ~ A@2 B ~ C D E ~@11>".pickRestart({
  A: "[~@4 c4@4 eb4@4 bb4@4 g4@37 ~@11]/2", B: "~@4 c4@3 ~ eb4@4 bb4@4 g4@16", C: "c5@7 ~ bb4@3 ~ bb4@3 ~ bb4@6 ab4@10",
  D: "g4@2 f4@2 eb4@2 f4@2 g4@16 f4@7 ~", E: "c4@29 ~@3",
})).s("gm_pad_bowed").gain(0.29).pan(0.8)

// chords · ocarina
const ocarina = note(`<
  ~@4 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 A B ~@8 A B A B A B A B A B A B A B A C ~@2
>`.pickRestart({
  A: "g4@16 ~@8 [c4,g4]@7 ~", B: "f3@11 ~ [c4,g4]@9 ~@3 [g4,c5]@7 ~", C: "f3@11 ~ g4@20, ~@12 c4@9 ~@11",
})).s("gm_ocarina").gain(0.14).pan(0.3)

// chords · ocarina · soft notes
const ocarina_soft = note(`<
  ~@4 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 A B ~@8 A B A B A B A B A B A B A B A B ~@2
>`.pickRestart({
  A: "c4 ~", B: "bb3@5 ~@11",
})).s("gm_ocarina").gain(0.09).pan(0.3)

// chords · epiano1
const epiano1 = note(`<
  ~@4 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 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 D A B C D A B C D ~@8 A B C D A B C D A B C D A B C E ~@2
>`.pickRestart({
  A: "~@4 c5 ~ f5@2 [eb5,g5]@2 d5 ~ c5@4 [eb5,g5]@16, ~@6 d5 ~@25", // Eb
  B: "~@4 c5@2 d5 ~ [eb5,g5]@2 [d5,f5]@2 c5@4 [eb5,g5]@16", C: "~@4 c5@2 d5 ~ [eb5,g5]@2 d5 ~ c5@4 [eb5,g5]@16",
  D: "~@2 c5 f5 [eb5,g5] [d5,f5] c5@2 g5@7 ~, ~@6 d5 ~@25", E: "~@2 c5 f5 [eb5,g5] [d5,f5] c5@10, ~@6 d5 ~@25",
})).s("gm_epiano1").gain(0.25).pan(0.7)

// chords · epiano1 · soft notes
const epiano1_soft = note(`<
  ~@4 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 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 D A B C D A B C D ~@8 A B C D A B C D A B C D A B C ~@3
>`.pickRestart({
  A: "~@5 f5 ~@10", B: "~@3 f5 ~@12", C: "~@3 f5 ~ f5 ~@10", D: "~@8 eb5@7 ~",
})).s("gm_epiano1").gain(0.17).pan(0.7)

// other · electric bass finger
const electric_bass_finger = note(`<
  ~@63
  [~@24 eb4@3 ~ eb4@2 eb4@2]
  [~ c4@3 ~@7 eb4!2 ~@2 eb4 eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@2 ~@2 eb4@2 ~@2]
  [eb4@2 ~@5 eb4@2 ~ eb4@2 ~@2 eb4 ~ eb4@3 ~ eb4@2 eb4 ~ eb4@2 ~ eb4 eb4@2 ~ eb4]
  [eb4 ~@15]
  ~@31
>`).s("gm_electric_bass_finger").gain(0.38)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A B A C A D A C E B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C E A E C A B A C A B A C A B A C A
  B A C E B A C E@3 F A B A C A B A C A B A C A B A C A B A C A B A G ~@2
>`.pickRestart({
  A: "x ~@3 x!2 ~@2", B: "x ~@15 x ~@3 x ~@10 x", C: "x ~@14 x!2 ~@3 x ~@11", D: "x ~@30 x", E: "~@4 x!2 ~@2",
  F: "x ~@4 x ~@2", G: "x ~@2 x ~@4",
})).gain(0.38)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@4 A B A ~ A ~ A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A
  B A ~ A B A ~ B@2 A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~@3
>`.pickRestart({
  A: "~@15 x ~@15 x", B: "~@15 x ~@16",
})).gain(0.17)

// drums · snare
const snare = s("sd").struct("<~@3 [~@3 x] [~ x ~ x]!5 [~@3 x] [~ x ~ x]!85 [~ x ~@2] ~@2>").gain(0.38)

// drums · hihat
const hihat = s("hh").struct("<~@3 A B@15 C D C D B@20 C D C D B@9 E@2 B@37 F ~@2>".pickRestart({
  A: "~@7 x", B: "x!8", C: "x!7 ~", D: "~@2 x!6", E: "x!6 ~@2", F: "x!3 ~@5",
})).gain(0.34)

// drums · open hat
const open_hat = s("oh").struct("<~@95 [~@3 x ~@4] ~@2>").gain(0.25)

// drums · ride bell
const ride_bell = s("rd").struct("<A@20 B A B A@21 B A B A@9 C@2 A@37 D ~@2>".pickRestart({
  A: "x!4", B: "~ x!3", C: "x!3 ~", D: "x ~ x!2 ~@4",
})).gain(0.25)

// drums · bell tree
const bell_tree = s("marktrees:0").struct("<~@30 A B ~@22 A B ~@22 A B ~@6 A B ~@10>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@4",
})).gain(0.75)

stack(
  piano, agogo, bass, pad_bowed, ocarina, ocarina_soft, epiano1, epiano1_soft, electric_bass_finger, kick, kick_soft,
  snare, hihat, open_hat, ride_bell, bell_tree
)

More by Fugees