Strudelify

The Night Train

Kadoc

KeyA♭ majorTempo140 bpm
0:00/0:00
// The Night Train — Kadoc
// 140 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 1 "A.PIANO 1" piano (copy of ch 2 "SYN BASS 2" synth bass 2); ch 7 "TRUMPET" trumpet (copy of ch 6 "+BRASS 2" brass section); ch 14 "VOICE OOHS" voice oohs (copy of ch 13 "CHOIR AAHS" choir aahs)
// note: Full arrangement: all 112 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.

// bass · synth bass 2 · "SYN BASS 2"
const bass = note("<~@22 A@23 B C A@14 B D ~@3 D ~@3 D ~@3 D E@2 B C A@14 B F ~@6 B C@3 B C@3 B@2 F>".pickRestart({
  A: "ab1 ~ ab1 ~ eb1!2 gb1 eb1 ab1 ~ ab1 ~ eb1!2 gb1 eb1", B: "ab1 ~ ab1 ~ ab1 ~@3",
  C: "c1@2 ~@2 eb1!2 gb1 eb1 ab1 ~ ab1 ~ eb1!2 gb1 eb1", D: "db1@3 ~@13", E: "db1@3 ~ db1@3 ~ db1@3 ~ db1@3 ~",
  F: "c1 ~@7",
})).s("gm_synth_bass_2").gain(0.43)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@62 A@5 ~@45>".pickRestart({
  A: "db7/5",
})).s("gm_string_ensemble_1").gain(0.28)

// other · tubular bells · "+CHRCHBELL"
const tubular_bells = note(`<
  ~@16
  [~ f5 ~ f5 ~ f5 ~ f5]!29
  ~@25
  [~ f5 ~ f5 ~ f5 ~ f5]!7
  ~
  [~ f5 ~ f5 ~ f5 ~ f5]!15
  ~@19
>`).s("gm_tubular_bells").gain(0.52)

// chords · brass section · "+BRASS 2"
const brass_section = note("<~@21 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@70>".pickRestart({
  A: "[eb4,gb4]@15 ~", // Ebm
})).s("gm_brass_section").gain(0.62)

// chords · orchestra hit · "ORCH.HIT"
const orchestra_hit = note(`<
  ~@30 A ~@3 A ~@3 A ~@3 A ~@2 B C ~@3 A ~@3 A ~@3 A ~@2 B D ~@3 D ~@3 D ~@3 D E F B C ~@3 A ~@3 A ~@3 A ~@2 B C ~@6 B
  C@3 B C@3 B@2 C
>`.pickRestart({
  A: "[db3,db4] ~@15", B: "[ab3,b3,ab4] ~@3 [ab3,b3,ab4] ~@3 [ab3,b3,ab4] ~@7", C: "[db3,db4,e5] ~@15",
  D: "[db3,db4,db5] ~@15", E: "[db3,db4,db5] ~@3 [db3,db4,db5] ~@3 [db3,db4,db5] ~@3 [db3,db4,db5] ~@3",
  F: "[db3,db4,db5] ~ [db3,db4,db5] ~ [db3,db4,db5] ~ [db3,db4,db5] ~ [db3,db4,db5] ~ [db3,db4,db5] ~ [db3,db4,db5] ~ [db3,db4,db5] ~", // Db
})).s("gm_orchestra_hit").gain(0.66)

// chords · synth drum · "+808 TOM"
const synth_drum = note("<A@16 ~@6 B@16 C@8 B@8 C@8 ~@16 B@8 C@8 A@7 ~ D@8 ~@2>".pickRestart({
  A: "~@14 d6 ~",
  B: "[~@7 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6, ~@4 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~, ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2]/8",
  C: "[~@7 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@15, ~@4 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@17, ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@16]/8",
  D: "[~@7 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@6 c6@2 ~@15, ~@4 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@17, ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@5 g5@2 ~@5 d5@2 d6@2 ~@16]/4",
})).s("gm_synth_drum").gain(0.43).pan(0.6)

// drums · rim
const rim = s("rim").struct("<~@45 A ~@15 A ~@7 A ~@3 A ~@3 A ~@15 A ~@7 A ~@3 A ~@3 A@2 ~>".pickRestart({
  A: "~@3 x",
})).gain(0.39)

// drums · clap
const clap = s("cp").struct("<~@8 A@8 ~@6 A@23 ~ A@15 ~@17 A@15 ~ A@7 ~ A@3 ~ A@3 ~@3>".pickRestart({
  A: "~ x ~ x",
})).gain(0.7)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@22 [~@3 x ~@7 x ~@4]!23 ~@67>").gain(0.31)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@5 A@3 ~ A@3 ~ A@3 ~@6 B@23 ~ B@15 ~@5 C@9 ~@3 B@15 ~ D@7 ~ B@3 ~ B@3 ~@3
>`.pickRestart({
  A: "x", B: "x!16", C: "~ x ~ x ~ x ~ x", D: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2",
})).gain(0.62)

// drums · low tom
const low_tom = s("lt").struct("<~@45 A ~@15 A ~@3 A ~@3 A ~@3 A ~@3 A ~@15 A ~@7 A ~@3 A ~@3 A@2 ~>".pickRestart({
  A: "~@15 x",
})).gain(0.54)

// drums · open hat
const open_hat = s("oh").struct("<~@94 [~ x ~ x ~ x ~ x]!7 ~@11>").gain(0.47)

// drums · mid tom
const mid_tom = s("mt").struct("<~@12 A@33 B A@15 B ~@3 B ~@3 B ~@3 B ~@3 B A@15 B A@7 B A@3 B A@3 B@2 ~>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "~@13 x ~@2",
})).gain(0.54)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A B@3 A B@3 A B@3 C ~ C ~@3 A B@7 A B@3 A B@3 A B@3 A B@2 D A B@3 A B@3 A B@3 A B@2 D C ~@3 C ~@3 C ~@3 C E F D A
  B@3 A B@3 A B@3 A B@2 D A B@6 D A@3 D A@3 D@2 C
>`.pickRestart({
  A: "x!2 ~ x ~ x ~ x", B: "~ x ~ x ~ x ~ x", C: "x", D: "x!3 ~", E: "x!4", F: "x!8",
})).gain(0.54)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@12 A B A B A B A B A C A B A B A B A B A B A B A B A B A B A B A B A D A B A B A B A B A B A B A B A D ~@3 D ~@3 D
  ~@3 D ~@3 D A B A B A B A B A B A B A B A D A B A B A B A D A@3 D A@3 D@2 ~
>`.pickRestart({
  A: "~@3 x!2 ~@6 x!2 ~@3", B: "~@3 x!2 ~@6 x!3 ~@2", C: "~@3 x!2 ~@5 x!4 ~@2", D: "~@10 x!3 ~@3",
})).gain(0.54)

// drums · ride
const ride = s("rd").struct("<A@16 ~@6 A@23 B A@15 B ~@13 A C B A@15 B A@7 B A@3 B A@3 B@2 D>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x!8", D: "x",
})).gain(0.78)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@5 A@3 ~ A@3 ~ A@3 ~@50 B@9 ~@37>".pickRestart({
  A: "x", B: "~ x ~ x ~ x ~ x",
})).gain(2.75)

// drums · whistle
const whistle = s("ballwhistle:0").struct("<~@69 A ~@3 A@4 ~@2 A ~@3 A ~@3 A ~@3 A ~@20>".pickRestart({
  A: "~@2 x!2",
})).gain(0.81)

// drums · shaker
const shaker = s("sh").struct("<~@18 A@4 ~@41 A@3 ~ B A@2 ~ B A@2 ~@38>".pickRestart({
  A: "x!16", B: "~@5 x!11",
})).gain(0.39)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@66 [x!16] [x!5 ~@11] ~@2 [x!16] [x!5 ~@11] ~@40>").gain(0.16)

stack(
  bass, string_ensemble_1, tubular_bells, brass_section, orchestra_hit, synth_drum, rim, clap, clap_soft, hihat,
  low_tom, open_hat, mid_tom, crash, high_tom, ride, cabasa, whistle, shaker, shaker_soft
)