Strudelify

There's Nothing Like This

Omar

KeyG minorTempo72 bpm
0:00/0:00
// There's Nothing Like This — Omar
// 72 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 78 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(72/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 · synth bass 2
const bass = note(`<
  A B A B A B A C A B A C D E A F G A C H I J K L E A F M F M N A B A C D E A C A B A C D E A F O A C H I J K L E P F M
  Q R N A B A C A B P S A B A C D E A T
>`.pickRestart({
  A: "eb2@2 ~ bb2 d3!2 ~ d3 ~ d3 ~ eb3 d3@2 bb2@2", B: "eb2@2 ~ bb2 d3!2 ~ d3 ~ d3 ~ eb3 d3!2 bb2@2",
  C: "eb2@2 ~ bb2 d3!2 ~ d3 ~ d3 ~ eb3 d3 c3 bb2@2", D: "ab2@2 ~ eb3 g3!2 ~ g3 ~ g3 ~ ab3 g3@2 eb3@2",
  E: "ab2@2 ~ eb3 g3!2 ~ g3 ~ g3 ~ ab3 g3 f3 eb3@2", F: "eb2@2 ~ bb2 d3!2 ~ d3 ~ d3 ~ eb3 d3 bb2 eb2@2",
  G: "db2@2 ~ ab2 db3!2 ~ b1@2 gb2@2 a1 bb1@2 f2 bb1", H: "eb2@3 bb2 d3!2 ~ d3 ~ d3 ~ eb3 d3@2 bb2@2",
  I: "eb2@3 bb2 d3!2 ~ d3 ~ d3 ~ eb3 d3!2 bb2 ~", J: "eb2@3 bb2 d3!2 ~ d3 ~ d3 eb3 d3 f3!2 bb2 ~",
  K: "eb2@3 bb2 d3!2 ~ d3 ~ d3 ~ eb3 d3 c3 bb2 ~", L: "ab2@3 eb3 g3!2 ~ g3 ~ g3 ~ ab3 g3@2 eb3@2",
  M: "db2@2 ~ ab2 db3!2 ~ b1 ~ gb2 ~ a1 bb1@2 f2 bb1", N: "eb2@2 ~ bb2 d3!2 ~ d3 ~@8",
  O: "db2@3 ab2 db3!2 ~ b1@2 gb2@2 a1 bb1@2 f2 bb1", P: "eb2@2 ~ bb2 d3!2 ~ d3 ~ d3 eb3 d3 f3!2 bb2@2",
  Q: "eb2@3 bb2 d3!2 ~ d3 ~ d3 ~ eb3 d3 bb2 eb2@2", R: "db2@3 ab2 db3!2 ~ b1 ~ gb2 ~ a1 bb1@2 f2 bb1",
  S: "eb2@2 ~ bb2 d3!2 ~ d3 ~ bb1 ~ bb1 ~ bb1 ~ bb1", T: "eb2@2 ~ bb2 d3 bb1 ~ eb2 ~@8",
})).s("gm_synth_bass_2").gain(0.4).pan(0.7)

// chords · epiano1
const epiano1 = note(`<
  ~@18 A@2 B@2 C@3 D@2 E F G H B@2 I@3 J@3 ~@10 A@2 B@2 K@2 L D@2 M F M H@2 F N@2 B@6 O@3 J@3
>`.pickRestart({
  A: "[~@11 [g3,bb3,d4,f4] ~ [f3,ab3,c4,eb4] ~ [g3,bb3,d4,f4]@7 ~ [g3,bb3,d4,f4] ~@8]/2", // Gm7 Fm7 Gm7
  B: "[[g3,bb3,d4,f4]@6 ~ [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [f3,ab3,c4,eb4] ~ [g3,bb3,d4,f4]@7 ~ [g3,bb3,d4,f4] ~@8]/2", // Gm7 Fm7 Gm7
  C: "[[g3,bb3,d4,f4]@6 ~ [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4]@6 ~@2 [ab3,c4,eb4,g4] ~ [eb4,g4] f4 ~@2 [ab3,c4,g4,bb4] ~ [g4,bb4] eb4 ~ [g3,ab3,c4,eb4] ~@4 [ab3,c4,eb4,f4] ~ [ab3,c4,eb4,g4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~@2, ~@25 [ab3,c4]@2 ~@4 [ab3,c4]@2 ~@15]/3", // Gm7 Abmaj7 Eb Abmaj7 Gm Abmaj7 Fm7 Abmaj7 …
  D: "[[g3,bb3,d4,f4]@7 [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [f3,ab3,c4,eb4] ~ [g3,bb3,d4,f4]@7 ~ [g3,bb3,d4,f4]@5 ~@4]/2", // Gm7 Fm7 Gm7
  E: "[f3,ab3,c4,eb4]@6 ~ [eb3,gb3,bb3,db4]@5 [f3,ab3,c4,eb4]@3 ~", F: "[g3,bb3,d4,f4]@7 [g3,bb3,d4,f4] ~@8",
  G: "[f3,ab3,c4,eb4]@5 ~@2 [eb3,gb3,bb3,db4]@4 ~ [f3,ab3,c4,eb4]@3 ~", H: "[g3,bb3,d4,f4]@6 ~ [g3,bb3,d4,f4] ~@8",
  I: "[[g3,bb3,d4,f4]@6 ~ [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [f3,ab3,c4,eb4] ~ [g3,bb3,d4,f4]@7 ~ [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4]@6 ~@2 [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] f4 ~ g4 f4 ~@2, ~@22 [ab3,c4,eb4] ~]/3", // Gm7 Fm7 Gm7 Abmaj7 Ab
  J: "[~ [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] f4 ~@3 [ab3,c4,eb4]!2 ~ [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,f4] ~ [g3,bb3,d4,f4]@7 ~ [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [f3,ab3,c4,eb4] ~ [g3,bb3,d4,f4]@7 ~ [g3,bb3,d4,f4] ~@8]/3", // Abmaj7 Ab Abmaj7 Fm7 Gm7 Fm7 Gm7
  K: "[[g3,bb3,d4,f4]@6 ~ [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [g3,ab3,c4,eb4] ~ [ab3,c4,eb4,g4]@4 f4 ~ [ab3,c4,eb4,f4] ~@5 g4 f4@2 [ab3,c4,eb4,g4] ~, ~@27 [ab3,c4,eb4]@3 ~@2]/2", // Gm7 Abmaj7 Fm7 Abmaj7 Ab
  L: "~@3 [ab3,c4,eb4,f4] ~ [ab3,c4,eb4,f4] ~ [ab3,c4,eb4,g4] ~ g4 f4 ~@2 f4 ~@2, ~@9 [ab3,c4,eb4]@2 ab3@3 ~@2, ~@6 [c4,eb4] ~", // Fm7 Abmaj7 Ab Cm
  M: "[f3,ab3,c4,eb4]@5 ab3 ~ [eb3,gb3,bb3,db4]@4 ~ [f3,ab3,c4,eb4]@3 ~", // Fm7 Ebm7 Fm7
  N: "[[g3,bb3,d4,f4]@7 [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [f3,ab3,c4,eb4] ~ [g3,bb3,d4,f4]@7 ~ [g3,bb3,d4,f4] ~@8]/2", // Gm7 Fm7 Gm7
  O: "[[g3,bb3,d4,f4]@6 ~ [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [f3,ab3,c4,eb4] ~ [g3,bb3,d4,f4]@7 ~ [g3,bb3,d4,f4] ~@3 [g3,bb3,d4,f4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4]@5 ~@3 [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] f4 ~ g4 f4 ~@2, ~@22 [ab3,c4,eb4] ~]/3", // Gm7 Fm7 Gm7 Abmaj7 Ab
})).s("gm_epiano1").gain(0.35).pan(0.3)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@6 A@6 B C A@2 D E F A@4 B C A@2 G F G H A F A F B I A F J@4 K@2 L@2 M L@2 J@4 K@2 L@2 N L N H F O F O F O F O F O F
  O I@2 F H
>`.pickRestart({
  A: "[g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2 [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2", // Gm7
  B: "[g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~@2 [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~@2", // Abmaj7
  C: "[g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~@2 [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~@2 [g3,ab3,c4,eb4]@4", // Abmaj7
  D: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~@2 [f3,ab3,c4,eb4] ~@3 [eb3,gb3,bb3,db4] ~@2 [f3,ab3,c4,eb4] ~@3", // Fm7 Ebm7 Fm7
  E: "[g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2 [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4]@3 ~@2", // Gm7
  F: "[g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2 [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4]@2 [g3,bb3,d4,f4]!2 ~", // Gm7
  G: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~@2 [f3,ab3,c4,eb4] ~@3 [eb3,gb3,bb3,db4] ~@4 [f3,ab3,c4,eb4] ~", // Fm7 Ebm7 Fm7
  H: "[g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2 [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@8", // Gm7
  I: "[g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~@2 [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4]@2 [g3,ab3,c4,eb4]!2 ~", // Abmaj7
  J: "[g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2 [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] [g3,bb3,d4,f4]@2", // Gm7
  K: "[g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~@2 [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] ~ [g3,ab3,c4,eb4] [g3,ab3,c4,eb4]@2", // Abmaj7
  L: "[g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2 [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4]@3", // Gm7
  M: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~@2 [f3,ab3,c4,eb4] ~@3 [eb3,gb3,bb3,db4] ~@2 [ab3,c4,eb4,f4]@3 ~", // Fm7 Ebm7 Fm7
  N: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~@2 [f3,ab3,c4,eb4] ~ [eb3,gb3,bb3,db4]@4 ~ [ab3,c4,eb4,f4]@3 ~", // Fm7 Ebm7 Fm7
  O: "[g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2 [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4]!4 ~", // Gm7
})).s("gm_acoustic_guitar_nylon").gain(0.2)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@4 A@4 ~@4 B@2 C@2 D E@6 B@2 C@2 D F D G A@4 B@2 C@2 ~@4 B@2 C@2 D E@6 B@2 C@2 D F D G H@8 ~@4 B@2 I@2
>`.pickRestart({
  A: "[g3,bb3,d4]/4", B: "[g3,ab3,c4,eb4]/2", C: "[g3,bb3,d4]/2", D: "[ab3,c4,eb4]@7 [gb3,bb3,db4]@5 [ab3,c4,eb4]@4",
  E: "[g3,bb3,d4]/6", F: "[g3,bb3,d4]", G: "[g3,bb3,d4] ~", H: "[g3,bb3,d4]/8", I: "[[g3,bb3,d4]@23 ~@9]/2",
})).s("gm_string_ensemble_1").gain(0.2).pan(0.3)

// other · string ensemble 1
const string_ensemble_1_2 = note("<~@3 A B@3 C ~@12 D ~ D ~@3 D ~@11 E ~@12 D ~ D ~@24>".pickRestart({
  A: "~@15 bb5", B: "~ bb5 ~ g5 bb5 c6 ~@2 f5 ~ f5 ~ f5!3 bb5", C: "~ bb5 ~ g5 bb5 c6 ~@2 f5 ~ f5 ~ f5!3 ~",
  D: "~ d5 g5 c6 bb5 ~@2 d5 g5 c6 bb5 ~@5", E: "~@3 f5",
})).s("gm_string_ensemble_1").gain(0.3).pan(0.7)

// other · pad new age
const pad_new_age = note("<~@31 [d5 ~ d5 ~ d5 eb5 g5 ~@9]!4 ~@27 [d5 ~ d5 ~ d5 eb5 g5 ~@9]!12 ~@4>")
  .s("gm_pad_new_age").gain(0.3)

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

// drums · rim
const rim = s("rim").struct(`<
  ~@2 A@3 B A@5 B A@6 B A@9 B A C A@18 B A@6 B A@4 C A B A D A B A B A B A@3 B A ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x!2 ~ x", C: "~ x ~@2", D: "~@4 x ~@3 x!2 ~ x!3 ~ x",
})).gain(0.35)

// drums · snare
const snare = s("sd").struct(`<
  ~
  [~@10 x ~ x!3 ~]
  ~@28
  [~@9 x!2 ~@2 x!2 ~]
  ~@30
  [~@9 x!2 ~@2 x!2 ~]
  ~@15
  [~ x!3 ~@2 x ~@9]
>`).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@2 A@28 B A@30 B A C A@3 C A C A C A C A@3 D>".pickRestart({
  A: "x!16", B: "x!7 ~ x ~@7", C: "x!15 ~", D: "x!5 ~ x ~ x ~@7",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@30 A ~@30 A ~ B ~@3 B ~ B ~ B ~ B ~@3 C>".pickRestart({
  A: "~@7 x ~@8", B: "~@15 x", C: "~@5 x ~ x ~@8",
})).gain(0.45)

// drums · guiro
const guiro = s("guiro:0").struct(`<
  ~@2 A@3 B A B ~@11 A B A B A B A B A B A C A@3 B A B A@2 ~@11 A B A B A B A B A B A C A@3 B A B A@5 B A B A D
>`.pickRestart({
  A: "~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2", B: "~@2 x!2 ~@2 x!2 ~@2 x ~@3 x!2", C: "~@2 x!2 ~@2 x!2 ~@8",
  D: "~@2 x!2 ~@2 x ~@9",
})).gain(6.29)

// drums · guiro
const guiro_2 = s("guiro:4").struct(`<
  ~@2 A@3 B A B ~@11 A B A B A B A B A B A C A@3 B A B A@2 D ~@10 A B A B A B A B A B A C A@3 B A B A@5 B A B A C
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@2 x!2 ~@3", C: "x!2 ~@2", D: "x",
})).gain(6.29)

stack(
  bass, epiano1, acoustic_guitar_nylon, string_ensemble_1, string_ensemble_1_2, pad_new_age, kick, rim, snare, hihat,
  open_hat, guiro, guiro_2
)