Strudelify

Jo Jo Action

Mr. President

KeyF majorTempo112 bpm
0:00/0:00
// Jo Jo Action — Mr. President
// 112 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(112/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@26 A B@2 C D B@2 C D B@2 C D B@2 C D ~@11 A B@2 C D B@2 C D B@2 C D B@2 C D ~@12 B@2 C D B@2 C D B@2 C D B@2 C A B@2
  C D B@2 C D ~
>`.pickRestart({
  A: "c5 d5 e5 f5 d5 e5 f5 g5 e5 f5 g5 a5 f5 g5 a5 bb5", B: "c6/2", C: "d6 c6 bb5 a5", D: "g5",
})).s("gm_string_ensemble_1").gain(0.31).pan(0.3)

// chords · lead 1 square
const lead_1_square = note(`<
  ~@4 A B C ~ A B C ~@25 D E@2 ~ D E@2 ~@21 D E@2 ~ D E@2 ~@29 D E@2 ~ D E@2 ~
>`.pickRestart({
  A: "~@4 [a3,f4] [bb3,g4] [c4,a4] [a3,f4]", B: "[d4,bb4]@4 [c4,a4]@4 [bb3,g4]@4 [a3,f4]@3 [c4,c5]",
  C: "~@3 [c4,c5] ~@3 [c4,c5] ~@3 [c4,c5] ~@4", D: "~@4 [f4,a4] [g4,bb4] [a4,c5] [c5,f5]",
  E: "[[bb4,d5]@4 [a4,c5]@4 [g4,bb4]@4 [f4,a4]@3 [g4,c5]@17]/2", // Bb Am Gm F C5
})).s("gm_lead_1_square").gain(0.39).pan(0.6)

// chords · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~@18 A ~@11 B ~@3 B ~@3 B ~@3 B ~@15 B ~@3 B ~@3 B ~@3 B ~@15 B ~@3 B ~@3 B ~@13
>`.pickRestart({
  A: "f4 ~ [f4,a4] ~ [a4,c5] d5 c5 [c5,d5] ~ c5 ~@6", B: "[c4,f4] ~ [e4,a4] ~ [g4,c5] [a4,d5] ~ [g4,c5] ~@8",
})).s("gm_lead_2_sawtooth").gain(0.28).pan(0.6)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@3 A B C D A B C D E@2 F@2 G H I J E@2 F@2 G H I J K@2 L M K@2 L M K@2 L M K@2 L M ~@4 E@2 F@2 G H I J K@2 L M K@2 L
  M K@2 L M K@2 L M ~@12 K@2 L M K@2 L M K@2 L M K@2 L M K@2 L M K@2 L M N
>`.pickRestart({
  A: "[f2,f3,a3,c4]", B: "[f2,f3,a3,d4]", C: "[g2,f3,bb3,d4]", D: "[c2,bb3,c4,g4]", E: "[c4,f4,a4]/2",
  F: "[d4,f4,a4]/2", G: "[d4,g4,bb4]", H: "[d4,f4,bb4]", I: "[c4,f4,g4]", J: "[c4,e4,g4]", K: "[a3,c4,f4]",
  L: "[bb3,d4,f4]", M: "[g3,c4,f4]", N: "[c4,f4,a4]",
})).s("gm_synth_strings_1").gain(0.14)

// chords · piano
const piano = note(`<
  ~@19 A@2 B@2 C D E F G@2 H I G@2 H I G@2 H I G@2 H I G J H I A@2 B@2 C D E F G@2 H I G@2 H I G@2 H I G@2 H I G J H I
  A@2 B@2 A@2 ~@2 G@2 H I G@2 H I G@2 H I G@2 H I G@2 H I G@2 H I ~
>`.pickRestart({
  A: "~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~@7", B: "~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~@7",
  C: "~@2 [d4,g4,bb4] ~@2 [d4,g4,bb4] ~@2 [d4,g4,bb4] ~@7", D: "~@2 [d4,f4,bb4] ~@2 [d4,f4,bb4] ~@2 [d4,f4,bb4] ~@7",
  E: "~@2 [c4,f4,g4] ~@2 [c4,f4,g4] ~@2 [c4,f4,g4] ~@7", F: "~@2 [c4,e4,g4] ~@2 [c4,e4,g4] ~@2 [c4,e4,g4] ~@7",
  G: "~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~", // F
  H: "~@2 [d4,f4,bb4] ~@2 [d4,f4,bb4] ~@2 [d4,f4,bb4] ~@2 [d4,f4,bb4] ~@2 [d4,f4,bb4] ~", // Bb
  I: "~@2 [f4,g4,c5] ~@2 [f4,g4,c5] ~@2 [f4,g4,c5] ~@2 [f4,g4,c5] ~@2 [f4,g4,c5] ~", // Fsus2
  J: "~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~", // Dm
})).s("gm_piano").gain(0.38).pan(0.6)

// bass · electric bass finger
const bass = note(`<
  ~@11 A B C D E F G H A B C D E F G I B D J K B D J K B D J K B D J K B D J ~ A B C D E F G I B D J K B D J K B D J K B
  D J K B D J K A B C D A B C D B D J K B D J K B D J K B D J K B D J K B D J K ~
>`.pickRestart({
  A: "f1@2 ~@2 f1@2 ~ f1 ~ f1 f1@2 f1@2 ~@2", B: "f1@2 ~@2 f1@2 ~ f1 ~ f1 g1@2 a1@2 c2@2",
  C: "d1@2 ~@2 d1@2 ~ d1 ~ d1 d1@2 d1@2 ~@2", D: "d1@2 ~@2 d1@2 ~ d1 ~ d1 e1@2 f1@2 a1@2",
  E: "g1@2 ~@2 g1@2 ~ g1 ~ g1 g1@2 g1@2 ~@2", F: "f1@2 ~@2 f1@2 ~ f1 ~ f1 g1@2 a1@2 bb1@2",
  G: "c1@2 ~@2 c1@2 ~ c1 ~ c1 c1@2 c1@2 ~@2", H: "c1@2 ~@2 c1@2 ~ c1 ~ c1 d1@2 e1@2 g1@2", I: "c1 ~@7",
  J: "g1@2 ~@2 g1@2 ~ bb1 ~ bb1 a1@2 g1@2 f1@2", K: "c1@2 ~@2 c1@2 ~ c1 ~ c1 c1@2 c2@4",
})).s("gm_electric_bass_finger").gain(0.5)

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

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

// drums · clap
const clap = s("cp").struct("<~@27 A@7 B A@11 ~@9 A@7 B A@10 ~@2 A@6 ~@2 A@7 B A@7 B A@8 ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x ~@2 x!2 ~ x!2",
})).gain(0.42)

// drums · hihat
const hihat = s("hh").struct(`<
  [x!4]
  [~ x ~ x]!6
  [x!2 ~ x ~ x ~@2]!39
  ~
  [x!2 ~ x ~ x ~@2]!27
  [x!2 ~ x!3 ~@2]
  [x!2 ~ x ~ x ~@2]!32
  ~
>`).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct("<~@7 [~@7 x]!39 ~ [~@7 x]!60 ~>").gain(0.3)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@27 [x!16]!19 ~@9 [x!16]!19 [x!8 ~@8] ~@8 [x!16]!24 ~>").gain(0.24)

// drums · congas
const congas = s("conga:13").struct("<~@11 A@15 ~ A@19 ~ A@7 ~ A@19 B A@6 C@2 A@24 ~>".pickRestart({
  A: "~ x ~@3 x ~@2", B: "~ x ~@6", C: "~@2 x!2 ~@2 x!2 ~@2 x ~@3 x!2",
})).gain(1.15)

// drums · congas
const congas_2 = s("conga:18").struct("<~@11 A@15 ~ A@19 ~ A@7 ~ A@19 B A@6 C@2 A@24 ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "x ~@3 x ~@3 x!2 ~@2 x ~@3",
})).gain(1.15)

// drums · congas
const congas_3 = s("conga:33").struct("<~@11 A@15 ~ A@19 ~ A@7 ~ A@19 B A@32 ~>".pickRestart({
  A: "~@6 x!2 ~@6 x!2", B: "~@6 x!2 ~@8",
})).gain(1.15)

// drums · whistle
const whistle = s("ballwhistle:1").struct("<~@6 [~@5 x ~ x] ~@37 [~@5 x ~ x] ~@27 [~@5 x ~ x] ~@35>").gain(0.08)

// drums · whistle
const whistle_2 = s("ballwhistle:0").struct("<~@6 [~@2 x!2] ~@37 [~@2 x!2] ~@27 [~@2 x!2] ~@35>").gain(0.47)

// drums · shaker
const shaker = s("sh").struct("<~@3 A@43 ~ A@27 B A@6 ~@2 A@24 ~>".pickRestart({
  A: "x!16", B: "x!8 ~@8",
})).gain(0.24)

stack(
  string_ensemble_1, lead_1_square, lead_2_sawtooth, synth_strings_1, piano, bass, kick, snare, clap, hihat, open_hat,
  crash, tambourine, congas, congas_2, congas_3, whistle, whistle_2, shaker
)

More by Mr. President