Strudelify
KeyA minorTempo135 bpm
0:00/0:00
// Let Me Be Free — 2 Brothers on the 4th Floor
// 135 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 115 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(135/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@9 A B C D A B C D E A B C D A B C D F G F G F G F G F G F G F G F ~ A H C I A H C I A B C D A B C D A B C D A B C D
  F G F G F G F G F G F G F G F ~ A B C D A B C D A H C I A H C I A B C D A B C D A B C D A B C D E
>`.pickRestart({
  A: "a2@2 ~ a2 ~@2 a2 ~ a2@2 ~ a2 ~@2 a2 ~", B: "f2@2 ~ f2 ~@2 f2 ~ f2@2 ~ f2 ~@2 f2 ~",
  C: "g2@2 ~ g2 ~@2 g2 ~ g2@2 ~ g2 ~@2 g2 ~", D: "e2@2 ~ e2 ~@2 e2 ~ e2@2 ~ e2 ~@2 g2 ~", E: "a1@3 ~",
  F: "a2@2 ~ a2 ~@2 g2 ~ a2@2 ~ a2 ~@2 g2 ~", G: "a2@2 ~ a2 ~@2 g2 ~ a2 d3@2 ~ d3 ~ d3 ~",
  H: "d3@2 ~ d3 ~@2 d3 ~ d3@2 ~ d3 ~@2 d3 ~", I: "e3@2 ~ e3 ~@2 e3 ~ e3@2 ~ e3 ~@2 c3 ~",
})).s("gm_synth_bass_2").gain(0.4)

// chords · rock organ · "ORGAN 3"
const rock_organ = note("<~@34 A B A B A B A C ~@32 A B A B A B A C ~@33>".pickRestart({
  A: "[a4,c5,e5]!2 ~ [a4,c5,e5] c5 ~ [a4,c5,e5]!4 ~ [a4,c5,e5] c5 ~ [a4,c5,e5]!2", // Am
  B: "[a4,c5,e5]!2 ~ [a4,c5,e5] c5 ~ [a4,c5,e5]!3 [d5,f5,a5] ~ f5 [d5,f5,a5] ~ [d5,f5,a5]!2", C: "[a4,c5,e5]!2 ~@14",
})).s("gm_rock_organ").gain(0.39)

// chords · rock organ · "ORGAN 3" · soft notes
const rock_organ_soft = note("<~@34 A B A B A B A ~@33 A B A B A B A ~@34>".pickRestart({
  A: "~@4 [a4,e5] ~@7 [a4,e5] ~@3", B: "~@4 [a4,e5] ~@6 [d5,a5] ~@4",
})).s("gm_rock_organ").gain(0.26)

// chords · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  ~ A B C D A B C D A B C D A B C D E ~@4 A B C D ~@16 A F C D A F C D A B C D A B C D ~@4 A B C D ~@20 A B C D A F C D
  A F C D A B C D A B C D A B C D A B C D E
>`.pickRestart({
  A: "[a3,c4,e4]", B: "[f3,a3,c4]", C: "[g3,b3,d4]", D: "[e3,g3,b3]", E: "[a3,c4,e4]@3 ~", F: "[d3,f3,a3,c4]",
})).s("gm_pad_poly").gain(0.48)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@9 A B C D E B C D F ~@8 G@15 H G@8 A B C D E B C D F ~@7 G@15 H ~@8 G@8 A B C D E B C D E B C D E B C D F
>`.pickRestart({
  A: "~@2 a4 ~ c5 a4 e5 c5 ~ e5 a4 ~ c5 a4 e5 c5", B: "~ e5 f4 ~ a4 f4 c5 a4 ~ c5 f4 ~ a4 f4 c5 a4",
  C: "~ c5 g4 ~ b4 g4 d5 b4 ~ d5 g4 ~ b4 g4 d5 b4", D: "~ d5 e4 ~ g4 e4 b4 g4 ~ b4 e4 ~ g4 e4 b4 g4",
  E: "~ b4 a4 ~ c5 a4 e5 c5 ~ e5 a4 ~ c5 a4 e5 c5", F: "~ b4 ~@14", G: "e4!16", H: "e4!3 ~@13",
})).s("gm_lead_2_sawtooth").gain(0.48).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@18 A@7 B A@15 C A@15 B A@7 B A@15 C A@7 B A@16 ~@9>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x ~@5 x ~ x!3 ~ x ~@3",
})).gain(0.64)

// drums · clap
const clap = s("cp").struct(`<
  ~@8 A ~@8 B ~@3 B ~@3 B ~@7 B ~@7 B ~@7 A ~@7 B ~@3 B ~@3 B ~@7 B ~@7 B ~@3 B ~@3 B ~@7 A ~@7 B ~@9
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~@9", B: "~@12 x ~@2 x",
})).gain(0.48)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@8 [~@9 x ~@2 x ~@3] ~@40 [~@9 x ~@2 x ~@3] ~@47 [~@9 x ~@2 x ~@3] ~@17>")
  .gain(0.24)

// drums · snare
const snare = s("sd").struct(`<
  ~@18 A B A B A B A C A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B A B A C A B A B A B A C A B A B A B A B A
  B A B A B A ~ A B A B A B A C A B A B A B A B A B A B A B A B ~@9
>`.pickRestart({
  A: "~@4 x ~@4 x ~@2 x ~@3", B: "~@4 x ~@2 x ~ x ~@2 x ~@3", C: "~@4 x ~@2 x ~ x ~@6",
})).gain(0.56)

// drums · hihat
const hihat = s("hh").struct("<~@18 A@7 B A@15 C A@15 B A@7 B A@15 C A@7 B A@16 ~@9>".pickRestart({
  A: "x!16", B: "x!13 ~@3", C: "x",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@18 A@7 B A@15 ~ A@15 B A@7 B A@15 ~ A@7 B A@16 ~@9>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct("<~@18 A ~@7 A ~@15 A ~@7 A ~@7 A ~@7 A ~@15 A ~@7 A ~@7 A ~@16>".pickRestart({
  A: "x",
})).gain(0.48)

stack(
  bass, rock_organ, rock_organ_soft, pad_poly, lead_2_sawtooth, kick, clap, clap_soft, snare, hihat, open_hat, crash
)

More by 2 Brothers on the 4th Floor