Strudelify

True Faith

New Order

KeyF majorTempo122 bpm
0:00/0:00
// True Faith — New Order
// 122 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 7 "string hook" synth strings 1 (copy of ch 4 "synth brass hook" synth brass 1)
// note: Full arrangement: all 166 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(122/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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.

// other · synth strings 2 · "strings"
const synth_strings_2 = note(`<
  ~@6 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@3 D@2 E@2 D@2 E@2 F@2 G@2 F@2 G@2 A@2 B@2 A@2 B@2 A@2 C@3 ~ D@2 E@2 D@2 E@2 F@2 G@2
  F@2 G@2 A@2 B@2 A@2 B@2 A@2 C@3 H@8 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@3 D@2 E@2 D@2 E@2 F@2 G@2 F@2 G@2 A@2 B@2 A@2 B@2
  A@2 C@3 ~@8 A@2 B@2 A@2 B@2 A@2 C@3 ~@9
>`.pickRestart({
  A: "[d3@7 f3@9]/2", B: "[c3@7 g2@9]/2", C: "[c3@7 bb2@17]/3", D: "[d3@7 bb2@9]/2", E: "[c3@7 a2@9]/2",
  F: "[d3@7 c3@9]/2", G: "[bb2@7 a2@9]/2", H: "[d3@7 e3@9]/2",
})).s("gm_synth_strings_2").gain(0.3).pan(0.8)

// bass · synth bass 1 · "synth bass"
const bass = note(`<
  ~@6 A B C D A B C D A B C D A B C E F G E C E G E C F A C E H A C E I A B C D A B C D A B C E J ~ G E C E G E C F A C
  E H A C E I A B C D A B C D A B C E J A K A K A K A K A B C D A B C D A B C D A B C E F G E C E G E C F A C E H A C E
  I A B C D A B C D A B C E J ~@8 A B C D A B C D A B C E J ~@9
>`.pickRestart({
  A: "~ d2!2 ~@3 d2 ~@3 d2!2 ~ d2 ~@2", B: "~ f2!2 ~@3 f2 ~@3 f2!2 ~ f2 ~ f2", C: "~ c2!2 ~@3 c2 ~@3 c2!2 ~ c2 ~ c2",
  D: "~ g1!2 ~@3 g1 ~@3 g1!2 ~ g1 ~ d2", E: "~ bb1!2 ~@3 bb1 ~@3 bb1!2 ~ bb1 ~ bb1",
  F: "~ bb1!2 ~@3 bb1 ~@3 bb1 d2 e2 gb2 e2 c2", G: "~ d2!2 ~@3 d2 ~@3 d2!2 ~ d2 ~ d2",
  H: "~ a1!2 ~@3 a1 ~@3 a1!2 ~ a1 ~ d2", I: "~ a1!2 ~@3 a1 ~@3 a1 d2 e2 gb2 e2 c2",
  J: "~ bb1!2 ~@3 bb1 ~@3 bb1!2 ~ bb1 ~@2", K: "~ e2!2 ~@3 e2 ~@3 e2!2 ~ e2 ~ e2",
})).s("gm_synth_bass_1").gain(0.35)

// other · synth brass 1 · "synth brass hook"
const synth_brass_1 = note("<~@14 A B C@2 D@2 E@2 F ~@75 B G H@2 I@2 J@2 F ~@59>".pickRestart({
  A: "g4 a4@4 ~ g4@2 a4@2 g4 a4@4 ~", B: "g4 a4@4 ~ g4@2 a4@2 g4 a4@5", C: "[g4 a4@4 ~ g4@2 a4 ~ f4@4 d4@17 ~]/2",
  D: "[d4@5 ~ e4@4 f4@3 ~ c5@15 ~ g4@2]/2", E: "[g4 ~ f4@4 e4@3 ~ f4@4 d4@9 ~ e4@7 ~]/2", F: "f4@15 ~",
  G: "g4 a4@5 g4@2 a4@2 g4 a4@4 ~", H: "[g4 a4@5 g4@2 a4@2 f4@3 ~ d4@17 ~]/2", I: "[d4@5 ~ e4@3 ~ f4@4 c5@15 ~ g4 ~]/2",
  J: "[g4@2 f4@3 ~ e4@4 f4@3 ~ d4@9 ~ e4@7 ~]/2",
})).s("gm_synth_brass_1").gain(0.35).pan(0.4)

// drums · kick
const kick = s("bd").struct("<[x!4]!2 [x ~@3 x ~@3 x ~@3 x!4] [x!4] [x ~@3 x ~@3 x ~@3 x!4] [x!4]!84 [x!8] [x!4]!76>")
  .gain(0.3)

// drums · snare
const snare = s("sd").struct("<~@2 A@3 B C@16 D C@15 D C@29 D C@13 A@7 E C@16 F C@15 D C@43>".pickRestart({
  A: "~@4 x!2 ~ x ~@4 x ~@3", B: "~ x ~ x!2 ~@4 x ~ x!4 ~", C: "~ x ~ x", D: "~@4 x ~@3 x ~ x!2 ~ x ~@2", E: "x!4",
  F: "~@4 x ~@3 x ~ x!2 ~ x!2 ~",
})).gain(0.35)

// drums · clap
const clap = s("cp").struct("<~@136 A B A B A B A B ~@22>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~",
})).gain(0.05)

// drums · hihat
const hihat = s("hh").struct("<~@2 [x!4]!134 ~@8 [x!4]!22>").gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~ x ~ x ~ x ~ x]!133 [~ x ~ x ~ x ~@2] ~@8 [~ x ~ x ~ x ~ x]!22>").gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~@6 A ~@7 A ~@3 A ~@4 A ~@15 A ~@13 A ~@15 A ~@28 A ~@3 A ~@4 A ~@15 A ~@11 B ~@30
>`.pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.4)

stack(synth_strings_2, bass, synth_brass_1, kick, snare, clap, hihat, open_hat, crash)

More by New Order