Strudelify

Ohio

Neil Young

KeyD minorTempo80 bpm
0:00/0:00
// Ohio — Neil Young
// 80 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 60 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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.

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@2 A B C D E F C@3 G H I J K L K M N O@2 C D E F C@3 G H I J K L K M N O@2 C D E F C@3 G P Q R S T U@2 S T U@2 V
>`.pickRestart({
  A: "d2@8 f2@4 c2@3 a1", B: "d2 ~ d2@6 f2@2 g2@2 c2@3 a1", C: "d2 ~ d2@6 f2@4 c2@3 a1", D: "d2 ~ d2@6 f2@4 c2@2 c2 a1",
  E: "d2 ~ d2@6 f2@2 f2 ~ c2@3 a1", F: "d2 ~ d2@6 f2@4 a1@2 ~ a1", G: "d2 ~ d2@6 f2@4 c2@4",
  H: "g1 ~ g1@6 g2@2 d2@2 g1 bb1 d2@2", I: "c2 ~ c2@4 c2 ~ c2 ~ c2 ~ c2 a1 d2@2",
  J: "g1 ~ g1@2 g2 ~ g2 ~ g2 d2 g2@2 g2 f2 d2@2", K: "c2 ~ c2@3 ~ c2 ~ c2 ~ c2 ~ c2 a1 d2@2",
  L: "g1 ~ g1@2 g2 ~ g2 d2 g1@2 d2@2 g2 bb1 d2@2", M: "g1 ~ g1@2 g2 ~ g2 ~ f2 d2 g2 ~ g2 f2 d2 ~",
  N: "c2 ~ c2@4 c2 ~ c2 ~ c2@3 ~ c2 a1", O: "d2 d2@2 d2 d2@2 d2 d2@2 d2 d2@2 d2@2 d2@2",
  P: "d2@2 d3@3 c3 a2@2 f2@2 g2@2 c2 d2@2 a1", Q: "d2@2 d3@3 ~ a2 ~ f2@2 g2@2 c2 d2@2 a1, ~@5 c3@2 ~@9",
  R: "d2@2 d3@3 c3 a2 ~ f2@2 g2@2 c2 d2@2 a1", S: "d2@2 d3@3 c3 a2@2 f2@2 g2 ~ c2 d2@2 ~",
  T: "d2@2 d3@3 c3 a2@2 f2@2 g2 ~ c2 d2@2 a1", U: "d2@2 d3@3 c3 a2@2 f2@2 g2@2 c2@2 ~ a1", V: "d2@3 ~",
})).s("gm_fretless_bass").gain(0.52)

// other · overdriven guitar · "Guitar 1"
const overdriven_guitar = note("<~ A@2 B C D E ~@53>".pickRestart({
  A: "[~@8 f3 ~ g3 ~ db3 ~ d3@9 ~ f3 ~ g3 ~ db3 ~ db3@2]/2", B: "gb3@2 g3@2 c4@2 e4@2 g4@2 g4@3 ~ g4@2",
  C: "a4 ~ g4@2 f4 ~ e4 d4 c4 ~ d4@5 ~", D: "~@2 c5 ~ c5 ~ c5 ~ g4 a4 f4@2 e4@2 f4 e4",
  E: "d4 ~ c4 a3 c4@2 f4@2 f4 ~ d4@5 ~",
})).s("gm_overdriven_guitar").gain(0.28).pan(0.3)

// chords · overdriven guitar · "Guitar 2"
const overdriven_guitar_2 = note(`<
  A B C B D E C F G H I J K L K M N O P Q R S D E C F G H I J K L K M N O P Q R S D E C F G H I J G H I J G H I C B D E
  T
>`.pickRestart({
  A: "d2@2 d4@2 ~@2 g3@2 f3 ~ g3@2 c3 ~ g3@2, ~@2 g3 ~ d3@4 ~@8, ~@5 d4@3 ~@8",
  B: "d2@2 d4@2 ~@2 g3@2 f3 ~ g3@2 ~@2 g3@2, ~@2 g3 ~ d3@4 ~@4 c3@4, ~@5 d4@3 ~@8",
  C: "d2 ~ d4@2 ~@2 g3@2 f3 ~ g3@2 c3 ~ g3@2, ~@2 g3 ~ d3@4 ~@8, ~@5 d4@3 ~@8",
  D: "d2@2 g3 ~@3 a3@2 f3 ~ g3@2 c3 ~ g3@2, ~ d4 d3@2 ~@4, ~@3 a3@2 d4@3 ~@8",
  E: "d2@2 d4@2 ~@2 g3@2 f3 ~ g3@2 db3@3 ~, ~@2 g3 ~ d3@4 ~@8, ~@5 d4@3 ~@8",
  F: "d2@2 d4@2 ~@2 g3@2 f3 ~ g3@2 c3@2 g3@2, ~@2 g3 ~ d3@4 ~@8, ~@5 d4@3 ~@8",
  G: "a3@2 [a3,d4]@4 ~ [d3,a3,d4] a3@2 f3 ~ [c3,e3]@2 g3 [g3,d4], d3@3 ~@5", // D5 C G5
  H: "~@2 [a3,d4]@6 [f3,a3]@2 a3 ~ [c3,e3]@2 e3 [a3,d4], d3 ~", // D5 F C D5
  I: "a3@2 [a3,d4]@4 ~ a3 [f3,a3]@2 [f3,a3] ~ [c3,e3,g3]@2 g3 [a3,d4], d3@6 ~ d4@3 ~@6", // D5 F C D5
  J: "a3@2 [a3,d4]@5 [a3,d4] [f3,a3]@2 [f3,a3] ~ [c3,e3,g3]@2 [e3,g3] ~, d3 ~", // D5 F C Em
  K: "~@2 [g3,bb3]@2 [g3,bb3]@2 ~@4 [g3,bb3]@2 [g3,bb3,d4]@2 [d3,g3] ~, g2@8 [g2,d3]@7 ~, ~ d4@2 ~, ~@3 [g3,bb3]@2 ~@3", // Gm G5 Gm
  L: "~ g3!2 ~ e3 [e3,g3] [e3,g3,c4,e4] [e3,g3], c3@8 c3@7 ~, ~ [c4,e4]@2 ~, ~ e3 ~@2, ~@3 g3@2 ~@3", // Em C Em C
  M: "~ g3!2 e3!2 [e3,g3] [e3,g3,c4,e4] [e3,g3], c3@8 c3@7 ~, ~ c4@2 ~, ~@4 e4@4 e2 ~@7, ~@3 g3@2 ~@3", // Em C Em
  N: "g3@2 g3@2 g3@2 ~@4 g3@2 [d3,g3,bb3,d4]@2 d3 ~, [g2,d3]@4 g2@3 ~, ~ [bb3,d4]@2 ~, ~@3 g3@2 ~@3, ~@2 d3 ~", // Gm G5 Bb
  O: "~ g3 [e3,g3] ~@2 [e3,g3] [e3,g3,c4,e4] g3, c3@8 c3@7 ~, ~ c4@2 ~, ~@3 [e3,g3]@2 ~@3", // Em C Em
  P: "~@2 [g3,bb3]@2 [g3,bb3]@2 g3@2 ~@2 g3@2 [g3,bb3,d4]@2 [d3,g3] ~, g2@8 [g2,d3]@7 ~, ~@4 g4@11 ~, ~ d4@2 ~, ~@3 bb3@3 ~@2", // Gm G5
  Q: "~@2 g3@2 g3@2 ~@4 e3@2 [e3,g3,c4]@2 e3 ~, c3@3 g3@3 ~@2, ~ c4@2 ~, ~@3 e3@2 ~@3, ~@4 c3@3 ~", // C
  R: "[d3,a3] [d3,a3,d4]@2 [d3,a3] [d3,a3,d4]@2 [d3,a3] [d3,a3,d4]@2 [d3,a3] [d3,a3,d4]@2 [d3,a3,d4]@2 [d3,a3,d4]@2", // D5
  S: "[d3,d4] [d3,a3,d4]@2 [d3,a3] [d3,a3,d4]@2 [d3,a3] [d3,a3,d4]@2 [d3,a3] [d3,a3,d4]@2 [d3,a3,d4]@2 [d3,a3,d4]@2, ~@9 a2@3 ~@4", // D D5
  T: "[d2,a2]@11 ~@5", // D5
})).s("gm_overdriven_guitar").gain(0.19).pan(0.9)

// chords · overdriven guitar · "Guitar 2" · soft notes
const overdriven_guitar_soft = note(`<
  A@4 ~ B@3 C D E F G H G I J K ~ L M@2 ~ B@3 C D E F G H G I J K ~ L M@2 ~ B@3 C D E F C D E F C D E N A ~ B ~
>`.pickRestart({
  A: "~@3 a3 ~@12", B: "~@3 a3@3 ~@10", C: "~@12 g3@2 e3 d3", D: "[a3,d4]@2 ~@13 d3", E: "~@7 d3 ~@8", F: "~@9 d4 ~@6",
  G: "~@5 f4@3 g4@2 ~@2 g4@3 ~, d3 ~", H: "~ e3 ~@6", I: "e3@3 ~@5", J: "bb3 ~@3 g4@6 ~@4 g2 ~",
  K: "~@2 e3@2 e4@8 ~@3 b3", L: "~ e3@2 ~@5", M: "[~@6 d4 ~@2 d4 ~@4 e4@5 d4 ~@2 db4 ~@5 e4@2 e4@2]/2",
  N: "a3 ~@2 a3 ~@12",
})).s("gm_overdriven_guitar").gain(0.06).pan(0.9)

// chords · electric guitar muted · "Guitar 3"
const electric_guitar_muted = note(`<
  A B C B C B C B D E@3 F G H I H J K L M N C B C B D E@3 F G H I H J K L M N C B C B D E@3 D E@3 D E@2 C B C O ~
>`.pickRestart({
  A: "d2 ~ g3 ~@3 g3 ~ [c3,f3] ~ g3@2 [g2,c3] ~ g3@2, ~@3 a3@2 d4@2 ~@9, ~@4 d3@3 ~@9", // F5 C5
  B: "[d2,a2]@2 g3 ~@3 g3@2 [c3,f3] ~ g3@2 c3@3 ~, ~@3 a3@2 d4@2 ~@9, ~@2 d3 ~@5", // D5 F5
  C: "d2 ~ g3 ~@3 g3@2 [c3,f3] ~ g3@2 [g2,c3] ~ g3@2, ~@3 a3@2 d4@2 ~@9, ~@2 d3 ~@5", // F5 C5
  D: "~@2 d4@4 [d3,a3] ~ [f3,a3]@2 d4@2 [c3,g3]@2 d4@2, [d3,a3]@3 ~@5", // D5 F C5 D5
  E: "~@2 d4@4 [d3,a3] ~ [f3,a3]@2 d4@2 [c3,g3]@2 d4@2, [d3,a3]@5 ~@11", // D5 F C5 D5
  F: "~@2 bb3@2 d4@3 ~@3 bb3@3 ~ bb3 ~, [d3,g3]@7 ~ g3@7 ~", G: "~ c4 ~ c4 ~ c4@2 e4, [e3,g3]@7 ~ e3@7 ~, ~ e4 ~@2",
  H: "~@2 bb3@2 d4@2 bb3@2 ~@2 bb3@2 d4@2 bb3 ~, [d3,g3]@7 ~ [d3,g3]@7 ~", // G5
  I: "~@2 c4@2 e4@2 c4@2 ~@2 c4@2 e4@2 c4 ~, [e3,g3]@6 ~@2 [e3,g3]@7 ~", // Em
  J: "~@4 e4@2 ~@4 c4@2 e4@2 c4 ~, [e3,g3]@7 ~ [e3,g3]@7 ~, ~ c4@2 ~@5", // Em
  K: "~@2 [bb3,d4]@2 d4@2 bb3@2 ~@2 bb3@2 d4@2 bb3 ~, [d3,g3]@8 [d3,g3]@7 ~", // Bb G5
  L: "~@2 c4@2 e4@2 c4@2 ~@2 c4@2 e4@2 c4 ~, [e3,g3]@8 [e3,g3]@7 ~", // Em
  M: "a3 a3@2 a3 a3@2 [d3,a3] a3@2 ~@3 a3 ~ [d3,a3]@2, d3 ~@3", // D5
  N: "[d3,a3] [d3,a3]@2 ~ [d3,a3]@2 [d3,a3] [d3,a3]@2 [d3,a3] [d3,a3]@2 [d3,a3]@2 [d3,a3]@2", // D5
  O: "[d2,a2]@2 g3 ~@3 g3@2 [c3,f3] ~ g3@2 c3@2 a2@2, ~@3 a3@2 d4@2 ~@9, ~@2 d3 ~@5", // D5 F5
})).s("gm_electric_guitar_muted").gain(0.19).pan(0.2)

// chords · electric guitar muted · "Guitar 3" · soft notes
const electric_guitar_muted_2 = note(`<
  A ~ A ~ A ~ A ~@5 B C ~@3 D ~@2 E F A ~ A ~@5 B C ~@3 D ~@2 E F A ~ A ~@12 A ~ A ~@2
>`.pickRestart({
  A: "a2 ~@15", B: "~@6 bb3@2 ~@4 d4@3 ~, ~@8 d3@7 ~", C: "~@8 g3@7 ~", D: "~@3 c4 ~@4",
  E: "~@4 d3@2 ~ d3@2 a3 a3@2 d3 ~@3, ~@9 d3@3 ~@4", F: "~@3 [d3,a3] ~@12",
})).s("gm_electric_guitar_muted").gain(0.1).pan(0.2)

// chords · electric guitar muted · "Guitar 4"
const electric_guitar_muted_3 = note(`<
  ~@2 A B@5 C D E F G H I J K L M N O@2 E@2 F D E@2 D F P Q R S T U V W O@2 E D F D E X D F@2 Y@4 E Z A B@3 AA
>`.pickRestart({
  A: "~@2 d3 ~@3 d3 ~@2 a2 d3 ~@2 a2 ~ a2", B: "d2 ~ d3 ~@2 a2 d3 ~ d2 ~ d3 ~@2 a2 d3 a2",
  C: "d2 ~ d3 ~@2 a2 d3 ~@7 d3 a2", D: "d2 ~ d3 ~@3 d3 ~@3 d3 ~@3 d3 ~", E: "~@2 d3 ~@3 d3 ~@3 d3 ~@3 d3 ~",
  F: "~@2 d3 ~@3 d3 ~@3 d3 ~@2 a2 d3 ~", G: "[d3,g3,bb3]@4 [d3,g3,bb3] ~@3 [d3,g3,bb3]@3 ~ [d3,g3,bb3] ~@3",
  H: "[e3,g3,c4]@4 [e3,g3,c4] ~@3 [e3,g3,c4]@4 [e3,g3,c4] ~@3", // C
  I: "[d3,g3,bb3]@3 ~ bb3 ~@3 [d3,g3,bb3]@3 ~ [d3,g3,bb3] ~@3", // Gm
  J: "[e3,g3,c4]@3 ~ [e3,g3,c4] ~ g3 [e3,g3] [e3,g3,c4]@2 g3 [e3,g3] [e3,g3,c4]@2 [e3,g3,c4] ~", // C Em C Em C
  K: "[d3,g3,bb3]@4 [g3,bb3] ~@3 [d3,g3,bb3]@4 [g3,bb3] ~@3", L: "[e3,g3,c4]@4 [g3,c4] ~@3 g3@4 [e3,g3,c4] ~@3",
  M: "[d3,g3,bb3]@4 [d3,g3,bb3] ~@3 [g3,bb3]@4 [d3,g3,bb3] ~@3", // Gm
  N: "[e3,g3,c4]@3 ~ [e3,g3,c4] ~ g3 [e3,g3,c4] [e3,g3,c4]@2 g3 [e3,g3] [e3,g3,c4]@2 [e3,g3,c4] ~", // C Em C
  O: "a2 d3 ~ a2 d3 ~ a2 d3 ~ a2 d3 ~ a2 ~ d3 ~", P: "[d3,g3,bb3]@3 ~ g3 ~@3 [d3,g3,bb3]@3 ~ [d3,g3] ~@3",
  Q: "g3@4 g3 ~@3 [g3,c4]@3 ~ [e3,g3,c4] ~@3", R: "[g3,bb3]@3 ~ [g3,bb3] ~@3 [g3,bb3]@3 ~ [g3,bb3] ~@3",
  S: "[e3,g3]@3 ~ [e3,g3] ~ [e3,g3] [e3,g3,c4] [e3,g3]@2 [e3,g3,c4] [e3,g3] [e3,g3,c4]@2 [e3,g3] ~", // Em C Em C Em C Em
  T: "[d3,g3,bb3]@3 ~@5 [d3,g3,bb3]@3 ~ [d3,g3,bb3] ~@3", U: "g3@3 ~ [e3,g3] ~@3 [e3,g3,c4]@3 ~ g3 ~@3",
  V: "[g3,bb3]@3 ~ [d3,g3] ~@3 [g3,bb3]@3 ~ g3 ~@3", // Gm G5 Gm
  W: "[e3,g3,c4]@3 ~ [e3,g3] ~ [g3,c4] [e3,g3,c4] g3@2 [g3,c4]!2 [e3,g3]@2 [e3,g3,c4] ~", // C Em C5 C C5 Em C
  X: "d2 ~ d3 ~@3 d3 ~@3 d3 ~@2 a2 ~@2", Y: "d2 ~ d3 ~@3 d3 ~@3 d3 ~@2 a2 d3 ~", Z: "~@2 d3 ~@13", AA: "d2 ~@15",
})).s("gm_electric_guitar_muted").gain(0.13).pan(0.8)

// chords · electric guitar muted · "Guitar 4" · soft notes
const electric_guitar_muted_4 = note(`<
  ~@2 A ~@11 B C D E F G ~@10 H I J K L M N O ~@4 P ~ P A ~ P@2 ~ Q ~ Q P@2 A ~@4
>`.pickRestart({
  A: "~@14 d3 ~", B: "~@4 [d3,g3] ~@11", C: "~@6 [e3,c4] c4 ~@2 [e3,c4] c4 ~@4", D: "~@4 d3 ~@7 d3 ~@3",
  E: "~@2 [e3,c4] ~", F: "~@2 d3 ~", G: "~@6 [e3,c4] ~@3 [e3,c4] c4 ~@4", H: "~@4 [d3,bb3] ~@7 bb3 ~@3",
  I: "[e3,c4]@4 e3 ~@3 e3@3 ~@5", J: "d3@3 ~ d3 ~@3 d3@3 ~ d3 ~@3", K: "c4@5 ~ c4 ~ c4@2 ~ c4 ~@2 c4 ~",
  L: "~@4 [d3,g3,bb3] ~@11", M: "[e3,c4]@3 ~ c4 ~@7 [e3,c4] ~@3", N: "d3@3 ~ bb3 ~@3 d3@3 ~ [d3,bb3] ~@3",
  O: "~@4 c4 ~ e3 ~ [e3,c4]@2 e3!2 c4@2 ~@2", P: "d2 ~@15", Q: "~@15 a2",
})).s("gm_electric_guitar_muted").gain(0.06).pan(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A@8 B C B D@2 E F G H@2 A@2 B A B I A J D C B K F G F L ~ M A B A@2 B J A G N F N@3 F N@2 F N F H
>`.pickRestart({
  A: "x!2 ~@2 x ~@3", B: "x!2 ~@2 x!2 ~@2", C: "x ~ x ~@5 x ~ x ~@4 x", D: "x ~ x ~@4 x!2 ~ x ~@5",
  E: "x ~ x ~@4 x!2 ~ x ~@4 x", F: "x ~ x ~@4 x!2 ~ x ~@3 x ~", G: "x!2 ~@2 x!2 ~ x", H: "x", I: "x!2 ~@2 x!3 ~",
  J: "x!2 ~@2 x ~ x ~", K: "x ~ x ~@5 x ~ x ~@2 x!2 ~", L: "x ~@2 x!3 ~ x", M: "x ~ x!6",
  N: "x ~ x ~@4 x!2 ~ x ~@2 x ~ x",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A@3 B A@3 C D E@6 F G H A@3 I A J A K D E@2 L D E@2 M G N A@3 O A P A Q A@10 R ~
>`.pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@4 x ~@5 x!3 ~@3", D: "~ x!3", E: "x!4", F: "x ~@3 x ~@2 x ~@8", G: "~@13 x!2 ~",
  H: "~@2 x ~@5 x!2 ~@6", I: "~@4 x ~@7 x!2 ~@2", J: "~@4 x ~@3 x!2 ~@6", K: "~@4 x ~@3 x ~@3 x!4",
  L: "x ~@3 x ~@2 x!2 ~@2 x!2 ~@2 x", M: "x ~@2 x ~@2 x ~@2 x ~@2 x ~ x!2", N: "~ x ~@6", O: "x!3 ~", P: "x!2 ~ x",
  Q: "x ~@3 x ~@7 x!4", R: "~@2 x!2 ~@2 x!2 ~@8",
})).gain(0.45)

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

// drums · low tom
const low_tom = s("lt").struct("<~@39 [~@15 x] ~@3 [~@15 x] ~@16>").gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 A ~@3 B ~@3 C ~@7 D ~ E ~@11 F ~@5 G ~@3 H ~@14 I ~>".pickRestart({
  A: "~@11 x!2 ~ x ~", B: "~@6 x!2", C: "~@13 x!3", D: "~@12 x!4", E: "~@11 x!5", F: "~@9 x!2 ~@2 x!2 ~",
  G: "~@5 x ~@2 x!4 ~ x!2 ~", H: "~@10 x!5 ~", I: "~@14 x!2",
})).gain(0.41)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A B@3 A B@2 C ~@5 D ~ E ~@2 A B@3 A B@2 F ~@5 G ~@14 H ~>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!4 ~ x ~@2", D: "~@7 x", E: "~@5 x ~@2", F: "x!5 ~ x ~", G: "~ x", H: "~@4 x!2 ~@2",
})).gain(0.23)

// drums · high tom
const high_tom = s("ht").struct("<~@39 [~@3 x] ~@20>").gain(0.41)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A ~@8 B ~@3 B ~@2 A B ~ B ~ B ~@5 B ~@3 B ~@2 C B ~ B ~ B ~ B ~ B ~@8 B ~@2 D B
>`.pickRestart({
  A: "~ x", B: "x", C: "~@5 x ~@2", D: "~@13 x ~@2",
})).gain(0.27)

stack(
  bass, overdriven_guitar, overdriven_guitar_2, overdriven_guitar_soft, electric_guitar_muted, electric_guitar_muted_2,
  electric_guitar_muted_3, electric_guitar_muted_4, kick, snare, hihat, low_tom, mid_tom, open_hat, high_tom, crash
)

More by Neil Young