Strudelify
Self Control cover art

1988 · Self Control

Self Control

Raf

KeyA♭ majorTempo114 bpm
0:00/0:00
// Self Control — Raf
// 114 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 11 "Flute" named as a pipe, played on flute (its synth brass 2 patch is not one)
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(114/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 · synth bass 2 · "Synbass"
const bass = note(`<
  ~@4 A B A B C D C D A B A B E F G H A B A B E F G H A B A B E F G H A B A B E F G H A B A B E F G H A B A B E F G H I
  D C D C D A B A B E F G H A B A B E F G H A B A B E F G H C D C D C D C D C D C D C D C J
>`.pickRestart({
  A: "f1 f2 f1 f2 f1 f2 f1 f2", B: "c2 c3 c2 c3 c2 c3 c2 c3", C: "f2 ~ f2 ~ eb2 ~ f2@4 eb2 f2 ab2@4",
  D: "c2 ~ c2 ~ bb1 ~ c2@4 bb1 c2 eb2@4", E: "eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2", F: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2",
  G: "db2 db3 db2 db3 db2 db3 db2 db3", H: "ab1@2 ab2@2 ab1@2 ab2@2 ab1@2 ab2@2 ab1@2 ab2 ~",
  I: "~@4 f1@6 eb1 f1 ab1@4", J: "c2 ~ c2 ~ bb1 ~ c2@3 ~ c2@2 eb2@2 f2@2",
})).s("gm_synth_bass_2").gain(0.64)

// other · pad halo · "Ice rain"
const pad_halo = note("<~@20 A B C B D C@2 B A B C B D C@2 B ~@8 E@4 ~@4 E@4 ~@18 A B C B D C@2 B ~@24>".pickRestart({
  A: "f5@3 c5@3 ab4@10", B: "eb4@3 g4@3 d5@2 eb5@6 ~@2", C: "f5@3 c5@3 ab4@8 ~@2", D: "~@3 g4@3 d5@2 eb5@5 ~@3",
  E: "[~@8 f3 c3 eb3 ab3 ~ f3 bb2 c3@13 ~@4]/2",
})).s("gm_pad_halo").gain(0.32).pan(0.6)

// chords · electric guitar clean · "Clean gt"
const electric_guitar_clean = note(`<
  ~@36 A B C D E F G H I J K L M N O P I J K L M N O P Q R S R T R ~@16 I J K L M N O P U V W X U V W X Y Z AA AB Y Z AA
  AC
>`.pickRestart({
  A: "[ab4,c5,f5] ~@2 [ab4,c5,f5] ~@2 [ab4,c5,f5] ~@2 [ab4,c5,f5] ~@2 [ab4,c5,f5]@2 ~@2", // Fm
  B: "[g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5]@2 ~@2", // Eb
  C: "[ab4,c5,f5] ~@2 [ab4,c5,f5] ~@2 [ab4,c5,f5] ~@2 [ab4,c5,f5] ~@2 [ab4,c5,f5]!3 ~", // Fm
  D: "[g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@3", // Eb
  E: "[g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~@2 [g4,bb4,eb5,f5] ~ [eb5,f5] ~", // Eb Ebsus2
  F: "[ab4,db5,f5] ~@2 [ab4,db5,f5] ~@2 [ab4,db5,f5] ~@2 [ab4,db5,f5] ~@2 [ab4,db5,f5] ~ [ab4,db5,f5] ~", // Db
  G: "[ab4,db5,f5] ~@2 [ab4,db5,f5] ~@2 [ab4,db5,f5] ~@2 [ab4,db5,f5]@2 ~ [ab4,db5,f5]@2 [ab4,db5,f5] ~", // Db
  H: "[ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@2 [ab4,c5,eb5] ~@2", // Ab
  I: "[ab4,c5,f5] ~@3 [ab4,c5,f5] ~@3 [ab4,c5,f5] ~@3 [ab4,c5,f5] ~@2 [g4,bb4,eb5]", // Fm Eb
  J: "~ [bb4,eb5] [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] [ab4,c5,f5]", // Eb5 Eb Fm
  K: "~@4 [ab4,c5,f5] ~@3 [ab4,c5,f5] ~@3 [ab4,c5,f5] ~@2 [g4,bb4,eb5]", // Fm Eb
  L: "~ bb4 [bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5]!2", // Eb5 Eb
  M: "~@4 [g4,bb4,eb5]@2 ~@2 [g4,bb4,eb5]@2 ~@2 [g4,bb4,eb5]@2 ~ [f4,ab4,db5]", // Eb Db
  N: "~@2 [f4,ab4,db5] ~ [f4,ab4,db5] ~ [f4,ab4,db5] ~ [f4,ab4,db5] ~ [f4,ab4,db5] ~ [f4,ab4,db5] ~ [f4,ab4,db5]!2", // Db
  O: "~@4 [f4,ab4,db5] ~@3 [f4,ab4,db5]@2 ~@2 [f4,ab4,db5]@2 ~ [eb4,ab4,c5]", // Db Ab
  P: "~ [eb4,ab4,c5]!2 ~ [eb4,ab4,c5] ~ [eb4,ab4,c5] ~ [eb4,ab4,c5] ~ [eb4,ab4,c5] ~ [eb4,ab4,c5] ~ ab4 ~", // Ab
  Q: "~@4 f4@6 eb4 f4 ab4@3 ~", R: "c4 ~@2 c4 ~@2 c4@2 ~@2 c4 ~@2 c4 ~@2", S: "f4@2 ~ f4 ~@2 f4 ~@3 f4 ~@2 f4 ~@2",
  T: "f4 ~@2 f4 ~@2 f4 ~@3 f4 ~@2 f4 ~@2", U: "~@2 eb4 ~@2 eb4 ~@2 eb4 ~@2 eb4 ~@2 eb4!2",
  V: "eb4 ~ eb4 ~@2 eb4!2 ~ eb4 ~@2 eb4 ~@2 c4 eb4", W: "~@2 eb4 ~@2 eb4 ~ eb4!2 ~@2 eb4 ~@2 eb4!2",
  X: "~@2 eb4 ~@2 eb4 ~@2 c4 ~ eb4 ~ f4 ~ ab4 bb4",
  Y: "[ab4,c5,f5] ~@3 [ab4,c5,f5]@2 ~@2 [ab4,c5,f5] ~@3 [ab4,c5,f5]@2 ~ [g4,bb4,eb5,f5]", // Fm Eb
  Z: "~ [bb4,eb5,f5] [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,eb5,f5] ~ [g4,bb4,eb5,f5] ~@2 [ab4,c5,f5]", // Bbsus4 Eb Cm Eb Fm
  AA: "~@4 [ab4,c5,f5] ~@3 [ab4,c5,f5] ~@3 [ab4,c5,f5] ~@2 [g4,bb4,eb5,f5]", // Fm Eb
  AB: "~ [bb4,eb5,f5] [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ f5 ~", // Bbsus4 Eb
  AC: "~ [bb4,eb5,f5] [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [g4,bb4,eb5,f5] ~ [c4,c5]@2 [eb4,eb5]@2 [f4,f5]@2", // Bbsus4 Eb C Eb F
})).s("gm_electric_guitar_clean").gain(0.48).pan(0.4)

// chords · electric guitar clean · "Clean gt" · soft notes
const electric_guitar_clean_2 = note(`<
  ~@40 A ~@2 B ~ C D E ~@3 F ~ C D E ~@3 F ~@23 C D E ~@3 F ~ G ~@3 G ~@3 H I J ~ H I C
>`.pickRestart({
  A: "~@8 f5 ~@5 [g4,bb4] ~", B: "~@5 eb5 ~@2 eb5 ~@3 eb5 ~@3", C: "~ g4 ~@14", D: "~@6 f5 ~@7 [g4,eb5] ~",
  E: "~ [g4,eb5] ~@14", F: "~@14 [eb4,c5] ~", G: "~@15 ab4", H: "~ g4 ~@8 bb4 ~@3 [g4,eb5,f5] ~",
  I: "~@6 f5 ~@3 f5 ~@3 [g4,f5] ~", J: "~ g4 ~@12 [g4,bb4,eb5] ~",
})).s("gm_electric_guitar_clean").gain(0.24).pan(0.4)

// other · pad new age · "Fantasia"
const pad_new_age = note("<~@12 A B A C D E A B A B A C D E A B ~@38 A B A C D E A B ~@32>".pickRestart({
  A: "f5@2 eb5@4 f5@4 c5@5 ~", B: "ab5@2 g5@4 c5@9 ~", C: "ab5@2 g5@4 c5@7 ~@3",
  D: "f5@2 eb5@4 bb4@3 ~ c5@2 eb5@2 f5@2", E: "ab5@2 g5@4 f5@7 ~@3",
})).s("gm_pad_new_age").gain(0.31)

// chords · pad poly · "Pads"
const pad_poly = note(`<
  A@8 ~@36 B C D E C F@3 B C D E C F@3 ~@22 B C D E C F@3 B C D E B C D E B C D E B C D G
>`.pickRestart({
  A: "[[c4,f4,ab4]@16 [bb3,c4,g4]@16 [c4,f4,ab4]@15 ~ [bb3,c4,g4]@16, eb4]/4", B: "[c4,f4,ab4]@15 ~", C: "[bb3,eb4,g4]",
  D: "[c4,f4], ab4@7 ~", E: "[bb3,eb4]", F: "[[db4,f4]@31 ~ eb4@16, ab4@47 ~]/3",
  G: "[bb3,eb4,g4]@7 ~@3 [c4,c5]@2 [eb4,eb5]@2 [f4,f5]@2", // Eb C Eb F
})).s("gm_pad_poly").gain(0.25).pan(0.4)

// chords · pad poly · "Pads" · soft notes
const pad_poly_soft = note("<~@46 A@2 ~@3 B ~@2 A@2 ~@3 B ~@24 A@2 ~@3 B ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@4>".pickRestart({
  A: "[~@15 g4@17]/2", B: "c4",
})).s("gm_pad_poly").gain(0.06).pan(0.4)

// other · distortion guitar · "Dist  gt"
const distortion_guitar = note(`<
  ~@7 A B C B C ~@23 D@4 E@6 ~ F ~@4 G H I H ~@5 J K B C B C ~@15 D@4 L@5 B C B C B C B C B C B C B C B M
>`.pickRestart({
  A: "f2@2 f2!2", B: "[f2,f3] ~ [f2,f3] ~ [eb2,eb3] ~ [f2,f3]@4 [eb2,eb3] [f2,f3] [ab2,ab3]@4",
  C: "[c2,c3] ~ [c2,c3] ~ [bb1,bb2] ~ [c2,c3]@4 [bb1,bb2] [c2,c3] [eb2,eb3]@4", // C Bb C Bb C Eb
  D: "[~@5 c3 eb3 f3@2 ~@4 f3 g3 c3@2 ~@4 c3 eb3 f3@2 ~@4 f3 g3 c3]/4",
  E: "[~@10 g3@2 ab3@2 bb3@10 ~@2 ab3@2 g3@2 f3@10 ~@2 f3@2 g3@2 ab3@10 ~@2 g3@2 f3@2 c3@10 ~@2 c3@2 eb3@2 f3@8 f3@2 f3 c3 eb3 ab3 ~ f3 bb2 c3]/6",
  F: "f3@2 ~@2 f3@2 f3 ~ f3 c3 eb3 ab3 ~ f3 bb2 c3", G: "~@9 c3 eb3 ab3 ~ f3 eb3 f3",
  H: "~@8 f3 c3 eb3 ab3 ~ f3 bb2 c3", I: "~@2 c3 ~@5", J: "~@4 [f2,c3,f3]@6 [eb2,eb3] [f2,f3] [ab2,ab3]@3 ~",
  K: "[c2,c3] ~ [c2,c3] ~ [bb1,bb2] ~ [c2,c3]@4 [bb1,c2,bb2] c3 [eb2,eb3]@3 ~", // C Bb C Bbsus2 Eb
  L: "[~@10 g3@2 ab3@2 bb3@8 ~@4 ab3@2 g3@2 f3@6 ~@6 f3@2 g3@2 ab3@8 ~@4 g3@2 f3@2 c3@10 ~@2 [bb1,bb2] [c2,c3] [eb2,eb3]@4]/5", // Bb C Eb
  M: "[c2,c3] ~ [c2,c3] ~ [bb1,bb2]@2 c3 ~@3 c3 ~ eb3 ~ f3@2", // C Bb
})).s("gm_distortion_guitar").gain(0.32).pan(0.6)

// other · kalimba
const kalimba = note(`<
  ~@4 A B C D ~@20 A B C D E F G H A B C D E F G H I J I J K L M N I J I J E F G O ~ P Q P Q P ~@8 A B C D E F G H I J I
  J E F G H Q R Q S Q R Q S Q R Q S Q R Q T
>`.pickRestart({
  A: "f4!2 eb4 f4 ~@2 f4 ~ eb4 f4 ~@2 f4 f4@2 ~", B: "c4 ~ bb3 c4 ~@2 c4 ~@3 c4!2 ~@2 c4!2",
  C: "f4!2 eb4 f4 ~@2 f4 ~@3 f4 ~ eb4 f4@2 ~", D: "c4 ~ bb3 c4 ~@2 c4 ~ bb3 ~ c4 ~@5",
  E: "eb4!2 bb3 eb4 ~@2 eb4 ~@3 eb4 ~ bb3 eb4 ~@2", F: "f4!2 eb4 f4 ~@2 f4 ~ eb4 f4 ~@2 f4 ~ [eb4,f4] ~",
  G: "f4!2 eb4 f4!2 ~ f4 ~ eb4 f4 ~@2 f4 ~ f4!2", H: "eb4!2 ~ eb4 ~@2 eb4!2 ~ eb4 ~@2 eb4 ~ e4 ~",
  I: "f4 ~@2 f4 ~@2 f4 ~ f4 c4 eb4 ab4 ~ f4 bb3 c4", J: "~@3 c4 ~@2 c4 ~@3 c4 ~@5",
  K: "eb4 ~@2 eb4 ~@2 eb4 ~@3 eb4@2 ~@4", L: "bb3 ~@2 bb3 ~@2 bb3 ~@3 bb3 ~@5", M: "db4 ~@2 db4 ~@2 db4 ~@3 db4 ~@5",
  N: "ab3 ~@2 ab3 ~@2 ab3 ~@2 c4 eb4 ab4 ~ f4 eb4 f4", O: "eb4!2 ~ eb4 ~@2 eb4!2 ~ eb4 ~@2 eb4 ~ f4 ~",
  P: "~@2 c4!2 ~ c4 ~@2 c4 ~@2 c4 ~@2 c4 ~", Q: "~@2 f4!2 ~ f4 ~@2 f4 ~@2 f4 ~@2 f4!2",
  R: "c5!2 c4!2 c5!2 c4@2 c5 c4 [eb4,eb5] c4 [f4,f5] c4 [ab4,ab5] [g4,g5]", // Eb F Ab G
  S: "c5!2 c4!2 c5!2 c4!2 c5 c4 [eb4,eb5] c4 [f4,f5] ~ [ab4,ab5] [g4,g5]", // Eb F Ab G
  T: "c5!2 c4!2 c5!2 c4!2 c5 c4 [c5,c6]@2 eb5@2 [f5,f6]@2, ~@12 eb6 ~@3", // C F
})).s("gm_kalimba").gain(0.57).pan(0.4)

// chords · pad sweep · "Sweep pd"
const pad_sweep = note("<~@11 A@3 ~@5 B@3 ~@43 C@2 ~@6 C@2 ~@31>".pickRestart({
  A: "[~@3 [f3,ab3,c4,f4]@9 ~@4]/3", B: "[~@8 [ab3,c4]@27 ~@13, ~@7 f3@24 ~@17, ~ f4@3 ~@2]/3",
  C: "[~@10 [f3,ab3,c4,f4]@19 ~@3]/2", // Fm
})).s("gm_pad_sweep").gain(0.25)

// other · flute
const flute = note("<~@73 A@3 B@4 C@2 D E D E F G D E ~@16>".pickRestart({
  A: "[~@5 c5 eb5 f5@2 ~@4 f5 ab5 c5@2 eb5 ~@3 c5 eb5 f5]/3",
  B: "[~@10 f5@2 ab5@2 c5@4 eb5@2 ~@6 g5@2 ab5@2 bb5@4 ~@8 ab5@2 g5@2 f5@4 ab5@3 ~@5 f5@2 g5@2 ab5@2]/4",
  C: "[~@5 g5 f5 c5@2 eb5@2 ~@5]/2", D: "~@2 f5!2 ~ eb5 f5@3 ~ eb5 f5 ~ ab5@3", E: "g5@2 ~ f5@2 ~ eb5@5 ~@5",
  F: "~@2 g5!2 ~ f5 g5@3 ~ f5 g5 ~ bb5@3", G: "ab5@2 ~ g5@2 ~ f5@8 ~@2",
})).s("gm_flute").gain(0.43)

// drums · kick
const kick = s("bd").struct(`<
  [x!2]!2
  [x ~@2 x!2 ~@3]
  [x!2]!4
  [x ~@7 x ~@2 x ~@4]
  [x!2]!52
  [~ x ~@2]
  [x!2]!44
  [x ~@4 x ~ x]
>`).gain(0.71)

// drums · snare
const snare = s("sd").struct(`<
  A@45 B A B A B A B A B A B A B A B ~ A@22 B A B A B A B A B A B A B A B A B A B A B A@2
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x ~@2 x ~@3",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C D A B C D E F G F E F G F E@2 F H E F G F E@2 F H I J K L I J K L M N O P M N O P M N O P M N O P M N O P M N O
  P ~ Q R S T U E F G F E@2 F H M N O P M N O P M N O P M N O P@2 Q R S P Q R S P Q R S V Q R W
>`.pickRestart({
  A: "x!4 ~@2 x!4 ~@3 x!3", B: "x ~@2 x ~@2 x!2 ~ x ~@4 x!2", C: "x!2 ~ x ~@2 x!4 ~@4 x!2",
  D: "x!2 ~ x ~@2 x!2 ~ x ~@4 x!2", E: "x!8", F: "x!7 ~", G: "x!5 ~ x!2", H: "x!6 ~ x", I: "x!2 ~ x!6 ~@2 x!2 ~@3",
  J: "x!2 ~ x!3 ~ x!8 ~", K: "x!2 ~ x!7 ~ x!3 ~@2", L: "x!6 ~ x!7 ~@2", M: "x!2 ~ x!3 ~ x ~ x!5 ~@2",
  N: "x!2 ~ x!2 ~@2 x ~ x!3 ~@3 x", O: "x!4 ~@2 x!3 ~ x!2 ~ x ~@2", P: "x!2 ~ x!11 ~@2", Q: "x!5 ~ x!8 ~@2",
  R: "x!2 ~ x!2 ~ x!8 ~@2", S: "x!2 ~ x!8 ~ x!2 ~@2", T: "x!2 ~ x!10 ~@3", U: "x!2 ~ x!2 ~ x!2 ~@2 x ~ x ~@3",
  V: "x ~@2 x!11 ~@2", W: "x!2 ~ x!7 ~@6",
})).gain(0.29)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A B C D A B C D ~@2 E ~@3 E ~@7 E ~@5 F G H ~ F G H ~ I J K H I J K H I J K H I J K H I J K H I J K H ~ L A M H N ~@2
  E ~@5 I J K H I J K H I J K H I J K H@2 L A M H L A M H L A M H L A ~
>`.pickRestart({
  A: "~@5 x ~@10", B: "~ x!2 ~@2 x ~@10", C: "~@2 x ~ x!2 ~@7 x ~@2", D: "~@2 x ~@2 x ~@7 x ~@2", E: "~@5 x ~@2",
  F: "~@2 x ~@6 x ~@3 x ~@2", G: "~ x ~ x ~@4", H: "~ x ~@6", I: "~ x ~ x!2 ~@3", J: "~@5 x!2 ~ x ~@5 x ~",
  K: "~@5 x ~@3 x ~@6", L: "~@5 x ~@9 x", M: "~@11 x ~@4", N: "~@2 x ~@2 x ~@3 x ~ x ~ x ~@2",
})).gain(0.14)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@43 [~@13 x ~@2] ~@7 [~@7 x] ~@29 [~@13 x ~@2] ~@23 [~ x]>").gain(0.64)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@43
  [~@7 x ~@2 x ~@5]
  ~@7
  [~@7 x ~@2 x ~@5]
  ~@29
  [~@7 x!2 ~ x ~@5]
  ~@23
  [~@2 x ~@2 x ~@10]
>`).gain(0.57)

// drums · splash
// … 8 more lines

More by Raf