Strudelify
Waterfalls cover art

1994 · Crazysexycool

Waterfalls

TLC

KeyC minorTempo86 bpm
0:00/0:00
// Waterfalls — TLC
// 86 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 68 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(86/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 · "FINGERDBAS"
const bass = note(`<
  ~@3 A ~@7 B C@2 D@2 E@2 F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 N@2 C@2 D@2 E@2 F@2 G@2 H@2 I@2 O@2 P@2 Q@2 M@2 R@2 S@2 T@2
  U@2 V W
>`.pickRestart({
  A: "~@12 [f1,db2] ~@5 [ab1,eb2] eb1@5", B: "~@18 eb2@2 db2 bb1@2 ~",
  C: "[eb1@6 bb1@6 eb1@3 ab1@3 a1@2 ~ bb1@6 d2@4 ~ eb2@4 f2@3 ab2@2 a2 bb2@3 f2@2 ~]/2",
  D: "[db2@11 ab1 db2 ~@2 db2@3 eb2@3 ab1@13 ~ eb2 ab2@2 eb2 ab1@3 bb1@6]/2",
  E: "[eb1@10 ~ eb1 eb1@3 g1@3 ab1@3 bb1@8 f2 c3@2 ~ b2@2 bb2@6 ~ f2@2 ~ eb2@2 ~]/2",
  F: "[db2@10 ~ f1 gb1@3 f1 ~@2 eb1 ~@2 eb2@13 ~ bb2 db3 ~@2 f3@2 ~ db3@3 eb3@2 ~]/2",
  G: "[eb1@6 bb1@6 eb1@3 g1@3 ab1@3 bb1@13 ~ f2 bb2@2 f2 bb1@3 f2@3 eb2@3]/2",
  H: "[db2@11 ab2 db3 ~@2 db3 ~@2 eb3@3 ab2@14 eb2 ab1 ~@2 ab1@8 ~]/2",
  I: "[eb1@9 ~@2 eb1 eb1@3 g1@3 ab1@3 bb1@10 ~ f2 c3@2 bb2 ~@2 f2 ~@2 bb1 ~@2 f2 ~@2 ab1]/2",
  J: "[db2 ~@2 db2@7 ~ db2 gb2@2 ~ f2 ~@2 eb2 ~@2 eb3@13 ~ eb3 bb3 ~@2 gb3@7 ~@2]/2",
  K: "[eb1@10 ~ eb1!2 ~@2 g1 ~@2 ab1 ~@2 bb1@8 f2 c3@3 bb2@6 f2 ~ f1 bb1@2 ~ d2@2 bb1]/2",
  L: "[db2@11 ab1 db2 ~@2 db2@3 eb2@2 ~ ab2@11 ~ bb2@3 ab2@5 eb2 ab2@5 ~]/2",
  M: "[eb1@6 bb1@5 ~ eb1@3 g1@3 ab1@3 bb1@9 ~@2 bb1 bb2@3 bb1@2 ~ bb1@2 ~ f2@2 ~ eb2 ~@2]/2",
  N: "[db2@10 ~ eb1 gb1@3 f1 ~@2 eb1 ~@2 eb2@13 ~ eb2 gb2@2 eb2 f2@2 db2 ab1 ~@2 bb1 ~@2]/2",
  O: "[db2 ~@2 db2@7 ~ db1 gb1@2 ~ f1 ~@2 eb1 ~@2 eb2@9 ~@18]/2",
  P: "[eb1@5 ~ g1@4 ~ g1 bb1 ~@2 db2 ~@2 eb2 ~@2 bb1@5 ~ bb1 ~@2 d2@3 ~@2 d2 f2 ~@2 ab2 ~@2 bb2@3 f2 ~@2]/2",
  Q: "[db2@9 ~@2 ab1 db2 ~@2 db2 ~@2 eb2 ~@2 ab1@8 ab1 bb2@5 eb2 ab2@5 eb2 ab2@6]/2",
  R: "[db2@10 ~ eb1 gb1@3 f1 ~@2 eb1 ~@2 eb2@17 ~ bb1 db2 eb2 gb2 ~@2 eb2@3]/2",
  S: "[eb2@6 db2@3 bb1@3 eb1@3 ab1@3 a1@3 bb1@8 f2 bb2 ~@2 c3@3 bb2@5 bb1 f2@2 bb1 eb2@2 bb1]/2",
  T: "[db2@8 ab2 db3@2 ab2 db2 ~@2 db2 ~@2 eb2@3 ab1@8 eb2 bb2 ~@2 ab2@8 eb2 bb2@6]/2",
  U: "[eb2@6 db2@3 bb1@3 eb1@3 ab1@3 a1@3 bb1@8 f2 bb2 ~@2 c3 ~@2 db3@3 c3@2 ~ bb2@3 f2@3]/2",
  V: "db2 ~@2 db2@3 ~@2 db2 eb2@2 db2 gb2@2 ~ f2@2 ~ eb2@3 db3@2 ~", W: "ab3@5 eb3 gb3@6 eb3@5 db3@5 ~@2",
})).s("gm_electric_bass_finger").gain(0.42)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  A@4 B C D E F C D G B C D E F C D G B C D E F C D G B C D E F C D G B C D E F C D G B C D E F C D H B C D E F C D ~ B
  C D E F C I J
>`.pickRestart({
  A: "[~@18 [ab4,bb4] ~@2 ab4@6 ~@9 eb4@3 gb4 ~@5 ab4@6 gb4 ~@2 eb4@3 eb4@6 db4@2 ~ bb3@3 ab3@6 gb3@2 ~@19, ~@21 gb4 ~@74]/4", // Absus2
  B: "[bb3,eb4,g4] ~ bb3 ~@2 bb3 [eb4,g4,bb4]@2 bb3 ~@2 bb3 [eb4,g4,c5]@2 bb3 ~@9", // Eb Cm
  C: "~@3 [d4,f4,bb4] ~ d4 [d4,f4,bb4] ~ [d4,f4,bb4] ~@2 d4 [d4,f4,bb4] ~ [d4,f4,c5] ~@2 d4 [d4,f4,c5] ~ [d4,f4,c5] ~@2 [d4,f4,c5]", // Bb Dm7
  D: "[ab3,c4,f4] ~ ab3 ~@2 ab3 [c4,eb4,ab4] ~ c4 ~@2 c4 [c4,eb4,bb4] ~ c4 ~@9", // Fm Ab Cm7
  E: "~@2 [c4,eb4,ab4] c4 ~@2 [c4,eb4,ab4] ~ c4 ~@2 c4 [c4,eb4,ab4] ~ c4 ~@2 c4 [c4,eb4,bb4] ~ c4 ~@3", // Ab Cm7
  F: "[bb3,eb4,g4] ~ bb3 ~@2 bb3 [eb4,g4,bb4]@2 bb3 ~@2 bb3 [eb4,g4,f5]@2 bb3 ~@9", // Eb
  G: "~@2 [c4,eb4,ab4] c4 ~@2 [c4,eb4,ab4] ~ c4 ~@3 c4 ~ [ab4,bb4,eb5] ab4 ~ ab4 [ab4,bb4,eb5] ~ ab4 ~@3", // Ab Absus2
  H: "~@2 [c4,eb4,ab4] c4 ~@2 [c4,eb4,ab4] ~@17", I: "[ab3,c4,f4] ~ ab3 ~@2 ab3 [c4,eb4,ab4] ~@17",
  J: "~@2 [c4,eb4,ab4] c4 ~@2 [c4,eb4,ab4] ~ c4 ~@3 c4 ~ [ab4,bb4,eb5] ~@9", // Ab Absus2
})).s("gm_overdriven_guitar").gain(0.07).pan(0)

// other · lead 3 calliope · "CALLIOPE"
const lead_3_calliope = note(`<
  ~@14 A ~@3 A ~@9 B C D E F G ~@4 H ~@3 I J ~@2 K@2 ~ L M ~ B C D E F G ~@2 B C D E F G ~@2
>`.pickRestart({
  A: "f4 ~@2 f4 ~@2 f4@2 ~ f4 ~@2 eb4@2 ~ db4@3 c4@2 ~ c4@3", B: "g4@4 ~@2 g4@4 ~@2 g4@4 ~@2 g4@3 f4 ~@2",
  C: "eb4@3 d4@3 ~@6 d4@2 ~ d4 ~@2 g4@2 ~ g4 ~@2", D: "ab4@3 ab4 ~@2 ab4@2 ~ ab4 ~@2 ab4@2 ~ ab4 ~@2 ab4@2 ~ g4@3",
  E: "f4@2 ~ eb4@5 ~@4 eb4@2 ~ eb4 ~@2 f4@2 ~ f4 ~@2", F: "g4@2 ~ g4 ~@2 g4@2 ~ g4 ~@2 g4@2 ~ g4 ~@2 g4 ~@2 f4@3",
  G: "eb4@2 ~ d4@2 ~ d4@2 ~@16", H: "f4 ~@2 f4 ~@2 f4@2 ~ f4 ~@2 eb4@2 ~ db4@5 ~ c4@3",
  I: "f4 ~@2 f4 ~@2 f4@2 ~ f4 ~@2 f4@2 ~ f4 ~@2 f4@2 ~ eb4 ~@2", J: "db4@3 c4@2 ~@19",
  K: "[~@12 gb4@3 f4@3 eb4 ~@2 eb4@8 ~ eb4@2 f4 eb4@2 ~@13]/2", L: "c4@2 ~ c4 ~@2 c4@2 ~ c4@5 ~ c4 ~@2 g4@2 ~ g4 ~@2",
  M: "ab4@2 ~ ab4 ~@2 ab4@2 ~ ab4@2 ~ gb4@3 f4@3 eb4 ~@2 eb4@3",
})).s("gm_lead_3_calliope").gain(0.22)

// other · trumpet
const trumpet = note(`<
  ~@5 A B C D E@2 ~ F ~@14 G F A B C D ~ H ~ I E@2 ~@4 G I ~@6 G F A B C D ~ H ~ F A B C D ~ H ~
>`.pickRestart({
  A: "~@12 bb4@4 a4 [g4,ab4] f4@5 ~", B: "[eb4,c5]@19 ~@5", C: "~@18 bb3 ~ c4 eb4 ~ d4", D: "~@2 f4 ~@2 bb3 ~@18",
  E: "[~@12 eb4@2 f4 ~@2 g4 ~@2 ab4 ~@2 [f4,bb4]@8 ~ [eb4,ab4] [d4,g4]@2 [eb4,ab4]@13]/2", // Bb5 Ab5 G5 Ab5
  F: "bb5@2 ab5 [bb4,db5,eb5,gb5] ~@20", G: "~@3 [eb4,c5]@20 ~", H: "[ab3,eb4]", I: "eb5@2 [bb4,eb5] ~@21, bb4 ~@23",
})).s("gm_trumpet").gain(0.35)

// other · trumpet · soft notes
const trumpet_soft = note("<~@12 A ~@15 A ~@23 A ~@7 A ~@7>".pickRestart({
  A: "~@4 [gb4,ab4] ~@19", // Gbsus2
})).s("gm_trumpet").gain(0.23)

// other · muted trumpet · "MT TRUMPET"
const muted_trumpet = note(`<
  ~@5 A B C D E@2 ~ F ~@14 G F A B C D ~ H ~ I E@2 ~@4 G J ~@6 G F A B C D ~ H ~ F A B C D ~ K ~
>`.pickRestart({
  A: "~@12 bb4@4 a4 [g4,ab4] f4@6", B: "c5@3 ~", C: "~@18 bb4@2 c5 eb5 ~ d5", D: "~@2 f5 ~@2 bb4 ~@18",
  E: "[~@12 eb5@2 f5 ~@2 g5 ~@2 ab5 ~@2 bb5@8 ~ ab5 g5@2 ab5@12 ~]/2", F: "bb5@2 ab5 [db5,eb5,gb5] ~@20",
  G: "~@3 c5@20 ~", H: "~@3 ab4@5", I: "bb5 ~ bb5 ~@21", J: "eb5 ~ eb5 ~@21", K: "ab4 ~@8 ab4@15",
})).s("gm_muted_trumpet").gain(0.23).pan(0.9)

// other · muted trumpet · "MT TRUMPET" · soft notes
const muted_trumpet_soft = note("<~@12 A ~@15 A ~@23 A ~@7 A ~@7>".pickRestart({
  A: "~@3 bb4 [gb4,ab4] ~@19", // Gbsus2
})).s("gm_muted_trumpet").gain(0.12).pan(0.9)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  ~@4 A@2 B@2 C D E F G@2 H@2 I@2 J@2 K@2 L@2 M@2 N@2 A@2 B@2 C D E O P@2 H@2 I@2 Q@2 K@2 R@2 M@2 S@2 A@2 B@2 C D E T
  A@2 B@2 C D E U
>`.pickRestart({
  A: "[[eb4,f4]@15 bb3@2 ~ [bb3,eb4,g4]@3 [c4,d4,f4]@26 ~, bb3@7 ~@17]/2", // Ebsus2 Eb Dm7
  B: "[[ab3,c4,eb4,f4]@15 ab3@2 ~ f4@3 eb4@26 ~, ~@3 [ab3,c4]@5]/2", C: "[bb3,eb4,f4,g4]@11 ~",
  D: "~@5 f3@3, [c4,d4,f4]@11 ~", E: "[ab3,c4,eb4,f4]@23 ~", F: "~@3 eb5@5 ab4@4 bb4@11 ~, [ab3,bb3,eb4]@23 ~",
  G: "[[bb3,eb4,f4]@15 bb3@5 ~ [c4,d4,f4]@19 ~@2 [c4,d4,f4]@5 ~]/2", // Bbsus4 Dm7
  H: "[[ab3,db4,f4]@18 ~@3 [ab3,bb3,c4,eb4]@20 ~ [ab3,eb4]@2 [ab3,bb3,c4,eb4] ~@3, ~@42 bb3 ~@5]/2", // Db Ab Ab5 Ab
  I: "[[bb3,eb4,g4]@18 [bb3,eb4,g4] ~@2 [c4,d4,f4]@22 ~@5]/2", // Eb Dm7
  J: "[[ab3,db4,f4]@18 [ab3,db4,f4] ~@11 eb5@6 bb4@6 eb4@2 ~@4, ~@21 [ab3,db4]@23 ~@4, ~@7 eb4@7 ~@2]/2", // Db Db5
  K: "[[bb3,d4,eb4,g4]@19 ~@2 [bb3,c4,d4,f4]@20 bb3 f4 ~@2 g4@2 ~]/2", // Ebmaj7 Bb
  L: "[ab4@12 ab4@3 gb4@3 f4 ~@13 ab4 bb4@2 ab4 [bb4,eb5] ~ [ab4,bb4,eb5] ~@3 [ab4,bb4,eb5] ~ [ab4,bb4,eb5] ~@3, [c4,db4,f4]@18 ~@3 [ab3,c4,eb4]@14 ~ ab4@2 ~@10]/2", // Eb5 Absus2 Dbmaj7 Ab
  M: "[[g3,bb3,eb4]@11 g3 [bb3,eb4]@3 g3 ~@2 [eb4,g4]@2 ~@10 [bb4,d5]@6 f4@6 d4@5 ~, ~@12 g3 ~@5 bb3@14 ~@16, ~@21 [d4,f4]@12 ~@3 bb4 ~@5 f4 ~@5]/2", // Eb Eb5 Eb Bb Dm
  N: "[[c4,db4,f4,ab4]@17 ~@4 [ab3,c4,eb4]@22 ~@5]/2", // Dbmaj7 Ab
  O: "~@6 eb5@5 eb4 [ab4,c5]@3 [g4,bb4]@3 [f4,ab4]@3 [eb4,g4]@3, [ab3,bb3,eb4]@11 ~@13", // Ab Gm Fm Eb Absus2
  P: "[[bb3,d4,eb4,g4]@17 ~@4 [c4,d4,f4]@19 ~@2 [c4,d4,f4]@5 ~]/2", // Ebmaj7 Dm7
  Q: "[[ab3,db4,f4]@18 [ab3,db4,f4] ~@16 [bb5,eb6] ab5@3 ~ eb5 bb4 ab4@3 ~@3, ~@21 [ab3,db4,eb4]@23 ~@4]/2", // Db Eb5 Absus4
  R: "[[c4,db4,f4,ab4]@18 ~@14 ab4 bb4@2 ab4 [bb4,eb5] ~ [ab4,bb4,eb5] ~@3 [ab4,bb4,eb5] ~ [ab4,bb4,eb5] ~@3, ~@21 [ab3,c4,eb4]@14 ~ ab4@2 ~@10]/2", // Dbmaj7 Eb5 Absus2 Ab
  S: "[[c4,db4,f4,ab4]@17 ~@4 [ab3,c4,eb4]@9 ~@18]/2", T: "eb4@6 eb5@5 bb4 ab4@6 eb4@6",
  U: "[ab3,bb3,eb4]@3 ~@6 [eb5,c6]@6 [ab4,eb5]@2 ~@7", // Absus2 Cm Ab5
})).s("gm_epiano1").gain(0.45)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@4 A ~ A ~ A ~@19 A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3>".pickRestart({
  A: "[eb5,f5,bb5]", // Ebsus2
})).s("gm_string_ensemble_1").gain(0.02)

// other · synth drum
const synth_drum = note("c0 ~").s("gm_synth_drum").gain(0.52)

// drums · kick
const kick = s("bd").struct("<[x ~@4 x ~@2]!51 x [x ~@4 x ~@2]!7 x [x ~@4 x ~@2]!7 x>").gain(0.49)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!51 [~ x ~@2] [~ x ~ x]!7 ~ [~ x ~ x]!7 ~>").gain(0.49)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@3 A B ~ A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B
  ~@2 A B ~@2 A B
>`.pickRestart({
  A: "~@21 x!3", B: "x",
})).gain(0.16)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!48 [~ x!7] [x!8]!2 [x!3 ~ x ~ x ~] [x!8]!7 x [x!8]!7 x>").gain(0.33)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3
  A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@23 x", B: "~@11 x ~@12",
})).gain(0.27)

// drums · congas
const congas = s("conga:18").struct("<[~@11 x!3 ~@10]!51 ~ [~@11 x!3 ~@10]!7 ~ [~@11 x!3 ~@10]!7 ~>").gain(0.87)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct("<[~@7 x ~@4]!51 ~ [~@7 x ~@4]!7 ~ [~@7 x ~@4]!7 ~>").gain(0.35)

// drums · shaker
const shaker = s("sh").struct(`<
  [~@3 x ~@2 x ~@2 x ~@2 x!4 ~@8]!51
  [~ x!2 ~@5]
  [~@3 x ~@2 x ~@2 x ~@2 x!4 ~@8]!7
  ~
  [~@3 x ~@2 x ~@2 x ~@2 x!4 ~@8]!7
  ~
>`).gain(0.27)

// drums · lt
const lt = s("lt").struct("<[~@11 x!3 ~@10]!51 ~ [~@11 x!3 ~@10]!7 ~ [~@11 x!3 ~@10]!7 ~>").gain(0.27)

// drums · lt · soft notes
const lt_soft = s("lt").struct("<[~@7 x ~@4]!51 ~ [~@7 x ~@4]!7 ~ [~@7 x ~@4]!7 ~>").gain(0.11)

stack(
  bass, overdriven_guitar, lead_3_calliope, trumpet, trumpet_soft, muted_trumpet, muted_trumpet_soft, epiano1,
  string_ensemble_1, synth_drum, kick, snare, snare_soft, hihat, open_hat, congas, congas_soft, shaker, lt, lt_soft
)

More by TLC