Strudelify

Familiar Places

Chris Rogers

KeyE majorTempo100 bpm
0:00/0:00
// Familiar Places — Chris Rogers
// 100 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 1/4 at bar 74) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5766615; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 75 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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.

// other · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  ~@4 A@4 B C@2 D B C@2 D E F@2 G E F@2 H I J K L I J K M N O@2 A@3 E F@2 G E F@2 P E F@2 G E F@2 H I J K L I J K M N
  O@2 ~ A@2 ~@5 Q R
>`.pickRestart({
  A: "f#4!2 ~@2 f#4@3 g4 ~ g4 ~@2 g4@2 ~@2", B: "f#4", C: "e4", D: "d4", E: "f#4!2 ~@2 f#4@3 f#4 ~ f#4 ~@2 f#4@2 ~@2",
  F: "e4!2 ~@2 e4@3 e4 ~ e4 ~@2 e4@2 ~@2", G: "d4!2 ~@2 d4@3 d4 ~ d4 ~@2 d4@2 ~@2",
  H: "d4!2 ~@2 d4@3 d4 ~ d4 ~@2 g4@2 f#4@2", I: "e4@4 e4 g4 ~ a4@5 a4@2 c#5@2", J: "d5@4 d5 f#5 ~ g5@5 ~@4",
  K: "g5@2 g5 f#5@2 f#5 e5@4 ~@4 a4 b4", L: "c5@2 c5!3 d5 c5 b4@3 ~@2 g4@2 f#4@2",
  M: "c5@2 c5!3 d5 c5 b4@3 ~@2 g4@2 g4@2", N: "a4", O: "[~@7 g5@3 g5!5 g5@2 f#5@15]/2", P: "d4!2 ~@2 d4@3 d4 ~ d4 ~@6",
  Q: "c#6", R: "d6 ~@3",
})).s("gm_trumpet").gain(0.4)

// other · trombone
const trombone = note(`<
  ~@2 A@6 B@2 C D B@2 C D E F G@2 H@2 I@2 ~@2 J ~@3 J ~ K L@2 A@3 E F M@2 N@2 I@2 E F I@2 O@2 I@2 ~@2 J ~@3 J ~ K L@2
  A@3 ~ P Q P Q ~ R
>`.pickRestart({
  A: "a3!2 ~@2 a3@3 b3 ~ b3 ~@2 b3@2 ~@2", B: "a2", C: "c3", D: "b2", E: "~@6 f#4!2 f#4@2 f#4 d4 d4@2 d4@2",
  F: "e4@3 f#4@13", G: "[~@6 g4 f#4 g4@2 g4 f#4 g4 a4 g4 f#4@13 a3!2 d4@2]/2",
  H: "[d4 ~@3 f#4!2 f#4@3 d4 d4@2 d4@2 d4@5 [e4,g4] ~@12, ~@19 f#4@12 ~]/2", // Em
  I: "[~@6 g4 f#4 g4@2 g4 f#4 g4 a4 g4 f#4@17]/2", J: "~@10 a3 ~ a3 ~@3", K: "~@4 c#4 d4 ~ e4 ~ d4 ~ c#4 ~ d4 ~ c#4",
  L: "[c#4@4 a3 b3 ~ b3@3 b3!5 b3@2 a3 ~@2 a3@3 b3 ~ b3 ~@2 b3@2 ~@2]/2",
  M: "[~@6 g4 f#4 g4@2 g4 f#4 g4 a4 g4 f#4@13 f#4!2 g4@2]/2",
  N: "[f#4 ~@3 f#4!2 f#4@3 d4 d4@2 d4@2 d4@5 [e4,g4] ~@12, ~@19 f#4@12 ~]/2", // Em
  O: "[~@4 f#4!2 f#4@3 d4 d4@2 d4@2 d4@5 [e4,g4] ~@12, ~@19 f#4@12 ~]/2", // Em
  P: "d3 a3 c4 a3 c4 d4 ~@2 d3 a3 c4 a3 c4 d4 g3 ~", Q: "d3 a3 c4 a3 c4 d4 ~@2 f4!2 e4 d4 c4 a3 g3@2", R: "f#4 ~@3",
})).s("gm_trombone").gain(0.24)

// other · trombone · soft notes
const trombone_soft = note("<~@24 A B C D A B C D ~@22 A B C D A B C D ~@11 E ~>".pickRestart({
  A: "d3@3 d3@4 e3@9", B: "f#3@3 f#3@4 g3@9", C: "g4@2 ~ f#4@2 ~ e4@4 ~@6", D: "g3@3 a3@4 d3@9", E: "e4",
})).s("gm_trombone").gain(0.16)

// bass · tuba
const bass = note(`<
  ~@3 A B C B C B D E@2 B D E@2 F G H@2 F G H@2 I J K L I M K L N@2 B C B C F G H@2 F G H@2 F G H@2 F G H@2 I J K L I M
  K L N@2 B C B C O ~@4 P Q
>`.pickRestart({
  A: "~@14 a2!2", B: "d3", C: "d3@2 ~@12 a2!2", D: "c#3", E: "g2",
  F: "d2@3 ~@3 [d2,d#2,e2,f2] [f#2,g2,g#2,a2,a#2,b2] [c3,c#3,d3] ~ d3 d2 d2@2 d2 ~",
  G: "a2@3 ~@3 [a2,a#2,b2,c3] [c#3,d3,d#3,e3,f3,f#3] [g3,g#3,a3] ~ a3 a2 a2@2 a2 ~",
  H: "g2@3 ~@3 [g2,g#2,a2,a#2] [b2,c3,c#3,d3,d#3,e3] [f3,f#3,g3] ~ g3 g2 g2@2 g2 ~", I: "e2 a2", J: "d3 g3",
  K: "g3@2 ~ d3@2 ~ e3@4 e3 ~ e3 ~@3", L: "c3 g2", M: "d3@2 ~ d3 g3@4", N: "a2!4", O: "d3!2 ~@14", P: "a2", Q: "d2 ~@3",
})).s("gm_tuba").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@16 A@10 B A@3 B A C A@23 D A@3 E F G F@2 A@3 F@5 ~ H>".pickRestart({
  A: "x!2", B: "x ~@4 x!2 ~", C: "x!4", D: "x ~@3 x!3 ~", E: "x!2 ~@2 x!4", F: "x!2 ~@2 x!2 ~@2", G: "x!2 ~@2 x!3 ~",
  H: "x",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@8 [~ x ~ x]!7 [~ x ~@2] ~@59>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@15 A B@10 C B@3 C D E B@23 C B@3 C D E B@5 F@5 G ~>".pickRestart({
  A: "~@14 x!2", B: "~@4 x ~@4 x ~@2 x ~@3", C: "~@2 x ~@2 x!2 ~", D: "~@4 x ~@4 x ~@6", E: "~ x ~ x",
  F: "~@4 x!2 ~@3 x ~@2 x ~@3", G: "x!14 ~ x",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@5 A B A C D@6 E D@15 E ~ D@28 E ~ D@10 ~@2>".pickRestart({
  A: "~@4 x!12", B: "x", C: "~@2 x!14", D: "x!16", E: "x!12 ~@4",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@31 [~@6 x!2] [x!4] ~@27 [~@13 x ~ x] [~@6 x!2] [x!4] ~@12>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@4 A ~@3 A ~@7 A ~@21 A ~@7 A ~@21 A@5 ~ A>".pickRestart({
  A: "x",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@24 A@2 B A@3 B C A@6 ~@16 A@2 B A@3 B C A@11 ~@2>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x!2 ~", C: "~ x ~ x ~ x ~@2",
})).gain(0.4)

stack(trumpet, trombone, trombone_soft, bass, kick, rim, snare, hihat, open_hat, crash, ride)