Strudelify

Father Figure

Michael George

KeyB♭ majorTempo101 bpm
0:00/0:00
// Father Figure — George Michael
// 101 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 5 "Strings 2" named as a string part, played on string ensemble 1 (its voice oohs patch is not one)
// note: Full arrangement: all 143 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(101/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 · string ensemble 1 · "Strings 1"
const string_ensemble_1 = note(`<
  A@2 B C D@3 E@3 F@4 G@4 H@4 I@2 J K L@2 M N O@2 P@2 Q@4 R@2 J S@3 J N O@2 T U V W U@2 V ~ X@2 Y@2 Z@2 AA@4 AB@2 X@2
  AC@2 J S@3 J N O@2 T U V W U@2 V ~ AD AE AD AE AD AE AF@2 AG AE AD AE AD AE AH AI AJ@2 AK AL@3 R@2 AM S@3 J N O@2 T U
  V W U@2 V ~ U@2 V W U@2 V ~@2 AN@6
>`.pickRestart({
  A: "[[bb3,c4,f4]@31 ~]/2", B: "[ab3,bb3,eb4]", C: "[ab3,bb3,eb4]@3 [bb3,d4,f4]@5",
  D: "[bb3 ~ ab3 f3 eb3 d3@2 b2 bb2@2 b2 d3@2 eb3 ~@2 [ab3,bb3,eb4]@8, [c4,f4]@31 ~@17, ~@2 bb3@29 ~@17, ~@7 f3@5]/3", // Absus2 F5
  E: "[[b2,ab3,bb3,eb4]@6 d4@9 ~ c4@31 ~, ~ [bb3,f4]@7, ~@3 bb2@14 ~@7]/3", // Abm Bb5
  F: "[[ab3,bb3,eb4]@21 ~ [bb3,c4,f4]@41 ~]/4", G: "[~@16 ab2@6 [bb3,c4,f4]@41 ~, [ab3,bb3,eb4]@21 ~ bb2@11 ~@31]/4",
  H: "[[ab3,bb3,eb4]@22 [bb3,c4,f4]@41 ~]/4", I: "[[ab3,bb3]@15 ~ [ab3,c4]@5 ~ [bb3,d4,f4]@10, eb4@21 ~@11]/2",
  J: "[db3,gb3,ab3,bb3,db4]", K: "[eb3,ab3,c4,eb4]", L: "[[f3,d4]@31 ~]/2", M: "[db3,gb3,ab3,db4]",
  N: "[eb3,ab3,bb3,c4,eb4]", O: "[[f3,bb3,eb4]@15 ~ [f3,a3,eb4]@16, c4]/2", P: "[bb3,c4,d4,f4]/2",
  Q: "[[ab3,bb3,c4,eb4]@11 [bb3,c4,d4,f4]@21]/4", R: "[[ab3,bb3,c4,eb4]@21 ~ [bb3,c4,d4,f4]@9 ~]/2",
  S: "[[eb3,ab3,c4,eb4]@16 [f3,c4,d4]@31 ~, bb3@47 ~]/3", T: "[bb2,d3,bb3,c4,d4]@2 ~@4 [bb2,d3,f3,bb3,c4,d4]@9 ~",
  U: "[bb2,d3,f3,bb3,c4,d4]@2 ~@4 [bb2,d3,f3,bb3,c4,d4]@9 ~", // Bb
  V: "[ab2,c3,eb3,ab3,bb3,c4]@2 ~@4 [ab2,c3,eb3,ab3,bb3,c4]@9 ~", // Ab
  W: "[ab2,c3,eb3,ab3,bb3,c4] ~@2 [ab2,c3,eb3,ab3,bb3,c4]@4 ~", X: "[~ d4, [bb3,c4,f4]]/2",
  Y: "[[ab3,eb4]@8 [ab3,c4,eb4]@3 [bb3,c4,d4,f4]@5, bb3@11 ~@5]/2", Z: "[~@8 d4@7 ~, [bb3,c4,f4]@31 ~]/2",
  AA: "[[ab3,eb4]@16 [ab2,ab3,c4,eb4]@6 [bb3,c4,d4,f4]@9 ~@17 d4@15 ~, bb3@11 bb2@13 ~@8, ~ [bb3,c4,f4]]/4", // Ab5 Ab Bb Bbsus2
  AB: "[[ab3,eb4]@8 [ab3,c4,eb4]@3 [bb3,c4,d4,f4]@5, bb3@21 ~@11]/2", // Ab5 Ab Bb
  AC: "[[ab3,bb3]@15 ~ [ab3,bb3,c4]@6 [bb3,c4,d4,f4]@10, eb4@11 ~@5]/2", AD: "[db3,gb3,ab3,bb3]",
  AE: "[eb3,ab3,bb3,c4]", AF: "[d3,f3,bb3,d4]/2", AG: "[db3,gb3,ab3]", AH: "[f3,bb3,c4,f4]@15 ~", AI: "[f3,a3,c4,f4]",
  AJ: "[bb3,d4,f4]/2", AK: "[ab3,bb3,c4,eb4]", AL: "[[ab3,bb3,c4,eb4]@5 ~ [bb3,c4,d4,f4]@42]/3",
  AM: "[db3,bb3,db4], [gb3,ab3]@7 ~", // Gb Gbsus2
  AN: "[bb3@2 ab3@2 f3@2 ~ eb3@2 d3@4 b2@2 bb2@4 b2@2 d3@4 eb3@2 ~@19 [ab2,b2,eb3]@8 [bb2,d3]@42, ~@9 f3@23]/6", // Abm Bb
})).s("gm_string_ensemble_1").gain(0.14)

// other · epiano2 · "Piano"
const epiano2 = note(`<
  ~@32 A B C D E F C D G C A H G C I J K L M@2 N@2 O ~@9 A@2 C D A B C D G C A@2 G C I J P Q R S P T U ~ V W V X V W Y Z
  V AA V X V W AB AC A@2 C D A B C D G C A@2 G C I J P Q R S P T U ~ AD Q U R P@2 AE ~@8
>`.pickRestart({
  A: "f4 bb4 c5 bb4 f5 bb4 c5 bb4", B: "f4 bb4 c5 bb4 eb5 bb4 d5 bb4", C: "eb4 ab4 bb4 ab4 eb5 ab4 bb4 ab4",
  D: "eb4 ab4 bb4 f4 bb4 c5 bb4 f4", E: "f4 bb4 c5 f4 f5 bb4 c5 bb4", F: "f4 bb4 c5 bb4 d5 bb4 eb5 bb4",
  G: "db4 gb4 ab4 gb4 db5 gb4 ab4 gb4", H: "f4 bb4 c5 bb4 d5 bb4 c5 bb4", I: "c4 f4 bb4 f4 c5 f4 bb4 f4",
  J: "a4 f4 bb4 f4 c5 f4 c5 f4", K: "[f4,bb4] ~@2 [f4,bb4,d5]@4 ~, d5 ~@15", L: "[f4,bb4,d5] ~@2 [f4,bb4,d5]@4 ~",
  M: "[eb4,ab4,c5]@2 ~@4 [eb4,ab4,c5]@9 ~", N: "[f4,bb4,d5]@2 ~@4 [f4,bb4,d5]@9 ~",
  O: "[eb4,ab4,c5] ~@2 [eb4,ab4,c5]@5", P: "[f4,bb4,d5] ~@5 [f4,bb4,d5]@9 ~", Q: "[f4,bb4,d5] ~@5 [f4,bb4,d5]@8 ~@2",
  R: "[eb4,ab4,c5] ~@5 [eb4,ab4,c5]@8 ~@2", S: "[eb4,ab4] ~@5 [eb4,ab4,c5]@8 ~@2, c5 ~@7",
  T: "[f4,d5] ~@5 [f4,bb4,d5]@8 ~@2, bb4 ~@7", U: "[eb4,ab4,c5] ~@5 [eb4,ab4,c5]@9 ~",
  V: "db4@2 gb4 ~ gb4@2 db4@2 ab4@2 gb4@2 db4@2 gb4@2", W: "eb4@2 ab4 ~ ab4@2 eb4@2 bb4@2 ab4@2 eb4@2 ab4@2",
  X: "eb4@2 ab4 ~ ab4@2 eb4@2 db5@2 c5@2 bb4@2 ab4 ~", Y: "d4@2 bb4 ~ bb4@12", Z: "d4@2 f4 ~ f4@2 d4@2 f4@2 bb4@5 ~",
  AA: "eb4 ~ [eb4,ab4] ~ ab4@2 eb4@2 db5@2 c5@2 bb4@2 ab4 ~", AB: "f4@2 c5 ~ c5@2 f4@2 c5@2 f5@2 c5@2 bb4@2",
  AC: "a4@10 f5@2 c5@2 a4 ~", AD: "[f4,bb4]@2 ~@4 [f4,bb4,d5]@9 ~, d5 ~@15", AE: "[eb4,ab4,c5] ~@5 [eb4,ab4,c5]@10",
})).s("gm_epiano2").gain(0.2).pan(0.7)

// chords · acoustic guitar nylon · "Nylon Guitar"
const acoustic_guitar_nylon = note("<~@104 A@2 B C@2 D E@2 ~@2 F@2 ~@2 G@2 ~@23>".pickRestart({
  A: "[~@2 d4@2 d4@2 eb4@2 d4@2 ~@8 d4@2 d4@2 d4 ~@3 bb3@2 ~@2 bb3@2, ~@5 bb3@7 ~@4]/2", B: "ab3 ~ ab3 g3@5",
  C: "[~@14 bb3@4 ~@2 f4@2 bb4 ~ bb4 ~@7, ~@5 d3@4 ~@7, ~@12 f3@6 d4@5 ~@9]/2", D: "c5@2 ~@4 d5 ~@3 c5 ~@5",
  E: "[~@2 bb3@2 ab3@2 g3@4 eb3@13 ~@9, ab3 ~@7]/2", F: "[d4@2 eb4 d4 [bb3,d4]@2 f3@18 ~@8]/2",
  G: "[~@3 f4@5 ~@3 f4@18 ~@3, c4@8 c4@21 ~@3]/2",
})).s("gm_acoustic_guitar_nylon").gain(0.37).pan(0.3)

// bass · synth bass 2 · "Synth Bass"
const bass = note(`<
  ~@8 A@2 B C A@2 B C A@2 B C A@2 B C D E A@2 D F G H A I B J K A B L D F A@2 D F G H K I B F K I B@2 A I B J A I B M A
  I B C K A B C D B K A N F G H O A B F A@2 B ~ P Q P F P R S@2 P T U R D T V W ~@8 D F A@2 D F G X A@2 B F A@2 B Y A@2
  F@2 A@2 B ~@8
>`.pickRestart({
  A: "bb1@2 ~@4 bb1@7 ~@3", B: "ab1@2 ~@4 ab1@7 ~@3", C: "ab1@2 ~@4 bb1@7 ~@3", D: "gb1@2 ~@4 gb1@7 ~ gb1@2",
  E: "ab1 ~@2 ab1@3 ab1 ~", F: "ab1@2 ~@4 ab1@7 ~ ab1@2", G: "f1@2 ~@4 f1@7 ~@3", H: "f1@2 ~@4 f1@7 ~ ab1@2",
  I: "bb1@2 ~@4 bb1@7 ~ bb1@2", J: "ab1@2 ~@4 bb1@7 ~ ab1@2", K: "bb1@2 ~@4 bb1@7 ~ ab1@2", L: "ab1 ~@2 bb1@4 ~",
  M: "ab1@2 ~@2 ab1@2 bb1@7 ~@3", N: "gb1@2 ~@4 gb1@7 ~@3", O: "bb1 ~@5 bb1@7 ~@3", P: "gb1@2 ~@4 gb1@9 ~",
  Q: "ab1@3 ~@3 ab1@7 ~ ab1@2", R: "ab1 ~@2 ab1@5", S: "bb1@2 ~@4 bb1@9 ~", T: "ab1@2 ~@4 ab1@9 ~", U: "gb1 ~@2 gb1@5",
  V: "f1 ~@2 f1@4 c2", W: "f2 ~@5 f1@7 ~@3", X: "f1@2 ~@4 f1@7 ~ f1@2", Y: "~@7 ab1",
})).s("gm_synth_bass_2").gain(0.5)

// chords · string ensemble 1 · "Strings 2"
const string_ensemble_1_2 = note(`<
  ~@4 A B@2 C@3 ~@5 D ~@8 E F ~@2 E G ~@10 E G ~@2 E F ~@2 H I J K H@2 J ~@8 L@2 ~@7 E G ~@2 E F ~@2 H I J K H@2 J ~@25
  E G ~@2 E F ~@2 H I J K H@2 J ~ H I J K H@2 J ~@2 M@6
>`.pickRestart({
  A: "~ bb4 ab4 f4 eb4 d4@2 b3", B: "[bb3@2 b3 d4@2 eb4 f4@10]/2", C: "[b3@3 ~ bb3@19 ~]/3", D: "ab3@3 bb3@5", E: "db4",
  F: "eb4", G: "eb4@15 ~", H: "[bb3,d4]@2 ~@4 [bb3,d4]@9 ~", I: "[bb3,d4] ~@2 [bb3,d4]@4 ~",
  J: "[ab3,c4]@2 ~@4 [ab3,c4]@9 ~", K: "[ab3,c4] ~@2 [ab3,c4]@4 ~", L: "[ab3@3 bb3@13]/2",
  M: "[bb4@2 ab4@2 f4@2 ~ eb4@2 d4@4 b3@2 bb3@4 b3@2 d4@4 eb4@2 ~@19 [ab3,b3,eb4]@8 ~ bb3@40 ~, ~@27 f4@68 ~, ~@55 d4@38 ~@3]/6", // Abm
})).s("gm_string_ensemble_1").gain(0.45)

// other · blown bottle · "Breath Flute"
const blown_bottle = note("<~@4 A B@3 ~@52 A B@3 ~@73 C@6>".pickRestart({
  A: "~ bb5 ab5 f5 eb5 d5@2 b4", B: "[bb4@4 b4@2 d5@4 eb5@2 f5@21 ~@15]/3",
  C: "[bb5@2 ab5@2 f5@2 ~ eb5@2 d5@4 b4@2 bb4@4 b4@2 d5@4 eb5@2 f5@68 ~]/6",
})).s("gm_blown_bottle").gain(0.21).pan(0)

// chords · electric guitar muted · "Steel Pick"
const electric_guitar_muted = note("<~@56 A B C D E F G ~@80>".pickRestart({
  A: "[ab4,bb4,d5] ~@5 [ab4,bb4,eb5] ~@9", B: "[ab4,bb4,d5] ~@5 [ab4,bb4,eb5] ~@3 [ab4,bb4,d5] ~@3 [ab4,bb4,c5] ~",
  C: "~@6 bb4 ~@3 [bb4,eb5] ~ [bb4,c5] ~@3", D: "[ab4,bb4,eb5] ~@3 [ab4,bb4,eb5] ~ [ab4,bb4,d5]@6 ~@4",
  E: "~@2 [ab4,bb4,d5] ~@3 [ab4,bb4,eb5] ~@9", F: "[ab4,bb4,d5] ~@5 [ab4,bb4,eb5] ~@3 [ab4,bb4,d5] ~@3 [ab4,bb4,c5]@2",
  G: "~@10 [ab4,bb4,eb5] ~@5", // Absus2
})).s("gm_electric_guitar_muted").gain(0.3).pan(0.3)

// other · orchestral harp · "Harp"
const orchestral_harp = note("<~@12 [f4 ~@2 g4 ~@2 f4 ~ bb4 ~@2 eb4 ~@2 d4@2] ~@130>")
  .s("gm_orchestral_harp").gain(0.3).pan(0.3)

// drums · rim
const rim = s("rim").struct("<~@8 [~@3 x]!135>").gain(0.03)

// drums · kick
const kick = s("bd").struct("<~@8 [x ~@2 x ~@4]!127 ~@8>").gain(0.07)

// drums · clap
const clap = s("cp").struct(`<
  ~@8
  [~@7 x]!40
  [~@2 x ~@3 x!2]!8
  [~@7 x]!24
  [~@2 x ~@3 x!2]!8
  [~@7 x]!32
  [~@2 x ~@3 x!2]!15
  [~@7 x]!8
>`).gain(0.03)

// drums · hihat
const hihat = s("hh").struct(`<
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2
  B@2 A@2 B@2 C@15 D C@8 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@16 E@7 ~@8
>`.pickRestart({
  A: "x!8", B: "x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~", C: "x ~ x!3 ~ x ~ x ~@3 x ~ x ~", D: "x!5 ~ x!2",
  E: "x!7 ~ x ~@3 x ~ x ~",
})).gain(0.07)

// drums · open hat
const open_hat = s("oh").struct("<~@64 [~@5 x ~@2]!24 ~@24 [~@5 x ~@2]!23 ~@8>").gain(0.07)

// drums · tambourine
const tambourine = s("tb").struct("<~@64 [~@3 x]!24 ~@24 [~@3 x]!23 ~@8>").gain(0.09)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@8 [~@7 x]!127 ~@8>").gain(0.34)

// drums · claves
const claves = s("clave:2").struct("<~@8 [~@3 x]!127 ~@8>").gain(0.28)

stack(
  string_ensemble_1, epiano2, acoustic_guitar_nylon, bass, string_ensemble_1_2, blown_bottle, electric_guitar_muted,
  orchestral_harp, rim, kick, clap, hihat, open_hat, tambourine, cabasa, claves
)

More by Michael George