Strudelify

I Wanna Know

Joe

KeyF♯ majorTempo67 bpm
0:00/0:00
// I Wanna Know — Joe
// 67 bpm, 2/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 177 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(67/2)

// 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 · electric bass finger
const bass = note(`<
  A B@2 C@2 B@2 D@2 E@2 F@2 G@3 H B@2 C@2 B@2 D@2 E@2 F@2 B@2 D@2 B@2 C@2 B@2 D@2 E@2 F@2 G@3 H B@2 C@2 B@2 D@2 E@2 F@2
  B@2 D@2 B@2 C@2 B@2 D@2 E@2 F@2 G@3 H B@2 I@2 B@2 D@2 E@2 J@2 B@2 D@2 B@2 C@2 B@2 D@2 E@2 F@2 B@2 D@2 B@2 C@2 B@2 D@2
  E@2 F@2 G@3 H B@2 C@2 B@2 D@2 E@2 F@2 B@2 D@2 B@2 C@2 B@2 D@2 E@2 F@2 G@3 H B@2 I@2 B@2 K@2 ~@8
>`.pickRestart({
  A: "~@8 f#2 f2 ~@6", B: "[b1@9 ~@3 a#1@18 ~@2]/2", C: "[g#1@8 ~@4 f#1@11 ~ g#1@3 ~ a#1@4]/2",
  D: "[g#1@8 ~@4 f#1@11 ~ c#2@2 d#2@2 c#2@2 a#1@2]/2", E: "[b1@9 ~@3 a#1@17 ~ d#1@2]/2",
  F: "[g#1@8 ~@4 f#1@11 ~ g#1@2 a#1@2 c#2@2 a#1@2]/2", G: "[d#2@9 ~@3 c#2@9 ~ g#2@2 c#3@4 c3@16 c2@4]/3",
  H: "b1 ~ c#3@3 g#2 f#2 c#2", I: "[g#1@8 ~@4 f#1@11 ~ g#1@3 ~ a#1@3 ~]/2",
  J: "[g#1@8 ~@4 f#1@11 ~ g#1@2 a#1@2 c#2@2 a#1 ~]/2", K: "[g#1@8 ~@4 f#1@11 ~@9]/2",
})).s("gm_electric_bass_finger").gain(0.45)

// bass · electric bass finger · soft notes
const bass_soft = note("<A ~@167 B C@2 D@2 E@3 F>".pickRestart({
  A: "~@10 [d#2,e2] [c#2,d2] [b1,c2] a#1 [g#1,a1] g1", B: "~@4 c#2 d#2 c#2 a#1", C: "[b1@9 ~@3 a#1@17 ~ d#1@2]/2",
  D: "[g#1@8 ~@4 f#1@11 ~ g#1@2 a#1@2 c#2@2 a#1@2]/2", E: "[d#2@9 ~@3 c#2@9 ~ g#2@2 c#3@4 c3@16 c2@4]/3",
  F: "b1@2 ~@2 c#3@6 g#2@2 f#2@2 ~ b1, ~@7 c#2",
})).s("gm_electric_bass_finger").gain(0.15)

// chords · epiano1
const epiano1 = note(`<
  ~ A@2 B@2 C@2 D@2 A@2 B@2 E@4 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 E@4 A@2 B@2 C@2 D@2 A@2 B@2 C@2
  D@2 A@2 B@2 C@2 D@2 A@2 B@2 E@4 A@2 F@2 C@2 D@2 A@2 F@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2
  B@2 E@4 ~@16 A@2 B@2 C@2 D@2 A@2 B@2 E@4 A@2 F@2 C@2 D@2 A@2 B@2 G@4
>`.pickRestart({
  A: "[[f#3,b3,d#4]@12 [f#3,a#3,c#4]@19 ~]/2", B: "[[f#3,g#3,b3]@3 f#3@3 ~ f#3, ~@12 a#3@11 ~ a#3@7 ~]/2",
  C: "[[f#3,b3,d#4]@12 c#4@11 ~@5 f#3@3 ~, ~@3 a#3@5, ~@12 f#3@15 ~@5, ~@3 c#4]/2", // B
  D: "[[f#3,g#3,b3]@12 [f#3,a#3]@12 a#3@2 g#3@2 f#3@3 ~]/2", // G#m7 F#
  E: "[[f#3,a#3,d#4]@12 [f#3,a#3,d#4]@16 c4@20 b3@15 ~, ~@7 [f#3,d#4]@9]/4", // D#m
  F: "[[f#3,g#3,b3]@12 f#3@12 ~@4 f#3@3 ~, ~@12 a#3@11 ~ a#3@7 ~]/2", // G#m7
  G: "[[f#3,a#3,d#4]@12 [f#3,a#3,d#4]@16 c4@20 b3@15 [f#3,b3,d#4], ~@28 [f#3,d#4]@35 ~]/4", // D#m B D#m
})).s("gm_epiano1").gain(0.4).pan(0.3)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~ A@12 B@4 ~@16 A@12 B@4 ~@16 A@12 B@4 ~@32 A@12 B@4 ~@16 A@12 B@4 A@8 C@4 ~@4
>`.pickRestart({
  A: "[f#5@30 d#5 f5]/4", B: "[f#5@11 f5 d#5@2 f5 f#5@13 ~@4]/4", C: "[f#5@15 ~]/4",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.7)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@172 A B@4>".pickRestart({
  A: "~@6 d#5 f5", B: "[f#5@11 f5 d#5@2 f5 f#5@13 ~@4]/4",
})).s("gm_string_ensemble_1").gain(0.16).pan(0.7)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B ~@15 B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B ~@2 A B A B A B A B A B A B A B A B A B A B A B A C ~@8
>`.pickRestart({
  A: "x ~@5 x!2", B: "x ~@6 x", C: "x",
})).gain(0.4)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@168 A B C B C B C B C>".pickRestart({
  A: "~@7 x", B: "x ~@5 x!2", C: "x ~@6 x",
})).gain(0.15)

// drums · snare
const snare = s("sd").struct("<~ [~ x]!80 ~@15 [~ x]!47 ~@2 [~ x]!23 ~@9>").gain(0.5)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@168 [~ x]!9>").gain(0.15)

// drums · hihat
const hihat = s("hh").struct("<~ A@15 B A@31 B A@31 B C ~@7 D@7 B A@31 B A@14 ~@2 A@15 B A@15 E>".pickRestart({
  A: "x!4", B: "x!3 ~ x ~@3", C: "x", D: "~ x", E: "x ~ x ~ x ~@3 x ~@6 x",
})).gain(0.4)

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

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@23 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A
  ~@7
>`.pickRestart({
  A: "x",
})).gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ A@15 B A@31 B A@31 B C ~@7 D@7 B A@31 B A@14 ~@2 A@15 B A@15 E>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x", D: "~ x", E: "x ~@3 x ~@3 x ~@6 x",
})).gain(1.26)

// drums · guiro
const guiro = s("guiro:4").struct("<~@81 [~ x]!15 ~@81>").gain(8.38)

// drums · triangle
const triangle = s("triangles:30").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@15 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~ x ~@2",
})).gain(2.59)

// drums · triangle
const triangle_2 = s("triangles:35").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B C ~@7 D@7 B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B ~@2 A B A B A B A B A B A B A B A B E B A B A B A B A B A B A B A F
>`.pickRestart({
  A: "~ x ~ x", B: "~@3 x ~@2 x ~", C: "x", D: "~ x", E: "x!2 ~ x", F: "~@6 x ~@5 x ~@2 x",
})).gain(2.59)

stack(
  bass, bass_soft, epiano1, string_ensemble_1, string_ensemble_1_soft, kick, kick_soft, snare, snare_soft, hihat,
  open_hat, crash, cabasa, guiro, triangle, triangle_2
)

More by Joe