Strudelify
Axel F cover art

Harold F

Axel F

Harold Faltermeyer

KeyF minorTempo118 bpm
0:00/0:00
// Axel F — Harold Faltermeyer
// 118 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(118/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · synth bass 1 · "SYNBASS 1"
const bass = note(`<
  ~@8 A B C D A B C D A B C D A B C D A B C D A B C D A@2 E A B C D A B C D A B C D A B C F G H I J G H K J G H K J G H
  K L@2 A B C D A B C D C D A B C D A B C D ~@3
>`.pickRestart({
  A: "f1@3 ~ f2@2 ~ eb2 ~ eb3 c1 ~ c2 ~ eb2 ~", B: "f1@3 ~ f2 ~@4 f1 c2 ~ eb2 ~ f2 ~",
  C: "db1@3 ~ db2@2 ~@3 eb1 eb2 ~ c2 ~ eb2@2", D: "f1@3 ~@6 eb2 c2 ~ bb1 ~ ab1 ~", E: "f1 ~@15",
  F: "f1@3 ~@6 ab2 eb2 ~ f2 ~ g2 ~", G: "ab2 ~@8 ab2 eb2 ~ ab2 ~ eb2 ~", H: "f2 ~@8 f2 eb2 ~ f2 ~ eb2 ~",
  I: "gb2 ~@9 [eb2,gb2] ~ gb2 ~ ab2 ~", J: "eb2 ~@8 ab2 eb2 ~ f2 ~ g2 ~", K: "gb2 ~@8 gb2 eb2 ~ gb2 ~ ab2 ~",
  L: "eb2 ~@2 eb2 ~@2 eb2 ~@9",
})).s("gm_synth_bass_1").gain(0.56)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@59
  [eb6 c6 bb5 ab5 ~ ab5 bb5 c6 eb6 ~ c6 ~ bb5 ~ ab5 ~]
  [eb6 c6 bb5 ab5 ~ ab5 bb5 c6 eb6@2 c6 ~ bb5 ~ ab5 ~]
  [eb6 c6 bb5 ab5 ~ ab5 bb5 c6 eb6 ~ c6 ~ bb5 ~ ab5 ~]!3
  [eb6 c6 bb5 ab5 ~ ab5 bb5 c6 eb6@2 c6 ~ bb5 ~ ab5 ~]
  [eb6 c6 bb5 ab5 ~ ab5 bb5 c6 eb6 ~ c6 ~ bb5 ~ ab5 ~]!3
  ~@21
>`).s("gm_electric_guitar_muted").gain(0.45)

// chords · marimba
const marimba = note("<~@51 A B C@2 D E D@2 A B C@2 D E D@3 ~@21>".pickRestart({
  A: "[eb5,ab5] ~@2 [ab4,eb5] ~@2 [eb5,ab5] ~@2 [ab4,eb5] ~ [ab4,eb5] ab5 ~ [ab4,eb5] ~", // Ab5
  B: "[eb5,ab5] ~@2 [ab4,eb5] ~@2 [eb5,ab5] ~@2 [ab4,eb5] ~ [ab4,eb5] [eb5,ab5]!2 [ab4,eb5] ~", // Ab5
  C: "[eb5,ab5] ~@2 [ab4,eb5] ~@2 [eb5,ab5] ~@2 [ab4,eb5] ~ [ab4,eb5] [eb5,ab5] ~ [ab4,eb5] ~", // Ab5
  D: "[eb5,ab5,c6] ~@2 [ab4,eb5,ab5] ~@2 [eb5,ab5,c6] ~@2 [ab4,eb5,ab5] ~ [ab4,eb5,ab5] [eb5,ab5,c6] ~ [ab4,eb5,ab5] ~", // Ab Ab5 Ab Ab5 Ab Ab5
  E: "[eb5,ab5,c6] ~@2 [ab4,eb5,ab5] ~@2 [eb5,ab5,c6] ~@2 [ab4,eb5,ab5] ~ [ab4,eb5,ab5] [eb5,ab5,c6]!2 [ab4,eb5,ab5] ~", // Ab Ab5 Ab Ab5 Ab Ab5
})).s("gm_marimba").gain(0.5)

// other · woodblock
const woodblock = note(`<
  ~@24 A B C D E F G H I J K L M N O P Q R S T U V W X Y A B C D E F G H I J K L M N O P Q R S Z AA AB AC AD AE G H G H
  ~@11
>`.pickRestart({
  A: "d7!2 eb7 d7 e7 d7 eb7 d7!3 c7 d7 db7 d7!3", B: "c7 d7 b6 d7 c7 d7 db7 d7!3 eb7 d7 e7 d7 eb7 d7",
  C: "d7!2 db7 d7 c7 e7 eb7 e7!3 d7 e7 db7 e7 c7 e7", D: "d7 e7 eb7 e7 d7 e7 db7 e7 c7 e7 bb6 e7 c7 e7 d7 e7",
  E: "eb7 e7 d7 e7 db7 e7 c7 e7 b6 e7 c7 e7 db7 e7 d7 e7", F: "eb7 e7 d7 e7 db7 e7 c7 e7 b6 e7 c7 e7 db7 e7 b6 e7",
  G: "c7 e7 db7 e7 b6 e7 c7 e7 db7 e7 b6 e7 c7 e7 db7 e7", H: "d7 e7 db7 e7 c7 e7 d7 e7 eb7 e7 d7 e7 db7 e7 c7 e7",
  I: "d7 e7 eb7 e7 d7 e7 db7 e7 c7 e7 d7 e7 eb7 e7 d7 e7", J: "db7 e7 c7 e7 d7 e7 eb7 e7 d7 e7 db7 e7 c7 e7 d7 e7",
  K: "c7 eb7 d7 eb7 c7 eb7 b6 eb7 db7 eb7 d7 eb7 c7 eb7 b6 eb7",
  L: "d7 eb7 c7 eb7 b6 eb7 c7 eb7 db7 eb7 d7 eb7 c7 eb7 b6 eb7",
  M: "c7 eb7 d7 eb7 c7 eb7 b6 eb7 c7 eb7 d7 eb7 c7 eb7 b6 eb7",
  N: "d7 eb7 db7 eb7 c7 eb7 b6 eb7 c7 eb7 db7 eb7 d7 eb7 db7 eb7",
  O: "c7 eb7 b6 eb7 c7 eb7 db7 eb7 d7 eb7 db7 eb7 c7 eb7 b6 eb7",
  P: "c7 eb7 d7 eb7 db7 eb7 c7 eb7 b6 eb7 c7 eb7 db7 eb7 d7 eb7",
  Q: "c7 eb7 b6 eb7 c7 eb7 db7 eb7 d7 eb7 c7 eb7 b6 eb7 c7 eb7",
  R: "db7 eb7 d7 eb7 c7 eb7 b6 eb7 c7 eb7 db7 eb7 d7 eb7 c7 eb7",
  S: "[b6,db7] eb7 c7 eb7 b6 eb7 c7 eb7 db7 eb7 c7 eb7 db7 eb7 c7 eb7", // Bsus2
  T: "db7 eb7 c7 eb7 db7 ~ [c7,eb7] eb7 db7 eb7 c7 eb7 db7 eb7 d7 eb7", // Cm
  U: "c7 eb7 b6 eb7 c7 eb7 d7 eb7 c7 eb7 b6 eb7 c7 eb7 d7 eb7",
  V: "db7 eb7 [c7,eb7] eb7 d7 eb7 c7 eb7 b6 eb7 c7 eb7 db7 eb7 d7 eb7", // Cm
  W: "c7 eb7 b6 eb7 c7 eb7 d7 eb7 db7 eb7 c7 eb7 [b6,eb7] ~ [c7,eb7] ~", // B Cm
  X: "[d7,eb7] ~ [b6,c7,eb7] b6 eb7 c7 ~ [d7,eb7] ~ [c7,eb7] eb7 ~ [b6,eb7] c7 eb7 ~", // Ebmaj7 B Ebmaj7 Cm B
  Y: "d7 eb7 c7 eb7 b6 eb7 c7 eb7 db7 eb7 d7 eb7 db7 eb7 c7 eb7",
  Z: "[db7,d7] [d7,eb7] [c7,eb7] [d7,eb7] [db7,e7] d7 [c7,eb7] [d7,eb7] [db7,d7] [d7,eb7] c7 [d7,eb7] db7 [d7,eb7] d7 [d7,eb7]", // Dmaj7 Ebmaj7 Cm Ebmaj7 Dbm Cm Ebmaj7 Dmaj7 …
  AA: "c7 [d7,eb7] b6 [d7,eb7] c7 [d7,eb7] [db7,d7] [d7,eb7] [c7,d7] [d7,eb7] [b6,eb7] [d7,eb7] [c7,e7] [d7,eb7]!3", // Ebmaj7 Dmaj7 Ebmaj7 Csus2 Ebmaj7 B Ebmaj7 C …
  AB: "[db7,d7] [d7,eb7] [c7,db7,eb7] [d7,eb7] [c7,d7] [eb7,e7] [c7,eb7] [eb7,e7] [b6,e7] [eb7,e7] [c7,d7] [eb7,e7] db7 [eb7,e7] [c7,d7] [eb7,e7]", // Dmaj7 Ebmaj7 Cm Ebmaj7 Csus2 Emaj7 Cm Emaj7 …
  AC: "[c7,d7] [eb7,e7] [b6,eb7] [eb7,e7] [c7,d7] [eb7,e7] [db7,d7] [eb7,e7] [c7,db7] [eb7,e7] [bb6,c7] [eb7,e7] [b6,c7,eb7] e7 [c7,d7,eb7] e7", // Csus2 Emaj7 B Emaj7 Csus2 Emaj7 Dmaj7 Emaj7 …
  AD: "[d7,eb7] e7 [b6,c7,d7,eb7] [b6,e7] [db7,eb7] [c7,e7] c7 [d7,eb7,e7] b6 [c7,eb7,e7] [c7,eb7] e7 [b6,db7,eb7] [c7,e7] [d7,eb7] e7", // Ebmaj7 E5 Dbsus2 C Cm B C Ebmaj7
  AE: "[d7,eb7] [eb7,e7] [c7,d7] [eb7,e7] [b6,db7] [eb7,e7] c7 [eb7,e7] [b6,db7] [eb7,e7] [c7,d7] [eb7,e7] db7 [eb7,e7] [b6,c7] [eb7,e7]", // Ebmaj7 Emaj7 Csus2 Emaj7 Bsus2 Emaj7 Bsus2 Emaj7 …
})).s("gm_woodblock").gain(0.4)

// chords · string ensemble 1 · "STRINGS" · Bbsus2 Fm
const string_ensemble_1 = note("<~@31 [~@15 [bb7,c8]] [[f7,ab7] f7@12 ~@3] ~@56>").s("gm_string_ensemble_1").gain(0.25)

// chords · bandoneon · "BANDNEON"
const bandoneon = note("<~@24 A B C D A B C D ~@7 E@2 F ~@26 A B C D A B C D C D ~@8 G@3>".pickRestart({
  A: "~@2 [a5,c6,f6] ~ [a5,c6,f6] ~ [a5,c6,f6] [g5,bb5,eb6] ~ [g5,bb5,eb6] ~ [g5,bb5,eb6] [f5,bb5,d6] ~ [f5,bb5,d6] ~", // F Eb Bb
  B: "~@2 [f5,a5,c6] ~ [f5,a5,c6] ~ [f5,a5,c6] [g5,bb5,eb6] ~ [g5,bb5,eb6] [g5,bb5,d6] ~ [f5,a5,c6] ~@3", // F Eb Gm F
  C: "~@2 [db5,f5,ab5] ~ [db5,f5,ab5] ~ [db5,f5,ab5] ~ [db5,f5,ab5] [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5] ~ [eb5,g5,bb5]", // Db Eb
  D: "[eb5,g5,bb5] ~ [f5,a5,c6] ~ [f5,a5,c6] ~ [f5,a5,c6] ~ [eb5,g5,bb5] [f5,a5,c6] ~ [f5,a5,c6] ~@4", // Eb F Eb F
  E: "[f7@3 eb7@4 c7@4 bb6@3 ab6@2]/2", F: "f6", G: "[[f2,f3]@11 ~@5]/3",
})).s("gm_bandoneon").gain(0.35)

// drums · kick
const kick = s("bd").struct(`<
  ~@12 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B ~@9 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@3 A B C@2 A B C@4 A
  B C@2 A B C@2 ~@3
>`.pickRestart({
  A: "x ~@6 x ~ x!2 ~@3 x ~", B: "x ~@8 x!2 ~@3 x ~", C: "x ~@3 x ~@4 x!2 ~ x ~ x ~",
})).gain(0.57)

// drums · snare
const snare = s("sd").struct("<~@16 [~ x ~ x]!18 ~@9 [~ x ~ x]!43 ~@3>").gain(0.64)

// drums · clap
const clap = s("cp").struct(`<
  ~@11 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@10 B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A@2 ~ B ~ A ~ B ~
  A@3 ~ B ~ A ~ B ~ A ~@3
>`.pickRestart({
  A: "~@2 x ~ x ~@4 x!4 ~@3", B: "~@9 x!4 ~@3",
})).gain(0.5)

// drums · shaker
const shaker = s("sh").struct("<[x!16]!86 ~@3>").gain(0.36)

stack(bass, electric_guitar_muted, marimba, woodblock, string_ensemble_1, bandoneon, kick, snare, clap, shaker)