Strudelify
Doubly Good to You cover art

Straight Ahead

Doubly Good to You

Amy Grant

KeyC majorTempo84 bpm
0:00/0:00
// Doubly Good to You — Amy Grant
// 84 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 6 "CHOIR AAHS" choir aahs (copy of ch 5 "VOICE OOHS" voice oohs)
// note: Full arrangement: all 47 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(84/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · "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.

// bass · fretless bass · "FRETLESS"
const bass = note("<A B C D E F G H I J K J L M N O P Q@2 R@2 S@6 T@6 U@3 V@7 W X Y Z>".pickRestart({
  A: "c2@5 ~ c2 ~ c2@6 c2 ~", B: "f2@4 ~@2 f2 ~ f2@4 a1@3 ~", C: "c2@5 ~ c2 ~ c2@6 e2 c2", D: "f2@5 ~ f2 ~ f2@6 a1 f1",
  E: "c2@4 ~@2 c2 ~ c2@6 g2 ~", F: "f3@5 ~ f3 ~ f3@3 c3 f2@3 ~", G: "c2@4 ~@2 c2 ~ c2@6 g1@2",
  H: "f2@5 ~ f2 ~ f2@6 f2!2", I: "a1@6 ~ a1 a1@7 g2", J: "f2@6 ~ f2!2 ~ f2@3 ~@2 c2", K: "c2@6 ~ c2 e2@6 ~ e2",
  L: "a1@7 a0 g2@6 ~ g2", M: "f2@6 ~ f2 e2 ~ e2@2 b2 ~ e2!2", N: "d2@6 ~ d2 f2@7 f1", O: "c2@6 ~ c2!2 ~ c2@3 ~ c2 ~",
  P: "c3@5 ~ c3 ~ c3@6 g2@2", Q: "[c2@5 ~ c2 ~ c2@6 ~@2 f2@4 ~@2 f2 ~ f2@6 c2@2, ~@7 c2@8 ~]/2",
  R: "[~@6 c2@2 c2@6 c2 ~ f2@4 ~@2 f2 ~ f2@4 e2@3 ~, ~@15 c2@17]/2",
  S: "[~@6 c2@2 ~@6 g2 ~ f2@5 ~ f2 ~ f2@6 f2!2 c3@5 ~ c3 ~ c3@3 g2 ~@4 f2@6 ~ f2 f2@6 f2!2 a1@6 ~ a1!2 ~ a1@4 g2 e2 f2@6 ~ f2 f2@7 e2, ~@2 c2@9 c2@13]/6",
  T: "[~@8 e2 ~ e2@2 e3@2 e2@2 f2@6 ~ f2 f2@6 f2!2 a1@6 ~ a1 g2 ~ g2@2 g3@2 g2@2 f2@7 f1 e2@6 ~ e2 d2@6 ~ d2 f2 ~ f2@2 f3@2 f2@2 c3@7 g2 c2@2 ~@4 g1 a1, ~@7 c2@81 ~@2 c2@6]/6",
  U: "[~@7 c2 c2@2 ~@6 a1@6 ~ a1 a1@6 a1!2 f2@6 ~ f2!2 ~ f2@4 e2 d2, ~@5 c2@19]/3",
  V: "[~@8 e2@7 e1 f2@6 ~ f2!2 ~ f2@3 ~ f2 ~ a1@6 ~ a1 g2@6 ~ g2 f2@7 f1 e2 ~ e2@2 b2 ~ e2!2 d2@6 ~ d2 f2@7 f1 a1@6 ~ a1!2 ~ a1@4 a1!2 f2@6 ~ f2 f2@6 a1 f1, ~ c2@15]/7",
  W: "~@7 c2 c2@2 c2@5 c1", X: "~@7 c2 c2@7 c2", Y: "~@7 c2 c2@7 g1", Z: "c2",
})).s("gm_fretless_bass").gain(0.19)

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

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@15 [~@7 x!2 ~@5 x ~] ~@7 [~@13 x!2 ~] ~@20 [~@7 x!2 ~@5 x ~] ~@2>").gain(0.32)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<A B C B D C@2 ~@9 A@2 E@2 F D B G ~@23>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2", B: "~ x ~ x ~ x ~ x ~ x ~ x ~@4", C: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
  D: "~ x ~ x ~@3 x ~ x ~ x ~@3 x", E: "~ x ~ x ~@3 x ~ x ~ x ~@4", F: "~ x ~ x ~@3 x ~ x ~ x ~ x ~ x",
  G: "~ x ~@3 x ~@4 x ~@5",
})).gain(0.14)

// drums · mid tom
const mid_tom = s("mt").struct("<~@7 A ~@7 B ~@7 C ~@20 B ~@2>".pickRestart({
  A: "~@13 x!2 ~", B: "~@5 x ~@10", C: "~@6 x ~@4 x!2 ~@3",
})).gain(0.32)

// drums · open hat
const open_hat = s("oh").struct("<A@2 ~ A ~@2 B ~@9 A@4 ~@2 A C ~@23>".pickRestart({
  A: "~@15 x", B: "~@7 x", C: "~@9 x ~@6",
})).gain(0.27)

// drums · high tom
const high_tom = s("ht").struct("<~@7 A ~@7 B ~@7 C ~@20 B ~@2>".pickRestart({
  A: "~@4 x!2 ~@5 x ~@4", B: "~@3 x ~@12", C: "~@3 x!2 ~@11",
})).gain(0.32)

// drums · crash
const crash = s("cr").struct("<A ~@6 B A ~@7 A ~@7 A ~@20 A@2>".pickRestart({
  A: "x", B: "~@15 x",
})).gain(0.27)

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

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@8 A B ~ B ~ C ~@10 A C ~ B ~ C ~ B ~ B ~ B ~ B ~ B ~ C ~ C ~@3>".pickRestart({
  A: "~ x ~@3 x ~@3 x ~@6", B: "~ x ~@5 x ~ x ~ x ~@4", C: "~ x ~@5 x ~@3 x ~@4",
})).gain(0.18)

// drums · tambourine
const tambourine = s("tb").struct("<A@8 B A B A B A B A@9 B A B A B A B A B A B A B A B A B A B A@3 ~>".pickRestart({
  A: "~ x ~@2", B: "~ x ~ x",
})).gain(0.41)

// drums · congas
const congas = s("conga:13").struct("<A@8 B@2 A@2 B A@12 B A@4 B A B A@3 B C A@3 B A@4 ~>".pickRestart({
  A: "~@2 x!2 ~@12", B: "~@3 x ~@12", C: "~@3 x ~@5 x ~@6",
})).gain(0.88)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  A@8 B C D E F D G A@9 D C H D I A B G F H A D F B J H D F D A@3 ~
>`.pickRestart({
  A: "~@11 x ~ x!3", B: "~@2 x ~@8 x ~ x!3", C: "~@2 x ~@3 x ~@4 x ~ x!3", D: "x ~@10 x ~ x!3",
  E: "x ~@5 x ~@4 x ~ x!3", F: "x ~ x ~@8 x ~ x!3", G: "~@6 x ~@4 x ~ x!3", H: "x ~@7 x ~@2 x ~ x!3",
  I: "~@8 x ~@2 x ~ x!3", J: "~@7 x ~@3 x ~ x!3",
})).gain(0.88)

// drums · shaker
const shaker = s("sh").struct("<~@8 [x!8]!7 ~@9 [x!8]!20 ~@3>").gain(0.32)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct(`<
  ~@8
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!7
  ~@9
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!20
  ~@3
>`).gain(0.18)

stack(
  bass, kick, snare, clap, low_tom, hihat, hihat_soft, mid_tom, open_hat, high_tom, crash, ride, ride_soft, tambourine,
  congas, congas_2, shaker, shaker_soft
)

More by Amy Grant