Strudelify
KeyD minorTempo80 bpm
0:00/0:00
// Mon frere — Maxime Le Forestier
// 80 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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 · synth brass 2
const synth_brass_2 = note("<A B C D ~@16 E F G H I J K H L H M ~@16 E F G H I J K H L H M ~@11>".pickRestart({
  A: "f4 a3 d4 e4 f4 d4 e4 f4, ~ db3 c3 b2",
  B: "[d4,g4] ~ [d4,g4]@2 ~ f4 e4@2 [b3,f4] ~ [b3,f4]@2 e4@2 d4@2, bb2 a2 ab2@2", // G5 Bdim
  C: "f4 a3 d4 a3 e4 g3 db4 g3, a2@7 ~ a2@7 ~", D: "[d2,a3,d4,f4] [a2,a3,db4]",
  E: "~@2 a4 ~ d5 ~ gb5@2 a5 ~ g5 gb5 e5 gb5 d5@2", F: "~@2 a4 ~ e5 ~ a5@2 a5 ~ e5 d5 db5 e5 a4@2",
  G: "~ gb4 b4 gb4 d5 gb4 gb5 gb4 e5 gb4 d5 gb4 db5 gb4 b4@2", H: "~ d4 g4 d4 b4 d4 d5 d4 c5 d4 b4 d4 a4 d4 g4@2",
  I: "~@2 f4@2 bb4 ~ f5 ~ f5@2 eb5 d5 c5 d5 bb4@2", J: "~ b4 d5 b4 g5 b4 b5 b4 a5 b4 g5 b4 gb5 b4 g5@2",
  K: "~@2 d5 ~ f5 ~ d6 ~ d6 ~ c6 bb5 a5 bb5 f5@2", L: "~ f4 bb4 f4 d5 f4 f5 f4 eb5 f4 d5 f4 c5 f4 bb4 f4",
  M: "~@2 a4 ~ e5 ~ a5 ~ a5 ~ e5 d5 db5 e5 a4@2",
})).s("gm_synth_brass_2").gain(0.31)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@2 A B C D E F G H I J C D E F K L M N ~@11 C D E F G H I J C D E F K L M N ~@11 O P Q R S O T U V@2 ~
>`.pickRestart({
  A: "~ a3 d4 a3 ~ g3 db4 g3, [a2,f4]@7 ~ [a2,e4]@7 ~", B: "~ a3 ~ a3 ~ a3 ~ a3, d2 [a2,d4,f4,a4] e2 [a2,db4,e4,a4]",
  C: "d2 a3 [e2,d4,f4,a4] a3 f2 a3 [d2,d4,f4,a4] a3", D: "g2 g3 [a2,bb3,d4,g4] g3 bb2 g3 [g2,bb3,d4,g4] g3",
  E: "c2 g3 [d2,c4,e4,g4] g3 e2 g3 [c2,c4,e4,g4] g3", F: "f2 c4 [g2,f4,bb4] c4 a2 c4 [f2,f4,a4] c4",
  G: "a2 a3 [b2,d4,e4,a4] a3 db3 a3 [a2,d4,e4,a4] a3", H: "~ a3 [d4,f4,a4] a3 ~ a3 [d4,f4,a4] a3, d3 c3",
  I: "~ g3 [bb3,d4,g4] g3 ~ ab3 [b3,d4,f4] ab3, bb2 ab2", J: "~ a3 [d4,f4] a3 ~ g3 [db4,e4] g3, a2@4 a2@3 ~",
  K: "a2 a3 [b2,d4,e4,a4] a3 db3 a3 [a2,d4,e4,g4] a3", L: "d3 a3 [d3,d4,f4,a4] a3 c3 a3 [c3,d4,f4,a4] a3",
  M: "bb2 g3 [bb2,bb3,d4,g4] g3 ab2 ab3 [ab2,b3,d4,f4] ab3", // Gm Abdim
  N: "~ a3 [d4,f4] a3 ~ a3 [db4,e4] [a2,a3], a2@3 ~ a2@2 ~@2", O: "[d5,f5] a4 [d5,f5] a4 [d5,f5] a4 [d5,f5] a4",
  P: "[d5,g5]@2 bb4@2 [d5,g5]@2 bb4@2 [d5,g5]@2 bb4@2 g5@2 bb4 ~, ~@3 d5", // G5
  Q: "[e5,g5] c5 [e5,g5] c5 [e5,g5] c5 [e5,g5] c5", R: "[f5,bb5] c5 [f5,bb5] c5 [f5,a5] c5 [f5,a5] c5",
  S: "[db5,e5] a4 [db5,e5] a4 [db5,e5] a4 [db5,e5] a4", T: "[d5,g5] bb4 [d5,g5] bb4 [d5,f5] ab4 [d5,f5] ab4",
  U: "[d5,f5] a4 [d5,f5] a4 [db5,e5] a4 [db5,e5] a4", // Dm Dbm
  V: "[d4@2 e4@3 ~ f4@2 g4@2 d5@2 e5@2 ~@10 d6@8, ~@7 f5@9, ~ a5]/2",
})).s("gm_acoustic_guitar_nylon").gain(0.51).pan(0.6)

// bass · acoustic bass
const bass = note(`<
  ~@4 A B C D E F G H A I C J K L M N O P Q R S R T R U R V A B C D E F G H A I C J K L M N O P Q R S R T R U R V A I C
  D W X Y Z AA AB ~
>`.pickRestart({
  A: "d2 e2 f2 d2", B: "g2 a2 bb2 g2", C: "c2 d2 e2 c2", D: "f2 g2 a2 f2", E: "a2 b2 db3 a2",
  F: "d3@4 d3@2 ~ d3 c3@4 c3@2 ~ c3", G: "bb2@4 bb2@2 ~ bb2 ab2@3 ~ ab2@4", H: "a2@4 a2@2 ~ e2 a1@4 a2@4",
  I: "g2@4 a2@4 bb2@4 g2@3 g2", J: "f2@3 ~ g2@4 a2@4 f2@2 a2 f2", K: "a2@4 b2@4 db3@4 a2@2 ~ a2",
  L: "d3@6 ~ d3 c3@6 ~ c3", M: "bb2@6 ~ bb2 ab2@6 ~ ab2", N: "a2@6 ~ a2 a1@6 ~ a2",
  O: "[d2,d3]@6 ~@2 [d2,d3]@5 ~ [d2,d3] ~", P: "[a1,a2]@6 ~@2 [db2,db3]@5 ~ [a1,a2] ~",
  Q: "[b1,b2]@6 ~@2 [b1,b2]@5 ~ [a1,a2]@2", R: "[g1,g2]@7 ~ [g1,g2]@5 ~ [g1,g2]@2",
  S: "[bb1,bb2]@8 [bb1,bb2]@5 ~ [c2,c3]@2", T: "[bb1,bb2]@8 [bb1,bb2]@3 ~ [a1,a2]@2 [bb1,bb2]@2",
  U: "[bb1,bb2]@7 ~ [bb1,bb2]@5 ~ [c2,c3]@2", V: "[a1,a2]!2", W: "a2@2 b2@2 db3@2 a2 db3", X: "d3@5 ~ d3@2 c3@5 ~ c3@2",
  Y: "bb2@5 ~ bb2@2 ab2@4 ~@2 ab2@2", Z: "a2@7 ~ a2@7 ~", AA: "d2", AB: "d3",
})).s("gm_acoustic_bass").gain(0.31).pan(0.2)

// chords · pad halo
const pad_halo = note("<~@20 A@2 B C D E F G@2 H I ~@16 A@2 B C D E F G@2 H I J@2 K L@2 M N O P@2 ~>".pickRestart({
  A: "[[d3,d4,gb4,a4]@13 ~ [d3,d4,gb4,a4] ~ [a2,e3,db4,e4,a4]@13 ~ [a2,db4,e4,a4] ~, a3@15 ~]/2", // D A
  B: "[b2,gb3,d4,gb4,b4]@11 ~ [b2,d4,gb4,b4]@3 ~", C: "~@12 g2@3 ~, [d3,d4,g4,b4]@15 ~, g2@11 ~@5, ~@8 g3@7 ~",
  D: "[bb2,f3,d4,f4,bb4]@13 ~@3", E: "~@12 g2@3 ~, [d3,d4,g4,b4]@15 ~, g2@3 ~, ~@8 g3@7 ~", F: "[bb2,d4,f4,bb4]@3 ~",
  G: "[~@12 g2@3 ~ [bb2,f3,f4,bb4]@13 ~@3, d4@7 ~, [d3,g4,b4]@15 ~@17, g2@11 ~@21, ~@8 g3@7 ~@17]/2", // Bb5 G
  H: "~@12 g2@3 ~, [d4,g4,b4]@15 ~, g2@11 ~@5, ~@8 g3@7 ~", I: "[a2,e3,e4,a4,db5]",
  J: "[[d4,f4,a4]@12 ~ a4 f4 ~ [d3,bb3,g4,bb4]@15 ~, [d3,a3]@15 d4@17]/2", K: "[e4,g4,c5]@12 ~ c5 g4 e4, [c3,g3]@15 ~",
  L: "[bb4@5 ~ bb4@2 a4@8 [e4,db5]@12 ~ db5 a4 e4, [f3,f4]@15 ~ e3@15 ~, ~ a3@3]/2", // Dbm F
  M: "~@2 f4@2 ~ d5 a4 f4 ~@2 f4@2 ~ c5 ~ f4, d3@3 ~ d3@3 ~, d5@2 a3@3 ~ a3 ~, ~@4 c5@2 ~ a4",
  N: "[d3,bb3,bb4]@7 ~ [d3,ab3,ab4,b4,d5]@8", O: "[d3,a3,f4,a4,d5]@7 ~ [a2,e3,g4,a4,db5]@7 ~",
  P: "[d3@7 ~@5 d3@4, [d2,a2,a4,d5,f5]]/2", // Dm
})).s("gm_pad_halo").gain(0.31)

// chords · epiano2
const epiano2 = note("<~@31 A B C D E F G H I J K L M N O P ~@22>".pickRestart({
  A: "a5 ~@2 d5 a5 ~@2 d5, d4 a4 d4 a4, ~ f5@2 ~@2 f5@2 ~", B: "bb5@5 d5 g5 d5 bb5@2 d5@4 g5@2, [d4,bb4] ~",
  C: "~ c5 e5 g5 ~ c5 e5 g5 ~ c5 e5 g5 c4@2 c5 ~, c4@3 ~, c6@4 [e4,bb5]@3 ~ [e4,bb5]@3 ~@5", // Edim
  D: "[c4,f5,bb5]@4 ~@2 [f5,bb5]!2 c4@4 f4@2 c4 ~, f4@3 ~ f4@4 [f5,a5]@6 ~@2", // Fsus4 Bb5 F
  E: "[d4,e4,a4]@2 ~ d4@5 db4@4 ~ [d4,a4] a3 [db4,a4], ~@3 [e4,a4]@7 ~@3 e4@2 ~", // Dsus2 D5 Gbm A5
  F: "[d4,f4,a4]@4 a3@2 [d4,f4,a4] ~ [c4,f4,a4]@4 a3@2 ~@2", // Dm F
  G: "[bb3,d4,g4]@4 g3@2 [bb3,d4,g4]@2 [b3,d4,f4]@4 ~ [d4,f4]@2 b3, ~@6 f3 ~, ~@13 b3 ~@2", // Gm Bdim Dm
  H: "~@2 d4 f4 ~ d4 ~ d4 ~@4 db4@2 a3 ~, a4 a3 ~@2, ~@3 f4 [e4,a4]@3 ~", // A5
  I: "~@5 d4 e4 f4 ~@2 f4@2 e4@2 d4@2, a4@4 a4@3 ~, ~ a3 ~@2",
  J: "bb3@2 ~@2 a3 d4 g4 a4 bb4@2 d4@2 [g3,g4]@2 bb4 ~, bb4 ~", // G
  K: "~@5 e4 g4 e4 ~@2 e4@2 g3 e4 ~ e4, c5@6 ~@2 c5@7 ~, ~@2 g3@3 ~@3", L: "[f4,bb4]@2 ~ [f4,bb4] [f4,a4]@3 ~",
  M: "~ d4 e4 d4 ~@2 d4@2 a3 e4@3 ~@2 [a3,d4]@2, a4 a4@3", N: "~@6 d4@2 ~@4 a3@2 [c4,f4] ~, f4@3 ~@5, ~@2 a3@2 c4@3 ~",
  O: "[bb3,d4,g4]@2 ~ [bb3,d4,g4]@3 [bb3,d4]@2 [b3,d4,f4]@2 ~ [d4,f4,ab4]@3 ~@2", // Gm Bb Bdim Ddim
  P: "[d4,f4,a4]@2 ~ [f4,a4] [db4,e4,g4,a4]@2 a3 db4, ~ a3 ~@2", // Dm F A7
})).s("gm_epiano2").gain(0.31)

// other · lead 3 calliope
const lead_3_calliope = note("<~@47 A B C D E F G D H D I ~@11>".pickRestart({
  A: "~@2 a4 ~ d5 ~ gb5@2 a5 ~ g5 gb5 e5 gb5 d5@2", B: "~@2 a4 ~ e5 ~ a5@2 a5 ~ e5 d5 db5 e5 a4@2",
  C: "~ gb4 b4 gb4 d5 gb4 gb5 gb4 e5 gb4 d5 gb4 db5 gb4 b4@2", D: "~ d4 g4 d4 b4 d4 d5 d4 c5 d4 b4 d4 a4 d4 g4@2",
  E: "~@2 f4@2 bb4 ~ f5 ~ f5@2 eb5 d5 c5 d5 bb4@2", F: "~ b4 d5 b4 g5 b4 b5 b4 a5 b4 g5 b4 gb5 b4 g5@2",
  G: "~@2 d5 ~ f5 ~ d6 ~ d6 ~ c6 bb5 a5 bb5 f5@2", H: "~ f4 bb4 f4 d5 f4 f5 f4 eb5 f4 d5 f4 c5 f4 bb4 f4",
  I: "~@2 a4 ~ e5 ~ a5 ~ a5 ~ e5 d5 db5 e5 a4@2",
})).s("gm_lead_3_calliope").gain(0.26).pan(0.6)

// drums · kick
const kick = s("bd").struct("<x!68 ~>").gain(0.2)

// drums · pedal hat
const pedal_hat = s("hh").struct("<[x!4]!68 ~>").gain(0.2)

stack(synth_brass_2, acoustic_guitar_nylon, bass, pad_halo, epiano2, lead_3_calliope, kick, pedal_hat)

More by Maxime Le Forestier