Strudelify

Thong Song

Sisqo

KeyD♭ majorTempo120 bpm
0:00/0:00
// Thong Song — Sisqo
// 120 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 112 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · violin · "Staff-1"
const violin = note(`<
  A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B
  C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C ~@4 D@2 E F D@2 E F D@2 E F D@2 E F D@2 E F D@2 E F D@2 E F
>`.pickRestart({
  A: "[[a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4,gb4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~ [a3,db4] ~, ~@4 a4@6 db5@2 gb5 e5 eb5 db5]/2", // A Gbm A
  B: "[ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~, eb5@2 db5 ab4@5", // Db5
  C: "[ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~ [ab3,db4] ~", // Db5
  D: "[[bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4,g4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~, ~@8 bb4@11 ~ d5@2 ~@2 g5@2 f5@2 e5@2 d5@2]/2", // Bb Gm Bb
  E: "[a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~, e5@2 d5 a4@5", // D5
  F: "[a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~ [a3,d4] ~", // D5
})).s("gm_violin").gain(0.72)

// chords · cello · "Staff-3"
const cello = note(`<
  A@2 B@2 A@2 C@2 A@2 B@2 A@2 C@2 A@2 B@2 A@2 C@2 A@2 B@2 A@2 C@2 A@2 B@2 A@2 C@2 A@2 B@2 A@2 C@2 A@2 B@2 A@2 C@2 A@2
  B@2 A@2 C@2 A@2 B@2 A@2 C@2 A@2 B@2 A@2 C@2 ~@4 D@2 E@2 D@2 E@2 D@2 E@2 D@2 E@2 D@2 E@2 D@2 E@2 D@2 E@2
>`.pickRestart({
  A: "[a2@31 ~]/2", B: "[~@4 ab3 gb3 e3 eb3, db3@31 ~]/2", C: "[~@4 ab3 gb3 e3 eb3, db2@31 ~]/2", D: "[bb2@31 ~]/2",
  E: "[~@4 a3 g3 f3 e3, d2@31 ~]/2",
})).s("gm_cello").gain(0.72)

// bass · electric bass finger · "Staff-8"
const bass = note(`<
  ~@8 A B C D A B C D A B C D A B C E F G C D F G C D A B C D A B C D A B C D A B C E F G C D F G C D F G C D F G C D
  ~@20 H I J K H I J K H I J K H I J K H I J K H I J K H I J K
>`.pickRestart({
  A: "a1 ~@6 a1", B: "a1@2 ~@10 b1@3 ~", C: "db2 ~@6 db2", D: "db2@2 ~@10 b1@3 ~", E: "db2 ~@7", F: "gb2 ~@6 gb2",
  G: "gb2@2 ~@10 b1@3 ~", H: "g2 ~@6 g2", I: "g2@2 ~@10 c2@3 ~", J: "d2 ~@6 d2", K: "d2@2 ~@10 c2@3 ~",
})).s("gm_electric_bass_finger").gain(0.72)

// chords · string ensemble 1 · "Staff-9"
const string_ensemble_1 = note(`<
  ~@24 A B C D A B C D ~@16 A B C D A B C D A B C D A B C D ~@20 E F G H E F G H E F G H E F G H E F G H E F G H E F G H
>`.pickRestart({
  A: "[a2,db3,gb3]@2 ~@6 db3!4 ~@2 [a2,db3,gb3]@2", B: "[a2,db3,gb3] ~@7",
  C: "[ab2,db3,e3]@2 ~@6 db3!4 ~@2 [ab2,db3,e3]@2", D: "[ab2,db3,e3] ~@7",
  E: "[bb2,d3,g3]@2 ~@6 d3!4 ~@2 [bb2,d3,g3]@2", F: "[bb2,d3,g3] ~@7", G: "[a2,d3,f3]@2 ~@6 d3!4 ~@2 [a2,d3,f3]@2",
  H: "[a2,d3,f3] ~@7", // Dm
})).s("gm_string_ensemble_1").gain(0.72)

// chords · pizzicato strings · "Staff-10"
const pizzicato_strings = note(`<
  ~@24 A B C D A B C D ~@16 A B C D A B C D A B C D A B C D ~@20 E F G H E F G H E F G H E F G H E F G H E F G H E F G H
>`.pickRestart({
  A: "[a2,db3,gb3] ~@6 [a2,db3,gb3]", B: "[a2,db3,gb3] ~@7", C: "[ab2,db3,e3] ~@6 [ab2,db3,e3]", D: "[ab2,db3,e3] ~@7",
  E: "[bb2,d3,g3] ~@6 [bb2,d3,g3]", F: "[bb2,d3,g3] ~@7", G: "[a2,d3,f3] ~@6 [a2,d3,f3]", H: "[a2,d3,f3] ~@7",
})).s("gm_pizzicato_strings").gain(0.72)

// other · string ensemble 2 · "Staff-11"
const string_ensemble_2 = note("<~@80 [db2 eb2] [e2 ab2] [eb3 e3] [ab3 a3] ~@28>").s("gm_string_ensemble_2").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 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
  C@20 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 ~@2 x ~@2 x ~", B: "x ~@2 x!2 ~@3", C: "x ~ x ~ x ~ x!2",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 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 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: "~@3 x ~@6 x ~@5", B: "~@3 x ~@8 x ~@3",
})).gain(0.72)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@6 A ~ 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 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: "~@2 x ~@2 x ~@2 x!4 ~@4", B: "~@2 x ~@2 x ~@2 x ~@2 x ~@4",
})).gain(0.72)

stack(violin, cello, bass, string_ensemble_1, pizzicato_strings, string_ensemble_2, kick, snare, shaker)