Strudelify

Please Don't Go

KWS

KeyB♭ majorTempo122 bpm
0:00/0:00
// Please Don't Go — KWS
// 122 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 2
const bass = note(`<
  ~@19 A B C@2 D E F G H E F G H E F G H E F G H E F G H E F G H E F G H E F G H E F G H E F G H E F G H ~@7 A E F G H E
  F G H E F G H E F G H E F G H E F G H E F G H I
>`.pickRestart({
  A: "~@9 f1 g1 ab1 bb1 g1 f1 g1", B: "f1 g1 bb1@3 ~ bb1!4 bb1@2 bb1!2 bb1@2", C: "f1 g1 ab1@4 ab1!4 ab1@2 ab1!2 ab1@2",
  D: "eb1@6 eb1!4 eb1@2 eb1@2 f1 ab1", E: "f1 g1 bb1@4 bb1!4 bb1@2 bb1@2 bb1!2",
  F: "f1 g1 ab1@4 ab1!4 ab1@2 ab1@2 ab1!2", G: "eb1@6 eb1!4 eb1@2 eb1@2 eb1 f1", H: "eb1@6 eb1!4 eb1@2 eb1 f1 ab1 ~",
  I: "bb1 ~@7",
})).s("gm_synth_bass_2").gain(0.45)

// chords · percussive organ
const percussive_organ = note(`<
  ~@12 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
  B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D E
>`.pickRestart({
  A: "~@2 [f4,bb4]@3 [f4,bb4]@3 [f4,bb4]@3 [f4,bb4]@3 [f4,bb4]@2", // Bb5
  B: "~@2 [f4,bb4]@3 [f4,bb4]@3 [f4,bb4]@3 [f4,bb4]@3 f4@2", // Bb5
  C: "~@2 [ab4,c5]@3 [g4,bb4]@3 [f4,ab4]@3 [g4,bb4]@3 [eb4,g4]@2", // Ab Gm Fm Gm Eb
  D: "~@2 [g4,bb4]@3 [g4,bb4]@3 [g4,bb4]@3 [g4,bb4]@3 f4@2", E: "[d4,f4] ~@7",
})).s("gm_percussive_organ").gain(0.35).pan(0.3)

// other · percussive organ
const percussive_organ_2 = note(`<
  ~@12 A B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2
  B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A D
>`.pickRestart({
  A: "~@2 eb5@3 d5@3 eb5@3 d5@3 bb4@2", B: "~@2 eb5@3 d5@3 eb5@3 d5@3 c5@2", C: "~@2 eb5@3 d5@3 c5@3 d5@3 bb4@2",
  D: "bb4 ~@7",
})).s("gm_percussive_organ").gain(0.4).pan(0.7)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@24 A@2 B@2 ~@8 C D E@2 C D E@2 ~@8 C D E@2 C D E@2 C D E@2 C D E@2 ~@12 F G H@2 F G H@2 F G H@2 F G H@2 F G H@2 F G
  H@2 I
>`.pickRestart({
  A: "f5@3 d5 eb5 f5 ~@2", B: "[eb5@3 d5 eb5 d5 ~ bb4@9]/2", C: "f4@3 d5", D: "f5@10 eb5@2 d5 c5@3",
  E: "[bb4@13 f4 g4 f4]/2", F: "f4@3 d4 eb4 d4 d5@2", G: "c5@2 f4 c5", H: "[bb4@11 f4 g4 f4 g4 f4]/2", I: "bb4 ~@7",
})).s("gm_string_ensemble_1").gain(0.5)

// chords · string ensemble 1
const string_ensemble_1_2 = note(`<
  A@2 B C A@2 B C A@2 B C A@2 B C ~@8 D E F@2 ~@8 D E F@2 D E F@2 ~@8 D E F@2 D E F@2 D E F@2 D E F@2 ~@12 D E F@2 D E
  F@2 D E F@2 D E F@2 D E F@2 D E F@2 G
>`.pickRestart({
  A: "[bb3,d4,f4]", B: "[ab3,bb3,eb4]", C: "[g3,bb3,eb4]", D: "[bb3,d4]", E: "[ab3,d4]", F: "[g3,bb3]",
  G: "[bb3,d4] ~@7", // Bb
})).s("gm_string_ensemble_1").gain(0.4).pan(0.3)

// other · string ensemble 1
const string_ensemble_1_3 = note("<A B C D A B C D A B C D A B C D ~@89>".pickRestart({
  A: "bb2", B: "g2", C: "ab2", D: "c3",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.7)

// other · clarinet
const clarinet = note("<A ~ B C A ~ B C A ~ B C A ~ B C ~@89>".pickRestart({
  A: "bb5 ~@2 bb5 ~@2 bb5 ~ bb5 ~@2 bb5 ~@4", B: "~@6 bb6@2 bb6 ~@2 bb6 ~@2 bb6@2", C: "~ bb6@2 ~@13",
})).s("gm_clarinet").gain(0.3).pan(0.9)

// drums · kick
const kick = s("bd").struct(`<
  ~@16 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 B A B ~@8 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 ~
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  ~@16 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 C 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 B A D E
>`.pickRestart({
  A: "~@4 x ~@7 x ~@2 x", B: "~ x ~ x", C: "~@3 x!5 ~ x ~ x!5", D: "~@4 x ~@5 x!6", E: "x",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@16 A@11 B A@19 C A@27 D A@27 D ~>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", B: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x ~@3", C: "x!2 ~@2 x!2 ~@2 x ~@7",
  D: "x!2 ~@2 x!2 ~@10",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@16 A@11 B A@19 C A@3 C A@23 C A@27 C ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~ x ~ x ~@4",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@15 A B ~@3 B ~@6 C B ~@18 D B ~@2 E B ~@22 E B ~@26 E B>".pickRestart({
  A: "~@12 x!4", B: "x", C: "~@13 x!3", D: "~@9 x!7", E: "~@8 x!8",
})).gain(0.3)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@15 [~@8 x!4 ~@4] ~@11 [~@3 x] ~@19 [~ x] ~@57>").gain(0.15)

// drums · tambourine
const tambourine = s("tb").struct("<~@12 [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!92 ~>").gain(0.25)

stack(
  bass, percussive_organ, percussive_organ_2, string_ensemble_1, string_ensemble_1_2, string_ensemble_1_3, clarinet,
  kick, snare, hihat, open_hat, crash, crash_soft, tambourine
)