Strudelify

Here I Go

2 Unlimited

KeyG minorTempo140 bpm
0:00/0:00
// Here I Go — 2 Unlimited
// 140 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 114 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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 · "A.PIANO 3"
const piano = note("<~@9 A B C D A B C D ~@97>".pickRestart({
  A: "~@2 [bb3,d4,g4] ~@2 [bb3,d4,g4] ~@2 [bb3,d4,g4] ~@2 [bb3,d4,g4] ~@2 [bb3,d4,g4] ~", // Gm
  B: "~@2 [a3,c4,f4] ~@2 [a3,c4,f4] ~@2 [a3,c4,f4] ~@2 [a3,c4,f4] ~@2 [a3,c4,f4] ~", // F
  C: "~@2 [c4,d4,f4,a4] ~@2 [c4,d4,f4,a4] ~@2 [c4,d4,f4,a4] ~@2 [c4,d4,f4,a4] ~@2 [c4,d4,f4,a4] ~", // Dm7
  D: "~@2 [bb3,eb4,g4] ~@2 [bb3,eb4,g4] ~@2 [bb3,eb4,g4] ~@2 [bb3,eb4,g4] ~@2 [bb3,eb4,g4] ~", // Eb
})).s("gm_piano").gain(0.35).pan(0.7)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@13 A B C D A@25 B C D A B C D A@8 ~@9 E@12 A@9 B C D A B C D A B C D A B C D A@8 ~@4
>`.pickRestart({
  A: "g1 ~@3 g1 ~@3 g1 ~@3 g1 ~@3", B: "f1 ~@3 f1 ~@3 f1 ~@3 f1 ~@3", C: "d1 ~@3 d1 ~@3 d1 ~@3 d1 ~@3",
  D: "eb1 ~@3 eb1 ~@3 eb1 ~@3 eb1 ~@3", E: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~",
})).s("gm_electric_bass_finger").gain(0.4).pan(0.7)

// bass · electric bass finger · "FINGERDBAS" · soft notes
const bass_soft = note(`<
  ~@13 A B C D A@25 B C D A B C D A@8 ~@21 A@9 B C D A B C D A B C D A B C D A@8 ~@4
>`.pickRestart({
  A: "~@2 g1 ~@3 g1 ~@3 g1 ~@3 g1 ~", B: "~@2 f1 ~@3 f1 ~@3 f1 ~@3 f1 ~", C: "~@2 d1 ~@3 d1 ~@3 d1 ~@3 d1 ~",
  D: "~@2 eb1 ~@3 eb1 ~@3 eb1 ~@3 eb1 ~",
})).s("gm_electric_bass_finger").gain(0.24).pan(0.7)

// bass · piano · "A.PIANO 1"
const bass_2 = note("<~@110 A@4>".pickRestart({
  A: "[g1@61 ~@3]/4",
})).s("gm_piano").gain(0.8)

// other · synth strings 1 · "+SYN STR 3"
const synth_strings_1 = note(`<
  ~ A B C D A B C D E F G H E I J K L@3 M L@3 M ~@8 A B C D A B C D E F G H E I J K N O N O N O N O ~@9 P@3 Q L@3 M L@3
  M A B C D A B C D E F G H E I J K E F G H E I J K N O N O N O N O R@4
>`.pickRestart({
  A: "[g3,bb3,d4]", B: "[f3,a3,c4]", C: "[f3,a3,d4]", D: "[eb3,g3,bb3,d4]", E: "[g2,g3,bb3,d4,g4]",
  F: "[f2,f3,a3,c4,f4]", G: "[d2,d3,a3,d4,f4]", H: "[eb2,eb3,g3,bb3,eb4]", I: "[f3,a3,c4,f4]", J: "[d3,a3,d4,f4,a4]",
  K: "[eb3,bb3,eb4,g4]", L: "~ g5 c6 g5 db6 g5 c6 g5", M: "~ g5 c6 g5 db6 c6 bb5 g5",
  N: "[g4,g5] ~ [g4,g5] [bb4,bb5] ~ [g4,g5] ~ [db5,db6]", O: "~ [db5,db6] ~ [c5,c6] ~ [c5,c6] ~ [bb4,bb5]",
  P: "~ g3 c4 g3 db4 g3 c4 g3", Q: "~ g3 c4 g3 db4 c4 bb3 g3", R: "[g1@61 ~@3, g2@13 ~@3]/4",
})).s("gm_synth_strings_1").gain(0.19).pan(0.1)

// other · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note(`<
  ~@17 A@3 B A@3 C ~@24 D E D E D E D E ~@9 F@3 G A@3 B A@3 B ~@24 D E D E D E D E ~@4
>`.pickRestart({
  A: "~ g3 c4 g3 db4 g3 c4 g3", B: "~ g3 c4 g3 db4 c4 bb3 g3", C: "~ g3 c4 g3 db4 c4!2 g3", D: "g3 ~ g3 bb3 ~ g3 ~ db4",
  E: "~ db4 ~ c4 ~ c4 ~ bb3", F: "~ g2 c3 g2 db3 g2 c3 g2", G: "~ g2 c3 g2 db3 c3 bb2 g2",
})).s("gm_synth_brass_1").gain(0.29).pan(0.7)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@17 A B@3 A B@3 ~@8 A B@3 A B@3 ~@8 A B@3 A B@3 ~@4 A B@3 ~@5 A B@3 A B@3 A B@3 A B@3 ~@16 A B@3 A B@3 ~@4
>`.pickRestart({
  A: "g2 ~ g2 ~@2 g2 f2 ~ g2 ~ g2 ~@2 g2 f2 ~", B: "g2 ~ g2 ~@2 g2 f2 ~ g2 ~@2 g2 ~ g2 f2 ~",
})).s("gm_lead_2_sawtooth").gain(0.28).pan(0.6)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth_2 = note(`<
  ~@17 A@25 B C D A B C D A@8 ~@13 A@8 ~@8 A B C D A B C D A B C D A B C D A@8 ~@4
>`.pickRestart({
  A: "g3 g2!2 g3!2 g2!2 g3!2 g2!2 g3!2 g2!2 g3", B: "f3 f2!2 f3!2 f2!2 f3!2 f2!2 f3!2 f2!2 f3",
  C: "d3 d2!2 d3!2 d2!2 d3!2 d2!2 d3!2 d2!2 d3", D: "eb3 eb2!2 eb3!2 eb2!2 eb3!2 eb2!2 eb3!2 eb2!2 eb3",
})).s("gm_lead_2_sawtooth").gain(0.46).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~@17 [x!4]!36 ~@4 [x!4]!8 ~@5 [x!4]!40 x ~@3>").gain(0.8)

// drums · rim
const rim = s("rim").struct("<~@57 [~ x ~@3 x ~@2]!8 ~@49>").gain(0.8)

// drums · snare
const snare = s("sd").struct("<~@15 A B C@6 D B C@28 E@2 F B ~@13 C@3 G C B@3 C@28 E@2 F B ~@4>".pickRestart({
  A: "~@5 x!11", B: "x!16", C: "~ x ~ x", D: "~@4 x!12", E: "x ~ x ~ x ~ x!2 ~ x!4 ~ x ~",
  F: "x ~ x ~ x ~ x!2 ~ x!4 ~ x!2", G: "~ x!3",
})).gain(0.32)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@15 A ~ B@6 C B@33 ~@17 D ~@3 B@32 ~@4>".pickRestart({
  A: "x!5 ~@11", B: "~ x ~@5 x ~ x ~@5 x", C: "x!5 ~@2 x ~ x ~@5 x", D: "x!4 ~ x!7 ~ x!3",
})).gain(0.08)

// drums · clap
const clap = s("cp").struct("<~@17 A@8 B@24 A@8 C@8 ~@5 A@8 B@24 A@8 ~@4>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@2 x ~@4 x ~@3", C: "~@2 x!2 ~@2 x ~",
})).gain(0.56)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@9
  [x!2 ~ x!3 ~ x!3 ~ x!3 ~ x]!56
  ~@5
  [~@3 x ~@3 x ~@3 x ~@3 x]!8
  [x!2 ~ x!3 ~ x!3 ~ x!3 ~ x]!32
  ~@4
>`).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@9 [~ x ~ x ~ x ~ x]!56 ~@5 [~ x ~ x ~ x ~ x]!40 ~@4>").gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@9 A@8 ~@32 B ~@2 C B ~@2 C ~@4 B ~@40 B ~@2 C B ~@2 C B ~@3>".pickRestart({
  A: "x!4", B: "x", C: "~@5 x ~ x",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@9 [~ x ~ x ~ x ~ x]!4 [x!16]!20 ~@8 [x!16]!24 ~@21 [x!16]!24 ~@4>").gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<A ~@7 B ~@5 A ~ B ~@5 A ~@41 C ~@49>".pickRestart({
  A: "~@3 x ~@4", B: "~@7 x ~@8", C: "~@7 x",
})).gain(4.06)

// drums · shaker
const shaker = s("sh").struct("<A B@3 ~@10 A B@2 C@5 D B@2 C@40 ~@13 C@32 ~@4>".pickRestart({
  A: "~@8 x!8", B: "x!16", C: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", D: "x ~ x!3 ~ x!10",
})).gain(0.4)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<A ~@13 A ~@2 B@5 A B@42 ~@13 B@32 ~@4>".pickRestart({
  A: "x!8 ~@8", B: "~ x ~@14",
})).gain(0.08)

stack(
  piano, bass, bass_soft, bass_2, synth_strings_1, synth_brass_1, lead_2_sawtooth, lead_2_sawtooth_2, kick, rim, snare,
  snare_soft, clap, hihat, open_hat, crash, tambourine, cabasa, shaker, shaker_soft
)

More by 2 Unlimited