Strudelify

The Metro

Berlin

KeyB minorTempo160 bpm
0:00/0:00
// The Metro — Berlin
// 160 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 166 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(160/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · overdriven guitar
const overdriven_guitar = note(`<
  ~@26 A B C D A B E@2 A B C D A F G@2 H@3 ~ I@3 ~@17 A B C D A B E@2 A B C D A F G@2 J@4 K@6 L M L M L N O ~ A B C D A
  B E@2 A B C D A F G@2 ~@24 A B C D A B E@2 A B C D A F G@2 H@3 ~ H@3 ~@3
>`.pickRestart({
  A: "[a3,e4,a4,c#5,e5]@15 ~", B: "[b3,f#4,b4,d#5,f#5]@15 ~", C: "[g3,d4,g4,b4,d5]@15 ~", D: "[d4,a4,d5,f#5,a5]@15 ~",
  E: "[[g3,d4,g4,b4,d5]@31 ~]/2", F: "[b3,f#4,b4,d#5,f#5]@7 ~ [g3,d4,g4,b4,d5]@3 ~ [a3,e4,a4,c#5,e5]@3 ~",
  G: "[[b3,f#4,b4,d#5,f#5]@31 ~]/2", H: "[a5 b5@47]/3", I: "[b5@47 ~]/3", J: "[b5@23 ~@9]/2", K: "[b5@31 ~]/2",
  L: "b5@7 ~ f#4@7 ~", M: "a5@3 ~ e4@3 ~ f#5@3 ~ b3@3 ~", N: "f#6@3 ~ e6@3 ~ c#6@3 ~ a4@3 ~", O: "b5@15 ~",
})).s("gm_overdriven_guitar").gain(0.14)

// other · synth strings 1
const synth_strings_1 = note(`<
  A B ~@18 C D ~@20 E F G@2 H I J ~@11 C D ~@20 K L M@2 N@2 O@2 N@2 P Q P Q P R N@2 ~@16 E F G@2 H I G@2 ~@10 C S ~@3 T
  ~@16 E F G@2 H I J ~ U V
>`.pickRestart({
  A: "b6 f#6 b6 f#6 a#6 f#6 a#6 f#6", B: "[a6,b6] e6 a6 e6 g#6 d#6 g#6 d#6", C: "g5@3 ~ f#5@3 ~ g5@3 ~ f#5@3 ~",
  D: "g5@3 ~ f#5@3 ~ d5@3 ~@5", E: "b5@3 ~ f#5@3 ~ g5@3 ~ e5@3 ~", F: "f#5@3 ~ d5@3 ~ e5@3 ~ c#5@3 ~", G: "[b4@31 ~]/2",
  H: "a5 b5@3 f#5@3 ~ g5@3 ~ e5@3 ~", I: "[f#5,b5]@3 ~ d5@3 ~ e5@3 ~ c#5@3 ~", J: "[b4,b5]@15 ~",
  K: "b5@3 ~ f#5@3 ~ a#5@3 ~ f5@3 ~", L: "a5@3 ~ e5@3 ~ g5@3 ~ b4@3 ~", M: "[b5@23 ~ a5@7 ~]/2", N: "[b5@31 ~]/2",
  O: "[b5@27 ~ e6@3 ~]/2", P: "b5@7 ~ f#5@7 ~", Q: "g5@3 ~ e5@3 ~ f#5@3 ~ g5@3 ~", R: "f#6@3 ~ e6@3 ~ c#6@3 ~ d6@3 ~",
  S: "g5@3 ~ f#5@3 ~@9", T: "g5@7 ~ f#5@7 ~", U: "b5@3 ~ f#5@3 ~ b5@3 ~ f#5@3 ~", V: "a#5@3 ~ f5@3 ~ a#5@3 ~ f5@3 ~",
})).s("gm_synth_strings_1").gain(0.72)

// bass · electric guitar jazz
const bass = note(`<
  ~@2 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 D E F C D E@2 C D E F C G D@2 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 D E F C D E@2 C D E F C G D@2 H I A B A B A B A B A B A B A B J K C D E F C D E@2 C D E F C G D@2 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 D E F C D E@2 C D E F C G D@2 A B A B A B A B K L
>`.pickRestart({
  A: "e1!2 b1!2 f#1!2 g1!2", B: "d2!2 a1!2 c2!2 b1 a1", C: "a2!8", D: "b2!8", E: "g2!8", F: "d3!8", G: "b2!4 g2!2 a2!2",
  H: "b2!2 f#2!2 a#2!2 f2!2", I: "a2!2 e2!2 g2!2 b1!2", J: "[e1,b1]!2 b1!2 [d#1,b1]!2 [g1,b1]!2",
  K: "[b1,c2]!2 [a1,b1]!2 [b1,c2]!2 [a1,b1]!2", L: "[c2,d#2]!2 [a1,b1]!2 [b1,c2]!2 [a1,b1]!2",
})).s("gm_electric_guitar_jazz").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  A@25 B A@3 C A@3 C A@27 C A@3 B A@3 C A@3 C A@7 B A@4 C A@4 C A@3 C A@3 B A@3 C A@15 C A@19 B A@3 C A@7 C A@3 C A@10
>`.pickRestart({
  A: "x!2 ~@2 x!2 ~@2", B: "x!2 ~@2 x ~@3", C: "x!2 ~@2 x ~ x ~",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct(`<
  A@25 B A@3 C A@3 C A@27 C A@3 B A@3 C A@3 C A@7 B A@4 C A@4 C A@3 C A@3 B A@3 C A@15 C A@19 B A@3 C A@7 C A@3 C A@8
  D@2
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!3", C: "~@2 x ~@2 x ~@2", D: "~@2 x!2 ~@2 x!2",
})).gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<~@6 x ~@3 x ~@155>").gain(0.72)

// drums · open hat
const open_hat = s("oh").struct("<~@120 x ~@45>").gain(0.72)

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

stack(overdriven_guitar, synth_strings_1, bass, kick, snare, hihat, open_hat, china)

More by Berlin