Strudelify

Sea of Love

The Honeydrippers

KeyG majorTempo125 bpm
0:00/0:00
// Sea of Love — The Honeydrippers
// 125 bpm, 12/8, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 50 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(125/6)

// 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.

// other · piano
const piano = note(`<
  A B C D E A@2 B F D A D E A@2 B C D A D E A G C G C B G A B C D A D E A G C G C B G A B C D A D E H
>`.pickRestart({
  A: "g3 b3 d4 g4 d4 b3 g3 b3 d4 g4 d4 b3", B: "f#3 b3 d#4 f#4 d#4 b3 f#3 b3 d#4 f#4 d#4 b3",
  C: "c4 e4 g4 c5 g4 e4 c4 e4 g4 c5 g4 e4", D: "a3 b3 c#4 e4 c#4 b3 a3 b3 c#4 e4 c#4 b3",
  E: "g3 b3 d4 g4 d4 b3 c4 e4 g4 c5 g4 e4", F: "c4 g4 c5 e5 c5 g4 c4 g4 c5 e5 c5 g4",
  G: "d4 f#4 a4 d5 a4 f#4 d4 f#4 a4 d5 a4 f#4", H: "[g3,b3,d4,g4]@2 ~",
})).s("gm_piano").gain(0.32).pan(0.9)

// other · tuba
const tuba = note("<~@6 A B C D@3 E@2 F G H I@3 J@2 K L K L M N F G H I@3 J@2 K L K L M N F G H I@3 O P>".pickRestart({
  A: "b4@3 b4@2 b4@4 ~@3", B: "d#5 b4 b4@3 ~", C: "b4@3 a4@2 g4@4 ~@2 a4",
  D: "[b4@2 a4@3 g4@4 ~@2 e5@4 d5@2 b4 d5@2 e5 ~@2 b4@3 a4 g4@2 a4 ~@2 a4 d4@3]/3", E: "[g4@2 ~]/2",
  F: "b4@2 b4 b4@2 b4@3 b4@3 ~", G: "d#5@4 ~ b4 b4@4 ~@2", H: "b4@3 ~ a4 b4@2 a4 g4@2 ~ a4",
  I: "[b4@2 a4 g4@2 a4 g4@3 ~@2 e5@4 d5@2 b4 d5@2 e5@2 ~ b4@3 a4 g4@2 a4 ~@2 a4@2 d4@2]/3", J: "[g4@7 ~@5]/2",
  K: "d5@9 e5@2 d5", L: "c5 ~", M: "b4@5 ~", N: "d5@5 ~", O: "g4", P: "g5",
})).s("gm_tuba").gain(0.48)

// bass · fretless bass
const bass = note(`<
  A B C D E F A B C D G H E F A B C D G H E I J K L K M N A B C D G H E I J K L K M N A B C D G H E ~
>`.pickRestart({
  A: "g2@3 g2@2 b2 d3@3 b2@2 d3", B: "b2@3 b2@2 d#3 f#3@3 d#3@2 b2", C: "c3@3 c2@2 e2 g2@3 e2@2 g2",
  D: "a2@3 a2 e2 c#2 a1@3 a1@2 a2", E: "g2@3 g2 a2 b2 c3@3 c3 b2 a2", F: "g2@3 g2@3 g2@2 g2 b2 d3 e3",
  G: "g2@3 g2@2 b2 d3@3 b2@2 g2", H: "a2@3 a2@2 c#3 e3@3 g3@2 a2", I: "g2@3 g2@2 g1 g2@2 f#2@2 e2@2",
  J: "d2@3 d3 c3 a2 f#2@3 a2@2 b2", K: "c3@3 c3!2 g2 e2@3 g2@2 c3", L: "d3@3 d3 b2 a2 f#2@3 a2@2 b2",
  M: "b2@3 f#2@2 a2 b2@3 f#2@2 a2", N: "d3@3 d2@3 f#2@2 e2 d2 e2 f#2",
})).s("gm_fretless_bass").gain(0.25)

// chords · piano · "Brite Piano"
const piano_2 = note(`<
  A B C D E A@2 F G H I J K L A F G H I J K M N O P Q R S A F G H I J K M N O P Q R S A F G H I J K ~
>`.pickRestart({
  A: "[b2,d3,g3]!12", B: "[b2,f#3,a3]!12", C: "[g2,c3,e3]!12", D: "[c#3,e3,a3]!12", E: "[b2,d3,g3]!6 [c3,e3,g3]!6",
  F: "[b2,f#3,a3]!3 [d#3,f#3]!4 [b2,d#3,f#3]!3 b2 [a2,d#3,f#3]", // B7 D#m B D#dim
  G: "[g2,c3,e3]!3 [c3,e3,a3] [c3,e3,g3] [c3,e3,a3] [c3,e3]!6", H: "[c#3,e3]!9 a2 c#3 e3", I: "[g3,b3]!9 [d3,g3,b3]!3",
  J: "[c#3,e3]!6 [c#3,e3,a3] [c#3,e3,g3]!4 d3", K: "[b2,d3]!3 [b2,d3,g3]!3 [c3,e3,g3]!3 [c3,e3] [b2,d3] [a2,c3]",
  L: "[g2,b2]!6 a2 b2 d3 e3 g3 a3", M: "[g2,b2,d3]!6 [b2,d3,g3]!2 [d3,g3,b3]!2 [g3,b3,d4]!2",
  N: "[f#3,a3]!6 [f#3,a3,d4]!3 [f#3,a3,e4]!2 [f#3,a3,d4]", // F#m D F#m7 D
  O: "[e3,g3]!3 [e3,g3,c4] [e3,g3] [e3,g3,c4] [g3,c4,e4] [g3,c4,d4] [g3,c4] [c4,e4,g4] [c4,e4,f#4] [c4,e4]", // Em C Em C Gsus4 C5 C F#m7b5 …
  P: "[f#3,a3]!12", Q: "[e3,g3]!6 [g3,c4]!3 [c4,e4]!3", R: "[d#3,f#3]!12", S: "[f#3,a3]!9 [d3,f#3]!3",
})).s("gm_piano").gain(0.14).pan(0.8)

// chords · rock organ · "BX-3 Organ"
const rock_organ = note(`<
  A B C D E A@2 B C D A D F A@2 B G H A D F A I C I G B J A B G H A H K A I C I C B J A B G D A H F ~
>`.pickRestart({
  A: "[d5,g5,b5]", B: "[d#5,f#5,a5]", C: "[c5,e5,g5]", D: "[c#5,e5,g5]", E: "[d5,g5,b5]@5 [e5,g5,c6]@7",
  F: "[d5,g5,b5] [e5,g5,c6]", G: "[e5,g5,c6]", H: "[e5,g5,c#6]", I: "[d5,f#5,a5]", J: "[d5,f#5,a5]@3 [f#5,a5,c6]",
  K: "[d5,g5,b5] [c5,e5,g5]", // G C
})).s("gm_rock_organ").gain(0.07).pan(0.1)

// chords · acoustic guitar steel · "Ac. Gt."
const acoustic_guitar_steel = note(`<
  A B C D E F@2 G C D F D H I A B C J F J K A L C M C B N F B O D A J P A M O L O B Q A B C D A J R ~
>`.pickRestart({
  A: "~ b3@23, [d3,g3]", B: "~ a3@23, [d#3,f#3]", C: "~ c4@23, [e3,g3]", D: "~ c#4@23, [e3,g3]",
  E: "~ d4@9 ~ e4@13, [g3,b3]@5 [g3,c4]@7", F: "~ d4@23, [g3,b3]", G: "~ d#4@23, [f#3,a3]",
  H: "~ b3@11 ~ c4@11, [d3,g3] [e3,g3]", I: "~ b3@11 ~@12, [d3,g3] ~", J: "~ e4@23, [g3,c#4]",
  K: "~ d4@11 ~ c4@11, [g3,b3] [e3,g3]", L: "~ a3@23, [d3,f#3]", M: "~ d4@23, [f#3,a3]",
  N: "~ a3@17 ~ c4@5, [d3,f#3]@3 [f#3,a3]", O: "~ e4@23, [g3,c4]", P: "~ b3@11 ~ e4@11, [d3,g3] [g3,c4]",
  Q: "~ d4@17 ~ c4@5, [f#3,a3]@3 [f#3,a3]", R: "~ d4@11 ~ e4@11, [g3,b3] [g3,c4]",
})).s("gm_acoustic_guitar_steel").gain(0.07).pan(0.9)

// other · pad halo · "Halo pad"
const pad_halo = note(`<
  A B C D E F A G A C F D H F A G A C F D H F B A G A B I A G A C F D H F B A G A B I A B C D J D K ~
>`.pickRestart({
  A: "g4", B: "f#4", C: "e4", D: "c#4", E: "b3@5 c4@7", F: "d4", G: "a4", H: "b3 c4", I: "d4@3 f#4", J: "b3",
  K: "d4 e4",
})).s("gm_pad_halo").gain(0.07)

// other · bassoon · "Basoon"
const bassoon = note("<A B C D E F G H I ~@3 J G ~ H K L ~@11 H K L ~@11 H K L ~@4>".pickRestart({
  A: "b2@5 ~", B: "b2", C: "c3@9 c3!2 b2", D: "a2", E: "g2@4 ~@2 g2 ~ a2 ~ b2 ~ c3 ~@5 c3 ~ c3 ~ b2 ~",
  F: "g2 ~@3 g2 ~ g2 ~@3 g2@2 ~@4 g2 ~ g2 ~@5", G: "g2@2 ~", H: "~@18 b2 ~ b2 ~ b2 ~", I: "c3 ~",
  J: "b2@10 c3@8 ~@2 c3 ~ c3 ~", K: "c3@2 ~@2 c3 ~ c3 ~@11 c3 ~ c3 ~ b2 ~", L: "a2@5 ~",
})).s("gm_bassoon").gain(0.32).pan(0.9)

// drums · kick
const kick = s("bd").struct("<[x!4]!49 ~>").gain(0.46)

// drums · snare
const snare = s("sd").struct("<A B A@3 C A D A E A@13 C A@21 C A F A ~>".pickRestart({
  A: "~ x ~ x", B: "x!2 ~ x", C: "~ x ~ x ~@5 x ~@2", D: "~ x!3", E: "~@3 x ~@3 x ~ x ~ x", F: "~ x ~ x ~ x ~@3 x ~@2",
})).gain(0.46)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<A B ~@2 C ~@2 D ~@11 E ~@2 E F ~ C ~@5 C ~ C ~@4 E G ~ C ~ A ~ H ~@4>".pickRestart({
  A: "~@5 x", B: "~@2 x ~@4 x ~@4", C: "~@7 x ~@4", D: "~ x!2", E: "~@11 x", F: "~@5 x ~ x!2 ~@3", G: "~ x ~@10",
  H: "~@5 x ~@5 x",
})).gain(0.26)

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

// drums · open hat
const open_hat = s("oh").struct("<~@3 A@2 ~@10 B ~ B ~ B ~ B ~ B ~ B ~ B ~@6 C ~ C ~@2 B ~ B ~ B ~@6>".pickRestart({
  A: "~ x", B: "~@3 x", C: "x",
})).gain(0.36)

stack(
  piano, tuba, bass, piano_2, rock_organ, acoustic_guitar_steel, pad_halo, bassoon, kick, snare, snare_soft, hihat,
  open_hat
)