Strudelify
Da Doo Ron Ron cover art

1977 · Shaun Cassidy

Da Doo Ron Ron

Shaun Cassidy

KeyE♭ majorTempo139 bpm
0:00/0:00
// Da Doo Ron Ron — Shaun Cassidy
// 139 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 3 "BASS" named as a bass, played on electric bass finger (its electric guitar jazz patch is not one)
// note: Full arrangement: all 92 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(139/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 · synth bass 1 · "SYNTH BASS"
const bass = note(`<
  A@5 B C A@2 B C A@2 B A C A B C A@4 B C A@2 B C A@2 B A C A B C A@4 B C A@2 B C A@2 B C A@2 B C A@2 B A C A B C A@4 B
  C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 D
>`.pickRestart({
  A: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~",
  B: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~",
  C: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~", D: "eb2 ~@23",
})).s("gm_synth_bass_1").gain(0.4).pan(0.3)

// bass · electric bass finger · "BASS"
const bass_2 = note(`<
  A@3 B C D E F C D E F C G C H C D E C@2 I C D E C@2 D E F C D C H C D E C@2 I C J E K C L E F C D M F C D E F C D C H
  N D E C@2 I C D E O C D E P C D H O C D E Q C D R S C D E C K T
>`.pickRestart({
  A: "eb1 ~ eb1 ~ eb1 ~ eb1 ~", B: "eb1@3 ~@3 eb1@3 ~@3 eb1@3 ~@3 eb1@2 bb1@2 c2@2",
  C: "eb2@2 ~ eb2@2 ~ eb2@2 ~ eb2@2 ~", D: "ab1@3 ~@3 ab1@3 ~@3 ab1@3 ~@3 ab1@4 ~@2",
  E: "bb1@4 ~@2 bb1@3 ~@3 bb1@3 ~@3 bb1@4 ~@2", F: "eb2@3 ~@3 eb2@3 ~@3 eb2@3 ~@3 eb2@3 ~ bb1@2",
  G: "ab1 ~ ab1 ~ ab1 ~ ab1 ~", H: "bb1@3 ~@3 bb1@3 ~@3 bb1@3 ~@3 bb1@2 ~@2 bb1@2",
  I: "eb2@3 ~@3 eb2@3 ~@3 eb2@3 ~@3 eb1@2 bb1@2 c2@2", J: "ab1@3 ~@3 ab1@3 ~@3 ab1@3 ~@3 ab1@4 ~@2, eb2 ~@23",
  K: "eb2@2 ~ eb2@2 ~ eb2@2 ~ eb2 c2 bb1", L: "ab1@3 ~@3 ab1@3 ~@3 ab1@3 ~@3 ab1@2 ~@2 ab1@2",
  M: "bb1@4 ~@2 bb1@3 ~@3 bb1@2 ~@4 bb1@5 ~", N: "eb2@4 ~@2 eb2@4 ~@2 eb2@4 ~@2 eb2@5 ~, ~@12 db2 ~@11",
  O: "eb2@2 ~ eb2@2 ~ eb2@2 ~ eb2 bb1 c2", P: "eb2@3 ~@3 eb2@4 ~@2 eb1@3 ~@3 eb1 ~ bb1@2 c2@2",
  Q: "eb2@4 ~@2 eb2@3 ~@3 eb2@3 ~ eb1@2 g1@2 bb1@2 c2@2", R: "bb1 ~ bb1 ~ bb1 ~ bb1 ~",
  S: "eb2@4 ~@2 eb2@3 ~@3 eb2@3 ~ bb1@2 c2@4 bb1@2", T: "eb1@3 ~@6 eb1@10 ~@5",
})).s("gm_electric_bass_finger").gain(0.68).pan(0.6)

// chords · piano · "A.PIANO"
const piano = note(`<
  A@5 B C A@2 B D A@2 B E C A B C A@4 B C A@2 B C A@2 F A C A B C A@4 B C A@2 B C A@2 B C A@2 G C A@2 F A C A B C A H A
  E I J A H K C H@2 K L H@2 K J H@2 K M N H K O H@2 P
>`.pickRestart({
  A: "[g4,bb4] eb4 [g4,bb4] eb4 [g4,bb4] eb4 [g4,bb4] eb4 [g4,bb4] eb4 [g4,bb4] eb4", // Gm
  B: "[ab4,c5]@2 eb4@2 [ab4,c5]@2 eb4@2 [ab4,c5]@2 eb4@2 [ab4,c5]@2 eb4@2 [ab4,c5]@2 eb4@2 [ab4,c5]@2 eb4 ~", // Ab
  C: "[f4,bb4] d4 [f4,bb4] d4 [f4,bb4] d4 [f4,bb4] d4 [f4,bb4] d4 [f4,bb4] d4", // Bb5
  D: "[f4,bb4] d4 [f4,bb4] d4 [f4,bb4] d4 [f4,bb4] d4 [f4,bb4] d4 [f4,bb4] d4, ~@16 e4 ~@7", // Bb5
  E: "[g4,bb4] ~ eb4 ~ [g4,bb4] ~ eb4 ~ [g4,bb4] ~ eb4@2 [g4,bb4]@2 eb4@2 [g4,bb4]@2 eb4 ~ [g4,bb4]@2 eb4@2", // Gm
  F: "[ab4,c5] eb4 [ab4,c5] eb4 [ab4,c5] eb4 [ab4,c5] eb4 [ab4,c5] eb4 [ab4,c5] eb4", // Ab
  G: "[ab4,c5]@2 eb4@2 [ab4,c5]@2 eb4@2 c5@2 eb4@2 c5@2 ~@2 c5@2 eb4@2 c5@2 eb4 ~, ~@8 ab4 ~@3 ab4 ~ eb4@4 ~@6, ~@16 ab4 ~@3 ab4 ~@3", // Ab
  H: "[g4,bb4] ~ eb4 ~ [g4,bb4] ~ eb4 ~ [g4,bb4] ~ eb4 ~ [g4,bb4] ~ eb4 ~ [g4,bb4] ~ eb4 ~ [g4,bb4] ~ eb4 ~", // Gm
  I: "c5@2 eb4 ~ c5@2 eb4 ~ [ab4,c5] ~ eb4 ~ [bb4,c5] ~ eb4 ~ [ab4,c5] ~ eb4 ~ [ab4,c5]@2 eb4@2, ab4 ~@3 ab4 ~@7 ab4@2 ~@10", // Ab Bbsus2 Ab
  J: "[f4,bb4]@2 d4@2 bb4@2 d4@2 [f4,bb4] ~ d4@2 [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ bb4@2 d4 ~, ~@4 f4 ~@15 f4 ~@3", // Bb5
  K: "[ab4,c5] ~ eb4 ~ [ab4,c5] ~ eb4 ~ [ab4,c5] ~ eb4 ~ [ab4,c5] ~ eb4 ~ [ab4,c5] ~ eb4 ~ [ab4,c5] ~ eb4 ~", // Ab
  L: "[f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,ab4,bb4] ~ d4 ~", // Bb5 Bb7
  M: "[f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~", // Bb5
  N: "[g4,bb4] ~ eb4@2 bb4@2 eb4@2 [g4,bb4] ~ eb4@2 [g4,bb4] ~ eb4 ~ [g4,bb4] ~ eb4 ~ bb4@2 eb4 ~, ~@4 g4 ~@15 g4 ~@3", // Gm
  O: "[f4,bb4] ~ d4@2 [f4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~ [f4,ab4,bb4] ~ d4 ~ [f4,ab4,bb4] ~ d4 ~ [f4,bb4] ~ d4 ~", // Bb5 Bb7 Bb5
  P: "[g4,bb4,eb5] ~@8 [g4,bb4,eb5]@7 ~@8", // Eb
})).s("gm_piano").gain(0.4).pan(0.4)

// chords · vibraphone
const vibraphone = note(`<
  ~@6 A B ~@2 A B ~@6 A B ~@4 A B ~@2 A B ~@6 A B ~@12 A B ~@2 C B ~@6 A B ~@2 D E A F D E A F D E A F D G A F D E A F D
  E A B ~@2
>`.pickRestart({
  A: "[f4,bb4,d5] ~@3 [f4,bb4,d5] ~@5 [f4,bb4,d5] ~@5 [f4,bb4,d5] ~@5 [f4,bb4,d5] ~", // Bb
  B: "[g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~@5 [g4,bb4,eb5] ~@13", // Eb
  C: "[f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 bb4 ~ [f4,bb4,d5] ~@5 [f4,bb4,d5] ~@5 [f4,bb4,d5] ~", // Bb
  D: "[g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~@5 [g4,bb4,eb5] ~@5 [g4,bb4,eb5] ~@5 [g4,bb4,eb5] ~", // Eb
  E: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@5 [ab4,c5,eb5] ~@11 [ab4,c5,eb5] ~", // Ab
  F: "[g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~@5 [g4,bb4,eb5] ~@11 [g4,bb4,eb5] ~", // Eb
  G: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@5 [ab4,c5,eb5]@3 ~@9 [ab4,c5,eb5] ~", // Ab
})).s("gm_vibraphone").gain(0.35).pan(0.7)

// chords · tenor sax
const tenor_sax = note(`<
  A B A@2 C D E A F G H I J K L M J N H B O@2 C P Q A C D E R J S L T U V W R X@2 Y Z AA AB AC AD AE AF C D E AG AH@2 E
  AI AJ AK L T J AL AM AN@2 AO AP D E AQ B AR E AS B AL E AT@3 AM AU@3 AV AW@3 AX AY@2 AZ
>`.pickRestart({
  A: "[eb3,bb3]@7 ~", B: "[eb3,bb3]@23 ~", C: "[bb2,eb3]@11 ~", D: "[eb3,ab3]@19 ~@5", E: "[bb3,f4]@23 ~",
  F: "bb2@23 ~, eb3@7 ~", G: "[eb3,ab3]@5 ~, bb2 ~@23", H: "[bb3,f4]@11 ~", I: "eb3@21 ~ bb3@2, bb3@19 ~@5",
  J: "eb3@3 ~@3 bb3@17 ~, ~@2 eb3@5 ~", K: "[eb3,ab3]@21 ~ bb3@2", L: "eb3 ~@2 eb3@9, ~@3 bb3@8 ~",
  M: "f4@11 bb3, bb3@5 ~", N: "[eb3,ab3]@10 ~ eb3", O: "[[eb3,bb3]@23 ~]/2", P: "[eb3,ab3]@23 ~", Q: "f3, bb3@11 ~",
  R: "[eb3,bb3]@21 ~ bb2@2", S: "[eb3,ab3]@21 ~ bb2@2", T: "[bb3,f4]@10 ~ bb2", U: "eb3 ~ [eb3,bb3]@6",
  V: "ab3@11 eb3, eb3@19 ~@5", W: "[bb2,bb3]@3 ~@3 [bb2,e4] ~@17, ~ f4@3, ~@3 bb3@8 ~",
  X: "[eb3@3 ~@3 [eb3,bb3]@40 eb3@2]/2", Y: "g3@6 bb3@3 ~ eb3 ~ g3@5 ~ bb3@3 ~ bb3 ~",
  Z: "c4@3 ~ c4@2 bb3@3 ~ ab3@4 ~@8 ab3 ~", AA: "bb3@4 ~@2 bb3@3 ~ bb3@2 c4@4 bb3@2 g3@3 ~ f3@2",
  AB: "eb3@2 ~@2 eb3@2 c3@3 ~ bb2@3 ~@9 eb3 ~", AC: "g3@6 ~@4 eb3 ~ g3@3 ~ bb3@3 ~@3 g3 ~, ~ bb3 ~@2",
  AD: "c4@3 ~ c4@2 bb3@3 ~ ab3@3 ~@9 ab3 ~", AE: "bb3@4 ~@2 bb3@5 ~ c4@3 ~ bb3@2 g3@3 ~ f3@2",
  AF: "eb3 ~ eb3 c3@2 eb3 ~@6", AG: "[eb3,bb3] ~@3 [eb3,bb3]@2 ~@4 [eb3,bb3]@12 bb2 ~, db3 ~@11",
  AH: "[[eb3,bb3]@19 ~@3 bb3@2 ab3@19 ~@3 [eb3,ab3]@2, ~@22 eb3@21 ~@5]/2", AI: "bb3@11 bb2, eb3@3 ~",
  AJ: "eb3@2 ~@4 bb3@17 ~, ~@2 eb3@5 ~", AK: "[eb3,ab3]@10 ~ bb2", AL: "[eb3,ab3]@19 ~@3 [eb3,ab3]@2",
  AM: "[bb3,f4]@10 ~ [bb3,f4]", AN: "[[eb3,bb3]@43 ~@3 [eb3,bb3]@2]/2",
  AO: "~@4 [eb3,bb3]@9 ~@3 [eb3,bb3]@3 ~@3 [eb3,bb3]@2", AP: "[eb3,bb3] ~@23",
  AQ: "bb3@15 ~ eb3 ~@5 bb2@2, eb3@13 ~@11", AR: "[eb3,ab3]@7 ~ [eb3,ab3] ~@2 [eb3,ab3]", AS: "[eb3,bb3]@19 ~@3 bb2@2",
  AT: "[bb3@15 ~ bb2@2 c3@4 ~@2 bb3@19 ~@3 bb3@2 ab3@13 ~@3 [eb3,ab3]@2 ~@4 [eb3,ab3]@2, eb3@11 ~@11 eb3@21 ~@3 eb3@15 ~@11]/3", // Ab5
  AU: "[bb3@15 ~ bb2@2 c3@4 ~@2 bb3@14 ~@2 [eb3,bb3]@3 ~@3 bb3@2 ab3@19 ~@3 [eb3,ab3]@2, eb3@13 ~@9 eb3@16 ~@8 eb3@21 ~@5]/3", // Eb5 Ab5
  AV: "[bb3,f4]@15 ~ f4@2 ~@4 f4@2, ~@16 bb3 ~@5 bb3 ~", // Bb5
  AW: "[bb3@15 ~ bb2@2 c3@4 ~@2 bb3@14 ~@2 [eb3,bb3]@2 ~@4 bb3@2 ab3@13 ~@3 [eb3,ab3]@2 ~@4 [eb3,ab3]@2, eb3@13 ~@9 eb3@16 ~@8 eb3@15 ~@11]/3", // Eb5 Ab5
  AX: "[bb3,f4]@3 ~@3 [bb3,f4]@14 ~@2 [bb3,f4] ~", AY: "[bb3@8 bb2 c3 eb3 ~ eb3@11 ~, eb3@6 ~@5 bb3@12 ~]/2",
  AZ: "[eb3,bb3] ~@8 eb3@6 ~@9", // Eb5
})).s("gm_tenor_sax").gain(0.45).pan(0.3)

// chords · synth strings 1 · "SYN STRING"
const synth_strings_1 = note(`<
  A@4 B C D E B C D F@2 C E D G@2 D H@3 E C D F@2 C D F@2 I@2 J E C K L@3 B C D F@2 C D F@2 C D F@2 C D F@2 M E D E C D
  N@3 B M D F@2 C D F@2 C D F@2 C D F@2 O@2 E B C D P@3
>`.pickRestart({
  A: "[[g3,bb3,eb4]@23 ~]/4", B: "[bb3,eb4], g3@11 ~", C: "[ab3,c4,eb4]@11 ~", D: "[f3,bb3,d4]@23 ~",
  E: "[g3,bb3,eb4]@11 ~", F: "[[g3,bb3,eb4]@47 ~]/2", G: "[[bb3,eb4]@23 [ab3,c4,eb4]@23 ~@2, g3@7 ~@9]/2",
  H: "[[g3,bb3,eb4]@71 ~]/3", I: "[[ab3,c4,eb4]@22 ~@2 bb3@23 ~, ~@23 [g3,eb4]@23 ~@2]/2",
  J: "~ d4@22 ~, [f3,bb3]@11 ~", K: "~ f3@21 ~@2, [bb3,d4]@11 ~", L: "[[g3,bb3,eb4]@35 ~]/3",
  M: "~ c4@21 ~@2, [ab3,eb4]@11 ~", N: "[~ [g3,eb4]@69 ~@2, bb3@23 ~]/3",
  O: "[[ab3,c4,eb4]@22 ~@2 d4@23 ~, ~@23 [f3,bb3]@23 ~@2]/2", // Ab Bb5
  P: "[[g3,bb3,eb4]@25 ~@4 eb4@4 ~@3, ~@57 [g3,bb3]@8 ~@7]/3", // Eb Gm
})).s("gm_synth_strings_1").gain(0.35)

// drums · kick
const kick = s("bd").struct("<[x!4]!91 [x ~@2 x ~@4]>").gain(0.78)

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

// drums · clap
const clap = s("cp").struct("<[x!4]!4 ~@36 [x!4]!8 x ~@17 [x!4]!24 [x ~ x!2] x>").gain(0.62)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@12 A ~ A ~ A ~@4 B ~@8 A ~ A ~ A ~@4 B ~@16 A ~ A ~ A ~@4 B ~@13 C ~ B ~ C ~ D ~ E ~@2 C ~
>`.pickRestart({
  A: "x", B: "~@9 x!3", C: "~@11 x", D: "~@7 x!5", E: "~@10 x!2",
})).gain(0.78)

// drums · hihat
const hihat = s("hh").struct("<[x!12]!91 [x ~@2 x ~@4]>").gain(0.54)

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 A ~@17 B ~@25 B ~@9 C ~ D ~ E ~ B ~ E ~ F ~ G ~@2 H ~>".pickRestart({
  A: "~ x ~@4 x!3 ~@3", B: "~@6 x!3 ~@3", C: "~@9 x!3", D: "~@8 x!4", E: "~@8 x!3 ~", F: "~@3 x!4 ~@5",
  G: "~@7 x!3 ~@2", H: "~@9 x!2 ~",
})).gain(0.78)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@11 A ~ A ~ A ~@5 B ~@7 A ~ A ~ A ~@5 B ~@15 A ~ A ~ A ~@5 B ~@9 C ~ D ~ D ~ B ~ D ~ E ~ F ~@2 G ~
>`.pickRestart({
  A: "~@11 x", B: "x!6 ~@6", C: "~@5 x!4 ~@3", D: "~@5 x!3 ~@4", E: "x!3 ~@9", F: "~@2 x!5 ~@5", G: "~@6 x!3 ~@3",
})).gain(0.78)

// drums · crash
const crash = s("cr").struct("<A ~@3 A ~@17 A ~@17 A ~@7 A ~@7 B ~@9 A ~@7 A ~@3 A ~@3 A ~@3 A ~@4 A>".pickRestart({
  A: "x", B: "~ x ~@2",
})).gain(0.62)

stack(
  bass, bass_2, piano, vibraphone, tenor_sax, synth_strings_1, kick, snare, clap, low_tom, hihat, mid_tom, high_tom,
  crash
)