Strudelify

Never Been to Spain

Three Dog Night

KeyC majorTempo93 bpm
0:00/0:00
// Never Been to Spain — Three Dog Night
// 93 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 77 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(93/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.

// other · clavinet
const clavinet = note(`<
  ~@2 A B C D E B C D F G H D E B C D E B C D F I C D E B C D E B C D J I C D E B C D E B C D F I C D E B K D E B C D F
  L C D E B C D E B C D F B C M N@2 O
>`.pickRestart({
  A: "~ f3!13 d#3!2", B: "f3!14 d#3!2", C: "[c3,f3] c3!13 a#2!2", D: "c3!14 a#2!2", E: "[c3,f3] f3!13 d#3!2",
  F: "[c3,g3] g3!13 f3!2", G: "g3!16", H: "[c3,g3] c3!13 a#2!2", I: "[f3,g3] f3!13 d#3!2", J: "c3 g3!13 f3!2",
  K: "f3 c3!13 a#2!2", L: "[f3,g3] f3!15", M: "[c3,c4] c4!13 a#3!2", N: "c4!14 a#3!2", O: "c4 ~@15",
})).s("gm_clavinet").gain(0.43)

// other · clavinet · soft notes · C5
const clavinet_soft = note("<~@73 [g3!14 f3!2]!3 [g3 [g3,c4]!15]>").s("gm_clavinet").gain(0.31)

// chords · synth strings 2
const synth_strings_2 = note(`<
  ~@3 A B C D A B C E F G C D A B C H A B C I J B C D A B C D A B C K L B C H A B C D A B C I L B C D A M C D A M C I N
  O C H A B C D A B C E A B P Q R S
>`.pickRestart({
  A: "[c4,f4,a4]", B: "[g3,c4,e4]@7 ~, [f4,a4] ~@15", C: "[g3,c4,e4]", D: "[c4,f4,a4]@7 ~, [g3,e4] ~@15",
  E: "[d4,g4,b4]@7 ~, [g3,c4,e4] ~@15", F: "[c4,g4,a4], [d4,b4] ~@15", G: "[g3,c4,e4]@7 ~, [g4,a4] ~@15",
  H: "[c4,f4,a4]@13 ~@3, [g3,e4] ~@15", I: "[d4,g4,b4]@13 ~@3, [g3,c4,e4] ~@15", J: "[c4,f4,a4]@15 ~, [d4,g4,b4] ~@15",
  K: "[g3,c4,e4] d4@13 ~@2, [g4,b4]@13 ~@3", L: "[c4,f4,a4], [d4,g4,b4] ~@15", M: "[g3,c4,e4]@13 ~@3, [f4,a4] ~@15",
  N: "[d4,f4,c5], [g4,b4] ~@15", O: "[g3,c4,e4]@7 ~, [d4,f4,c5] ~@15", P: "[c4,e4,g4]@13 ~ [c4,d4,g4]@2, g3 ~@15",
  Q: "[c4,d4,g4]", R: "[a3,d4,e4]", S: "[e3,g3,c4] ~@7",
})).s("gm_synth_strings_2").gain(0.41).pan(0.4)

// bass · synth bass 1
const bass = note(`<
  ~@2 A B C D E F C D G H I D J B C I K B C D L H C D J F C D J B M D N H C I J F C D O B M D N P C D J B Q D E B C I R
  S T D O F M D K F C D U B Q V W@2 X
>`.pickRestart({
  A: "~@4 f2@2 ~ f2@2 ~ f2@3 ~ f2 ~", B: "f2@3 ~ f2@3 f2@2 ~ f2@3 ~ f2 ~", C: "c2@3 ~ c2@3 c2@2 ~ c2@3 ~ c2@2, f2 ~@15",
  D: "c2@3 ~ c2@3 c2@2 ~ c2@3 ~ c2 ~", E: "f2@3 ~ f2@3 f2@2 ~ f2@3 ~ f2 ~, c2 ~@15",
  F: "f2@3 ~ f2@2 ~ f2@2 ~ f2@3 ~ f2 ~", G: "g1@2 ~@2 g1@3 g1@2 ~ g1@3 ~ g1@2, c2 ~@15",
  H: "f2@3 ~ f2@3 f2@2 ~ f2@3 ~ f2 ~, g1 ~@15", I: "c2@3 ~ c2@2 ~ c2@2 ~ c2@3 ~ c2 ~",
  J: "f2@3 ~ f2@3 f2@2 ~ f2@3 ~ f2@2, c2 ~@15", K: "f2@3 ~ f2@2 ~ f2@2 ~ f2@3 ~ f2@2, c2 ~@15",
  L: "g1@3 ~ g1@2 ~ g1@2 ~ g1@3 ~ g1 ~, c2 ~@15", M: "c2@3 ~ c2@2 ~ c2@2 ~ c2@3 ~ c2@2, f2 ~@15",
  N: "g1@3 ~ g1@3 g1@2 ~ g1@3 ~ g1 ~, c2 ~@15", O: "f2@3 ~ f2@2 ~ f2@2 ~ f2@3 ~ f2 ~, c2 ~@15",
  P: "f2@3 ~ f2@2 ~ f2@2 ~ f2@3 ~ f2 ~, g1 ~@15", Q: "c2@3 ~ c2@2 ~ c2@2 ~ c2@3 ~ c2 ~, f2 ~@15",
  R: "g1@3 ~ g1@3 g1@2 ~ g1@3 ~ g1@2, c2 ~@15", S: "g1@3 ~ g1@3 g1@2 ~ g1@3 ~ g1 ~",
  T: "c2@3 ~ c2@3 c2@2 ~ c2@3 ~ c2@2, g1 ~@15", U: "g1@2 ~@2 g1@2 ~ g1@2 ~ g1@3 ~ g1@2, c2 ~@15",
  V: "c2@3 ~ c2@3 c2@2 ~ c2@3 ~ a#1@2", W: "c2@3 ~ c2@3 c2@2 ~ c2@3 ~ a#1 g1", X: "c1 ~",
})).s("gm_synth_bass_1").gain(0.64).pan(0.4)

// chords · drawbar organ
const drawbar_organ = note(`<
  ~@2 A@2 B@2 C@4 D E F ~ G@2 B@2 A@2 H@2 D E I J A@2 K@2 L@4 M N O J P@2 Q@2 R@2 S@2 D N I J T@2 U@2 T@2 V@2 D E I J
  G@2 B@2 G@2 H@2 W@2 X Y ~@3
>`.pickRestart({
  A: "[[c4,f4,a4]@15 ~]/2", B: "[[c4,e4,g4]@15 ~]/2", C: "[[c4,f4,a4]@29 ~@3 [e4,g4]@32, ~@31 c4@32 ~]/4",
  D: "[g5,b5,d6]", E: "[c4,f4,a4]@13 ~@3", F: "[c4,e4,g4]", G: "[[c4,f4,a4]@29 ~@3]/2", H: "[c4,e4,g4]/2",
  I: "[c4,e4,g4]@7 ~", J: "[c4,e4,g4] ~@15", K: "[[c4,e4,g4]@29 ~@3]/2",
  L: "[[c4,f4,a4]@15 ~ [e4,g4]@16, ~@31 c4@33]/4", M: "[g5,b5,d6]@15 ~", N: "[c4,f4,a4]@7 ~", O: "[c4,e4,g4]@15 ~",
  P: "[[c4,f4,a4]@7 ~ [c4,f4,a4] ~ [c4,f4,a4] ~@3 [c4,f4,a4]@15 ~@3]/2", // F
  Q: "[[c4,e4,g4]@6 ~@2 [c4,e4,g4]!2 ~@4 [c4,e4,g4]@15 ~@3]/2", // C
  R: "[[c4,f4,a4]@6 ~@2 [c4,f4,a4] ~ [c4,f4,a4] ~@3 [c4,f4,a4]@15 ~@3]/2", // F
  S: "[[c4,e4,g4]@6 ~@2 [c4,e4,g4] ~ [c4,e4,g4] ~@3 [c4,e4,g4]@18]/2", T: "[[c4,f4,a4]@31 ~]/2",
  U: "[[c5,e5,g5]@31 ~]/2", V: "[[c5,e5,g5]@7 ~]/2", W: "[[g5,b5,d6]@15 ~ [f4,a4]@13 ~@3, ~@15 c4@13 ~@4]/2",
  X: "[c4,e4,g4]@13 ~@2 c4", Y: "[e4,g4] ~@15",
})).s("gm_drawbar_organ").gain(0.35)

// other · whistle
const whistle = note("<~@37 A B@2 C@2 D E F G H I J K ~@27>".pickRestart({
  A: "~@4 a5@2 c6 ~ d#6 ~ d#6 ~ d6@2 c6@2", B: "[d6@3 ~ c6@16 a5@2 c6 ~ d#6 ~ d#6 ~ d6@2 c6 ~]/2",
  C: "[c6@4 g5@15 ~ a5@2 c6@2 d#6 ~ d#6 ~ d6@2 c6@2]/2", D: "d6@3 ~ c6@11 ~",
  E: "~@5 c6@3 d#6 ~ d#6 ~ d6@2 c6 ~, ~ a5 ~@2", F: "c6 a5@3", G: "g5@9 ~ g5@2 a5@2 g5@2",
  H: "e6@4 d6@5 ~ e6 ~ e6 ~ e6 ~", I: "d6@3 ~ c6@5 ~ c6@2 a5@2 c6 ~", J: "c6 ~@9 c6@2 a5@2 c6 ~", K: "c6 ~@15",
})).s("gm_whistle").gain(0.72).pan(0.3)

// other · synth drum
const synth_drum = note(`<
  ~@2 A ~ B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B
  C B C B C B C B C B C B C B C ~@3
>`.pickRestart({
  A: "c3@2 ~@4 g3 ~ f3 ~ e3 ~@3 c3 ~", B: "c3 ~@5 g3 ~ f3 ~ e3 ~@3 d3 ~", C: "c3 ~@15",
})).s("gm_synth_drum").gain(0.44).pan(0.6)

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

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!76 ~>").gain(0.42)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~@2
>`.pickRestart({
  A: "~@7 x ~@8",
})).gain(0.24)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!76 ~>").gain(0.42)

// drums · hihat
const hihat = s("hh").struct("<[x ~@2 x!2 ~@2 x!2 ~@2 x!3 ~ x]!76 x>").gain(0.42)

// drums · open hat
const open_hat = s("oh").struct("<[~ x ~ x ~ x ~ x]!76 ~>").gain(0.42)

// drums · crash
const crash = s("cr").struct("<~@76 x>").gain(0.36)

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

stack(
  clavinet, clavinet_soft, synth_strings_2, bass, drawbar_organ, whistle, synth_drum, kick, snare, snare_soft, clap,
  hihat, open_hat, crash, tambourine
)

More by Three Dog Night