Strudelify

Encore Une Fois

SASH!

KeyB minorTempo130 bpm
0:00/0:00
// Encore Une Fois — SASH!
// 130 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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.

// bass · synth bass 1 · "synthbass"
const bass = note(`<
  ~@2 A@16 ~@3 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A@17 B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@2
>`.pickRestart({
  A: "~ b1 ~ b1 ~ b1 ~ b1", B: "~ d2 ~ d2 ~ e2 ~ e2",
})).s("gm_synth_bass_1").gain(0.54)

// chords · pizzicato strings · "pizzicato"
const pizzicato_strings = note(`<
  ~@2 A@17 B ~ C D C E C D C E C D C E C D C E C D C E C D C E C D C E C D C E ~@16 A@15 F C D C E C D C E C D C E C D C
  E C D C E C D C E C D C E C D C E ~@2
>`.pickRestart({
  A: "~@2 [b3,f#4] ~@4 [b3,f#4] ~@8", B: "~@2 [b3,f#4] ~@3 [b3,f#4] ~@3 [b3,f#4] ~@3 [b3,f#4] ~",
  C: "~@2 [d5,f#5] ~ [d5,f#5] ~@2 [d5,f#5] ~@2 [d5,f#5] ~ [d5,f#5] ~@2 [d5,f#5]", // D
  D: "~@2 [f#5,a5] ~ [f#5,a5] ~@2 [e5,g#5] ~@2 [e5,g#5] ~ [e5,g#5] ~@2 [e5,g#5]", // F#m E
  E: "~@2 [f#5,a5] ~ [f#5,a5] ~@2 [g#5,b5] ~@2 [g#5,b5] ~ [g#5,b5] ~@2 [g#5,b5]", F: "~@2 [b4,f#5] ~@4 [b4,f#5] ~@8",
})).s("gm_pizzicato_strings").gain(0.72)

// bass · lead 8 bass lead · "bass&lead"
const bass_2 = note(`<
  ~@5 A B@4 C@8 B ~@2 B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D
  B@8 C@8 B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D ~@2
>`.pickRestart({
  A: "~@9 b3 b2!2 b3 b2!3", B: "b3 ~ b3 ~@6 b3 b2!2 b3 b2!3",
  C: "[b3 ~ b3 ~@6 b3 b2!2 b3 b2!3 b3 ~ b3 ~@6 b3 b2!2 b3 b2!3 b3 ~ b3 ~@6 b3 b2!2 b3 b2!3 b3 ~ b3 ~@6 b3 b2!2 b3 b2!3 b3 ~ b3 ~@6 b3 b2!2 b3 b2!3 b3 ~ b3 ~@6 b3 b2!2 b3 b2!3 b3 ~ b3 ~@6 b3 b2!2 b3 b2!3 b3 ~ b3 ~@6 b3 b2!2 b3 b2!3, [b4,d5]]/8", // Bm
  D: "c#4 ~ c#4 ~@6 b3 b2!2 b3 b2!3",
})).s("gm_lead_8_bass_lead").gain(0.52)

// drums · kick
const kick = s("bd").struct("<~@2 A@3 B A@3 ~ A@8 C D ~ A@32 ~@16 A@3 ~ A@3 ~ A@39 E D ~>".pickRestart({
  A: "x!4", B: "x!2 ~@2", C: "x ~ x!2", D: "x", E: "x ~ x!3 ~ x!2",
})).gain(0.73)

// drums · snare
const snare = s("sd").struct("<~@11 A B@6 ~@60 A B@6 ~@25 A B@6 ~@2>".pickRestart({
  A: "~@2 x!14", B: "x!16",
})).gain(0.29)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@10 A B ~@65 A B ~@30 A B ~@8>".pickRestart({
  A: "x!16", B: "x!2 ~@14",
})).gain(0.22)

// drums · clap
const clap = s("cp").struct("<A B A@7 ~ A@8 ~@3 A@32 ~@16 A@3 ~ A@3 ~ A@40 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.65)

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

// drums · open hat
const open_hat = s("oh").struct("<~@6 [~ x ~ x ~ x ~ x]!12 ~@3 [~ x ~ x ~ x ~ x]!96 ~@2>").gain(0.44)

// drums · crash
const crash = s("cr").struct("<~@6 A ~@3 B@8 C A ~ B@32 A ~@14 D A ~@7 B@40 A ~>".pickRestart({
  A: "x", B: "x!8", C: "x ~ x!2", D: "x!4",
})).gain(0.44)

// drums · congas
const congas = s("conga:13").struct("<~@2 A@3 B A@3 ~ A@8 ~@3 A@32 ~@16 A@3 ~ A@3 ~ A@40 ~@2>".pickRestart({
  A: "~@2 x ~ x ~@2 x ~@2 x ~@3 x ~", B: "~@2 x ~ x ~@2 x ~@8",
})).gain(1.86)

// drums · whistle
const whistle = s("ballwhistle:0").struct("<[x!4 ~@12] ~@118>").gain(0.85)

stack(bass, pizzicato_strings, bass_2, kick, snare, snare_soft, clap, hihat, open_hat, crash, congas, whistle)