Strudelify
KeyE♭ majorTempo100 bpm
0:00/0:00
// mombasa suite — Martin O'Donnell Michael Salvatori
// 100 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/1381101; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 22 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · acoustic guitar nylon · "Electric Guitar"
const acoustic_guitar_nylon = note("<A@4 B@4 A@4 C@2 D@2 E@3 F D@2>".pickRestart({
  A: "[eb4@2 bb4@3 bb4@3 bb4@3 bb4@3 bb4@4 bb4 bb4@2 bb4 bb4@2 bb4@3 bb4@3 bb4@4 bb4@3 bb4@3 bb4@3 bb4@3 bb4@4 bb4 bb4@2 bb4 bb4@2 bb4@3 bb4@3 bb4@2]/4",
  B: "[bb3@2 f4@3 f4@3 f4@3 f4@3 f4@4 f4 f4@2 f4 f4@2 f4@3 f4@3 f4@4 eb4@3 eb4@3 eb4@3 eb4@3 eb4@4 eb4 eb4@2 eb4 eb4@2 eb4@3 eb4@3 eb4@2]/4",
  C: "[bb3@2 f4@3 f4@3 f4@3 f4@3 f4@4 f4 f4@2 f4 f4@2 f4@3 f4@3 f4@2]/2",
  D: "[eb4@2 eb4 bb4@2 eb4@3 eb4@3 eb4@3 eb4@4 eb4 bb4@2 eb4@3 eb4@3 eb4@3 eb4@2]/2",
  E: "[eb4@2 bb4 bb4@2 bb4@3 bb4@3 bb4@3 bb4@4 bb4!3 bb4@3 bb4@3 bb4@3 bb4@4 f4@3 f4@3 f4@3 f4@3 f4@2]/3",
  F: "f4@2 f4 f4@2 f4 f4@2 f4 f4@3 f4@4",
})).s("gm_acoustic_guitar_nylon").gain(0.18)

// bass · electric bass finger · "Electric Bass"
const bass = note("<A B A C A B A C A B A C A B A C A C A B A C>".pickRestart({
  A: "c2!4 ~@2 c2!4 ~@6", B: "c2!4 ~@2 c2!4 ~@2 g1!2 ab1!2", C: "c2!4 ~@2 c2!4 ~@2 eb2!2 d2!2",
})).s("gm_electric_bass_finger").gain(0.27).pan(0.4)

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

// drums · snare
const snare = s("sd").struct("<A@7 B A@3 C A@3 D A E A F A G>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x!3 ~", C: "~@4 x ~@7 x ~ x!2", D: "~@4 x ~@5 x ~ x!4", E: "~@4 x ~@4 x ~@2 x ~@2 x",
  F: "~@4 x ~@4 x ~@2 x ~@3", G: "~@4 x ~@5 x!2 ~ x!3",
})).gain(0.25).pan(0.6)

// drums · hihat
const hihat = s("hh").struct("<~@20 x ~>").gain(0.34).pan(0.6)

// drums · crash
const crash = s("cr").struct("<A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~@3>".pickRestart({
  A: "x",
})).gain(0.34).pan(0.6)

// drums · high tom
const high_tom = s("ht").struct("x!16").gain(0.25).pan(0.6)

// drums · ride
const ride = s("rd").struct("<~@8 [~ x]!14>").gain(0.34).pan(0.6)

stack(acoustic_guitar_nylon, bass, kick, snare, hihat, crash, high_tom, ride)