Strudelify
Kiss and Say Goodbye cover art

The Manhattans

Kiss and Say Goodbye

The Manhattans

KeyF majorTempo97 bpm
0:00/0:00
// Kiss and Say Goodbye — The Manhattans
// 97 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 9 lead 2 sawtooth (copy of ch 6 string ensemble 1)
// note: Full arrangement: all 119 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(97/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, A@4 for four bars: edit a riff to change every repeat.

// bass · electric bass finger
const bass = note(`<
  ~@12 A B C@2 D E F C D B G H E I F C D B F C D E F C D B G H E I F C D B C@2 D E F C D B G H E I F C D B C@2 D E F C D
  B G H E I F C D B D E F C D E F C D E F C A B C@2 D E F C D B G H E I F C D B F C D E F C D E F C D
>`.pickRestart({
  A: "f1@2 ~ f2 ~@2 f1@2 ~ f2 ~@2 f1@2 ~ f2 ~@2 f1@2 ~ f2 ~@2", B: "f2 ~@11",
  C: "c3@2 ~@3 c3 g2@3 c3 ~@2 c3@2 ~@3 c3 a2@3 g2 ~@2", D: "f2@2 ~@3 f2 c2@2 ~ f2 ~@2 f2@2 ~@3 f2 c2@2 ~ f2 ~@2",
  E: "f2@2 ~@3 f2 c2@3 f2 ~@2 f2@2 ~@3 f2 eb2@3 c2 ~@2", F: "c3@2 ~@3 c3 g2@3 c3 ~@2 c3@2 ~@3 c3 bb2@2 ~ g2 ~@2",
  G: "bb2@2 ~@3 bb2 f2@3 bb2 ~@2 bb2@2 ~@3 bb2 g2@3 f2 ~@2", H: "bb2@2 ~@3 bb2 f2@3 bb2 ~@2 bb2@2 ~@3 bb2 ab2@3 f2 ~@2",
  I: "f2@2 ~@3 f2 c2@3 f2 ~@2 f2@2 ~@3 f2 d2@3 c2 ~@2",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · harpsichord
const harpsichord = note(`<
  ~@12 A B C@2 A@2 C@2 A B D@2 A@2 C@2 A B C@2 A@2 C@2 A B D@2 A@2 C@2 A B C@2 A@2 C@2 A B D@2 A@2 C@2 A B C@2 A@2 C@2 A
  B D@2 A@2 C@2 A B A@2 C@2 A@2 C@2 A@2 C@2 A B C@2 A@2 C@2 A B D@2 A@2 C@2 A B C@2 A@2 C@2 A@2 C@2 A
>`.pickRestart({
  A: "~@3 [f4,a4,c5] ~@5 [f4,a4,c5] ~@5 [f4,a4,c5] ~@5 [f4,a4,c5] ~@2", B: "[f4,a4,c5] ~@23",
  C: "~@3 [e4,g4,c5] ~@5 [e4,g4,c5] ~@5 [e4,g4,c5] ~@5 [e4,g4,c5] ~@2", // C
  D: "~@3 [f4,bb4,d5] ~@5 [f4,bb4,d5] ~@5 [f4,bb4,d5] ~@5 [f4,bb4,d5] ~@2", // Bb
})).s("gm_harpsichord").gain(0.24).pan(0.6)

// chords · pad choir
const pad_choir = note(`<
  A@2 B@2 C@2 D E F G H E ~@2 B@2 A@2 B@2 ~@2 I@2 A@2 B@2 ~@2 B@2 A@2 B@2 ~@2 I@2 A@2 B@2 ~@2 B@2 A@2 B@2 ~@2 I@2 A@2
  B@2 ~@2 D E F G D E ~@2 I@2 A@2 B@2 ~@2 A@2 B@2 F J D K F J D K ~@2 D K F J D K ~@2 I@2 A@2 B@2 ~@2 D K F J D K F J D
  K F
>`.pickRestart({
  A: "[a3,c4,f4]/2", B: "[g3,c4,e4]/2", C: "[~ [c4,f4,a4], [a3,c4,f4]]/2", D: "[c4,e4,g4]@3 ~", E: "[c4,e4,g4]",
  F: "[c4,f4,a4]@3 ~", G: "[c4,f4,a4]", H: "[g3,c4,e4]@3 ~", I: "[bb3,d4,f4]/2", J: "[f4,a4]", K: "[e4,g4]",
})).s("gm_pad_choir").gain(0.14).pan(0.6)

// other · electric guitar clean
const electric_guitar_clean = note("<A B C D E F G H A I C J ~@67 B C D E F G H A I C J ~@29>".pickRestart({
  A: "~@6 c3 f3", B: "g3 f3@6 ~", C: "~@6 g3 c4", D: "c4", E: "~@6 c4 f4", F: "g4 e4@6 ~", G: "~@6 g4 c5", H: "c5",
  I: "g3 e3@6 ~", J: "bb3",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.3)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  ~@14 A B C@2 B@2 ~@2 D@2 E@2 F@2 G H F@2 I J F ~@3 D@2 I@2 F@2 G H F@2 I J F ~@3 D@2 I@2 F@2 G K F@2 I J F ~@3 D@2 I@2
  F@2 G K E@2 F@2 E@2 F@2 E@2 F@2 G H ~@16 F@2 I J F@2 I J F@2 I
>`.pickRestart({
  A: "~@3 g3 ~ g3 ~@3 g3 ~@5 g3 ~ g3 ~@3 g3@2 ~", B: "~@3 g3 ~ g3 ~@3 g3@2 ~@4 g3 ~ g3 ~@3 g3@2 ~",
  C: "~@3 f3 ~ f3 ~@3 f3@2 ~@4 f3 ~ f3 ~@3 f3@2 ~", D: "~@3 bb3 ~ bb3 f3 ~ bb3 bb3@2 ~@4 bb3 ~ bb3 f3 ~ bb3 bb3@2 ~",
  E: "~@3 a3 ~ a3 f3 ~ a3 a3@2 ~@4 a3 ~ a3 f3 ~ a3 a3@2 ~", F: "~@3 g3 ~ g3 e3 ~ g3 g3@2 ~@4 g3 ~ g3 e3 ~ g3 g3@2 ~",
  G: "d3@2 ~ c3 ~@2 d3@2 ~ c3 ~@2 d3@2 ~ c3 ~@2 d3@2 ~ c3 ~@2", H: "c3 ~@23",
  I: "~@3 f3 ~ f3 c3 ~ f3 f3@2 ~@4 f3 ~ f3 c3 ~ f3 f3@2 ~", J: "~@3 f3 ~ f3 c3 ~ f3!2 ~@5 f3 ~ f3 c3 ~ f3 f3@2 ~",
  K: "c3 ~@11",
})).s("gm_electric_guitar_muted").gain(0.24).pan(0.3)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@12 A B ~@6 C B ~@6 D B ~@6 C B ~@6 E B ~@6 C B ~@6 D B ~@6 F G@8 H@8 ~@5 I J@8 K@8 L ~@11
>`.pickRestart({
  A: "f4@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2", // F Bb F Bb F Bb F
  B: "[c4,f4,a4] ~@7", // F
  C: "[d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2", // Bb F Bb F Bb F Bb F
  D: "f4@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2, bb4 ~@3", // F Bb F Bb F Bb F
  E: "[f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2 [d4,f4,bb4]@3 [c4,f4,a4] ~@2", // Bb5 F Bb F Bb F Bb F
  F: "f4@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4]@2 [f5,a5] [a4,g5,bb5]@3, bb4@6 ~@12 bb5 ~@5, ~@3 a4@6 a4@6 a4@6 [c4,f4] ~@2", // F5 Bb F5 Bb F5 Dm F Eb …
  G: "[[c4,f4]@3 ~@165 [f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2, a4@57 a4@2 a4@2 a4@2 a4]/8", // F5 Bb5 F5 Bb F5 Bb F5 Bb …
  H: "[[c4,f4] ~@63, a4]/8", // F5
  I: "f4@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2, bb4 ~@3, ~ a4@2 a4@2 a4@2 a4", // F5 Bb F5 Bb F5 Bb F5
  J: "[[c4,f4]@3 ~@165 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@2 [f5,a5] [a4,g5,bb5]@3, a4@171 a4@6 a4@6 a4@6 [c4,f4] ~@2, ~@186 [g5,bb5] ~@5]/8", // F5 Bb F5 Bb F5 Bb F5 Bb …
  K: "[[c4,f4]@3 ~@165 [f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2 [d4,f4,bb4]@3 [c4,f4] ~@2, a4@57 a4@2 a4@2 a4@3]/8", // F5 Bb5 F5 Bb F5 Bb F5 Bb …
  L: "[c4,f4] ~@7", // F5
})).s("gm_string_ensemble_1").gain(0.21).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@12 [x!4]!107>").gain(0.55)

// drums · snare
const snare = s("sd").struct(`<
  ~@13 A B@7 A B@7 A B@7 A B@7 A B@7 A B@7 A B@7 A B@7 A B@13 A B@7 A B@7 A B@6 A B@4
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.55)

// drums · hihat
const hihat = s("hh").struct("<~@12 A B C@32 D C@7 D C@7 D C@7 D C@7 D C@13 D C@7 D C@7 D C@6 D C@3>".pickRestart({
  A: "x!4", B: "x ~@5 x ~@2 x ~ x!2 ~@5 x ~ x ~@3", C: "x ~@2 x ~ x!2 ~ x!2 ~@2 x ~@2 x ~ x!2 ~ x!2 ~@2",
  D: "~@3 x ~ x!2 ~ x!2 ~@2 x ~@2 x ~ x!2 ~ x!2 ~@2",
})).gain(0.38)

// drums · open hat
const open_hat = s("oh").struct("<~@13 [~ x ~@3 x ~ x] ~@105>").gain(0.38)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@13 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@13 A ~@7 A ~@7 A ~@6 A ~@4
>`.pickRestart({
  A: "~@3 x ~@10 x ~@2 x ~@3 x ~@2",
})).gain(0.55)

// drums · crash
const crash = s("cr").struct(`<
  ~@14 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@21 A ~@7 A ~@7 A ~@6 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.49)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@13 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@13 A ~@7 A ~@7 A ~@6 A ~@4
>`.pickRestart({
  A: "~@11 x ~@12",
})).gain(1.57)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@13 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@13 A ~@7 A ~@7 A ~@6 A ~@4
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(1.57)

// drums · shaker
const shaker = s("sh").struct("<[~ x!3] [x!4]!11 ~@107>").gain(0.38)

// drums · claves
const claves = s("clave:2").struct(`<
  ~@13 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@13 A ~@7 A ~@7 A ~@6 A ~@4
>`.pickRestart({
  A: "~@23 x",
})).gain(2.14)

stack(
  bass, harpsichord, pad_choir, electric_guitar_clean, electric_guitar_muted, string_ensemble_1, kick, snare, hihat,
  open_hat, high_tom, crash, congas, congas_2, shaker, claves
)