Strudelify

Jesus Freak (Reprais)

dc Talk

KeyF minorTempo104 bpm
0:00/0:00
// Jesus Freak (Reprais) — dc Talk
// 104 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 125 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(104/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 · acoustic guitar nylon · "Acoustic Guitar" · E5 G5 A5 B5 E5 G5 A5 B5
const acoustic_guitar_nylon = note(`<
  [[e2,b2] ~ [e2,b2] ~ [e2,b2] ~ [e2,b2] ~]
  [[e2,b2]!3 [g2,d3]!4 [a2,e3]]
  [[a2,e3]!3 [b2,gb3]!5]
  [[e2,b2]!3 [g2,d3]!4 [a2,e3]]
  [[a2,e3]!3 [b2,gb3]!5]
  ~@120
>`).s("gm_acoustic_guitar_nylon").gain(0.1)

// bass · electric bass finger · "Fretted Electric Bass"
const bass = note(`<
  ~@5 A B A B A B A B C D E@2 C D E@2 F G F G F G F H A I A I A I A I ~@4 C D E@2 C D E@2 F G F G F G F H A I A I A I A
  I A I A I A I A I A J ~@4 K@2 L@2 K@2 L@2 K@2 L@2 ~ M N M O M N M P A I A I A I A I A I A I A I A I A I A I A I A I ~
>`.pickRestart({
  A: "f1!3 ab1!4 eb2", B: "eb2 d2!2 c2!5", C: "c3 d3 f3 ab3@5", D: "g3", E: "[c3 d3 f3 ab3@8 d3@5]/2",
  F: "f2!3 db2!4 bb1", G: "bb1!5 eb2!3", H: "bb1!3 db2!2 bb1!3", I: "eb2 bb1!2 c2!5", J: "eb2 bb1!2 c2 c2@4",
  K: "[f3 c3 f3 g3@2 ab3@11]/2", L: "[~ c3 d3 g3@2 f3@2 f3@9]/2", M: "db2!3 ab1!5", N: "ab1!5 bb1 ab1 f1",
  O: "ab1!4 ab2 d2 ab2 d2", P: "ab1!4 ab2!4",
})).s("gm_electric_bass_finger").gain(0.47)

// bass · acoustic bass · "Standup Fretless Bass"
const bass_2 = note("<~@37 A B C D ~@34 A B A B A B A B A C A B A B A B ~@34>".pickRestart({
  A: "f2 ~@5 bb2@2 ~@2 ab2@2 ~@2 eb2 ~", B: "f2 ~@2 bb2 ~ ab2 ~ eb2", C: "f2@2 ~@4 bb2@2 ~@2 ab2@2 ~@2 eb2 ~",
  D: "f2 ~@7",
})).s("gm_acoustic_bass").gain(0.35)

// chords · overdriven guitar · "Rhythm Guitar - Stereo"
const overdriven_guitar = note(`<
  ~@5 A B A B A B A B ~@16 C D C D C D C D E@4 ~@16 C D C D C D C D C D C D C D C D C F@5 ~@13 G H G I G H G I C D C D C
  D C D C D C D C D C D C D C D C D C D J
>`.pickRestart({
  A: "[f2,c3]!3 [ab2,eb3]!4 eb3", B: "eb3 d3!2 c3!5", C: "[f2,c3]!3 [ab2,eb3]!4 [eb3,bb3]",
  D: "[eb3,bb3] [bb2,f3]!2 [c3,g3]!5", E: "[f2,c3]/4", F: "[[eb3,bb3] [bb2,f3]!2 [c3,g3] [c3,g3]@36]/5",
  G: "db3!3 ab2!5", H: "ab2!5 bb2 ab2 f2", I: "ab2!4 ab3 d3 ab3 d3", J: "[f2,c3]@2 [f2,c3]@2 [f2,c3]@2 [ab2,eb3]@3 ~@7",
})).s("gm_overdriven_guitar").gain(0.31)

// other · distortion guitar · "Lead Guitar - Stereo"
const distortion_guitar = note("<~@92 A B A B A B A B ~@25>".pickRestart({
  A: "db4!3 ab3!4 db5", B: "ab4!3 ab5 d5!3 ab4",
})).s("gm_distortion_guitar").gain(0.4)

// other · distortion guitar · "Rap Guitar - Right"
const distortion_guitar_2 = note(`<
  ~@21
  [f4 ~ f4 ~ f4 ~ f4 ~]!7
  [f4 ~ f4 ~ f4@2 f4 ~]
  ~@20
  [f4 ~ f4 ~ f4 ~ f4 ~]!7
  [f4 ~ f4 ~ f4@2 f4 ~]
  ~@68
>`).s("gm_distortion_guitar").gain(0.24).pan(1)

// chords · drawbar organ · "Crunchy Organ"
const drawbar_organ = note(`<
  ~@8 A ~@3 A B C B C B C B C ~@11 A ~@3 A ~@4 B C B C B C B C ~@11 A ~@3 A ~@3 A ~@3 A ~@30 A ~@3 A ~@3 A ~@3 A ~@3 A
  ~@3 A ~
>`.pickRestart({
  A: "[f4,f5]@4 [ab4,ab5]@2 [f4,f5]@2 [c5,eb5,c6,eb6] ~ [c5,eb5,c6,eb6] ~@5, [c4,c5]@7 ~@9", // F Ab F Cm C
  B: "[ab4,ab5] ~ [ab4,ab5] ~ [f4,f5] ~ [f4,f5] ~, [f1,f2] [db1,db2]", C: "[d4,d5] ~ [d4,d5] ~@5, [bb0,bb1]",
})).s("gm_drawbar_organ").gain(0.32)

// chords · epiano2 · "Electric Keys"
const epiano2 = note("<~@37 A@4 ~@36 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@34>".pickRestart({
  A: "[~@3 d5@5, ~@3 ab5@13, ~@5 g5@11]/2",
})).s("gm_epiano2").gain(0.27)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A B@9 C B C B C B D B@7 E B@11 F B C B C B C B D B@7 G B@17 H ~@12 I@4 ~ I B@2 D I B@2 J B@16 K@8 ~
>`.pickRestart({
  A: "~@7 x ~ x ~ x ~ x ~@2", B: "x!2 ~@2 x!2 ~@2", C: "x!2 ~@2 x ~ x ~", D: "x!2 ~ x ~ x ~ x", E: "x ~@10 x ~@4",
  F: "x!2 ~@2 x ~@3", G: "x ~ x ~ x ~ x ~@2 x ~ x ~@4", H: "x", I: "x ~@3 x!2 ~@2",
  J: "x ~ x ~ x ~ x ~@2 x ~ x ~ x ~@2", K: "x!8",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A B@8 C D C D C D C E C F C F C F C G B@8 C@3 H C D C D C D C E C F C F C F C I B@17 J ~@12 C@4 ~ C K C L C K C I
  B@16 M@7 N ~
>`.pickRestart({
  A: "~@2 x!2", B: "~@4 x ~@2 x ~@4 x ~@3", C: "~ x ~ x", D: "~@2 x ~@2 x ~ x", E: "~ x!3", F: "~@4 x ~@4 x ~@2 x ~@3",
  G: "~@4 x!7 ~ x ~@3", H: "~ x ~@2", I: "x!9 ~@3 x ~@3", J: "~ x!4 ~@3", K: "~ x ~@2 x ~@2 x ~ x ~@2 x ~@3",
  L: "~ x ~@2 x ~@3 x ~@3 x ~@3", M: "x!4", N: "x ~ x ~ x ~ x!2",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<~@13 A@7 B ~@16 C A@2 D A@7 B ~@76>".pickRestart({
  A: "x!8", B: "x!3 ~@5", C: "~ x!7", D: "x!5 ~@3",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@12 [~@7 x] ~@27 [~@7 x] ~@84>").gain(0.48)

// drums · ride
const ride = s("rd").struct("<~@37 A B A C ~@38 A B A B A B A B A@4 ~@34>".pickRestart({
  A: "x ~ x!3 ~ x!2", B: "x ~ x!3 ~ x ~", C: "x ~ x!3 ~@3",
})).gain(0.48)

// drums · splash
const splash = s("cr").struct("<~@5 A@7 B ~@8 A@7 C A@8 C ~@11 A@7 ~ A@17 D ~@17 A@3 E A@3 ~ A@24 ~>".pickRestart({
  A: "x!8", B: "x!7 ~", C: "x", D: "x!5 ~@3", E: "x!4 ~@4",
})).gain(0.48)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@77 [x!8]!14 ~@34>").gain(2.43)

// drums · woodblocks
const woodblocks = s("woodblock:4").struct("<~@37 [x!4]!3 [x!3 ~] ~@84>").gain(0.7)

stack(
  acoustic_guitar_nylon, bass, bass_2, overdriven_guitar, distortion_guitar, distortion_guitar_2, drawbar_organ,
  epiano2, kick, snare, hihat, open_hat, ride, splash, cabasa, woodblocks
)