Strudelify

Delta Dawn

Helen Reddy

KeyF majorTempo68 bpm
0:00/0:00
// Delta Dawn — Helen Reddy
// 68 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(68/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
const piano = note("<~@7 A B C D E F G B H B C D E F G B I@8 J C ~@6 A K@7 J K@7 J L@6 ~>".pickRestart({
  A: "[bb3,d4,f4]@3 [a3,c4]@5", B: "[c4,f4] bb3", C: "[a3,c4]", D: "[c4,f4] [bb3,eb4]", E: "[a3,c4]@3 f4",
  F: "[f4,bb4] [gb4,a4] [d4,g4] [e4,bb4]", G: "[f4,a4,c5]", H: "[a3,c4,f4]",
  I: "[[a3,c4,f4]@8 [a3,c4,f4]@4 [f4,a4,c5]@2 [c4,f4,a4] ~ [c4,f4]@4 [a3,c4]@8 [c4,f4]@8 [bb3,d4]@8 [a3,c4]@8 [a3,c4]@8 [a3,c4]@8 [e4,g4]@8 [e4,g4]@8 [f4,a4]@8 [c4,f4]@8 [bb3,d4]@8 [a3,c4]@8 [a3,c4]@4 [c4,f4]@4 [c4,e4]@4, ~@15 a3@4 ~@109]/8", // F F5 Am F5 Bb Am Em F …
  J: "[bb3,d4]@3 [a3,c4]@3 [a3,c4]@2", // Bb Am
  K: "[~ [a3,c4]@2 [c4,f4]@2 [bb3,d4]@2 [a3,c4]@2 [a3,c4]@2 [a3,c4]@2 [e4,g4]@2 [e4,g4]@2 [f4,a4]@2 [c4,f4]@2 [bb3,d4]@2 [a3,c4]@2 [a3,c4] [c4,f4] [c4,e4]]/7", // Am F5 Bb Am Em F F5 Bb …
  L: "[~ [a3,c4]@2 [c4,f4]@2 [bb3,d4]@2 [a3,c4]@2 [a3,c4]@2 [a3,c4]@2 [e4,g4]@2 [e4,g4]@2 [f4,a4]@2 [c4,f4]@2 [bb3,d4]@2 ~]/6", // Am F5 Bb Am Em F F5 Bb
})).s("gm_piano").gain(0.46)

// bass · electric bass finger · "Finger Bass"
const bass = note(`<
  ~@7 A B C B D E F B G H I H J E F H K L M L N L O P A Q ~@6 A L M L N L O P A L M L N L O P A L M L N L R ~
>`.pickRestart({
  A: "bb2@2 bb2 f2@3 c3@2", B: "f2 eb2", C: "f2@4 f2!2 c3 d3", D: "f2@4 f2!2 a2@2", E: "bb2 a2 g2 c2", F: "f2 e2 d2 c2",
  G: "f2@4 f2!2 c2@2", H: "f2@3 f2 eb2@4", I: "f2@3 f2!3 c3 d3", J: "f2@3 f2!3 a2@2", K: "f2@4 c2@4 d2!4 e2@2 e2@2",
  L: "f2!2", M: "bb1 f2", N: "c2@2 c2 c3@3 c2@2", O: "bb1@2 f2 c3", P: "f2@2 f2 c3", Q: "f2", R: "bb1 ~",
})).s("gm_electric_bass_finger").gain(0.46)

// chords · acoustic guitar steel · "Acoustic Guitar"
const acoustic_guitar_steel = note(`<
  ~@24 A B A C A B A B D ~@7 A B A C A B A B A B A C A B A B A B A C A E ~
>`.pickRestart({
  A: "~@2 [f3,a3,c4]!2 ~@2 [f3,a3,c4]@2 ~ f3 [f3,a3,c4]!2 ~ f3 [f3,a3,c4]@2, f2 c3 f2 c3", // F
  B: "~@2 [bb2,d3,f3]!2 ~@2 [bb2,d3,f3]@2 ~@2 [f3,a3,c4]!2 ~@2 [f3,a3,c4]@2, bb1 f2!2 c3", // Bb F
  C: "~@2 [c3,e3,g3]!2 ~@2 [c3,e3,g3]@2 ~ c3 [c3,e3,g3]!2 ~ c3 [c3,e3,g3]@2, c2 g2 c2 g2", D: "[f2,f3,a3]@3 ~@13",
  E: "~@2 [bb2,d3,f3]!2 ~@2 [bb2,d3,f3]@2 ~@8, bb1 f2 ~@2", // Bb
})).s("gm_acoustic_guitar_steel").gain(0.3)

// chords · acoustic guitar steel · "Acoustic Guitar"
const acoustic_guitar_steel_2 = note(`<
  ~@8 A B A B C B A B A B A B C B A B@2 D B E B D B D F ~@7 B D B E B D B D B D B E B D B D B D B E B G ~
>`.pickRestart({
  A: "[c3,a3]@2 [f3,a3,c4]@3 [a3,c4] f3 [a3,c4] [bb2,g3]@2 [eb3,g3,bb3]@3 [g3,bb3] eb3 [g3,bb3]", // F Am Eb Gm
  B: "[c3,a3]@2 [f3,a3,c4]@3 [a3,c4] f3 [a3,c4] c3@2 [f3,a3,c4]@3 [a3,c4] f3@2", // F Am F Am
  C: "[f2,d3] [bb2,d3,f3] [a2,gb3] [d3,gb3,a3] [d2,bb2] [g2,bb2,d3] [g2,e3] [c3,e3,g3]", // Dm Bb D Gm C
  D: "[f2,d3]@2 [bb2,d3,f3]@3 [d3,f3] bb2 [d3,f3] [c3,a3]@2 [f3,a3,c4]@3 [a3,c4] f3 [a3,c4]", // Dm Bb Dm F Am
  E: "[g2,e3]@2 [c3,e3,g3]@3 [e3,g3] c3 [e3,g3] g2@2 [c3,e3,g3]@3 [e3,g3] c3@2", F: "[c3,a3] ~@7",
  G: "[f2,d3]@2 [bb2,d3,f3]@3 [d3,f3] bb2 [d3,f3] ~@8", // Dm Bb Dm
})).s("gm_acoustic_guitar_steel").gain(0.33)

// chords · electric guitar clean · "Clean Elec Guitar"
const electric_guitar_clean = note("<~@40 A B A C A B A B A B A C A B A B A B A C A D ~>".pickRestart({
  A: "[a3,c4,f4] ~ [a3,c4,f4]@3 [a3,c4,f4]!2 ~@2 [a3,c4,f4]!3 ~ [c4,f4] [a3,c4,f4]!2", // F F5 F
  B: "[d3,f3,bb3] ~ [d3,f3,bb3]@3 [d3,f3,bb3]!2 ~ [a3,c4,f4] ~ [a3,c4,f4]@3 [a3,c4,f4]!2 ~", // Bb F
  C: "[e3,g3,c4] ~ [e3,g3,c4]@3 [e3,g3,c4]!2 ~@2 [e3,g3,c4]!3 ~ [g3,c4] [e3,g3,c4]!2", // C C5 C
  D: "[d3,f3,bb3] ~ [d3,f3,bb3]@3 [d3,f3,bb3]!2 ~@9", // Bb
})).s("gm_electric_guitar_clean").gain(0.22)

// chords · electric guitar clean · "Clean Elec Guitar" · soft notes
const electric_guitar_clean_2 = note("<~@40 A ~ A B A ~ A ~ A ~ A B A ~ A ~ A ~ A B A ~@2>".pickRestart({
  A: "~@8 [a3,c4,f4] ~@4 a3 ~@2", B: "~@8 [e3,g3,c4] ~@4 e3 ~@2",
})).s("gm_electric_guitar_clean").gain(0.13)

// drums · kick
const kick = s("bd").struct("<~@7 A B@8 C@7 D E@3 C E@2 C F G ~@6 F E@3 C E@3 F E@3 C E@3 F E@3 C E A ~>".pickRestart({
  A: "x ~@2 x ~@4", B: "x!2", C: "x ~@2 x!2 ~@3", D: "x ~@5 x ~ x!4 ~@4", E: "x ~@2 x!2 ~@2 x",
  F: "x ~@3 x ~ x ~@7 x!2", G: "x",
})).gain(0.31)

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

// drums · clap
const clap = s("cp").struct("<~@32 [~ x ~ x]!7 ~@24>").gain(0.4)

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

// drums · low tom
const low_tom = s("lt").struct("<~@6 A ~@16 A ~@6 A ~@7 A ~@7 A ~@7 A ~@8>".pickRestart({
  A: "~@15 x",
})).gain(0.31)

// drums · mid tom
const mid_tom = s("mt").struct("<~@6 A ~@16 B ~@6 A ~@7 A ~@7 A ~@7 A ~@8>".pickRestart({
  A: "~@15 x", B: "~@7 x",
})).gain(0.31)

// drums · open hat
const open_hat = s("oh").struct("<~@31 A ~@7 A ~@7 A ~@7 A ~@7>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.31)

// drums · high tom
const high_tom = s("ht").struct("<~@23 [~@12 x!2 ~@2] ~@39>").gain(0.31)

// drums · splash
const splash = s("cr").struct("<~@7 A ~@16 A ~@6 A@2 ~@6 A B C@2 D C@3 A B C@2 D C@3 A B C@2 D C E ~>".pickRestart({
  A: "x", B: "x!2 ~ x", C: "~ x ~ x", D: "~@4 x ~@7 x ~ x!2", E: "~ x ~@2",
})).gain(0.31)

// drums · ride
const ride = s("rd").struct("<~@7 A B ~@7 B ~@6 C ~@7 D ~@7 D ~@4 B ~@2 D ~@4 B ~@2 D ~@4 B ~@2>".pickRestart({
  A: "~@3 x ~@4", B: "x", C: "~@8 x!5 ~ x ~", D: "~@2 x!2 ~ x ~@2",
})).gain(0.4)

stack(
  piano, bass, acoustic_guitar_steel, acoustic_guitar_steel_2, electric_guitar_clean, electric_guitar_clean_2, kick,
  snare, clap, hihat, low_tom, mid_tom, open_hat, high_tom, splash, ride
)

More by Helen Reddy