Strudelify

C'est comme vous voulez

Alain Souchon

KeyE♭ majorTempo114 bpm
0:00/0:00
// C'est comme vous voulez — Alain Souchon
// 114 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 5 electric guitar muted (copy of ch 1 overdriven guitar)
// note: Full arrangement: all 122 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: edit a riff to change every repeat.

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~ A B A C D E F G H I H J H I H J H I H J H I H J H I H J H I A K L K A K M K H@5 I H J H I H J H I H J H I H J H I H
  J H I A K L K A K M K H@4 N O P Q R S T U A L V H A W X S Y Z A K L K A K M K H@2 A K L K A K M K H@2 A K L K A AA ~
>`.pickRestart({
  A: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~", B: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2!3 ~ ab2!2",
  C: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2!3 ~ ab2!3 ~", D: "gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~",
  E: "gb2!3 ~ gb2 ~ gb2 ~ gb2!3 ~ gb2!4", F: "gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2!2",
  G: "gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2!2 ~ gb2!2 ~ gb2 ~", H: "eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~",
  I: "eb3 ~ eb3!3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~", J: "eb3 ~ eb3!3 ~ eb3 ~ eb3 ~ eb3 ~ eb3!4",
  K: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~", L: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2@2",
  M: "[ab2,bb2] ~ ab2 ~ [ab2,bb2] ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~", // Absus2
  N: "db3@2 eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~", O: "eb3 ~ eb3 ~ eb3 ~ eb3!3 ~ eb3!3 ~ eb3!2",
  P: "db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~", Q: "db3!3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~",
  R: "b2 ~ b2 ~ b2!3 ~ b2 ~ b2 ~ b2!3 ~", S: "db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3@2",
  T: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2!3 ~ bb2 ~ bb2 ~", U: "bb2 ~ bb2!3 ~ bb2 ~ bb2!3 ~ bb2!4",
  V: "eb2@2 eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~", W: "b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~",
  X: "db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3!2", Y: "eb2@2 eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3!2",
  Z: "eb2@2 eb3 ~ eb2@2 eb3 ~ eb2@2 eb3 ~ eb3 ~ eb3!2", AA: "bb2 ~ bb2 ~@13",
})).s("gm_overdriven_guitar").gain(0.6)

// bass · electric bass pick
const bass = note(`<
  ~ A@4 B@3 C D E D E D E D E F G H I D E D E D E D E F J K L M N O P Q R S T U V D E D E D E D E F G H I D E D E D E D
  E F J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG@2 AH AI AJ AK AL AM K L M N O P Q R S T K L M N O P Q R S T
  K L M N O AN ~
>`.pickRestart({
  A: "ab1@7 ~ ab1@7 ~", B: "gb1@7 ~ gb1@7 ~", C: "gb1@7 ~ gb1@6 ~@2", D: "eb1@7 ~ eb1@6 ~@2", E: "eb1@5 ~@3 eb1@7 ~",
  F: "eb5@2 eb6@2 eb5 eb6 ~ eb5 eb6 ~ eb5@2 eb6 ~ eb6@2, eb1@7 ~ eb1@6 ~@2",
  G: "eb5@2 eb6@2 eb5 ~@2 eb5 ~ eb5@2 ~ bb5 db6 eb6 db6, eb1@5 eb6@5 ~@6, ~@8 eb1@7 ~",
  H: "eb6 ~@3 eb6 ~ eb6 ~ eb5@2 eb6 ~ eb5 eb6 ~ eb6, eb1@7 ~ eb1@6 ~@2, ~ eb5@2 ~@5",
  I: "eb5@2 eb6@2 eb5@2 eb6@2 eb5@2 eb6 ~ bb5 db6 eb6 db6, eb1@5 ~@3 eb1@7 ~",
  J: "eb5@2 eb6@2 eb5 ~@3 eb1@7 ~, eb1@5 ~@11", K: "ab1@7 ~ ab1@5 ~ ab1@2", L: "bb1@5 ~@3 bb1@4 bb1@3 ~",
  M: "ab1@5 ~@3 ab1@8", N: "bb1@7 ~ bb1@5 ~ bb1@2", O: "ab1@7 ~ ab1@8", P: "bb1@7 ~ bb1@8",
  Q: "ab1@7 ~ ab1@4 ab2@2 ab1@2", R: "bb1@3 ~ bb1@4",
  S: "eb5@2 eb6@2 eb5 eb6 ~ eb5 eb6 ~ eb5@2 eb6 ~ eb6@2, eb1@6 ~@2 eb1@7 ~",
  T: "eb5@2 eb6@2 eb5 ~@2 eb5 ~ eb5@2 ~ bb5 db6 eb6 db6, eb1@5 eb6@5 ~@6, ~@4 eb1@2 ~ eb2",
  U: "eb6 ~@3 eb6 ~ eb6 ~ eb5@2 eb6 ~ eb5 eb6 ~ eb6, eb1@3 ~ eb1@3 ~, ~ eb5@2 ~@5",
  V: "eb5@2 eb6@2 eb5@2 eb6@2 [eb1,eb5]@2 bb1@2 bb5 db6 eb6 db6, eb1@6 ~@4 eb6 ~ eb2@2 bb1@2", // Eb
  W: "db1 eb1@2 ~ eb1 ~ eb1 ~", X: "eb1@2 ~@2 eb1@2 ~@2 eb1@2 ~@2 eb1 ~ eb1@2", Y: "db1@2 ~@2 db1@3 ~ db1@3 ~ db1@3 ~",
  Z: "db1@3 ~ db1@3 ~ db1@2 db2@2 db1@2 db2 ~", AA: "b1@2 ~@2 b1@2 ~@2 b1@2 ~@2 b1@3 ~",
  AB: "db2@3 ~ db2@3 ~ db2@2 ~@2 db2@3 ~", AC: "bb1@3 ~ bb1@3 ~ bb1@3 ~ bb1@3 ~",
  AD: "bb1@3 ~ bb1@3 ~ bb1@2 ~@2 bb1@3 ~", AE: "ab1@2 ~@2 ab1@3 ~ ab1@2 ~@2 ab1@3 ~",
  AF: "ab1@3 ~ ab1@3 ~ ab1 ~@3 ab1@2 bb1@2",
  AG: "[eb2@3 ~ eb2@2 ~@2 eb2@2 ~@2 eb2 ~ eb1@5 ~ eb1@2 eb2@6 eb1@2 eb2@2]/2", AH: "ab1@3 ~ ab1@3 ~ ab1@3 ~ ab1@3 ~",
  AI: "b1@3 ~@5 b1@3 ~ b1@4", AJ: "db2@4 db2@3 ~ db2@2 ~@2 db2@3 ~", AK: "db2@2 ~@2 db2@3 ~ db2@2 ~@2 db2@2 eb2@2",
  AL: "eb1@3 ~ eb1@3 ~ eb1@2 ~@2 eb1@2 ~@2", AM: "eb1 ~ eb1 ~ eb1 ~ eb1@2", AN: "bb1@7 ~@9",
})).s("gm_electric_bass_pick").gain(0.6)

// bass · electric bass pick · soft notes
const bass_soft = note(`<
  ~@10 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 B ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 B ~@11 C ~@3 D
  ~@13 B ~@9 B ~@7
>`.pickRestart({
  A: "~@6 eb1 ~@9", B: "~@6 bb1 ~", C: "~@10 ab1 ~@5", D: "~@4 b1@3 ~@9, ~@4 c2 ~@11",
})).s("gm_electric_bass_pick").gain(0.36)

// chords · pad new age
const pad_new_age = note(`<
  ~ A@2 B@2 C@2 D@2 E@22 F G H ~ I J K L M@4 E@22 F G H ~ I J K L M@4 N@2 O@2 P Q R@2 S@2 T@2 U V W@2 X@2 F G H ~ I J K
  L Y@2 F G H ~ I J K L Y@2 F G H ~ I J ~
>`.pickRestart({
  A: "[[db5,eb5,ab5]@15 ~]/2", B: "[[db5,eb5,ab5]@29 ~@3]/2", C: "[[b4,db5,gb5]@15 ~]/2", D: "[[b4,db5,gb5]@29 ~@3]/2",
  E: "[[ab3,bb3,eb4,ab4,bb4,eb5]@29 ~@3]/2", F: "[ab3,c4,eb4]@7 ~", G: "[bb3,d4]@7 ~, f3@3 ~", H: "[c4,eb4]@15 ~",
  I: "c4@7 ~", J: "f3@3 ~", K: "[c4,eb4]@13 ~@3", L: "[f3,bb3,d4]@13 ~@3",
  M: "[[ab5,bb5,eb6]@30 ~@2 [ab5,bb5,eb6]@31 ~, [ab3,bb3,eb4]@63 ~]/4", // Absus2
  N: "[[db4,f4,ab4,db5,f5,ab5]@2 [eb4,g4,bb4,eb5,g5,bb5]@29 ~]/2", O: "[[db4,f4,ab4,db5,f5,ab5]@31 ~]/2",
  P: "[b3,eb4,gb4,b4,eb5,gb5]@15 ~", Q: "[db4,ab4,db5,ab5], [f4,f5]@13 ~@3",
  R: "[[bb3,d4,bb4,d5]@31 ~, [f4,f5]@29 ~@3]/2", S: "[[c4,eb4,ab4,c5,eb5,ab5]@29 ~@3]/2",
  T: "[[bb3,eb4,ab4,bb4,eb5,ab5]@15 ~]/2", U: "[c4,eb4,ab4,c5,eb5,ab5]@15 ~", V: "[b3,eb4,gb4,b4,eb5,gb5]@7 ~",
  W: "[[db4,f4,ab4,db5,f5,ab5]@15 ~]/2", X: "[eb4,ab4,bb4,eb5,ab5,bb5]/2", Y: "[[ab3,bb3,eb4], [ab5,bb5,eb6]@15 ~]/2",
})).s("gm_pad_new_age").gain(0.36)

// chords · pad new age · soft notes
const pad_new_age_soft = note("<~@33 A B C D E ~@29 A B C D E ~@25 A B C D E ~@5 A B C D E ~@5 A B C D ~>".pickRestart({
  A: "ab3@7 ~", B: "[f3,bb3,d4]@13 ~@3", C: "[ab3,eb4]@7 ~", D: "[bb3,d4]@13 ~@3", E: "ab3@13 ~@3",
})).s("gm_pad_new_age").gain(0.18)

// chords · pad metallic
const pad_metallic = note(`<
  ~ A@2 B@2 C@2 D@2 E@22 F G H I F I J I K@4 E@22 F G H I F I J I K@4 L@2 M@2 N O P@2 Q@2 R@2 S T U@2 V@2 F G H I F I J
  I W@2 F G H I F I J I W@2 F G H I F I ~
>`.pickRestart({
  A: "[[db4,eb4,ab4,db5,eb5,ab5]@15 ~]/2", B: "[[db4,eb4,ab4,db5,eb5,ab5]@29 ~@3]/2",
  C: "[[b3,db4,gb4,b4,db5,gb5]@15 ~]/2", D: "[[b3,db4,gb4,b4,db5,gb5]@29 ~@3]/2", E: "[[ab4,bb4,eb5]@29 ~@3]/2",
  F: "[ab3,c4,eb4]@7 ~", G: "[bb3,d4]@7 ~, f3@3 ~", H: "[ab3,c4,eb4]@15 ~", I: "[f3,bb3,d4]@13 ~@3",
  J: "[ab3,c4,eb4]@13 ~@3", K: "[[ab5,bb5,eb6]@30 ~@2 [ab5,bb5,eb6]@31 ~, [ab3,bb3,eb4]@63 ~]/4",
  L: "[[db5,f5,ab5]@2 [eb5,g5,bb5]@29 ~]/2", M: "[[db5,f5,ab5]@31 ~]/2", N: "[b4,eb5,gb5]@15 ~",
  O: "[db5,ab5], f5@13 ~@3", P: "[[bb4,d5]@31 ~, f5@29 ~@3]/2", Q: "[[c5,eb5,ab5]@29 ~@3]/2",
  R: "[[bb4,eb5,ab5]@15 ~]/2", S: "[c5,eb5,ab5]@15 ~", T: "[b4,eb5,gb5]@7 ~", U: "[[db5,f5,ab5]@15 ~]/2",
  V: "[eb5,ab5,bb5]/2", W: "[[ab3,bb3,eb4], [ab5,bb5,eb6]@15 ~]/2",
})).s("gm_pad_metallic").gain(0.42)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!119 ~@2>").gain(0.66)

// drums · rim
const rim = s("rim").struct("<[x!4] ~@121>").gain(0.33)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!103 [~@2 x ~@2 x!3] [~ x ~ x]!9 [~@2 x ~@2 x!3] [~ x ~ x]!4 [~ x ~@2] ~@2>")
  .gain(0.66)

// drums · hihat
const hihat = s("hh").struct("<~ [x!4]!118 [x!3 ~] ~@2>").gain(0.66)

// drums · low tom
const low_tom = s("lt").struct("<~@30 [~@7 x] ~@33 [~@7 x] ~@29 [~@15 x] ~@27>").gain(0.66)

// drums · mid tom
const mid_tom = s("mt").struct("<~@30 A ~@33 A ~@28 B C ~@8 B D ~@8 B D ~@7>".pickRestart({
  A: "~@3 x!4 ~", B: "~@15 x", C: "~ x!7", D: "~ x!4 ~@3",
})).gain(0.59)

// drums · high tom
const high_tom = s("ht").struct("<~@93 A B ~@8 C B ~@8 C B ~@7>".pickRestart({
  A: "~@7 x", B: "x", C: "~@2 x ~@2 x!2 ~",
})).gain(0.52)

// drums · crash
const crash = s("cr").struct("<~@31 A ~@33 A ~@29 A ~@9 A ~@9 A ~@6>".pickRestart({
  A: "x",
})).gain(0.52)

stack(
  overdriven_guitar, bass, bass_soft, pad_new_age, pad_new_age_soft, pad_metallic, kick, rim, snare, hihat, low_tom,
  mid_tom, high_tom, crash
)

More by Alain Souchon