Strudelify

Forever Young

Interactive

KeyC majorTempo158 bpm
0:00/0:00
// Forever Young — Interactive
// 158 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 8 "WARM PAD" pad warm (copy of ch 6 "SLOWSTRING" string ensemble 2, 0.125 beats early)
// note: Full arrangement: all 139 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): DISTORTION.
setcpm(158/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 · distortion guitar · "DISTORTION"
const bass = note("<~@9 A@16 ~@40 B@6 C D E F E F E F E F G H G H G H G H ~@50>".pickRestart({
  A: "~ c2 ~ c2 ~ c2 ~ c2", B: "c2!2 c3 ~ c2!2 c3 ~ c2!2 c3 ~ c2!2 c3 ~",
  C: "c2 ~ c3 ~ c2!2 c3 ~ c2!2 c3 ~ c2!2 c3@2, ~ c2@2 ~@13",
  D: "~@2 c3@2 c2 ~ c3 ~ c2!2 c3 ~ c2@2 c3 ~, [c2,a#2]@2 ~@3 c2@2 ~@9, ~ c2@2 ~@13", // C7
  E: "c2!2 c3 ~ c2!2 c3 ~ c2!2 c3 ~ c2!2 c3@2", F: "~ c2 c3@2 c2!2 c3 ~ c2!2 c3 ~ c2!2 c3 ~, [c2,a#2] ~@7",
  G: "~ c2 c3 ~ c2!2 c3 ~ c2!2 c3 ~@2 c2 c3@2, [c2,g3] ~@5 [c2,d#3] ~", // C5 Cm
  H: "~ c2 c3@2 c2!2 c3 ~ c2!2 c3 ~ c2@2 c3 ~, [c2,a#2] ~@7", // C7
})).s("gm_distortion_guitar").gain(0.26)

// bass · synth bass 2 · "SYN BASS 2"
const bass_2 = note(`<
  ~@33 A B C D B E D F A B C D B E D F A B C D B E D F A B C D B E D ~ G@7 ~ G@12 ~@20 A B C D B E D F A B C D B E D F A
  B C D B E D F A B C D B E D B ~@2
>`.pickRestart({
  A: "c1 c2 c1 c2 c1 c2 c1 c2", B: "g1 g2 g1 g2 g1 g2 g1 g2", C: "a1 a2 a1 a2 a1 a2 a1 a2",
  D: "f1 f2 f1 f2 f1 f2 f1 f2", E: "d2 d3 d2 d3 d2 d3 d2 d3", F: "a1 a2 a1 a2 g1 g2 g1 g2",
  G: "c1 ~ c2 ~ c1 ~ c2 ~ c1 ~ c2 ~ c1 ~ c2 ~",
})).s("gm_synth_bass_2").gain(0.33)

// other · clavinet
const clavinet = note(`<
  ~ A B C D B E F G ~@40 A B C D B E F G A B C D B E F G ~@56 A B C D B E F G A B C D B E F H I ~
>`.pickRestart({
  A: "c4 g4 ~ g4 ~ g4 ~ g4", B: "g3 d4 ~ d4 ~ d4 ~ d4", C: "a3 e4 ~ e4 ~ e4 ~ e4", D: "c4 f4 ~ f4 ~ f4 ~ f4",
  E: "a3 d4 ~ d4 ~ d4 ~ d4", F: "f3 c4 ~ c4 ~ c4 ~ c4", G: "a3 e4 ~ e4 g3 d4 ~ d4", H: "g3 d4 ~ d4 g3 d4 ~ d4",
  I: "c4 ~@3",
})).s("gm_clavinet").gain(0.22)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<A@8 B ~@15 C@8 D@32 E ~@23 C@8 D@32 F@2 G@8 ~>".pickRestart({
  A: "[~@15 [c4,e4]@16 [b3,d4]@16 e4@16 f3@16 [g3,b3]@16 ~@16 c4@16 e4, ~@47 [a3,c4]@32 d4@32 ~@17, ~@95 [f3,a3]@33]/8", // C Bm G Am F
  B: "e5@7 ~ [b4,d5]@8, ~@7 [g3,b3,d4]@9", // Bm G
  C: "[~@15 [c4,e4]@16 [b3,d4]@16 e4@16 f3@16 [g3,b3]@16 ~@16 [c4,a4]@16 e4, ~@47 [a3,c4]@32 d4@32 ~@17, ~@95 [f3,a3]@33]/8", // C Bm G F Am F
  D: "[~@7 [g3,b3,d4,g4]@8 [c4,e4]@16 [b3,d4]@16 e4@16 f3@16 [g3,b3]@16 ~@16 [c4,a4]@16 e4, ~@47 [a3,c4]@32 d4@32 ~@17, ~@95 [f3,a3]@33]/8", // G C Bm G F Am F
  E: "~@7 [g3,b3,d4,g4]@9", F: "[~@7 [g3,b3,d4,g4]@8 [c4,e4]@16 [b3,d4]]/2",
  G: "[~@15 e4@16 f3@16 [g3,b3]@16 ~@16 [c4,a4]@16 ~ d4@15 [c4,e4]@17, ~@15 [a3,c4]@32 d4@32 ~@49, ~@63 [f3,a3]@32 [g3,b3,g4]@16 ~@17]/8", // G F C Am F G
})).s("gm_string_ensemble_2").gain(0.11)

// chords · string ensemble 2 · "SLOWSTRING" · soft notes
const string_ensemble_2_soft = note(`<
  A@8 B ~@15 C@7 ~ D ~ E@5 ~ D ~ E@5 ~ D ~ E@5 ~ D ~ E@5 ~@25 C@7 ~ D ~ E@5 ~ D ~ E@5 ~ D ~ E@5 ~ D ~ E@5 ~ D ~ E@5 ~
  F@3
>`.pickRestart({
  A: "[~@15 g4@32 a4@32 ~ b4@15 ~ a4@15 ~ c5@16, ~@79 g4@16 f4@16 a4@15 ~@2, ~@5 d5@2 ~]/8", B: "~@7 g4@9",
  C: "[~@15 g4@32 a4@32 g4@16 f4@16 ~]/7", D: "~@15 g4", E: "[~@15 a4@32 g4@16 f4@16 ~]/5", F: "[~@15 g4@20 ~@13]/3",
})).s("gm_string_ensemble_2").gain(0.05)

// other · pad new age · "FANTASIA"
const pad_new_age = note(`<
  ~@25 A B C D E@2 D F A B C D E@2 D F A B C D E@2 D F ~@40 A B C D E@2 D F A B C D E@2 D F A B C D E@2 D F A B C D E@2
  D F A B C D E@2 D F A B C D E@2 D G ~@2
>`.pickRestart({
  A: "g5 e6 c6 e6 ~ e6 c6 e6", B: "~ d6 b5 d6 ~ d6 b5 d6", C: "~ e6 c6 e6 ~ e6 c6 e6", D: "f5 c6 a5 c6 f5 c6 a5 c6",
  E: "[g5@2 d6@2 b5@2 d6@2 g5@2 d6@2 b5@2 ~ f5@2 ~ d6@2 a5@2 d6@2 f5@2 d6@2 a5@2 d6@2, ~@7 d6 ~@8]/2",
  F: "a5 e6 c6 e6 ~ d6 b5 d6", G: "g5 d6 b5 d6 ~ d6 b5 d6",
})).s("gm_pad_new_age").gain(0.16)

// other · pad new age · "FANTASIA" · soft notes
const pad_new_age_soft = note(`<
  ~@25 A B C ~@4 A@2 B C ~@4 A@2 B C ~@4 A ~@40 A B C ~@4 A@2 B C ~@4 A@2 B C ~@4 A@2 B C ~@4 A@2 B C ~@4 A@2 B C ~@4 A
  ~@2
>`.pickRestart({
  A: "~@4 g5 ~@3", B: "g5 ~@3 g5 ~@3", C: "a5 ~@3 a5 ~@3",
})).s("gm_pad_new_age").gain(0.08)

// other · clavinet
const clavinet_2 = note(`<
  ~ A B C D B E F G ~@40 A B C D B E F G A B C D B E F G ~@56 A B C D B E F G A B C D B E F H ~@2
>`.pickRestart({
  A: "~@2 c4 g4 ~@4", B: "~@2 g3 d4 ~@4", C: "~@2 a3 e4 ~@4", D: "~@2 c4 f4 ~@4", E: "~@2 a3 d4 ~@4",
  F: "~@2 f3 c4 ~@4", G: "~@2 a3 e4 ~@2 g3 d4", H: "~@2 g3 d4 ~@2 g3 d4",
})).s("gm_clavinet").gain(0.16).pan(0.9)

// other · clavinet
const clavinet_3 = note(`<
  ~ A B C D E F G H I ~@39 A B C D E F G H J B C D E F G H ~@56 A B C D E F G H J B C D E F G K ~@2
>`.pickRestart({
  A: "~@5 g4 ~ g4", B: "~ g4 ~@3 d4 ~ d4", C: "~ d4 ~@3 e4 ~ e4", D: "~ e4 ~@3 f4 ~ f4", E: "~ f4 ~@3 d4 ~ d4",
  F: "~ d4 ~@3 d4 ~ d4", G: "~ d4 ~@3 c4 ~ c4", H: "~ c4 ~@3 e4 ~@2", I: "~ d4 ~@6", J: "~ d4 ~@3 g4 ~ g4",
  K: "~ c4 ~@3 d4 ~@2",
})).s("gm_clavinet").gain(0.16).pan(0.2)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note("<~@81 A B C B C B C B ~@50>".pickRestart({
  A: "~@3 g3 ~ c3 ~@3 c3 ~@3 c3 ~@2", B: "~ c3 ~ a#2 ~ c3 ~@7 c3 ~@2", C: "~ c3 ~ g3 ~ c3 ~@3 c3 ~@3 c3 ~@2",
})).s("gm_distortion_guitar").gain(0.17).pan(0)

// drums · kick
const kick = s("bd").struct(`<
  ~@9 A@14 B ~@5 C ~@3 A@7 D A@7 E A@15 D C ~@7 A@8 ~@8 C ~@7 C ~@6 F A@3 D A@7 D A@3 C ~@18
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@2 x!2 ~ x ~@3 x ~", C: "x", D: "x ~@3 x ~@3 x ~@2 x!2 ~ x ~", E: "x ~@3 x ~@6 x!2 ~ x ~",
  F: "~@11 x!2 ~ x ~",
})).gain(0.39)

// drums · snare
const snare = s("sd").struct(`<
  ~@9 A@16 ~@8 A@32 B@4 C D C D C D C D C D C E F G@3 F G@3 ~@8 A@7 H A@24 ~@10
>`.pickRestart({
  A: "x ~ x ~ x ~@2 x!6 ~ x ~", B: "x!3 ~ x!3 ~ x!3 ~ x!3 ~", C: "x!11 ~ x!3 ~", D: "x!9 ~ x ~ x!3 ~", E: "x!13 ~@3",
  F: "~@2 x ~ x!8 ~@4", G: "~@2 x ~ x!9 ~@3", H: "x",
})).gain(0.2)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@9 A@16 ~@8 A@32 ~@32 A@7 ~ A@24 ~@10>".pickRestart({
  A: "~@3 x ~@4",
})).gain(0.12)

// drums · clap
const clap = s("cp").struct("<~@9 A@16 ~@4 B@60 ~@8 B@7 ~ B@28 ~@6>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.24)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@5 A@3 B A@3 B A@3 B A@3 B A@3 B ~@4 A@3 B A@35 B A@23 B A@3 B A@3 B A@3 C A@28 ~@6
>`.pickRestart({
  A: "x ~@3 x!2 ~@2 x ~@3 x ~@3", B: "x ~@3 x!2 ~@2 x ~@3 x ~@2 x", C: "x",
})).gain(0.2)

// drums · pedal hat · soft notes
const pedal_hat_soft = s("hh").struct(`<
  ~@5
  [~@3 x ~@3 x ~@3 x ~@4]!20
  ~@4
  [~@3 x ~@3 x ~@3 x ~@4]!75
  ~
  [~@3 x ~@3 x ~@3 x ~@4]!28
  ~@6
>`).gain(0.12)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A@3 B A@3 B A@3 B A@3 B A@3 B ~@4 A@3 B A@35 B A@23 B A@3 B A@3 B A@3 ~ A@28 ~@6
>`.pickRestart({
  A: "~@2 x ~@3 x ~@3 x ~@3 x!2", B: "~ x ~ x ~ x ~ x",
})).gain(0.16)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@15 A B ~@3 B ~@2 A ~@8 B ~@7 B ~@7 B ~@6 A B ~@6 A ~@15 A B ~@7 B ~@6 A ~@4 B ~@3 B ~@3 B ~@11 B ~@9
>`.pickRestart({
  A: "x ~ x ~ x!4", B: "x",
})).gain(0.2)

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

// drums · bongos
const bongos = s("bongo:4").struct("<~@9 [~ x ~@2]!16 ~@44 [~ x ~@2]!20 ~@50>").gain(0.62)

stack(
  bass, bass_2, clavinet, string_ensemble_2, string_ensemble_2_soft, pad_new_age, pad_new_age_soft, clavinet_2,
  clavinet_3, distortion_guitar, kick, snare, snare_soft, clap, pedal_hat, pedal_hat_soft, open_hat, crash, tambourine,
  bongos
)