Strudelify

Strasbourg/St. Denis

Roy Hargrove

KeyA♭ majorTempo120 bpm
0:00/0:00
// Strasbourg/St. Denis — Roy Hargrove
// 120 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "Trumpet" named as a brass, played on trumpet (its slap bass 1 patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/5829931; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 56 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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
const trumpet = note("<~@16 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~ E F G H I J@2 ~@16>".pickRestart({
  A: "[ab5 ~ f5 ~ eb5 ~ c5 ~ eb4 ~ bb4@2 ab4@14 ~@6]/2", B: "[ab5 ~ f5 ~ eb5 ~ c5 ~ eb4 ~ bb4@2 ab4@8 c5@2 eb5 ~@9]/2",
  C: "[ab5 ~ f5 ~ eb5 ~ c5 ~ eb4 ~ bb4@2 ab4@8 ~ f4 ab4 ~ c5@4 bb4@3 ab4]/2",
  D: "[g4@3 f4 eb4@4 c5@2 eb5@2 f5@2 gb5@4 ab5@4 f5@6 ~@4]/2", E: "~@6 c5 bb4 ab4 f4 eb4 db4 c4@2 ~@2",
  F: "~@6 c5 bb4 ab4 f4 ~ c4 ~@4", G: "~@14 c5 bb4", H: "ab4 f4 ~ c5 ~@12", I: "~@5 f5 ab5 ~ c6@4 bb5@3 ab5",
  J: "[g5@3 f5 eb5@4 c5@2 eb5@2 f5@2 gb5@4 ab5@4 f5@6 ~@4]/2",
})).s("gm_trumpet").gain(0.3)

// other · tenor sax
const tenor_sax = note("<~@19 A ~@2 B@2 ~@3 A ~@2 B@2 C@2 D E F G H@2 ~@16>".pickRestart({
  A: "~@4 c4@2 eb4 ~@9", B: "[~@4 f4 b4 bb4 a4@2 gb4@2 c4@3 ~@2]/2", C: "~@6 c5 bb4 ab4 f4 eb4 db4 c4@2 ~@2",
  D: "~@6 c5 bb4 ab4 f4 ~ c4@2 ~@3", E: "~@6 c5 bb4 ab4 f4 eb4 db4 c5 ~@3", F: "~@6 c5 bb4 eb4 eb5 ~ bb4@2 ~@3",
  G: "~@5 f4 ab4 ~ c5@4 bb4@3 ab4", H: "[g4@3 f4 bb4@4 f4@2 b4@2 bb4@2 a4@4 gb4@4 c4@6 ~@4]/2",
})).s("gm_tenor_sax").gain(0.3)

// other · trombone
const trombone = note("<~@19 A ~@2 B@2 ~@3 A ~@2 C@2 D E D F G H I@2 ~@16>".pickRestart({
  A: "~@4 ab3@2 c4 ~@9", B: "[~@4 gb3 g3 eb4 a3@2 gb3@2 ab3@3 ~@2]/2",
  C: "[~@8 gb3@2 g3@2 eb4@2 a3@4 gb3@4 ab3@6 ~@2 c4 bb3]/2", D: "ab3 f3 eb3 db3 c3@2 ~@8 c3 db3",
  E: "eb3 f3 ab3 bb3 c4@2 ~@8 c4 bb3", F: "eb3 f3 eb4 bb3@3 ~@8 c4 bb3", G: "ab3 f3 ~ c4@2 ~@11",
  H: "~@5 f3 ab3 ~ c4@4 bb3@3 ab3", I: "[g3@3 f3 bb3@4 gb3@2 g3@2 eb4@2 a3@4 gb3@4 ab3@6 ~@4]/2",
})).s("gm_trombone").gain(0.3)

// chords · piano
const piano = note(`<
  A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 E@2 F@2 G@2 D@2 H I F@2 G@2 J@2 E@2 F@2 G@2 J@2 K@4 L@2 M N O P Q R S M N O
>`.pickRestart({
  A: "[[bb2,db4,f4] ~@3 [bb2,db4,f4]@4 [c3,bb3,eb4,g4] ~ [c3,bb3,eb4,g4]@2 ~@2 [db3,c4,f4,ab4]@9 ~ eb5@6 ~@2]/2", // Bbm Cm7 Dbmaj7
  B: "[[bb2,db4,f4] ~@3 [bb2,db4,f4]@4 [c3,bb3,eb4,g4] ~ [c3,bb3,eb4,g4]@2 ~@2 [db3,c4,eb4,f4,ab4]@9 ~ eb5 eb6@2 ~@5]/2", // Bbm Cm7 Dbmaj7
  C: "[[bb2,db4,f4] ~@3 [bb2,db4,f4]@4 [c3,bb3,eb4,g4] ~ [c3,bb3,eb4,g4]@2 ~@2 [db3,c4,eb4,f4,ab4]@6 ~ f4 ab4 ~ [db4,f4,g4,c5]@4 [db4,g4,bb4]@3 [c4,eb4,ab4], ~@3 eb2]/2", // Bbm Cm7 Dbmaj7 Gdim Ab
  D: "[[bb3,c4,g4]@3 [db4,f4] [bb3,eb4]@4 [ab2,gb3,c4]@2 [g2,g3,b3,eb4]@2 [gb2,bb3,db4,f4]@2 [f2,c3,a3,eb4,gb4]@4 [ab2,eb3,bb3,f4,ab4]@4 [f2,ab3,c4,eb4,f4]@6 ~@4, [ab2,eb3] ~@3]/2", // C7 Db Eb5 Ab7 Gaug Gbmaj7 F7 Absus2 …
  E: "[[bb2,db4,f4] ~@3 [bb2,db4,f4]@4 [c3,bb3,eb4,g4] ~ [c3,bb3,eb4,g4]@2 ~@2 [db3,c4,f4,ab4]@9 ~@3 [eb5,eb6]@2 [eb6,eb7]@4]/2", // Bbm Cm7 Dbmaj7 Eb
  F: "[[bb2,db4,f4] ~@3 [bb2,db4,f4]@4 [c3,bb3,eb4,g4] ~ [c3,bb3,eb4,g4]@2 ~@2 [db3,c4,eb4,f4,ab4]@6 ~@4 e3 [c3,f3] f2@6]/2", // Bbm Cm7 Dbmaj7 F5
  G: "[[bb2,db4,f4] ~@3 [bb2,db4,f4]@4 [c3,bb3,eb4,g4] ~ [c3,bb3,eb4,g4]@2 ~@2 [db3,c4,eb4,f4,ab4]@6 ~ f4 ab4 ~ [eb2,db4,f4,g4,c5]@8]/2", // Bbm Cm7 Dbmaj7 Cm
  H: "~@2 [bb2,db4,f4] ~@3 [bb2,db4,f4] ~@3 [c3,bb3,eb4,g4]@6", // Bbm Cm7
  I: "~@2 [eb3,eb4] ~ [ab3,c4,db4,f4] ~ [db4,f4,ab4,bb4] ~ [bb3,eb4,g4,c5] ~ [c4,g4,bb4,eb5] ~ [bb3,eb4,g4,c5] ~ [g3,c4,eb4,bb4] ~", // Eb Dbmaj7 Bbm7 Cm7
  J: "[[bb3,c4,g4]@3 [db4,f4] [bb3,eb4]@4 [ab2,gb3,c4]@2 [g2,g3,b3,eb4]@2 [gb2,bb3,db4,f4]@2 [f2,c3,a3,eb4,gb4]@4 [ab2,gb3,c4,eb4,f4,ab4]@4 [f2,ab3,c4,eb4,f4]@6 ~@4, [ab2,eb3] ~@3]/2", // C7 Db Eb5 Ab7 Gaug Gbmaj7 F7 Ab7 …
  K: "[[bb2,db4,f4]@4 ~@4 [c3,bb3,eb4,g4]@3 ~@3 [db3,c4,eb4,f4,ab4]@17 ~]/2", // Bbm Cm7 Dbmaj7
  L: "[[bb2,db4,f4]@4 ~@4 [c3,bb3,eb4,g4]@3 ~@3 [db3,c4,eb4,f4,ab4]@6 ~@4 [eb2,db4,f4,g4,c5]@8]/2", // Bbm Cm7 Dbmaj7 Cm
  M: "[ab2,eb3,c4,f4,bb4] [ab2,c4,gb4]", N: "[g2,g3,b3,eb4] [gb2,eb3,ab3,bb3,db4,f4]", O: "[f2,c3,a3,eb4,gb4]@15 ~",
  P: "[c3,bb3,eb4,g4]@15 ~", Q: "[b2,a3,eb4,gb4] [bb2,db4,ab4,c5]", R: "[f2,c3,c4,e4,g4]@15 ~",
  S: "[bb2,ab3,d4,f4] [eb2,db3,c4,f4,g4]", // Bb7 Cm
})).s("gm_piano").gain(0.3)

// bass · acoustic bass · "Bass"
const bass = note(`<
  A@4 B@2 C@2 A@4 B@2 C@2 A@2 D@2 B@2 C@2 A@2 D@2 B@2 C@2 E@2 D@2 B@2 C@2 A@4 F@2 G H I J K L M N O P
>`.pickRestart({
  A: "[bb1 ~@3 bb1@4 c2 ~ c2@2 ~@2 db2@10 ~@8]/2", B: "[bb1 ~@3 bb1@4 c2 ~ c2@2 ~@2 db2@6 db2@2 d2@2 eb2@4 g2@3 bb2]/2",
  C: "[ab2@3 eb2 ab1@4 ab1@2 g1@2 gb1@2 f1@4 ab1@4 f1@6 ~@4]/2",
  D: "[bb1 ~@3 bb1@4 c2 ~ c2@2 ~@2 db2@6 ~@4 e2 [c2,f2] f1@6]/2", E: "[bb1 ~@3 bb1@4 c2 ~ c2@2 ~@2 db2@10 ~@6 c2 b1]/2",
  F: "[bb1@3 ~@5 c2@2 ~@4 db2@6 ~@2 db2 d2 eb2@8]/2", G: "ab2@8 ab2@3 eb2 ab1@4", H: "g2 gb2", I: "f2",
  J: "c2 eb2 f2 db2", K: "b1 eb2 db2 c2", L: "f2 c2 db2 eb2", M: "bb2 ab2 g2 c2", N: "ab2@4 c3@4 ab2@3 gb2 ab2@4",
  O: "g2 ab2 gb2 db3", P: "f2 c3 eb2 gb2",
})).s("gm_acoustic_bass").gain(0.4)

// drums · kick
const kick = s("bd").struct("<A@7 B A@7 B A@7 B A@7 B A@7 B A@8 B A@6 B>".pickRestart({
  A: "x ~@2 x!2 ~ x ~@4 x!2 ~ x ~", B: "x!2",
})).gain(0.3)

// drums · rim
const rim = s("rim").struct("<A@7 B A@7 B A@7 B A@7 B A@7 B A@8 B A@6 B>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x ~@4 x ~@2 x!2 ~",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<A@6 B ~ A@6 B ~ A@6 B ~ A@6 B ~ A@7 ~ A@6 B A ~ A@6 ~>".pickRestart({
  A: "~ x!7", B: "~ x!6 ~",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<A@7 ~ A@7 ~ A@7 ~ A@7 ~ A@7 ~ A@8 ~ A@6 ~>".pickRestart({
  A: "x",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@6 A ~@7 A ~@7 A ~@7 A ~@15 A ~@9>".pickRestart({
  A: "~@7 x",
})).gain(0.3)

stack(trumpet, tenor_sax, trombone, piano, bass, kick, rim, hihat, open_hat, crash)

More by Roy Hargrove