Strudelify
Yummy Yummy Yummy cover art

Yummy, Yummy, Yummy

Yummy Yummy Yummy

Ohio Express

KeyA♭ majorTempo130 bpm
0:00/0:00
// Yummy Yummy Yummy — Ohio Express
// 130 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 3 "Guitar" electric guitar jazz (copy of ch 2 "Guitar" electric guitar muted)
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · electric guitar muted · "Guitar"
const electric_guitar_muted = note(`<
  ~ A B C D A E F A@3 G A H@3 A@2 H@3 I J A B C D A E F A@3 G A H@3 A@2 H@3 K L M N O P Q R S Q@3 T Q U@3 Q@2 U@3 V W X
  Y Z AA X AB AC AB X AB AC AB X AB AC AB X AB AC AB X ~
>`.pickRestart({
  A: "[g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~", // G5
  B: "[g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3]@2 [g2,d3] ~", // G5
  C: "[g2,d3] ~ [g2,d3]@2 [g2,d3]@2 [g2,d3] ~ [g2,d3] ~ [g2,d3]@2 [g2,d3] ~ [g2,d3] ~", // G5
  D: "[g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3]@2", // G5
  E: "[g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [f2,g2,d3] ~", // G5 G7
  F: "[f2,c3]@2 [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~", // F5
  G: "[f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~", // F5
  H: "[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~", I: "[g2,d3] ~@3",
  J: "[f2,c3]@5 ~@11", K: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~, d3 ~@3",
  L: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~, c3@5 ~@11",
  M: "[c3,g3] ~ [c3,g3] ~ [c3,a3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,a3] ~ [g2,d3] ~", // C5 F C5 F G5
  N: "[g2,d3] ~ [g2,d3] ~ [g2,e3] ~ [g2,e3] ~ [g2,d3] ~ [g2,d3] ~ [g2,e3] ~ [g2,e3] ~", // G5 C G5 C
  O: "[c3,g3] ~ [c3,g3] ~ [c3,a3] ~ [c3,a3] ~ [c3,g3] ~ [c3,g3] ~ [c3,a3] ~ [c3,g3] ~", P: "g2@13 ~@3, d3@5 ~@3",
  Q: "[ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~", // Ab5
  R: "[ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [gb2,ab2,eb3] ~", // Ab5 Ab7
  S: "[gb2,db3]@2 [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~", // Gb5
  T: "[gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~", // Gb5
  U: "[db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~", // Db5
  V: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~, eb3 ~@3",
  W: "gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~, db3@5 ~@11",
  X: "[db3,ab3] ~ [db3,ab3] ~ [db3,bb3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,bb3] ~ [ab2,eb3] ~", // Db5 Gb Db5 Gb Ab5
  Y: "[ab2,eb3] ~ [ab2,eb3] ~ [ab2,f3] ~ [ab2,f3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,f3] ~ [ab2,f3] ~", // Ab5 Db Ab5 Db
  Z: "[db3,ab3] ~ [db3,ab3] ~ [db3,bb3] ~ [db3,bb3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,bb3] ~ [db3,ab3] ~", // Db5 Gb Db5 Gb Db5
  AA: "ab2@13 ~@3, eb3@5 ~@3",
  AB: "[ab2,eb3] ~ [ab2,eb3] ~ [ab2,f3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,f3] ~ [ab2,eb3] ~", // Ab5 Db Ab5 Db Ab5
  AC: "[db3,ab3] ~ [db3,ab3] ~ [db3,bb3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,bb3] ~ [db3,ab3] ~", // Db5 Gb Db5 Gb Db5
})).s("gm_electric_guitar_muted").gain(0.48)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~ A@2 B C ~@18 A@2 B C ~@62>".pickRestart({
  A: "~@12 [g2,g3,g4,g5] ~@3", B: "~@4 [g2,g3,g4,g5] ~@7 [g2,g3,g4,g5] ~@3",
  C: "[g2,g3,g4,g5] ~@3 [g2,g3,g4,g5] ~@3 [g2,g3,g4,g5] ~@3 [g2,g3,g4,g5] ~@3", // G
})).s("gm_string_ensemble_1").gain(0.5)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A@2 B C D@2 E F D@2 G H I@2 J K L I M N O P A@2 B C D@2 E F D@2 G H I@2 J K L I M N O P J D J Q R@2 S T R@2 U V W@2
  X Y Z W AA AB AC AD X R X AE X R X AF X R X AF X R X AF X R X AF X ~
>`.pickRestart({
  A: "~@6 g1 ~", B: "~@2 g1 ~@3 g1 ~", C: "g1 ~ g1 ~ g1 ~ g1 ~", D: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~",
  E: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1@2", F: "g1 ~ g1 ~ g1 ~ g1 ~ bb1@2 c2@2 d2@2 f2@2",
  G: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~", H: "g1 ~ g1 ~ g1 ~ g1 ~ g1@2 g2 ~ g1 ~ g1 ~",
  I: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ g1 ~", J: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~",
  K: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ f1 ~", L: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1@2",
  M: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ g1@2", N: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2", O: "d2@4 g1@5 ~@3 g1@4",
  P: "~ f1 ~ f1", Q: "g1", R: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~",
  S: "gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1@2", T: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ b1@2 db2@2 eb2@2 gb2@2",
  U: "gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~ gb1 ~", V: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1@2 ab2 ~ ab1 ~ ab1 ~",
  W: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ ab1 ~", X: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~",
  Y: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ gb1 ~", Z: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1@2",
  AA: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ ab1@2", AB: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2@2",
  AC: "ab1@2 ~@2 ab1@2 ~@2 ab1@3 ~ ab1@2 ~@2", AD: "gb1@3 ~ gb1@3 ~ gb1@2 ~@2 gb1@2 ~@2", AE: "ab1",
  AF: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ c2@2 ab1@2",
})).s("gm_electric_bass_finger").gain(0.56)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@84 [x ~@2 x!2 ~@3] [x ~@2 x!2 ~@2 x] x [x ~@2 x!2 ~@2 x] ~>").gain(0.26)

// drums · rim
const rim = s("rim").struct("<[x!4] ~@88>").gain(0.39)

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

// drums · low tom
const low_tom = s("lt").struct("<~@78 [~@4 x ~@6 x ~@4] ~@7 [~@5 x ~@2] ~@2>").gain(0.52)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@78 [x ~@3 x ~@6 x ~@2 x ~] ~@7 [~@7 x!2 ~@7] ~@2>").gain(0.46)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@84 [~@3 x] [x!4] [x!2 ~@2] [~ x!3] ~>").gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@78 [x ~@6 x] ~@10>").gain(0.52)

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

stack(
  electric_guitar_muted, string_ensemble_1, bass, kick, kick_soft, rim, snare, low_tom, hihat, mid_tom, open_hat,
  open_hat_soft, high_tom, crash
)