Strudelify
homecoming cover art

2007 · Graduation

homecoming

Kanye West

KeyA♭ majorTempo87 bpm
0:00/0:00
// homecoming — Kanye West
// 87 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 5/4 at bar 21, 4/4 at bar 23) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/2925376; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 36 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(87/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.

// chords · marimba
const marimba = note("<~@6 A B C D A B C E A B C F G H I J K L@2 M N O@2 M P K Q@2 ~@2>".pickRestart({
  A: "~@2 [f4,c5]!2 ~ [f4,c5]@3 [eb4,bb4]@2 [f4,c5]@2 [eb4,bb4]@2 [c4,ab4]!2", // F5 Eb5 F5 Eb5 Fm
  B: "~@2 [f4,c5]!2 ~ [eb4,c5]@2 [f4,db5]@2 ~ [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4]", // F5 Cm Db Eb7 Gb Fm Eb
  C: "~@2 ab4@2 [c4,f4]@2 ~@2 g4@2 g4 ab4 g4 eb4@2 f4", D: "~@2 f4 eb4 f4!2 ~@2 g4@2 g4 ab4 g4 eb4@2 f4",
  E: "~@8 g4@2 g4 ab4 g4 eb4@2 f4",
  F: "[ab4,ab5] [g4,g5] [f4,f5] [g4,g5] [bb4,bb5] [ab4,ab5] [g4,g5] [ab4,ab5] c5 [ab4,bb4] g4 [ab4,bb4] db5 [bb4,c5] ab4 [bb4,c5]", // Ab G F G Bb Ab G Ab …
  G: "ab4 g4 f4 g4 ab4 g4 f4 g4 ab4 g4 f4@2 ab4 g4 f4 g4",
  H: "~ ab4 g4 f4 g4 [eb4,c5]@2 [f4,db5]@2 ~ [eb4,c5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4]", // Cm Db Cm Gb Fm Eb
  I: "c5 bb4 ab4 bb4 c5 bb4 ab4 bb4 c5 bb4 ab4@2 c5 bb4 ab4 bb4", J: "c5 ~ [g4,eb5]@2 [f4,c5]@2 [db4,ab4] [ab3,f4]",
  K: "~@6 [f4,c5]!2 ~ [f4,c5]@3 [eb4,bb4]@2 [f4,c5]@2", // F5 Eb5 F5
  L: "[[eb4,bb4]@2 [c4,ab4]!2 ~@2 [f4,c5]!2 ~ [eb4,c5]@2 [f4,db5]@2 ~ [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4] ~@2 ab4@2 [c4,f4]@2 ~@2 g4@2 g4 ab4]/2", // Eb5 Fm F5 Cm Db Eb7 Gb Fm …
  M: "g4 eb4@2 f4 ~@2 f4 eb4 f4!2 ~@2 g4@2 g4 ab4", N: "g4 eb4@2 f4 ~@2 [f4,c5]!2 ~ [f4,c5]@3 [eb4,bb4]@2 [f4,c5]@2",
  O: "[[eb4,bb4]@2 [c4,ab4]!2 ~@2 [eb4,bb4]!2 ~ [f4,c5]@2 [f4,db5]@2 ~ [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4] ~@2 ab4@2 [c4,f4]@2 ~@2 g4@2 g4 ab4]/2", // Eb5 Fm Eb5 F5 Db Eb7 Gb Fm …
  P: "g4 eb4@2 f4 ~@2 [ab4,ab5]!6 [g4,g5]@2 [eb4,eb5] [f4,f5]", // Ab G Eb F
  Q: "[[eb4,bb4]@2 [c4,ab4]!2 ~@2 [eb4,bb4]!2 ~ [f4,c5]@2 [f4,db5]@2 ~ [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4] ~@2 ab4@2 [c4,f4]@2 ~@2 g4@2 ~@2]/2", // Eb5 Fm Eb5 F5 Db Eb7 Gb Fm …
})).s("gm_marimba").gain(0.3)

// chords · marimba · soft notes · Ab G Eb F
const marimba_soft = note(`<
  ~@33
  [~@14 g4 ab4]
  [g4 eb4@2 f4 ~@2 f4 eb4 f4!2 ~@2 g4@2 g4 ab4]
  [g4 eb4@2 f4 ~@2 [ab4,ab5]!6 [g4,g5]@2 [eb4,eb5] [f4,f5]]
>`).s("gm_marimba").gain(0.15)

// chords · marimba
const marimba_2 = note("<~@6 A B C D A B C E A B C ~ F G H I J K@2 L M N@2 L O J P@2 ~@2>".pickRestart({
  A: "~@2 [f4,c5]!2 ~ [f4,c5]@3 [eb4,bb4]@2 [f4,c5]@2 [eb4,bb4]@2 [c4,ab4]!2", // F5 Eb5 F5 Eb5 Fm
  B: "~@2 [f4,c5]!2 ~ [eb4,c5]@2 [f4,db5]@2 ~ [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4]", // F5 Cm Db Eb7 Gb Fm Eb
  C: "~@2 ab3@2 [c3,f3]@2 ~@2 g3@2 g3 ab3 g3 eb3@2 f3", D: "~@2 f3 eb3 f3!2 ~@2 g3@2 g3 ab3 g3 eb3@2 f3",
  E: "~@8 g3@2 g3 ab3 g3 eb3@2 f3", F: "ab3 g3 f3 g3 ab3 g3 f3 g3 ab3 g3 f3@2 ab3 g3 f3 g3",
  G: "~ ab3 g3 f3 g3 [eb3,c4]@2 [f3,db4]@2 ~ [eb3,c4] [db3,bb3]@2 [c3,ab3]@2 [bb2,g3]", // Cm Db Cm Gb Fm Eb
  H: "c4 bb3 ab3 bb3 c4 bb3 ab3 bb3 c4 bb3 ab3@2 c4 bb3 ab3 bb3", I: "c4 ~ [g3,eb4]@2 [f3,c4]@2 [db3,ab3] [ab2,f3]",
  J: "~@6 [f4,c5]!2 ~ [f4,c5]@3 [eb4,bb4]@2 [f4,c5]@2", // F5 Eb5 F5
  K: "[[eb4,bb4]@2 [c4,ab4]!2 ~@2 [f4,c5]!2 ~ [eb4,c5]@2 [f4,db5]@2 ~ [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4] ~@2 ab4@2 [c4,f4]@2 ~@2 g4@2 g4 ab4]/2", // Eb5 Fm F5 Cm Db Eb7 Gb Fm …
  L: "g4 eb4@2 f4 ~@2 f4 eb4 f4!2 ~@2 g4@2 g4 ab4", M: "g4 eb4@2 f4 ~@2 [f4,c5]!2 ~ [f4,c5]@3 [eb4,bb4]@2 [f4,c5]@2",
  N: "[[eb4,bb4]@2 [c4,ab4]!2 ~@2 [eb4,bb4]!2 ~ [f4,c5]@2 [f4,db5]@2 ~ [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4] ~@2 ab4@2 [c4,f4]@2 ~@2 g4@2 g4 ab4]/2", // Eb5 Fm Eb5 F5 Db Eb7 Gb Fm …
  O: "g4 eb4@2 f4 ~@2 [ab3,ab4]!6 [g3,g4]@2 [eb3,eb4] [f3,f4]", // Ab G Eb F
  P: "[[eb4,bb4]@2 [c4,ab4]!2 ~@2 [eb4,bb4]!2 ~ [f4,c5]@2 [f4,db5]@2 ~ [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4] ~@2 ab4@2 [c4,f4]@2 ~@2 g4@2 ~@2]/2", // Eb5 Fm Eb5 F5 Db Eb7 Gb Fm …
})).s("gm_marimba").gain(0.3)

// chords · marimba · soft notes · Ab G Eb F
const marimba_soft_2 = note(`<
  ~@33
  [~@14 g4 ab4]
  [g4 eb4@2 f4 ~@2 f4 eb4 f4!2 ~@2 g4@2 g4 ab4]
  [g4 eb4@2 f4 ~@2 [ab3,ab4]!6 [g3,g4]@2 [eb3,eb4] [f3,f4]]
>`).s("gm_marimba").gain(0.15)

// other · xylophone
const xylophone = note("<~@13 A B C B D E F G ~@15>".pickRestart({
  A: "~@15 ab5", B: "c6!4 bb5@2 ab5!2 g5@2 [f5,c6]@2 ~ [eb5,bb5]@2 f5",
  C: "c6!4 bb5@2 ab5!2 g5@2 [f5,c6]!2 ~ [c5,ab5]@2 [bb4,g5]", // F5 Fm Eb
  D: "[ab5,ab6] [g5,g6] [f5,f6] [g5,g6] [bb5,bb6] [ab5,ab6] [g5,g6] [ab5,ab6] c6 [ab5,bb5] g5 [ab5,bb5] db6 [bb5,c6] ab5 [bb5,c6]", // Ab G F G Bb Ab G Ab …
  E: "~@2 [f5,c6]!2 ~ [f5,c6]@3 [eb5,bb5]@2 [f5,c6]@2 [eb5,bb5]@2 [c5,ab5]!2", // F5 Eb5 F5 Eb5 Fm
  F: "~@2 [f5,c6]!2 ~ [eb5,c6]@2 [f5,db6]@2 ~ [eb5,db6] [db5,bb5]@2 [c5,ab5]@2 [bb4,g5]", // F5 Cm Db Eb7 Gb Fm Eb
  G: "~@2 ab5@2 [c5,f5]@2 ~@2 g5@2 g5 ab5 g5 eb5@2 f5", // F5
})).s("gm_xylophone").gain(0.4)

// other · glockenspiel
const glockenspiel = note("<~@6 A B C D A B C@2 ~@8 E F G H I J K L M N O@2 ~@2>".pickRestart({
  A: "~@2 c7!6 eb7@2 c7!2 ~@4", B: "~@2 c7!6 eb7@2 f7 c7 ~@2 bb6 ab6", C: "~@8 g6@2 g6 ab6 g6 eb6@2 f6",
  D: "~@8 [g6,g7]@2 [g6,g7] [ab6,ab7] [g6,g7] [eb6,eb7]@2 [f6,f7]", E: "~@6 c7!6 eb7@2 c7!2", F: "~@6 c7!6 eb7@2 f7 c7",
  G: "~@2 bb6 ab6 ~@8 g6@2 g6 ab6", H: "g6 eb6@2 f6 ~@4 [eb6,eb7]@4 [c6,c7]@4",
  I: "[ab5,ab6]@2 [f5,f6]@2 ~@2 [c7,c8]!2 ~ [c7,c8]@2 [c7,c8] [eb7,eb8]@2 [f7,f8] [c7,c8]", // Ab F C Eb F C
  J: "~@6 [c7,c8]!2 ~ [c7,c8]@2 [c7,c8] [bb6,bb7]@2 [c7,c8] [ab6,ab7]", // C Bb C Ab
  K: "~@2 [g6,g7] [f6,f7] ~@2 [ab6,ab7]@2 ~@4 [g6,g7]@2 [g6,g7] [ab6,ab7]", // G F Ab G Ab
  L: "[g6,g7] [eb6,f7]@2 [f6,f7] c7@2 ~@2 [eb6,eb7]@4 [c6,c7]@4", // G Ebsus2 F Eb C
  M: "[ab5,ab6]@2 [f5,f6]@2 ~@2 [ab6,ab7]!6 [g6,g7]@2 [eb6,eb7] [f6,f7]", // Ab F Ab G Eb F
  N: "~@6 [f6,c7]!2 ~ [f6,c7]@3 [eb6,bb6]@2 [f6,c7]@2", // F5 Eb5 F5
  O: "[[eb6,bb6]@2 [c6,ab6]!2 ~@2 [eb6,bb6]!2 ~ [f6,c7]@2 [f6,db7]@2 ~ [eb6,db7] [db6,bb6]@2 [c6,ab6]@2 [bb5,g6] ~@12]/2", // Eb5 Fm Eb5 F5 Db Eb7 Gb Fm …
})).s("gm_glockenspiel").gain(0.4)

// other · glockenspiel · soft notes · F5 Ab G Eb F
const glockenspiel_soft = note(`<
  ~@33
  [~@6 ab6@2 [c6,f6]@2 ~@2 g6@2 g6 ab6]
  [g6 eb6@2 f6 ~@2 f6 eb6 f6!2 ~@2 g6@2 g6 ab6]
  [g6 eb6@2 f6 ~@2 [ab6,ab7]!6 [g6,g7]@2 [eb6,eb7] [f6,f7]]
>`).s("gm_glockenspiel").gain(0.05)

// chords · piano · "Electric Piano"
const piano = note("<A B@4 ~ C D E F C D E G C D E ~ C D E H I@3 J K@4 L M@5>".pickRestart({
  A: "~@6 [f4,ab4,c5]!2 ~@2 [f4,ab4,c5]!2 ~@2 [f4,ab4,c5]!2, ~ f2!3", // Fm
  B: "[~@2 [f4,ab4,c5]!2 ~@2 [f4,ab4,c5]!2 ~ [f4,ab4,c5]@3 [eb4,g4,bb4]@2 [f4,ab4,c5]@2 [eb4,g4,bb4]@2 [c4,f4,ab4]!2 ~@2 [f4,ab4,c5]!2 ~ [eb4,ab4,c5]@2 ~@3 [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4] ~@2 ab4@2 [c4,f4]@2 ~@2 [g4,g5]@2 [g4,g5] [ab4,ab5] [g4,g5] [eb4,eb5]@2 [f4,f5] ~@12, f2@4 f2@8 g2@8 ab2@7 [f4,ab4,db5]@2 ~@35, ~@7 bb2@2 db3@2 c3@2 ~@3]/4", // Fm Eb Fm Eb Fm Ab Eb7 Gb …
  C: "~@2 [f4,ab4,c5]!2 ~ [f4,ab4,c5]@3 [eb4,g4,bb4]@2 [f4,ab4,c5]@2 [eb4,g4,bb4]@2 [c4,f4,ab4]!2, f2 g2", // Fm Eb Fm Eb Fm
  D: "~@2 [f4,ab4,c5]!2 ~ [eb4,ab4,c5]@2 ~@3 [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4], ab2@7 [f4,ab4,db5]@2 ~@7, ~ bb2", // Fm Ab Eb7 Gb Fm Eb Db
  E: "~@2 ab4@2 [c4,f4]@2 ~@2 [g4,g5]@2 [g4,g5] [ab4,ab5] [g4,g5] [eb4,eb5]@2 [f4,f5], db3 c3", // F5 G Ab G Eb F
  F: "~@2 [f4,f5] [eb4,eb5] [f4,f5]!2 ~@2 [g4,g5]@2 [g4,g5] [ab4,ab5] [g4,g5] [eb4,eb5]@2 [f4,f5], f2 c3", // F Eb F G Ab G Eb F
  G: "~@8 [g4,g5]@2 [g4,g5] [ab4,ab5] [g4,g5] [eb4,eb5]@2 [f4,f5]", // G Ab G Eb F
  H: "[f2,c5] ~ [eb3,g4,eb5]@2 [c3,f4,c5]@2 [ab1,ab2,db4,ab4] [f1,f2,ab3,f4]", // F5 Eb F5 Db5 Fm
  I: "[~@6 [c5,c6]!6 [eb5,eb6]@2 [c5,c6]!2 ~@6 [c5,c6]!6 [eb5,eb6]@2 [f5,f6] [c5,c6] ~@2 [bb4,bb5] [ab4,ab5] [db2,db3]@8 [eb5,f5] [g4,g5] [g2,g3,g4,g5] [ab2,ab3,ab4,ab5], ~@2 [f1,f2]@4 [g1,g2]@4 [ab1,ab2]@4 [bb1,bb2]@4 ~@4 [g2,g3] ~]/3", // C Eb C Eb F C Bb Ab …
  J: "[g4,g5] [eb4,eb5]@2 [f4,f5] [db5,eb5] f5 ~@2 [f4,f5]!2 ~@2 [eb3,c4,c5,c6]@4, [g2,g3]@2 [f2,f3] [f4,f5] ~@4, ~@7 [f2,f3]@3 ~@6", // G Eb F Dbsus2 F Cm G F
  K: "[[ab2,ab3,ab4,ab5]@2 [g2,g3,f4,f5]@2 ~@2 [c5,c6]!2 ~ [c5,c6]@2 [c5,c6] [eb5,eb6]@2 [f5,f6] [c5,c6] ~@6 [c5,c6]!2 ~ [c5,c6]@2 [c5,c6] [bb4,bb5]@2 [c5,c6] [ab4,ab5] ~@2 [g4,g5] [f4,f5] ~@2 [ab4,ab5]@2 ~@4 [g4,g5]@2 [g4,g5] [ab4,ab5] [g4,g5] [eb4,f5]@2 [f4,f5] [f2,c5]@2 ~@2 [g2,g3,g4,eb5]@4 [eb2,eb3,f4,c5]@4, ~ [f1,f2]@2 [g1,g2]@2 [ab1,ab2]@2 [bb1,bb2]@2 [db2,db3]@2 [c2,eb3]@2 ~@3]/4", // Ab G7 C Eb F C Bb C …
  L: "[ab1,ab2,db4,ab4]@2 [f1,f2,ab3,f4]@2 ~@4 [ab4,ab5]!4 [g4,g5]@2 [eb4,eb5] [f4,f5]", // Db5 Fm Ab G Eb F
  M: "[~@6 [f4,ab4,c5]!2 ~ [f4,ab4,c5]@3 [eb4,g4,bb4]@2 [f4,ab4,c5]@2 [eb4,g4,bb4]@2 [c4,f4,ab4]!2 ~@2 [f4,ab4,c5]!2 ~ [eb4,ab4,c5]@2 ~@3 [eb4,db5] [db4,bb4]@2 [c4,ab4]@2 [bb3,g4] ~@2 ab4@2 [c4,f4]@2 ~@2 [g4,g5]@2 [g4,g5] [ab4,ab5] [g4,g5] [eb4,eb5]@2 [f4,f5] ~@2 [f4,f5] [eb4,eb5] [f4,f5]!2 ~@2 [g4,g5]@2 [g4,g5] [ab4,ab5] [g4,g5] [eb4,eb5]@2 [f4,f5] ~@2 [ab4,ab5]!6 [g4,g5]@2 [eb4,eb5] [f4,f5], ~@4 f2@8 g2@8 ab2@7 [f4,ab4,db5]@2 ~@51, ~@7 bb2@2 db3@2 c3@2 f2@2 c3@2 ~@3]/5", // Fm Eb Fm Eb Fm Ab Eb7 Gb …
})).s("gm_piano").gain(0.3)

// bass · synth bass 2 · "Acoustic Bass"
const bass = note("<A B@3 C ~ D E F G D E F H D E F ~ D E F G I@3 J K@3 J L M@3 J ~>".pickRestart({
  A: "~ f1!3", B: "[f1@4 f1@8 g1@8 ab1@8 bb1@8 db3@4 [db1,db2]@4 c3 g2 ~@2]/3", C: "~ c2 eb2 f2 ~@12", D: "f1 g1",
  E: "ab1 bb1", F: "db3@4 [db1,db2]@4 c3 g2 ~@3 c2 eb2 f2", G: "~@2 eb2@2 c2@2 ab1 f1",
  H: "~@8 g1@2 g1 ab1 g1 eb1@2 f1",
  I: "[~@4 [f0,f1,f2]@8 [g0,g1,g2]@8 [ab0,ab1,ab2]@8 [bb0,bb1,bb2]@8 db3@4 [db1,db2]@4 c3 g2 ~@2]/3", // F G Ab Bb Db
  J: "~ c2 eb2 f2 ~@4 eb2@4 c2@4",
  K: "[ab1@2 f1@2 [f0,f1,f2]@8 [g0,g1,g2]@8 [ab0,ab1,ab2]@8 [bb0,bb1,bb2]@8 db3@4 [db1,db2]@4 c3 g2 ~@2]/3", // F G Ab Bb Db
  L: "ab1@2 f1@2 ~@4 ab2!4 f2@2 eb2 f2", M: "[~@4 f1@8 g1@8 ab1@8 bb1@8 db3@4 [db1,db2]@4 c3 g2 ~@2]/3",
})).s("gm_synth_bass_2").gain(0.3)

// bass · synth bass 2 · "Acoustic Bass" · soft notes
const bass_soft = note("<~@35 [ab1@2 f1@2 ~@4 ab1!4 f1@2 eb1 f1, ~ f1@2 ~]>").s("gm_synth_bass_2").gain(0.15)

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

// drums · tambourine
const tambourine = s("tb").struct("<A B@3 C ~ A B@3 A B@2 D A B@2 ~@5 E B@3 F B@3 C E B@3 G>".pickRestart({
  A: "~ x!3", B: "x!4", C: "x", D: "~ x!2 ~@5", E: "~@2 x!2", F: "x ~ x!2", G: "x!2 ~@2",
})).gain(0.3)

stack(
  marimba, marimba_soft, marimba_2, marimba_soft_2, xylophone, glockenspiel, glockenspiel_soft, piano, bass, bass_soft,
  kick, tambourine
)

More by Kanye West