Strudelify
Midnight Train to Georgia cover art

Imagination

Midnight Train to Georgia

Gladys Knight

KeyD♭ majorTempo89 bpm
0:00/0:00
// Midnight Train to Georgia — Gladys Knight
// 89 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 4 "organ" named as an organ, played on drawbar organ (its piano patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 102 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(89/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "bass"
const bass = note(`<
  ~ A B C D E F G H G I J K E F G H G I J K L M N O P Q R S P T U V W X Y Z E F G H G I J K E F G H G I J K L M N O P Q
  R S P T U V W X AA AB L M N O P Q R S P T U V W X AA AB AA AB L M L M AA AB AA AB L M L M AC@3
>`.pickRestart({
  A: "db2@6 ~ db2 c2@7 ~", B: "bb1@14 ~@2 ab1 ~ ab1 ~ ab1@2 ~@2 ab1@4 bb1 ~ ab1@2", C: "db2@6 ~ db2 c2@6 ~ c2",
  D: "bb1@2 ~@2 bb1@7 ~ bb1@4 ab1@2 ~@2 ab1@2 ~@2 ab1@4 bb1@2 ab1@2", E: "db2 ~@3 db2@7 ~ db2@2 eb2@2 f2@2 ~@2 f2@12",
  F: "bb1@12 ~@2 bb1@2 ab1@2 ~@2 ab1@7 ~ ab1@2 bb1@2", G: "db2@9 ~@3 db2@2 eb2@2 f2@2 ~@2 f2@7 ~ f2@4",
  H: "bb1@15 ~ ab1 ~ ab1 ~ ab1@8 bb1@2 ab1 ~", I: "bb1@11 ~ bb1@4 eb2@7 ~ eb2@8", J: "ab1@13 ~@3 ab1 ~@3 ab1@10 ~@2",
  K: "ab1 ~@3 ab1@8 ab1 ~@3 ab1 ~@3 ab1@2 bb1@2 db2 ~ [bb1,db2]@2 ab1@2 ~@2", L: "db2 ~ db2@3 ~ db2 eb2 f2 ~ f2@4 ~ f2",
  M: "bb1@2 ~@2 bb1@7 ~ bb1@3 ~ ab1@2 ~@2 ab1@7 ~ eb2@2 ab1@2",
  N: "db2@2 ~@2 db2@5 ~@3 db2@2 eb2@2 f2 ~ f2 ~ f2@2 ~@2 f2@5 ~ f2@2",
  O: "bb1@2 ~@2 bb1@6 ~@2 bb1@2 ~@2 ab1@2 eb2@2 ab2@5 ~ eb2@2 ab1@4",
  P: "db2@2 ~@2 db2@6 ~@2 db2@2 eb2@2 f2@2 ~@2 f2@7 ~ f2@4", Q: "bb1@2 ~@2 bb1@8 ab1@3 ~ g1@2 ~@2 g1@4 eb1@7 ~",
  R: "ab1@2 ~@2 ab1@11 ~ ab1@2 ~@2 ab1@3 ~ ab1@2 eb2@2 ab2@3 ~",
  S: "ab2@2 ~@2 ab2@2 ~@2 ab2@2 eb2@2 ab1@3 ~ ab1@4 ab1@3 ~ ab1@2 bb1@2 db2 ~ bb1@2",
  T: "bb1@2 ~@2 bb1@7 ~ bb1@4 ab1@2 ~@2 ab1@3 ~ ab1@6 a1@2",
  U: "bb1@2 ~@2 bb1@8 f2@2 bb1@2 bb2@2 f2@2 bb1@2 ~@2 bb1@4 db2@2 bb1 ~",
  V: "eb2 ~ eb2@4 ~@2 eb2@6 bb1@2 eb2@2 ~@2 eb2@4 bb1@7 ~", W: "gb1@2 ~@2 gb1@10 ~@2 gb1@2 ~@2 gb1@6 bb1@2 gb1 ~ g1@2",
  X: "ab1@3 ~ ab1@8 ~@2 ab1 ~ ab1@2 ~@2 ab1@2 ~@2 ab1@2 bb1@2 db2@2 ~@2", Y: "db2@16 c2@15 ~",
  Z: "bb1@16 ab1@11 ~ ab1@2 ~@2", AA: "db2 ~@3 db2@9 ~ db2@2 c2 ~@3 c2@9 ~ c2@2",
  AB: "bb1 ~@3 bb1@10 ~@2 ab1@2 ~@2 ab1@2 ~@2 ab1@2 bb1@2 db2@2 bb1 ~", AC: "[db2@11 ~@5]/3",
})).s("gm_fretless_bass").gain(0.5)

// chords · epiano2 · "rhodes"
const epiano2 = note(`<
  ~ A B C D E F@2 G H@2 I J E F@2 G H@2 I K L M N O L P Q R S T U V W X Y Z E F@2 G H@2 I J E F@2 G H@2 I K L M N O L P
  Q R S T U V W X AA AB L M N O L P Q R S T U V W X AA AB AA AB L AC@2 M AA AB AA AB L AC@2 M AD@3
>`.pickRestart({
  A: "~ [ab3,db4]@11 ~@4 c4@12 c4@4, ~ [db3,f4]@15 [c3,eb4,ab4]@16, ~@6 ab3@3 ~@7, ~@7 db4@2 ~@7", // Db5 Db Ab
  B: "bb3@12 ~@2 db4@3 ~ [bb3,db4,gb4]@3 ~@3 [bb3,db4,gb4]@8, [bb2,db4,gb4]@16 ~ ab2@15, ~@12 bb3@5 ~@15", // Gb
  C: "[db3,ab3,db4,f4]@4 c4@3 c4, ~ [c3,eb4,ab4]", // Db Ab
  D: "bb3@7 ~ bb3@4 ~@2 [bb3,gb4]@2 [ab2,bb3,db4,gb4]@15 ~, [bb2,gb4] ~, db4@3 db4 ~@4", // Ebm Gb Ebm
  E: "[db4,f4]@6 ~ db3 ab4@6 ab4@2, [db3,ab3] [f3,c4,eb4], ~@3 [db4,f4] ~@4", // Db Db5 F7 Db
  F: "[bb3@3 bb3 ~ [db4,gb4]@2 gb4 [ab3,f4]@3 [ab3,db4,f4] c4@3 c4, [bb2,db4,gb4] ab2 db3 [f3,eb4,ab4], ~@7 db4@4 ~@5]/2", // Gb5 Db Gb Fm7
  G: "bb3@3 bb3 ~@2 gb4@2, [bb2,db4,gb4]@16 c4@15 ~, ~@17 [ab2,eb4,ab4]@15", // Gb Ab5
  H: "[[ab3,db4,f4]@12 [ab3,db4,f4]@4 [f3,c4,eb4,ab4]@15 ~ gb4@16 f4@8 eb4@8, db3@17 ~@14 [bb2,bb3,db4]@17 [g2,g3,bb3,db4]@16, ~@32 c4 ~@31]/2", // Db Fm7 Bbm Gdim
  I: "[gb3,bb3,db4]@7 ~ [bb3,db4]@2 ~@4 gb3@2, ab2, ~@14 gb3@13 ~@5, ~@5 [bb3,db4]@3", // Gb Bbm
  J: "~@12 gb4@3 ~, ab2@15 ~, ab3@6 ab3@9 ~, ~@8 bb3@21 ~@3, ~@8 db4@7 ~",
  K: "~@12 gb5@3 ~, ab2@15 ~, ab4@6 ab4@9 ~, ~@8 bb4@21 ~@3, ~@8 db5@7 ~",
  L: "ab4@3 ~ [f4,c5,eb5]@4, [db4,db5,f5] ~, ~@3 ab4@5", // F7 Db
  M: "[bb3,gb4,bb4,db5]@15 ~ c5@8 ~@6 ab3@2, ~@15 ab4@9 ab4@8, ~@4 [ab3,eb5]@3 eb5, ~@16 b4 ~@9 c5@6", // Gb Ab5
  N: "f5@8 f5@4 eb5@2 db5@2 c5@11 ~ c5@4, db4 ~, [ab4,db5]@11 ~@5 [f4,eb5]@16, ~ ab5@3, ~@8 eb5@3 ~@21", // Db5 F7
  O: "~@4 [bb4,db5,gb5] ~@3 [bb4,db5,gb5]@8 [bb4,db5,gb5]@8 [ab4,c5,eb5]@8, bb3 ab3", // Gb Ab
  P: "bb4@3 bb4 [g4,bb4,db5]@3 [g4,bb4,db5], [bb3,db5,f5] [g3,f5]", // Gdim Bbm G7
  Q: "ab3@10 ~@5 ab3, [bb4,db5]@13 bb4@3, gb4@3 gb4, ~@5 ab3@2 db5", R: "~ bb4 [bb4,db5] [bb4,db5,eb5], [ab3,ab4] ab3",
  S: "[db4,ab4,db5,f5]@12 [ab4,db5,f5]@2 db4 ~ [ab4,c5,eb5] ~@3 [f4,ab4,c5,eb5]@12, ~@15 f4@2 ~@15", // Db Ab Fm7
  T: "[bb3,bb4,db5,gb5]@8 ab4@6 ~ ab3, ~ [ab3,c5,eb5], ~@7 ab4", // Gb Ab
  U: "[bb4,db5,f5]@12 eb5 ~@11 bb3@8, bb3@3 ~, ~@3 ab5 db5@4, ~@13 f5@19, ~@5 bb4@3", // Bbm
  V: "g3@5 ~@2 g3, [g4,bb4,db5,f5]@3 [g4,bb4,db5,f5], ~@5 g3@2 ~", // Gm7b5
  W: "[bb4,db5]@20 [ab4,eb5]@3 ~@5 gb3@3 ~, gb3@26 gb4@5 ~, [gb4,f5]@23 ~ ab4@5 ~@3, ~@5 [bb4,db5]@3", // Bbm Ab5 Gbmaj7 Bbm
  X: "[gb4,bb4,db5]@15 ~ bb4@4 ab4@2 ~@2 ab4@8, ab3, ~ db5, ~@16 ab4 ~@15", // Gb
  Y: "[db4,f4]@15 ~ [c4,eb4]@16, ab3, bb3 ~@31", Z: "[bb3,db4,gb4]@4 [ab3,c4,eb4]@3 ~",
  AA: "[db5,f5]@15 ~ [c5,eb5]@15 ~, ab4@31 ~", // Db Cm
  AB: "[bb4,db5]@16 ab4@2 ~@2 ab4@2 ~@6 db5@3 ~, c5 ~@22 ab4@7 ~@2, ~@26 bb4@5 ~", // Bbm
  AC: "[[bb3,gb4,bb4,db5]@15 ~ c5@8 ~@8 ab4@12 ~@4 [f4,c5,eb5]@16, ~@15 ab4@9 ab4@6 ab3@19 ~@15, ~@4 [ab3,eb5]@3 eb5@4 ab4@5, ~@16 b4 ~@9 c5@22 ~@16, ~@2 [db4,db5,f5] ~]/2", // Gb F7 Ab5 Db
  AD: "[[db3,db4,ab4,db5,eb5,f5]@67 ~@29]/3", // Db
})).s("gm_epiano2").gain(0.5).pan(0.7)

// chords · drawbar organ · "organ"
const drawbar_organ = note(`<
  ~ A B@2 C ~@7 D E F@2 G H@2 I J K L M N@2 O P Q@2 R S@2 T U V@2 ~@15 W K L M N@2 O P Q@2 R S@2 T U X@2 K L M N@2 O P
  Q@2 R S@2 T U Y Z AA AB AC AD AE@4 AF AG AH@2 AI AJ AK@3
>`.pickRestart({
  A: "g5 ~@15 [eb5,c6]@16, [f5,db6]@15 ~@17, ~ ab5@30 ~", // Cm Db
  B: "[[db5,gb5,bb5]@15 ~ [gb5,bb5] db6 ~@2 [gb5,bb5]@11 ~ f5@14 ~@2 [eb5,c6]@16, ~@20 db6@27 ~@17, ~@16 ab5@15 ~]/2", // Gb Cm
  C: "[db5,gb5,bb5]@14 ~@2 [gb5,bb5,db6] ~ [gb5,bb5,db6]!2 ~@4 [gb5,bb5,db6]@7 ~", // Gb
  D: "ab4@8 bb4@8 db5@8 eb5@5 db5@2 ~, ~@8 a4 ~@23", E: "[db5,f5]@15 ~ [c5,eb5]@15 ~",
  F: "[[bb4,db5]@19 ~ [bb4,db5,gb5] ~@3 [bb4,gb5]@7 ~ [ab4,f5]@5 ~@2 eb5 f5@4 eb5@2 db5 ~ eb5@16, ~@24 db5@13 ~@2 ab5@25]/2", // Bbm Gb Ebm Db
  G: "~@4 eb5 ~@3 eb5@4 db5@16 bb4@4",
  H: "[db5@9 ~@3 [eb5,e5] ~@3 eb5@4 db5@4 eb5@4 db5@20 eb5@15 ~, ~@12 ab5@13 ~@39, ~@12 f5@4 ~@32 d5 ~@15]/2", // Emaj7
  I: "eb5@31 ~", J: "ab4@4 bb4@4 db5@4 eb5@3 ~, ~@8 a4 ~@23",
  K: "[db5,f5]@14 ~@2 [c5,eb5]@15 ~, ab4@31 ~, ~@16 b4 ~@15", // Db Cm
  L: "[bb4,db5,gb5]@15 ~ ab4@2 ~@2 c5@4 [bb4,db5]@4 [c5,eb5]@4, ~@16 c5 ~@3 ab4@3 ~@9", // Gb Bbm Cm
  M: "[db5,f5]@7 ~ [c5,eb5]@8, ab4@15 ~", // Db Cm
  N: "[[bb4,db5]@16 eb5@15 ~ [db5,f5]@15 ~ [c5,eb5]@15 ~, ~@16 d5 ~@14 ab4@31 ~@2]/2", // Bbm Db Cm
  O: "~@12 ab4@4 ~@4 bb4@11 ~, [db5,f5]@31 ~, bb4 g4", P: "[gb4,bb4,db5]",
  Q: "[~@8 a4 ~@14 eb5@7 ~ [ab4,db5,f5]@15 ~@2 [c5,eb5,ab5]@15 ~, ab4@15 ~@17, ~@4 bb4@11 ~@17, ~@16 db5@14 ~@18 d5 ~@15]/2", // Db Ab
  R: "[bb4,db5,gb5]@15 ~ [ab4,c5]@9 [bb4,db5]@3 [c5,eb5]@3 ~", // Gb Ab Bbm Cm
  S: "[ab4@4 ~ bb4@6 ~ ab4@2 ~@2 bb4@6 ~@2 ab4@6 ~@2 bb4@32, [db5,f5], ~@31 g4@32 ~]/2", // Db
  T: "~ [gb4,bb4,f5]@16 ~@3 [gb4,bb4,db5,f5] ~@3 [gb4,bb4,db5,f5]@5 gb4 ~@2, db5 ~", // Gbmaj7
  U: "[gb4,bb4]@19 ~ ab4@4 bb4@4 db5 ~@3, ~@24 a4 ~@7", // Gb
  V: "[db5@46 ~@2 eb5 f5@3 eb5@2 ~@2 eb5@4 db5@3 ~, ~@48 ab5@5 ~@3 ab5@7 ~, ~@49 e5 ~@14]/2",
  W: "~@7 a4 ~@16 eb5@6 ~@2, ab4@15 ~, ~@4 bb4@11 ~, ~@8 db5@7 ~",
  X: "[db5@16 c5@15 bb4@17 ~@12 eb5@4, ~@3 ab4, ~@13 bb4@3, ~@7 db5]/2", Y: "[db5,eb5,e5] f5@14 ~ eb5@16, ab5",
  Z: "db5@20 ab4@2 bb4@2 db5@4 bb4 ~@3",
  AA: "[eb5,e5] f5@14 ~@2 [e5,f5] db5@2 eb5@4 db5@4 bb4@4, ab5@16 ~ eb5@2 ~@13, ~@18 e5 ~@13", // Emaj7 Fmaj7
  AB: "db5@20 ab5 ~@3 [db5,ab5]@7 ~", AC: "eb5 f5@7 eb5@4 db5@4 eb5@4 db5@8 eb5@2 ~@2, ab5@21 ~@11, ~ g5 ~@30",
  AD: "db5@11 ~ bb4@2 ab4 ~ ab4@11 ~ [ab4,a4] bb4@3", // Amaj7
  AE: "[db5@26 ~@2 [eb5,e5] e5 ~@5 eb5@2 ~@2 e5!2 db5 bb4 ~ eb5@4 e5 f5@3 ab5 ~@2 bb5@2 ~@15 bb5@8 ab5@8 gb5@4 f5@4 eb5@4 db5@6 ~ eb5 f5@3 eb5@5 db5@4 eb5@4 db5@4, ~@28 [f5,ab5]@9 ~@3 eb5@2 ~@15 db6@48 ~@2 ab5@20 ~, ~@107 bb5@2 ~@19]/4", // Emaj7 Fm
  AF: "[eb5,e5] f5 ~@2 [eb5,e5] ~@7 db5@5 eb5@2 ~ eb5 f5@7 db5@4, ab5@2 ~@2 ab5@15 ~ ab5@12, ~ f5@2 ~@5", // Emaj7
  AG: "[eb5,e5] f5 ~@2 [eb5,e5] ~@3 eb5@4 db5@4 eb5@4 db5@2 ~@3 bb4 bb4@2 db5@2 bb4@2, ab5@2 ~ ab5@18 ~@11, ~@2 f5@2 ~@8 ab4 ~@3", // Emaj7
  AH: "[db5@27 ~ a4 bb4@2 db5@7 ~@2 [db5,eb5,e5] f5@2 eb5@2 ~@2 e5 [eb5,e5] db5@2 eb5@5 db5@4 bb4@2 db5 eb5, ~@27 ab4@2 ~@11 ab5@4 ~@20]/2", // Dbm Emaj7
  AI: "~ e5 f5@2 ab5@7 ~ eb5@2 db5@2 eb5@4 db5@4 bb4@4 db5@2 ~@2, ~@2 eb5 ~@29",
  AJ: "[f5,ab5]@3 ~ eb5@4 db5@3 ~ eb5@4 db5@2 ~@2 db5@3 ~ eb5@3 ~ db5@2 ~@2, eb5 ~@3 ab5@15 ~ ab5 ~@2 ab5@5 ~@4", // Fm
  AK: "[eb5 f5@65 ~@30, [db5,ab5]@11 ~@5, ~ e5 ~@94]/3", // Db5
})).s("gm_drawbar_organ").gain(0.24).pan(0.3)

// chords · tenor sax · "saxes"
const tenor_sax = note("<~ A B C@2 ~@16 D ~@2 E ~@19 F@2 ~@7 D ~@2 E ~@12 D ~@2 E ~@29>".pickRestart({
  A: "[db4,ab4,db5,f5]@7 ~ [ab4,db5,f5] ~@11 [c4,ab4,c5,eb5] ~@3 [c4,ab4,c5,eb5] ~@7, ~@4 db4 ~@11", // Db Ab
  B: "[bb3,bb4,db5,gb5]@7 ~ [bb4,db5,gb5] ~@11 [gb4,bb4,db5] ~@11, ~@4 bb3 ~@5 ab3 ~@5", // Gb
  C: "[[db4,ab4,db5,f5]@7 ~ [db4,ab4,db5,f5]@2 ~@10 [c4,ab4,c5,eb5] ~@3 [c4,ab4,c5,eb5] ~@7 bb3@7 ~ [bb3,bb4,db5,gb5] ~@10 [bb4,db5] [ab3,gb4] ~@11, ~@31 [bb4,db5,gb5]@7 ~@26]/2", // Db Ab Gb Bbm Ab7 Gb
  D: "[ab4,db5,f5]@3 ~ [ab4,db5,f5] ~@27", // Db
  E: "~@3 [bb4,db5,gb5] ~@4 [bb4,db5,gb5]@8 ~@4 [ab4,c5,eb5] ~@3 [ab4,c5,eb5]@5 ~@3", // Gb Ab
  F: "[~@27 [ab3,ab4,c5,eb5]@4 ~ [db5,f5]@3 ~ [ab4,db5,f5] ~@27, ~@31 [db4,ab4]@3 ~ db4@2 ~@27]/2", // Ab Db Db5
})).s("gm_tenor_sax").gain(0.4).pan(0.4)

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

// drums · snare
const snare = s("sd").struct(`<
  A B@3 C B@7 D B@7 D B@7 D B@6 ~ E B@7 D B@7 D B@7 D B@7 F B@7 D B@9 F B@7 F B@3 G ~ H ~
>`.pickRestart({
  A: "~@8 x!5 ~ x ~", B: "~ x ~ x", C: "~@4 x ~@5 x ~ x!2 ~@2", D: "~@4 x ~@4 x ~ x!3 ~@2", E: "~@8 x!3 ~ x ~ x ~",
  F: "~@4 x ~@3 x!3 ~ x!4", G: "~@4 x ~@3 x!7 ~", H: "~@30 x!2",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B A B A B A B A B 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 A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@3
>`.pickRestart({
  A: "x!8", B: "x!7 ~", C: "x!2", D: "x",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@7 x", B: "~@15 x",
})).gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A ~@7 A ~@7 A ~@7 A ~@15 A ~@7 A ~@7 A ~@15 A ~@25>".pickRestart({
  A: "~@7 x",
})).gain(0.5)

// drums · ride
const ride = s("rd").struct("<~@99 x ~@2>").gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<~ [~ x ~ x]!4 ~@16 [~ x ~ x]!78 ~@3>").gain(0.4)

stack(bass, epiano2, drawbar_organ, tenor_sax, kick, snare, hihat, open_hat, mid_tom, ride, tambourine)

More by Gladys Knight