Strudelify

Celine

Hugues Aufray

KeyF minorTempo120 bpm
0:00/0:00
// Celine — Hugues Aufray
// 120 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// chords · acoustic guitar nylon · "** OK **"
const acoustic_guitar_nylon = note(`<
  A B C D E F G H I J K L M N O P Q J R S K S E F G H M J K L M N O T Q J R S K S E F G H M J U L M N O P Q J R S K S E
  F G H M J U L M N O P Q J R S R S
>`.pickRestart({
  A: "db5 f3 db5 f3 db5 f3 [bb3,c5] [f3,bb4], bb2@3 ~ bb2@3 ~, ~@2 bb3@3 ~@3", // Bbsus2 Bb5
  B: "ab4 c3 ab4 c3 ab4 c3 [f3,g4] [c3,f4], f2@7 ~ f2@6 ~@2, ~@4 f3@7 ~@5", // Fsus2 F5
  C: "~ bb2 ~ [bb2,f4] g4 [bb2,f4] [eb3,eb4] [bb2,g4], [eb2,eb4]@7 ~ eb2@6 ~@2, ~@2 eb3@3 ~@3", // Bb5 Eb
  D: "[f2,f3,f4]@2 ~@2 [f2,f3,f4]@2 ~@2 [f2,f3,f4]@3 ~@5", E: "f2 c3 ~ c3 f2 c3 ~ c3, ~ f3 ~ f3",
  F: "f2 c3 ~ c3 ~ c3 f3 c3, ~ f3 f2 ~", G: "f2@2 c3@2 f3@2 c3@2 ~@2 c3@2 ~@2 c3 ~, ~@2 f2 f3",
  H: "~ f3 ~ f3 ~ f3 ~ f3, bb2@3 ~ bb2@3 ~, ~@4 bb3@5 ~@3 bb3@4",
  I: "~@2 f3@2 ~@2 f3@2 ~@2 f3@2 bb3@2 f3 ~, bb2@3 ~ bb2@3 ~, ~ bb3 ~@2",
  J: "~ c3 ~ c3 ~ c3 f3 c3, f2@3 ~ f2@3 ~, ~ f3 ~@2", K: "~ bb2 ~ bb2 ~ bb2 eb3 bb2, eb2@7 ~ eb2@6 ~@2, ~@4 eb3@5 ~@7",
  L: "f3@2 ~@2 f3@3 ~ e3@3 ~ eb3@2 ~@2, f2@3 ~",
  M: "~@2 f3@2 ~@2 f3@2 ~@2 f3@2 bb3@2 f3 ~, bb2@3 ~ bb2@3 ~, ~@4 bb3@5 ~@7",
  N: "~@2 c3@2 ~@2 c3@2 ~@2 c3@2 f3@2 c3 ~, f2@3 ~ f2@3 ~, ~@4 f3@5 ~@7",
  O: "eb2 ~ ab2@2 ~@2 ab2@2 ~@2 ab2@2 ~@2 ab2@2, db2@7 ~ db2@6 ~@2, ~@2 db3@3 ~ db3@2",
  P: "~@2 c3@2 ~@2 c3@2 ~@2 c3@2 ~@2 c3 ~, f2@2 f3@2 f2@3 ~, ~@3 f3",
  Q: "~@2 f3@2 ~@2 f3@2 ~@2 f3@2 bb3@2 f3 ~, bb2@6 ~@2 bb2@7 ~, ~@4 bb3@5 ~@7",
  R: "~@2 bb2@2 ~@2 bb2@2 ~@2 bb2@2 eb3@2 bb2 ~, eb2@3 ~ eb2@3 ~, ~@4 eb3@5 ~@7",
  S: "[f2,f3] ~ [f2,f3] ~ [f2,f3]@2 ~@2", T: "f2@2 c3@2 ~@2 c3@2 ~@2 c3@2 ~@2 c3 ~, ~@2 f3@2 f2@3 ~, ~@3 f3",
  U: "~ bb2 ~ bb2 ~ bb2 eb3 bb2, eb2@3 ~ eb2@3 ~, ~@4 eb3@5 ~@7",
})).s("gm_acoustic_guitar_nylon").gain(0.51).pan(0.4)

// chords · string ensemble 2 · "** OK **"
const string_ensemble_2 = note("<~@38 A B C D E F G H I J ~@28>".pickRestart({
  A: "[eb2,bb4,g5]@3 ~ [eb2,bb4,g5]@2 ~@2 [eb2,g5]@2 f5@2 eb5@2 g5 ~, ~@8 bb4@4 eb2 ~@3", // Eb
  B: "f5@4 [ab4,f5]@2 ~@2 [f2,ab4,f5]@5 ~@3, f2 ~@3 f2 ~@11", C: "f2@13 ~ f3@2, [c4,f4]", D: "f2@13 f3@3, [c4,f4]@15 ~",
  E: "[f2,c4,f4]@13 [f2,f4]@3, ~@13 c4 ~@2", F: "[bb2,bb3,db4]@15 ~", G: "[bb2,bb3,db4]@14 [bb3,db4] ~, f4, ~@7 bb2",
  H: "[ab3,c4,f4]@14 ~ bb3, f2@11 ~@5", I: "[eb2,bb3,eb4,g4]@15 ~", J: "[f2,ab3,c4,f4] [f3,f4] [e3,e4] [eb3,eb4]",
})).s("gm_string_ensemble_2").gain(0.2)

// chords · synth brass 2 · "** OK **"
const synth_brass_2 = note("<~@48 A B C@2 D@2 E F G H ~@8 A I C@2 D@2 E F E F>".pickRestart({
  A: "bb2@5 ~@5 bb2@2 ~@2 bb2@2, [db4,f4,bb4]@15 ~, ~@3 f3", B: "f2@5 ~@7 f3@4, [c4,f4,ab4], ~@3 f2@4 ~",
  C: "[~@12 db3@3 ~@13 c3@2 ~@2, f4@31 ~, [db4,ab4]@16 ab4@15 ~, db3@9 ~@7 c4@13 ~@3, ~@3 ab3@5 c3@3 ab3@5]/2", // Db5
  D: "[bb2@7 ~@3 f3@2 ~@2 f3@2 f2@12 f3@2 f2 ~, f4, [db4,bb4] [c4,ab4], ~@3 bb2 ~@4]/2", // Gb Fm
  E: "~@6 eb2 ~, [eb4,g4,bb4]@15 ~, eb2@5 ~@3, ~@8 eb3@7 ~", // Eb
  F: "[f2,f3,c4,f4,ab4]@3 ~ f3 ~ f3 ~ [f2,f3,c4,f4,ab4]@4 ~@4, ~ [f2,c4,f4,ab4] ~@2", // Fm
  G: "bb3@4 g5@3 ~ g5 ~ f5@2 [bb3,eb5]@2 g5@2, [eb3,g3]@7 ~ eb3@4 ~@2 eb3 ~, g5@3 ~ eb4@8 ~@4", // Eb5 Eb
  H: "f5@3 ~ f5@3 ~ [f2,f5]@5 ~@3, f2@3 ~@5, ~@4 f3@9 ~@3", I: "f2 ~@2 f3, [c4,f4,ab4], ~@3 f2@4 ~",
})).s("gm_synth_brass_2").gain(0.15)

// other · oboe · "** OK **"
const oboe = note("<~@58 A B A C D E F G ~@10>".pickRestart({
  A: "f4 g4 ab4 g4 f4 g4 ab4 bb4", B: "c5@6 bb4 ~ c5@7 ~", C: "c5@4 bb4@5 ~ ab4@2 g4@2 f4@2", D: "bb4@3 ab4@2 g4 f4 g4",
  E: "c5@2 bb4@2 ab4@5 ~@3 ab4@2 g4 ~", F: "g4@4 bb4@2 ab4@2 g4@2 f4@2 ab4@2 g4 ~", G: "f4@3 ~ f4@4 e4@4 eb4@3 ~",
})).s("gm_oboe").gain(0.1)

// other · acoustic guitar steel · "** OK **"
const acoustic_guitar_steel = note("<~@66 A B C D E F G H G H>".pickRestart({
  A: "f5@2 bb4 ~@3 bb4 ~ f5 ~ bb4 ~@3 bb4 ~", B: "c5@3 ~ ab4@4 f4@3 ~@5", C: "f5@2 db5 ~@3 db5 ~ f5@2 db5 ~@3 db5 ~",
  D: "ab5@4 f5@4 c5@3 ~@5", E: "f5@3 ~ db5 ~ f5 ~@3 db5 ~ f5@2 db5 ~", F: "c5@4 ab4@4 f4@2 ab4@5 ~",
  G: "g4@3 ~ bb4@2 eb4@3 ~ eb4 ~ g4@2 bb4 ~", H: "ab4@4 c5@3 ~ f5@5 ~@3",
})).s("gm_acoustic_guitar_steel").gain(0.26)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@12 [x!4]!10 ~@8 [x!4]!28 ~@8 [x!4]!8 ~@2>").gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@12 x!10 ~@8 x!28 ~@8 x!8 ~@2>").gain(0.15)

stack(acoustic_guitar_nylon, string_ensemble_2, synth_brass_2, oboe, acoustic_guitar_steel, pedal_hat, high_tom)