Strudelify
Freedom 90 cover art

Ladies & Gentlemen

Freedom 90

Michael George

KeyC majorTempo90 bpm
0:00/0:00
// Freedom 90 — Michael George
// 90 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 152 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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.

// bass · electric bass finger · "chorus bass"
const bass = note(`<
  ~@4 A B C D E F C G H I J K L I J M N O P Q N O P Q N O P Q N O P Q R S T U T S T V W X Y Z AA AB Y AC AD I J K L I J
  M N O P Q N O P Q N O P Q N O P Q R S T U T S T V W X Y Z AA AB Y AC AD I J K L I J M T S T AE T S T AE T S T U T S T
  V T S T U T S T V W X Y Z AA AB Y AC AD I J K L I J M L I J M L I J M L I J M
>`.pickRestart({
  A: "~@2 c3@2 c3@3 c3@2 c3@2 c3@2 a#2 c3@2", B: "~@2 a#2@2 a#2@3 a#2@2 a#2@2 a#2@2 a#2 a#2@2",
  C: "~@2 f2@2 f2@3 f2@2 f2@2 f2@2 f2 f2@2", D: "~@2 c3@2 c3@3 c3@2 c3@2 c3@2 c3!3",
  E: "~@2 c3@2 c3@3 c3@2 c3@2 c3 g2@2 a2@2", F: "~@2 a#2@2 a#2@3 a#2@2 a#2@2 a#2@2 a#2 c3@2",
  G: "~@2 c3@2 c3@3 c3@2 c3@2 c3 g2!2 a2@2", H: "~@2 c3@2 c3@3 c3@2 c3!2 c3@2 c3@3",
  I: "a#2@2 a#2@2 a#2@3 a#2@2 a#2 a#2@3 a#2@3", J: "f2@2 f2@2 f2@3 f2@2 f2 f2@3 f2@3",
  K: "c3@2 c3@2 c3@3 c3@2 c3 c3@3 c3 g2 a2", L: "c3@2 c3@2 c3@3 c3@2 c3 c3@3 c3@3",
  M: "c3@2 c3@2 c3@3 c3@2 c3 c3@4 c3@2", N: "g2@2 g2@2 g2@3 g2@3 g2@3 g2@3", O: "f2@2 f2@2 f2@3 f2@3 f2@3 f2@3",
  P: "c3@2 c3@2 c3@3 c3@3 c3@3 c3 c2@2", Q: "c3@3 c3 c3@3 c3@2 c3@2 a#2@2 c3@3",
  R: "c2 c2@2 d2@2 d#2@2 f2@2 g2@2 a#2@2 c3@2 g2", S: "c3 c2@2 d2@2 d#2@2 f2@2 g2 a2 g2 a#2 g2@2 g2",
  T: "c3 c2@2 d2@2 d#2@2 f2@2 g2@2 a#2@2 c3@2 g2", U: "c3 c3@2 c3@2 d3@2 d#3@2 f3@2 d#3@2 d3@3",
  V: "g2@2 g2@2 g2@2 g2 a2@2 c3@2 a2 c3@2 c3 a#2", W: "c3@2 c3@2 c3@3 c3@2 c3@2 c3@2 a#2 c3@2",
  X: "a#2@2 a#2@2 a#2@3 a#2@2 a#2@2 a#2@2 a#2 a#2@2", Y: "f2@2 f2@2 f2@3 f2@2 f2@2 f2@2 f2 f2@2",
  Z: "c3@2 c3@2 c3@3 c3@2 c3@2 c3@2 c3!3", AA: "c3@2 c3@2 c3@3 c3@2 c3@2 c3 g2@2 a2@2",
  AB: "a#2@2 a#2@2 a#2@3 a#2@2 a#2@2 a#2@2 a#2 c3@2", AC: "c3@2 c3@2 c3@3 c3@2 c3@2 c3 g2!2 a2@2",
  AD: "c3@2 c3@2 c3@3 c3@2 c3!2 c3@2 c3@3", AE: "c3 c2@2 c2@2 d2@2 d#2@2 f2@2 d#2@2 d2@3",
})).s("gm_electric_bass_finger").gain(0.51)

// chords · piano · "chorus chords"
const piano = note(`<
  ~@4 A B C D A B C D E F G H I J K L M N O P M N O P M N O P Q N O R S T U V W T U X A B C D A B C D E F G Y Z J K L M
  N O P M N O P M N O P Q N O R S T U V W T U X A B C D A B C D E F G Y Z J K L AA@2 AB@2 AA@2 AB@2 AC@4 AD@4 AC@4 AD@4
  A B C D A B C D E F G Y Z J K L Z J K L Z J K L Z J K L
>`.pickRestart({
  A: "a#3 [c4,e4,g4]@2 a#3 [c4,e4,g4]@2 a#3 [c4,e4,g4]@2 a#3 [c4,e4,g4]@2 ~ g3 a3 g3", // C
  B: "a3 [a#3,d4,f4]@2 a3 [a#3,d4,f4]@2 a3 [a#3,d4,f4]@2 a3 [a#3,d4,f4] f3@2 [g3,g4]@2 [f3,f4]", // A# G F
  C: "[d4,f4,a#4] [c4,f4,a4]@2 [a#3,g4] [c4,f4,a4]@2 [a#3,g4] [c4,f4,a4]@2 [a#3,g4] [c4,f4,a4]@2 c4@2 c4@2", // A# F D# F D# F D# F
  D: "[d4,f4,a#4]@2 [d4,f4,a#4]@2 [c4,e4,g4]@2 a#3 [c4,e4,g4]@2 a#3 [c4,e4,g4]@2 ~@4", // A# C
  E: "a#3 [c4,e4]@2 a#3 [c4,e4,g4]@2 a#3 [c4,e4]@2 a#3 [c4,e4,g4]@2 ~ g3 a3 g3", // C
  F: "a3 [a#3,d4]@2 a3 [a#3,d4,f4]@2 a3 [a#3,d4]@2 a3 [a#3,d4,f4] f3@2 [g3,g4]@2 [f3,f4]", // A# G F
  G: "a#4 [c4,f4,a4]@2 g4 [f4,a4]@2 g4 [c4,f4,a4]@2 g4 [c4,f4,a4]@2 c4@2 c4@2", // F
  H: "[d4,f4,a#4]@2 [d4,f4,a#4]@2 [c4,e4,g4]@2 [a#3,d4,f4] [c4,e4,g4]@2 [a#3,d4,f4] [c4,e4,g4]@2 [a#6,c7] [e6,g6,a6] [a5,c6,d6] [d5,e5,g5]", // A# C A# C A# C A#sus2 A7 …
  I: "[a#4,c5] [c5,e5]@2 a#4 [c5,e5,g5]@2 a#4 [c5,e5]@2 a#4 [c5,e5,g5]@2 ~ g4 a4 g4", // A#sus2 C
  J: "a4 [a#4,d5]@2 a4 [a#4,d5,f5]@2 a4 [a#4,d5]@2 a4 [a#4,d5,f5] f4@2 [g4,g5]@2 [f4,f5]", // A# G F
  K: "[d5,f5,a#5] [c5,f5,a5]@2 g5 [c5,f5,a5]@2 g5 [c5,f5,a5]@2 g5 [c5,f5,a5]@2 [c4,c5]@2 [c4,c5]@2", // A# F C
  L: "[d5,f5,a#5]@2 [d5,f5,a#5]@2 [c5,e5,g5]@2 [a#4,d5,f5] [c5,e5,g5]@2 [a#4,d5,f5] [c5,e5,g5]@2 c4@2 c4@2", // A# C A# C A# C
  M: "[g3,b3,d4]@2 ~@2 [g3,b3,d4]@2 ~ [g3,b3,d4]@3 [g3,b3,d4]@4 ~ [g3,b3,d4]", // G
  N: "[f3,a3,c4]@2 ~@2 [f3,a3,c4]@2 ~ [f3,a3,c4]@3 [f3,a3,c4]@3 ~ c4@2", // F
  O: "[a3,c4,f4]@3 [a3,c4,f4]@3 [g3,c4,e4]@6 ~@2 c4@2", P: "[a3,c4,f4]@3 [a3,c4,f4]@3 [g3,c4,e4]@6 ~@4",
  Q: "[g3,a#3,d4]@2 ~@2 [g3,a#3,d4]@2 ~ [g3,a#3,d4]@3 [g3,a#3,d4]@4 ~ [g3,a#3,d4]", // Gm
  R: "[a3,c4,f4]@3 [a3,c4,f4]@3 [g3,c4,e4]@6 [b6,c7] [e6,g6,a6] [a5,c6,d6] [d5,e5,g5]", // F C Cmaj7 A7 D7 Em7
  S: "[c4,d#4,g4]@2 ~@2 [c4,d#4,g4]@2 ~ [c4,d#4,g4]@2 ~ [c4,d#4,g4]@3 [c4,d#4,g4]@3, c5 ~@15", // Cm
  T: "[b3,d#4,g4]@2 ~@2 [b3,d#4,g4]@2 ~ [b3,d#4,g4]@2 ~ [b3,d#4,g4]@3 [b3,d#4,g4]@3", // Baug
  U: "[a#3,d#4,g4]@2 ~@2 [a#3,d#4,g4]@2 ~ [a#3,d#4,g4]@2 ~ [a#3,d#4,g4]@3 [a#3,d#4,g4]@3", // D#
  V: "[a3,d#4,g4]@2 ~@2 [a3,d#4,g4]@2 ~ [a3,d#4,g4]@2 ~ [a3,d#4,g4]@3 [a3,d#4,g4]@3", // Am7b5
  W: "[c4,d#4,g4]@2 ~@2 [c4,d#4,g4]@2 ~ [c4,d#4,g4]@2 ~ [c4,d#4,g4]@3 [c4,d#4,g4]@3", // Cm
  X: "[b3,f4,g4]@2 ~@2 [b3,f4,g4]@2 ~ [b3,f4,g4]@3 ~ [b3,f4,g4]@5", // G7
  Y: "[d4,f4,a#4]@2 [d4,f4,a#4]@2 [c4,e4,g4]@2 [a#3,d4,f4] [c4,e4,g4]@2 [a#3,d4,f4] [c4,e4,g4]@3 [a#3,d4,f4] [c4,e4,g4]@2", // A# C A# C A# C A# C
  Z: "a#4 [c5,e5]@2 a#4 [c5,e5,g5]@2 a#4 [c5,e5]@2 a#4 [c5,e5,g5]@2 ~ g4 a4 g4", // C
  AA: "[~@4 [g3,c4,d#4]@2 ~@2 [c4,d#4,g4]@2 ~ [g3,c4,d#4]@3 ~ [g3,c4,d#4]@3 ~@2 [g3,c4,d#4]@2 ~@2 [d#4,g4,a#4] a4@3 [c4,d#4,a4] g4@3]/2", // Cm D# Adim
  AB: "[~@4 [g3,c4,d#4]@2 ~@2 [c4,d#4,g4]@2 ~ [g3,c4,d#4]@3 ~ [g3,c4,d#4]@3 ~@2 [c4,d#4,g4]@2 ~@2 [d#4,g4,a#4] a4@3 [c4,d#4,a4] g4@3]/2", // Cm D# Adim
  AC: "[[c4,d#4,g4] a#3 [c4,d#4,g4]@2 a#3 [c4,d#4,g4]@2 [c4,d#4,g4]@2 a#3 [c4,d#4,g4]@2 a#3 [c4,d#4,g4]@2 [b3,d#4,g4]@2 g3 [b3,d#4,g4]@2 g3 [b3,d#4,g4]@2 [b3,d#4,g4]@2 g3 [b3,d#4,g4]@2 g3 [b3,d#4,g4]@2 [a#3,d#4,g4]@2 g3 [a#3,d#4,g4]@2 g3 [a#3,d#4,g4]@2 [a#3,d#4,g4]@2 g3 [a#3,d#4,g4]@2 g3 [a#3,d#4,g4]@2 [a3,d#4,g4]@3 [a3,d#4,g4]@3 [a3,d#4,g4]@2 [a3,d#4,g4]@3 [a3,d#4,g4]@3 [a3,d#4,g4]@3]/4", // Cm Baug D# Am7b5
  AD: "[[c4,d#4,g4] a#3 [c4,d#4,g4]@2 a#3 [c4,d#4,g4]@2 [c4,d#4,g4]@2 a#3 [c4,d#4,g4]@2 a#3 [c4,d#4,g4]@2 [b3,d#4,g4]@2 g3 [b3,d#4,g4]@2 g3 [b3,d#4,g4]@2 [b3,d#4,g4]@2 g3 [b3,d#4,g4]@2 g3 [b3,d#4,g4]@2 [a#3,d#4,g4]@2 g3 [a#3,d#4,g4]@2 g3 [a#3,d#4,g4]@2 [a#3,d#4,g4]@2 g3 [a#3,d#4,g4]@2 g3 [a#3,d#4,g4]@2 [b3,f4,g4]@3 [b3,f4,g4]@3 [b3,f4,g4]@3 [b3,f4,g4]@2 [b3,f4,g4]@3 [b3,f4,g4]@3]/4", // Cm Baug D# G7
})).s("gm_piano").gain(0.8)

// drums · kick
const kick = s("bd").struct("<~@12 [x ~ x ~@7 x!2 ~@2 x ~]!140>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@12 [~@4 x ~@2 x ~ x ~@2 x!2 ~ x]!140>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("~ x ~ x ~@12").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("x!2 ~@6").gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<[x!3 ~ x!12]!149 [x!16] x ~>").gain(0.5)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<[~@3 x ~@12]!149 ~ [~ x!15] [x!16]>").gain(0.15)

// drums · bongos
const bongos = s("bongo:18").struct("~ x ~ x").gain(1.3)

// drums · congas
const congas = s("conga:18").struct("x ~ x!2 ~@3 x ~ x!3 ~@4").gain(1.59)

stack(bass, piano, kick, snare, hihat, open_hat, tambourine, tambourine_soft, bongos, congas)

More by Michael George