Strudelify

An Old Fashioned Love Song

Three Dog Night

KeyG minorTempo140 bpm
0:00/0:00
// An Old Fashioned Love Song — Three Dog Night
// 140 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 89 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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.

// chords · piano · "Piano (Melody)"
const piano = note(`<
  ~@2 A B C D A B C D E F G H I J@2 K L@3 M N O P Q R@3 S T U V W X@4 Y Z@2 AA AB@4 AC@2 AD AE AF AG AH J AI AJ L@3 M N
  O P Q R@3 S T U V W X@4 Y Z@2 AA AB@4 AC@2 AK AL@2
>`.pickRestart({
  A: "g3@2 d4 bb3@2 d4 bb3@2, g4@3 g4@5", B: "f3@2 d4 bb3@2 d4 bb3@2, g4@3 g4@5",
  C: "eb3@2 d4 bb3@2 d4 bb3@2, g4@3 g4@5", D: "~ [d4,gb4,a4] [d4,g4,bb4] [d4,a4,c5], d3", E: "~@3 g4@3 a4@2",
  F: "bb4@3 c5@3 d5@2", G: "c5@3 g4@5", H: "gb4 [c4,d4,gb4] [c4,e4,g4] [c4,gb4,a4]",
  I: "[d4,g4,bb4]@2 [a4,c5] [bb4,d5]@5", J: "g4@3 g4@5", K: "~ [d4,gb4,a4] [d4,g4,bb4] [d4,a4,c5]",
  L: "c5@2 bb4 a4@3 bb4@2", M: "[d4,gb4,a4] [d4,gb4,a4]@2 [d4,g4,bb4]@3 [d4,a4,c5]@2",
  N: "[g4,bb4]@2 [a4,c5] [bb4,d5]@3 d5@2", O: "eb5 d5 c5 bb4", P: "g5 f5 eb5@2, g4", Q: "d5@2 c5 bb4@3 a4@2, gb4",
  R: "[~@2 [d4,b4,d5]@2 [d4,b4,d5]@2 [d4,b4,d5] [d4,d5]@2 [a4,c5] [g4,b4] [g4,b4]@2 [a4,c5] [b4,d5] [bb4,d5]@3 [a4,c5] [g4,bb4]@3 [a4,c5]@2, ~@7 b4 ~@16]/3", // G D Am G Am Bm Bb Am …
  S: "[gb4,a4]@2 [g4,bb4] [a4,c5]@5", T: "~ [d4,bb4,d5]!3",
  U: "[d4,bb4,d5] [a4,c5] [g4,bb4] [g4,bb4]@2 [a4,c5] [bb4,d5]@2", V: "c5 bb4@3 c5 d5@3, [eb4,g4]!2", W: "[d4,gb4,a4]",
  X: "[~@2 d4 bb3 ~ d4 g4 [d4,bb4]@4 [d4,f4,c5]@2 [d4,f4,d5]@2 [eb4,g4,c5]@4 [bb3,e4]@5 bb4 e4 c4 bb4@2 c4 e4 bb4, ~@4 f4@2 ~@13 g4@13]/4", // Gm Dm7 Dm Cm Bbdim
  Y: "[eb4,g4,eb5] [eb4,g4,c5]@2 [eb4,g4,c5]@3 [g4,bb4]@2", // Eb Cm Gm
  Z: "[[f4,a4,db5]@3 [eb4,a4,c5]@6 [eb4,a4,c5]@9 g4@3 [d4,f4,bb4]@9 f5@4 bb5 ~ e5@4 bb5 ~ eb5@4 bb5 ~, ~@5 [f4,d5] [e4,db5] [eb4,c5]]/2", // Faug Adim Bb Dm Dbm Cm
  AA: "[d4,bb4,d5] ~@3", // Gm
  AB: "[~@2 d4 bb3 ~ d4 g4 [d4,bb4]@4 [d4,f4,c5]@2 [d4,f4,d5]@2 [g4,c5]@4 [bb3,eb4]@5 bb4 e4 c4 bb4@2 c4 e4 bb4, ~@4 f4@2 ~@9 e4 ~@3 g4@13]/4", // Gm Dm7 Dm C5 Eb5
  AC: "[[eb4,g4,eb5] [eb4,g4,c5]@2 [eb4,g4,bb4]@3 g4 [f4,a4]@3 [eb4,a4,c5]@2 [eb4,g4,bb4] [eb4,a4,c5]@3, ~@7 db5 ~@8]/2", // Eb Cm Eb F Adim Eb Adim
  AD: "bb4@3 bb4 a4@2 bb4@2, [d4,g4]", AE: "c5@2 bb4 a4@3 bb4@2, g4", AF: "c5 bb4@2 a4@3 bb4@2, g4",
  AG: "[d4,gb4,a4]@2 [d4,gb4,a4]@2 ~ [d4,g4,bb4] [d4,a4,c5]@2", AH: "[g4,bb4]@2 g4 [bb4,d5]@5",
  AI: "g4@2 eb4 g4@2 bb4 eb5@2", AJ: "~ gb4 [bb4,d5] [a4,c5], ~ d4",
  AK: "[d4,f4,bb4]@4 f5@3 bb5 e5@3 bb5, ~ [f4,d5] [e4,db5]", // Bb Dm Dbm
  AL: "[eb5@3 bb5 [d4,bb4]@2 ~@2 [d4,f4,bb4]@10 ~@6, [eb4,c5] d5 ~@4]/2", // Gm Bb Cm
})).s("gm_piano").gain(0.74)

// chords · piano
const piano_2 = note(`<
  ~@10 A B C D A B E D F B E G F H E G I B J K L M E D N@2 O@2 J P Q@2 N@2 R@2 S T A H J G L H J K A U V K A U J D I H S
  W X U S W Y@2 O@2 C Z AA@4 R@2 S Z AB@3
>`.pickRestart({
  A: "[g3,bb3,d4]@18 g3@2 bb3@2 d4 ~", // Gm
  B: "~@16 c4@2 ~@2 f4@2 a4 ~, [f2,a4]@23 ~, f4@5 ~, c4@16 ~@2 c4@5 ~, ~@14 a3@9 ~", // F
  C: "~@20 d4@2 f4 ~, [eb2,f4]@23 ~, d4@18 bb3@5 ~, bb3@16 g3@7 ~, g3@14 eb3@9 ~", // Ebsus2
  D: "~@20 c4@2 d4 ~, [d2,d4]@11 ~, c4@9 a3@2 ~, a3@8 gb3@3 ~, gb3@14 d3@9 ~", // D
  E: "~@20 d4@2 f4 ~, [eb2,f4]@11 ~, d4@9 bb3@2 ~, bb3@8 g3@3 ~, g3@14 eb3@9 ~", // Ebsus2
  F: "~@16 d4@2 ~@2 g4@2 bb4 ~, [g2,bb4]@23 ~, g4@5 ~, d4@16 ~@2 d4@5 ~, ~@14 bb3@9 ~", // Gm
  G: "[c4,d4,gb4,a4]@18 c4@2 gb4@2 a4 ~", H: "[a3,c4,f4]@18 f4@2 a4@2 c5 ~",
  I: "~@16 d4@2 ~@2 g4@2 b4 ~, [g2,b4]@11 ~, g4@5 ~, d4@8 ~ d4@2 ~, ~@14 b3@9 ~", // G
  J: "[bb3,d4,f4,g4]@8 eb3 [bb3,d4,f4,g4] ~@2", // Gm7
  K: "~@20 c4@2 d4 ~, [d2,d4]@23 ~, c4@18 a3@5 ~, a3@16 gb3@7 ~, gb3@14 d3@9 ~", L: "[g3,bb3,d4]@8 g2 [g3,bb3,d4] ~@2",
  M: "~@16 c4@2 ~@2 f4@2 a4 ~, [f2,a4]@11 ~, f4@5 ~, c4@8 ~ c4@2 ~, ~@14 a3@9 ~", // F
  N: "[~@42 f4@4 d4 ~, bb2@23 [bb4,d5] f4@10 bb3@2 d4@4 bb3@6 ~@2, d4@22 f5@25 ~, bb3@12 f5@8 f3@27 ~, f4@11 [bb5,d6]@36 ~]/2", // Bb
  O: "[~@44 bb3@2 g3 ~, c2@22 bb4 [e4,g4] c4@10 e3@2 g3@4 e3@2 c4@4 ~@2, bb3@12 bb4@8 c3@27 ~, g3@12 c5@35 ~, [e3,c4]@11 [e5,g5]@36 ~]/2", // Em C Em
  P: "[c4,eb4,f4,a4]@8 f3 [c4,eb4,f4,a4] ~@2", // F7
  Q: "[~@18 bb3@6 ~@18 bb3@2 bb3@2 d4 ~, bb2@47 ~, [d4,f4,bb4]@12 [d4,f4]@11 ~, bb3@3 ~ bb3@3 ~, ~@16 f3@24 f3@7 ~]/2", // Bb Dm
  R: "[~@44 g3@2 bb3 ~, c2@47 ~, [bb3,c4,g4]@11 g3@10 e3@2 ~, e3@9 e3@3 [bb3,c4]@11 ~, ~@16 c3@8 e3@16 c3@7 ~]/2", // C7 Bbsus2
  S: "[bb3,d4,f4,g4]@18 d4@2 g4@2 bb4 ~", T: "[c4,eb4,f4,a4]@18 eb4@2 a4@2 c5 ~", U: "[a3,c4,f4]@8 f3 [a3,c4,f4] ~@2",
  V: "[d4,f4,g4,bb4]@8 eb3 [d4,f4,g4,bb4] ~@2", W: "[c4,d4,gb4,a4]@8 d3 [c4,d4,gb4,a4] ~@2",
  X: "~@16 d4@2 ~@2 g4@2 bb4 ~, [g2,bb4]@11 ~, g4@5 ~, d4@8 ~ d4@2 ~, ~@14 bb3@9 ~", // Gm
  Y: "[~@18 bb3@2 ~@4 bb3@16 bb3@2 bb3@4 d4 ~, bb2@23 ~, f4@11 d4@12 ~, d4@10 bb3@2 f4@11 ~, bb3@8 f3@15 ~]/2",
  Z: "~@20 eb4@2 f4 ~, [f2,f4]@11 ~, eb4@9 c4@2 ~, c4@8 a3@3 ~, a3@14 f3@9 ~", // F
  AA: "[bb3@4 ~@2 bb3@3 ~ bb3@6 bb3@2 ~@12 bb3@4 bb3@8 bb3@3 ~@3, bb2@22 f4@23 ~@3, [d4,f4]@9 ~ f4@10 d4@4 bb3@4 f3@17 ~@3, ~@4 f3@20 bb2@21 ~@3, ~@10 d4@8 bb3@6 bb4@10 [d4,bb4]@11 ~@3]/2", // Dm Gm
  AB: "[~@21 bb3@3 ~@5 f4 ~@2 [d4,bb4]@4 ~@4 [d4,f4,bb4]@20 ~@12, bb2@31 ~@41, f4@27 d4@4 ~ d5@8 ~@32, d4@24 bb3@7 ~@41, bb3@19 f3@12 ~@41]/3", // Gm Bb
})).s("gm_piano").gain(0.41)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@2 A B C D E F G H E I J K L F G H E M J N E M G H E I G N O P Q D R S T U V W X Y Z AA AB AC AD AE AF AG V AH AI AJ
  AK AL AM F G AN E AO Q N A AP Q K E P G H X Y AQ AR AK AG AS AT R S T U AU AV AW@3
>`.pickRestart({
  A: "g2@10 d2@2 g2@9 ~ g2 ~", B: "f2@10 c2@2 f2@9 ~ e2 ~", C: "eb2@9 ~ eb2 ~ eb2@10 eb2 ~",
  D: "d2@9 ~ d2 ~ d2@9 ~ d2 ~", E: "g2@8 ~@2 g2 ~ g2@10 g1 ~", F: "f2@8 ~@2 f2 ~ f2@10 f1 ~",
  G: "eb2@8 ~@2 eb2 ~ eb2@10 eb1 ~", H: "d2@10 a1@2 d2@9 ~ d2 ~", I: "f2@9 ~ f2 ~ f2@9 ~ f2 ~",
  J: "eb2@10 bb1@2 eb2@9 ~ eb2 ~", K: "d2@8 ~@2 d2 ~ d2@4 e2@2 d2@4 gb2 ~", L: "g2@10 d2@2 g2@9 ~ gb2 ~",
  M: "f2@9 ~ f2 ~ f2@10 e2 ~", N: "d2@8 ~@2 d2 ~ d2@10 d1 ~", O: "g2@9 ~ g2 ~ g2@10 gb2 ~",
  P: "f2@8 ~@2 f2 ~ f2@4 g2@2 f2@4 f2 ~", Q: "eb2@8 ~@2 eb2 ~ eb2@4 f2@2 eb2@4 eb2 ~",
  R: "bb1@9 ~ bb1 ~ bb1@8 f1 ~ g1 ~", S: "bb1@9 ~ bb1 ~ bb1@8 bb1 ~ bb1 ~", T: "c2@9 ~ c2 ~ c2@8 g1@2 a1@2",
  U: "c2@8 ~@2 c2 ~ c2@8 e2 ~ d2 ~", V: "eb2@8 ~@2 eb2 ~ eb2@8 eb2 ~ eb2 ~", W: "f2@9 ~ f2 ~ f2@8 b1 ~ a1 ~",
  X: "bb1@8 ~@2 bb1 ~ bb1@8 bb0 ~ f1 ~", Y: "bb1@8 ~@2 bb1 ~ bb1@7 ~ bb1 ~ bb1 ~",
  Z: "bb1@9 ~ bb1 ~ bb1@4 c2@2 bb1@4 f1@2", AA: "bb1@8 ~@2 bb1 ~ bb1@8 bb1 ~ bb1 ~",
  AB: "c2@9 ~ c2 ~ c2@4 d2@2 c2@4 g1@2", AC: "c2@8 ~@2 c2 ~ c2@8 f2 ~ d2 ~", AD: "eb2@8 ~@2 eb2 ~ eb2@8 eb2 ~ g2 ~",
  AE: "f2@9 ~ f2 ~ f2@8 ab2 ~ gb2 ~", AF: "g2@9 ~ g2 ~ g2@8 gb2 ~ e2 ~", AG: "f2@8 ~@2 f2 ~ f2@3 ~ f2@3 ~ f2 ~ f2 ~",
  AH: "d2@9 ~ d2 ~ d2@8 ab2 ~ gb2 ~", AI: "g2@8 ~@2 g2 ~ g2@8 g2 ~ g2 ~", AJ: "f2@9 ~ f2 ~ f2@8 e2 ~ d2 ~",
  AK: "eb2@8 ~@2 eb2 ~ eb2@3 ~ eb2@3 ~ eb2 ~ eb2 ~", AL: "d2@8 ~@2 d2 ~ d2@8 d2 ~ d2 ~", AM: "g2@9 ~ g2 ~ g2@9 ~ g2 ~",
  AN: "d2@9 ~ d2 ~ d2@10 ab2 ~", AO: "f2@10 c2@2 f2@9 ~ f2 ~", AP: "f2@8 ~@2 f2 ~ f2@4 g2@2 f2@4 c2 ~",
  AQ: "c2@9 ~ c2 ~ c2@8 g1 ~ a1 ~", AR: "c2@9 ~ c2 ~ c2@8 g1 ~ c2 ~", AS: "bb1@9 ~ bb1 ~ bb1@8 f1@2 g1@2",
  AT: "bb1@8 ~@2 bb1 ~ bb1@8 b1 ~ a1 ~", AU: "eb2@9 ~ eb2 ~ eb2@8 gb2 ~ e2 ~", AV: "f2@8 ~@2 f2 ~ f2@8 f2 ~ f2 ~",
  AW: "[bb1@11 ~@2 bb1 ~@2 bb1@11 a2 ~ ab2 ~@6 f3@4 g3@4 [bb2,ab3]@20 ~@8]/3", // Bb7
})).s("gm_fretless_bass").gain(0.43)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@34 A@2 B@2 C D E@2 F@2 G@2 C H I J C K I J C L ~@16 A@2 G@2 C D M@4 N@2 C H O@3
>`.pickRestart({
  A: "[f5 bb5, d6]/2", B: "[~@3 g6, [bb5,e6]]/2", C: "[g5,d6]", D: "~ a5, [eb6,f6]", E: "[~ d6, [f5,f6]]/2",
  F: "[~ f5, f6@47 ~, ~@12 d6@35 ~]/2", G: "[bb6@24 [bb5,g6]@23 ~, e6@47 ~]/2", H: "[a5,eb6]", I: "[bb5,g6]",
  J: "[a5,f6]", K: "[gb6,a6]", L: "[gb6,c7]", M: "[f6@24 [f5,f6]@23 ~, d6@47 ~]/2",
  N: "[~ bb5, g6@47 ~, ~@12 e6@35 ~]/2", O: "[~@4 f5@4 [d4,bb4] ~ [d4,f4,bb4]@5 ~@3, [d6,f6]@4 d5 ~@4]/3",
})).s("gm_string_ensemble_1").gain(0.23)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A B A C A C A@4 C A@3 C D A@4 C@3 E A@3 E A C A F A C A C A C A E A C A C A C A C A C A C A F A@4 C@3 G A@2 C A@6
  C A C A C A C A C A C A@2 H I ~
>`.pickRestart({
  A: "x ~@4 x!2 ~@4 x", B: "x ~ x ~@2 x!2 ~@4 x", C: "x ~@4 x!2 ~ x ~@2 x", D: "x ~@4 x ~@2 x ~@3", E: "x ~@4 x ~@6",
  F: "x ~@3 x!2 ~@6", G: "x ~@3 x ~@6 x", H: "x ~@10 x ~@12", I: "~@5 x ~@2 x ~@11 x ~@3",
})).gain(0.44)

// drums · rim
const rim = s("rim").struct("<A B C@15 ~ C@7 ~ C@3 ~ C@3 ~@23 C@7 ~ C@3 D C@3 D ~@7 D ~@5 D ~@3>".pickRestart({
  A: "x!2", B: "x!4", C: "~ x ~ x", D: "~ x ~@2",
})).gain(0.59)

// drums · snare
const snare = s("sd").struct("<~@17 A ~@7 B ~@3 B ~@3 C D@7 B D@13 C ~@7 E ~@3 F ~@3 G D@7 H D@5 G I J ~>".pickRestart({
  A: "~ x!3", B: "~@3 x!2 ~ x ~@2 x ~@2", C: "~@2 x!2 ~@3 x ~@2 x ~", D: "~ x ~ x", E: "~@2 x!2 ~@8", F: "~@7 x!3 ~ x",
  G: "~@7 x!3 ~@2", H: "~@9 x ~ x", I: "~@5 x ~@2 x ~@15", J: "~@4 x!2",
})).gain(0.59)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@17 A ~@7 B ~@3 B ~@3 C ~@3 D ~ D ~ B ~ D ~@7 D ~ D ~ C ~@25 D ~@7>".pickRestart({
  A: "~@7 x ~@2 x ~", B: "~ x ~@2 x!2", C: "~@3 x", D: "~@5 x ~@6",
})).gain(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@17 A ~@7 A ~@3 A ~@3 A ~@7 A ~@13 A ~@7 B ~@23 C ~>".pickRestart({
  A: "~@11 x", B: "~@3 x", C: "x",
})).gain(0.66)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2 A@3 B A C A D A@2 C E A F C G A@2 H A@2 I C ~ A@3 ~ A I A ~ J K L M N O L ~ J P N Q J R N R N O S O L ~ A@3 F C@3
  ~ A T C U A@3 V J K S C N Q L I J P S K J V ~ W ~
>`.pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x", B: "x ~ x!2 ~@2 x ~ x!2 ~@2", C: "x ~ x!2 ~ x!2 ~ x!4", D: "x!4 ~@2 x ~ x!2 ~ x",
  E: "x!4 ~@2 x ~ x!2 ~@2", F: "x ~ x!2 ~@2 x ~ x!2 ~ x", G: "x!3 ~@9", H: "x!4 ~ x!2 ~ x!2 ~@2",
  I: "x ~ x!2 ~ x!2 ~ x!2 ~@2", J: "x ~ x!5 ~ x!4", K: "x ~ x!5 ~ x!3 ~", L: "x!4 ~ x!2 ~@2 x!3",
  M: "x ~ x!3 ~ x ~ x!4", N: "x ~ x!6 ~ x!3", O: "x ~ x!3 ~ x!6", P: "x ~ x!2 ~@2 x ~ x!4", Q: "x!11 ~", R: "x ~ x!9 ~",
  S: "x!12", T: "x ~ x!5 ~ x!2 ~ x", U: "x ~ x!2 ~ x!2 ~@5", V: "x ~ x!2 ~ x!3 ~ x ~@2", W: "~@2 x!4",
})).gain(0.44)

// drums · mid tom
const mid_tom = s("mt").struct("<~@25 A ~@3 A ~@3 B ~@7 A ~@13 B ~@7 A ~@22 C ~@2>".pickRestart({
  A: "~@7 x ~@4", B: "~@2 x", C: "~@19 x ~@4",
})).gain(0.59)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A ~@3 B ~@3 A ~ B ~ C ~@2 D ~@2 D ~@7 D ~@3 D E ~ E ~ E ~@2 F E D ~ D E D E ~@3 E ~@4 B ~@11 D ~ D ~ F E D E D ~ F
  ~ D ~ D ~@3
>`.pickRestart({
  A: "~@5 x ~@5 x", B: "~@5 x ~@6", C: "~ x ~@2", D: "~@11 x", E: "~@2 x", F: "~ x ~",
})).gain(0.44)

// drums · high tom
const high_tom = s("ht").struct("<~@33 A ~@21 A ~@7 B ~@22 C ~@2>".pickRestart({
  A: "~ x", B: "~@5 x ~@6", C: "~@13 x ~@10",
})).gain(0.59)

// drums · ride
const ride = s("rd").struct(`<
  ~@2 A ~@7 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@13 A ~@6 A@2 ~@3 A ~@3 A ~@7 A ~@5 A ~@2
>`.pickRestart({
  A: "x",
})).gain(0.52)

stack(
  piano, piano_2, bass, string_ensemble_1, kick, rim, snare, snare_soft, low_tom, hihat, mid_tom, open_hat, high_tom,
  ride
)

More by Three Dog Night