Strudelify

Freed From Desire

Gala

KeyD minorTempo133 bpm
0:00/0:00
// Freed From Desire — Gala
// 133 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(133/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 · piano · "PIANO2"
const piano = note(`<
  ~@12 A@2 B C D@2 E F G H I J G H K L G H I J G H I M ~@24 G H I J G N I J G H I J G H K L G H I J G N I M ~@17
>`.pickRestart({
  A: "[[d3,d4,f4] [d2,c4], a4@31 ~, ~@16 e4@11 ~@5]/2", B: "[bb2,bb3,d4,f4]", C: "[c3,e4,g4], c4@7 ~",
  D: "[[d3,d4,f4] [d2,c4], a4@31 ~, ~@16 e4@13 ~@3]/2", E: "[bb2,d4,f4], bb3@7 ~", F: "[c3,c4,e4,g4]",
  G: "[d4,f4,a4]@3 ~ [d4,f4,a4]@2 ~ [d4,f4,a4]@2 ~ [d4,f4,a4]@2 ~@2 [d4,f4,a4] ~, d3", // Dm
  H: "[c4,e4,a4]@3 ~ [c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~@2 [c4,e4,a4] ~, d2", // Am
  I: "[bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@2 ~ [bb3,d4,f4]@2 ~ [bb3,d4,f4]@2 ~@2 [bb3,d4,f4] ~, bb2", // Bb
  J: "[c4,e4,g4]@2 ~@2 [c4,e4,g4]@2 ~ [c4,e4,g4]@2 ~ [c4,e4,g4]@2 ~@2 [c4,e4,g4] ~, c3", // C
  K: "[bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@2 ~ [bb3,d4] ~@2 [bb3,d4,f4]@2 ~@2 [bb3,d4,f4] ~, bb2, ~@7 f4@2 ~@7", // Bb
  L: "[c3,c4,e4,g4]@5 ~@11", M: "[c3,c4,e4,g4]@3 ~@13",
  N: "[c4,e4,a4]@3 ~ [c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~@2 [c4,e4,a4] ~, d2@15 ~", // Am
})).s("gm_piano").gain(0.57).pan(0.4)

// bass · lead 8 bass lead · "BASS&LEAD"
const bass = note(`<
  ~@28 A B C D C E C F G@2 H I H@2 G J K G H I H@2 G J K G H I H@2 G J A B C D A B C D A B C D C E C F A B C D C E C F
  ~@8 K G H I H@2 G L M
>`.pickRestart({
  A: "d2@2 ~ d2@2 ~ d2@2 a2@2 ~ a2@2 ~ a2 ~", B: "f2@2 ~ f2@2 ~ f2 ~ c2@2 ~ c2@2 ~ c2 ~",
  C: "d2@2 ~ d2@2 ~ d2 ~ a2@2 ~ a2@2 ~ a2 ~", D: "g2@2 ~ g2@2 ~ g2 ~ c2@2 ~ c2@2 ~ c2 ~",
  E: "f2@2 ~ f2@2 ~ f2 ~ c2@2 ~ c2 ~@2 c2 ~", F: "c2 ~@7", G: "d2@2 d3 d2@2 ~ f3 ~ d2@2 d3 d2 ~@2 f3 ~",
  H: "d2@2 d3 d2@2 ~ f3 ~ d2@2 d3 d2@2 ~ f3 ~", I: "d2@2 d3 d2 ~@2 f3 ~ d2@2 d3 d2@2 ~ f3 ~",
  J: "d2@2 d3 d2 ~@2 f3 ~ d2@2 d3 d2 ~@4", K: "~@2 d3 d2@2 ~ f3 ~ d2@2 d3 d2 ~@2 f3 ~",
  L: "d2@2 d3 d2 ~@2 f3 ~ d2@2 d3 d2 ~@2 f3 ~", M: "d2 ~@7",
})).s("gm_lead_8_bass_lead").gain(0.45)

// other · percussive organ · "ORGAN2"
const percussive_organ = note(`<
  A ~ B ~ A ~ B ~ A ~ B ~@25 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@33 A ~ B ~ A ~ B C D
>`.pickRestart({
  A: "[d4,d5,d6]@3 ~ [d4,d5,d6]@2 ~ [d4,d5,d6] ~@2 [d4,d5,d6] ~@3 [d4,d5,d6] ~", // D
  B: "[d4,d5,d6]@2 ~@2 [d4,d5,d6]@2 ~ [d4,d5,d6] ~@2 [d4,d5,d6] ~@3 [d4,d5,d6] ~", // D
  C: "~@4 [d4,d5,d6]@2 ~ [d4,d5,d6] ~@2 [d4,d5,d6] ~@3 [d4,d5,d6] ~", D: "[d4,d5,d6] ~@7",
})).s("gm_percussive_organ").gain(0.5).pan(0.3)

// chords · synth strings 1 · "SYNSTRING"
const synth_strings_1 = note(`<
  ~@12 A@2 B C D@2 E C F@2 B C D@2 E G F@2 E C H@2 E G ~@24 F@2 B C H@2 E C A@2 E C I@2 E G F@2 B C H@2 E G ~@17
>`.pickRestart({
  A: "[[d4,f4] [c4,e4], a3]/2", B: "[f3,bb3,d4]@15 ~", C: "[g3,c4,e4]",
  D: "[[d4,f4]@15 ~ e4@16, a3@31 ~, ~@15 c4@16 ~]/2", E: "[f3,bb3,d4]", F: "[[d4,f4]@15 ~ [c4,e4]@16, a3]/2",
  G: "[g3,c4,e4]@3 ~@13", H: "[[d4,f4]@15 ~ e4@16, a3, ~@15 c4@16 ~]/2",
  I: "[[d4,f4]@15 ~ e4@15 ~, a3, ~@15 c4@16 ~]/2", // Dm
})).s("gm_synth_strings_1").gain(0.27)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<A@36 ~@32 A@16 ~@17>".pickRestart({
  A: "[d6,d7]/4", // D
})).s("gm_string_ensemble_1").gain(0.41).pan(0.4)

// chords · pad sweep · "SWEEPPAD"
const pad_sweep = note("<~@22 A@6 ~@32 B C D E B F G@2 ~@2 A@6 B C D H B I@3 ~@17>".pickRestart({
  A: "[~@74 d4@7 ~@15, d4@31 ~ d4@42 ~@22, ~@17 d5@30 ~ d5@34 ~@14]/6", B: "[f4,a4,d5]", C: "[e4,a4,c5]@15 ~",
  D: "[d4,f4,bb4]@15 ~", E: "~ g4@14 ~, [e4,c5]@7 ~", F: "[e4,a4,c5]", G: "[[d4,f4,bb4]@15 [e4,g4,c5]@15 ~@2]/2",
  H: "[e4,g4,c5]@7 ~", I: "[[e4,a4,c5]@15 ~ [d4,bb4]@15 [e4,g4,c5]@15 ~@2, ~@5 f4@5 ~@6]/3",
})).s("gm_pad_sweep").gain(0.58).pan(0.6)

// other · lead 2 sawtooth · "SAWWAVE"
const lead_2_sawtooth = note("<~@44 A B A B A B A B A B A B A B A B ~@41>".pickRestart({
  A: "d3 ~ d3 d3@2 ~ f3 ~ d3@2 d3 d3@2 ~ f3 ~", B: "d3 ~ d3 d3@2 ~ f3 ~ d3 ~ d3 d3@2 ~ f3 ~",
})).s("gm_lead_2_sawtooth").gain(0.39).pan(0.6)

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

// drums · snare
const snare = s("sd").struct("<~@24 A B@2 C ~@7 B ~@23 D ~@7 D ~@4 A B@2 C ~@7 B ~@7 B ~@7 B ~>".pickRestart({
  A: "~@13 x!3", B: "x!16", C: "x", D: "~@6 x!10",
})).gain(0.5)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@24 [x!13 ~@3] ~@47 [x!13 ~@3] ~@28>").gain(0.29)

// drums · clap
const clap = s("cp").struct("<A@27 ~ A@31 B A@7 B A@3 B A@3 ~ A@24 ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.57)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@20 A B@3 A B@2 C A B@3 A B@2 A@2 B@3 A B@3 A B@3 A B@2 D A B@3 A B@2 A@2 B@3 A B@3 A B@3 A B@2 C A B@3 A B@3 A B@3 A
  B@3 A B@3 A B@3 ~
>`.pickRestart({
  A: "~ x!3", B: "x!4", C: "x", D: "~ x ~ x",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@20 [~ x ~ x ~ x ~ x]!7 ~ [~ x ~ x ~ x ~ x]!47 ~ [~ x ~ x ~ x ~ x]!24 ~>").gain(0.5)

// drums · crash
const crash = s("cr").struct(`<
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@2 A@2 ~@3 A ~@2 A@2 ~@3 A ~@3 A ~@3 A ~@2 B A ~@3 A ~@2 A@2 ~@2 A@2 ~@2 A@2
  ~@3 A ~@2 A@2 ~@3 A ~@2 A@2 ~@3 A ~@2 A@2 ~@3 A ~@3 A
>`.pickRestart({
  A: "x", B: "x!2",
})).gain(0.5)

// drums · ride
const ride = s("rd").struct("<~@12 [~ x!7] [x!8]!3 [~ x!7] [x!8]!3 ~@81>").gain(0.43)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@28 A B@3 A B@2 ~ A B@3 A B@3 A B@3 A B@2 C A B@3 A B@2 A@2 B@2 A@2 B@2 A@2 B@3 ~@4 A B@3 A B@2 ~ A B@6 ~ A B@7 ~
>`.pickRestart({
  A: "~ x!15", B: "x!16", C: "~ x!7 ~ x!7",
})).gain(0.5)

// drums · shaker
const shaker = s("sh").struct("<~@28 [x ~@3 x ~@3 x ~@3 x!3 ~]!44 ~@4 [x ~@3 x ~@3 x ~@3 x!3 ~]!24 ~>").gain(0.64)

stack(
  piano, bass, percussive_organ, synth_strings_1, string_ensemble_1, pad_sweep, lead_2_sawtooth, kick, snare,
  snare_soft, clap, pedal_hat, open_hat, crash, ride, tambourine, shaker
)