Strudelify

Mendocino

Michael Holm

KeyB♭ majorTempo131 bpm
0:00/0:00
// Mendocino — Holm, Michael
// 131 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(131/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 · fretless bass
const bass = note(`<
  A B C D E F G F H I J K J K L M H F G F H I J K J K L M H F G H@2 I J K J K L N H F G F H I J K J K L M H F G F G H@2
  I J K J O L P G F Q R@2 S T U T V W X Q Y Q R@2 S T U T Z
>`.pickRestart({
  A: "bb2@7 ~", B: "bb2@15 ~", C: "bb1", D: "~@2 bb1@2 ~@2 bb1@2 ~@2 bb1@2 ~@2 [bb1,b1,c2] [db2,d2,eb2,e2]",
  E: "bb2@2 ~@2 bb2@2 ~@2 f2 ~ f2@2 g2@2 f2@2, f2 ~@15", F: "bb2@3 ~ bb2@2 ~@2 f2 ~ f2@2 g2@2 f2@2",
  G: "bb2@2 ~@2 bb2@3 ~ f2 ~ f2@2 g2@2 f2@2", H: "bb2@2 ~@2 bb2@2 ~@2 f2 ~ f2@2 g2@2 f2@2",
  I: "bb2@3 ~ bb2@3 ~ bb2@2 a2 ~ a2@2 g2@2", J: "f2@2 ~@2 f2@2 ~@2 c2 ~ c2@2 d2@2 c2@2",
  K: "f2@3 ~ f2@2 ~@2 c3 ~ c3@2 bb2@2 c3@2", L: "f2@3 ~ f2@2 ~@2 c2 ~ c2@2 d2@2 c2@2",
  M: "f2@2 ~@2 f2@3 ~ c3 ~ f2@2 g2@2 a2@2", N: "f2@2 ~@2 f2@3 ~ c3@2 f2@2 g2@2 a2@2",
  O: "f2@2 ~@2 f2@2 ~@2 c3 ~ c3@2 bb2@2 c3@2", P: "f2@3 ~ f2@3 ~ c3@2 f2@2 g2@2 a2@2",
  Q: "b2@2 ~@2 b2@3 ~ gb2 ~ gb2@2 ab2@2 gb2@2", R: "b2@2 ~@2 b2@2 ~@2 gb2 ~ gb2@2 ab2@2 gb2@2",
  S: "b2@3 ~ b2@3 ~ b2@2 bb2 ~ bb2@2 ab2@2", T: "gb2@2 ~@2 gb2@2 ~@2 db2 ~ db2@2 eb2@2 db2@2",
  U: "gb2@3 ~ gb2@2 ~@2 db3 ~ db3@2 b2@2 db3@2", V: "gb2@2 ~@2 gb2@2 ~@2 db3 ~ db3@2 b2@2 db3@2",
  W: "gb2@3 ~ gb2@2 ~@2 db2 ~ db2@2 eb2@2 db2@2", X: "gb2@3 ~ gb2@3 ~ db3@2 gb2@2 ab2@2 bb2@2",
  Y: "b2@3 ~ b2@2 ~@2 gb2 ~ gb2@2 ab2@2 gb2@2", Z: "gb2@2 ~@2 gb2@2 ~@2 db3 ~ db3@2 ~@4",
})).s("gm_fretless_bass").gain(0.48)

// bass · fretless bass · soft notes
const bass_soft = note("<~@4 A@5 ~ B@6 A@5 ~ B@6 A@5 ~ B@6 A@5 ~ B@6 A@7 ~ B@6 A@2 C@3 ~ D@6 C@5 ~ D@4>".pickRestart({
  A: "~@7 bb2 ~@8", B: "~@7 f2 ~@8", C: "~@7 b2 ~@8", D: "~@7 gb2 ~@8",
})).s("gm_fretless_bass").gain(0.32)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A@2 B C D@6 E@6 D@6 E@6 D@6 E@6 D@6 E@6 D@8 E@6 D@2 F@4 G@6 F@6 G@3 H
>`.pickRestart({
  A: "[f3,bb3,d4,f4]@7 ~", B: "[f3,bb3,d4,f4] ~ [bb3,d4,f4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~",
  C: "[d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~", D: "~@4 [f4,bb4] ~@7 [f4,bb4] ~@3",
  E: "~@4 [f4,a4] ~@7 [f4,a4] ~@3", F: "~@4 [gb4,b4] ~@7 [gb4,b4] ~@3", G: "~@4 [gb4,bb4] ~@7 [gb4,bb4] ~@3",
  H: "~@4 [gb4,bb4] ~@11", // Gb
})).s("gm_electric_guitar_clean").gain(0.34).pan(0.2)

// chords · drawbar organ
const drawbar_organ = note("<~@4 A@6 B@6 A@6 B@6 A@6 B@6 A@6 B@6 A@8 B@6 A@2 C@4 D@6 C@6 D@3 E>".pickRestart({
  A: "[f5,bb5,d6] ~ [f5,bb5,d6] ~ [f5,bb5,d6] ~ [f5,bb5,d6] ~ [f5,bb5,d6] ~ [f5,bb5,d6] ~ [f5,bb5,d6] ~ [f5,bb5,d6] ~", // Bb
  B: "[f5,a5,c6] ~ [f5,a5,c6] ~ [f5,a5,c6] ~ [f5,a5,c6] ~ [f5,a5,c6] ~ [f5,a5,c6] ~ [f5,a5,c6] ~ [f5,a5,c6] ~", // F
  C: "[gb5,b5,eb6] ~ [gb5,b5,eb6] ~ [gb5,b5,eb6] ~ [gb5,b5,eb6] ~ [gb5,b5,eb6] ~ [gb5,b5,eb6] ~ [gb5,b5,eb6] ~ [gb5,b5,eb6] ~", // B
  D: "[gb5,bb5,db6] ~ [gb5,bb5,db6] ~ [gb5,bb5,db6] ~ [gb5,bb5,db6] ~ [gb5,bb5,db6] ~ [gb5,bb5,db6] ~ [gb5,bb5,db6] ~ [gb5,bb5,db6] ~", // Gb
  E: "[gb5,bb5,db6] ~ [gb5,bb5,db6] ~ [gb5,bb5,db6] ~ [gb5,bb5,db6] ~@9", // Gb
})).s("gm_drawbar_organ").gain(0.28).pan(0.2)

// chords · trumpet
const trumpet = note("<A B C@2 ~@62 D@2 E F G H I@2 J@3 K L@2 E F G H I@2 J M>".pickRestart({
  A: "~@6 bb4@9 ~", B: "~@3 bb4@5", C: "[~@4 f4 ~@3 g4@2 f4@2 eb4@2 d4@16 ~@2]/2",
  D: "[~@2 [d4,f4] ~ [eb4,g4] f4 eb4 [bb3,d4]@7 ~ [d4,bb4]]/2", E: "[eb4,b4]@13 ~ [d4,bb4]@2", F: "b4@13 ~ [d4,bb4]@2",
  G: "[eb4,b4]@7 [d4,bb4]", H: "[eb4,b4]", I: "[~@4 bb4@2 ~@2 b4@2 bb4@2 ab4@2 gb4@15 ~ [c4,a4]@2]/2",
  J: "[db4,bb4]@13 ~ [c4,a4]@2", K: "[db4,bb4]", L: "[~@2 [eb4,gb4] ~ [e4,ab4] [eb4,gb4] e4 eb4@7 ~ [d4,bb4]]/2",
  M: "[db4,bb4]@13 ~@3", // Gb
})).s("gm_trumpet").gain(0.45).pan(0.2)

// chords · trumpet · soft notes
const trumpet_soft = note("<~@66 A ~@2 B ~@8 C@2 ~ B ~@6>".pickRestart({
  A: "~@5 d4 c4 ~", B: "eb4@13 ~@3", C: "[~@6 db4 b3@7 ~@2]/2",
})).s("gm_trumpet").gain(0.28).pan(0.2)

// chords · acoustic guitar steel · Bb
const acoustic_guitar_steel = note(`<
  [[f3,bb3,d4,f4]@2 [f3,bb3,d4,f4]@2 [f3,bb3,d4,f4] ~ [f3,bb3,d4,f4]@2 [f3,bb3,d4,f4]@2 [f3,bb3,d4,f4]@2 [f3,bb3,d4,f4]@2 [f3,bb3,d4,f4] ~]!4
  ~@84
>`).s("gm_acoustic_guitar_steel").gain(0.07).pan(0.2)

// chords · percussive organ
const percussive_organ = note("<A@4 B@6 C@6 B@6 C@6 B@6 C@6 B@6 C@6 D@8 C@6 E@2 F@4 G@6 H@6 I@3 ~>".pickRestart({
  A: "[d4,f4]/4", B: "[d4,f4]/6", C: "[a3,c4]/6", D: "[d4,f4]/8", E: "[d4,f4]/2", F: "[eb4,gb4]/4", G: "[bb3,db4]/6",
  H: "[eb4,gb4]/6", I: "[[bb3,db4]@47 ~]/3",
})).s("gm_percussive_organ").gain(0.05).pan(0.2)

// chords · trumpet
const trumpet_2 = note("<A B C@2 ~@62 D@2 E@2 F G H@2 I@3 J K@2 E@2 F G H@2 I L>".pickRestart({
  A: "~@6 f4@9 ~", B: "~@3 f4@5", C: "[~@4 d4 ~@3 eb4@2 d4@2 c4@2 bb3@16 ~@2]/2",
  D: "[~@2 [d4,f4] ~ [eb4,g4] [d4,f4] [c4,eb4] [bb3,d4]@7 ~ [f3,d4]]/2", E: "[gb3,eb4]@13 ~ [f3,d4]@2",
  F: "[gb3,eb4]@7 [f3,d4]", G: "[gb3,eb4]", H: "[~@4 db4@2 ~@2 eb4@2 db4@2 b3@2 bb3@15 ~ [f3,c4]@2]/2",
  I: "[gb3,db4]@13 ~ [f3,c4]@2", J: "[gb3,db4]",
  K: "[~@2 [eb4,gb4] ~ [e4,ab4] [eb4,gb4] [db4,e4] [b3,eb4]@7 ~ [f3,d4]]/2", L: "[gb3,db4]@13 ~@3",
})).s("gm_trumpet").gain(0.45).pan(0.8)

// chords · rock organ
const rock_organ = note(`<
  ~@5 A ~ A ~@2 B@2 ~@4 C@2 ~@4 B@2 ~@4 C@2 ~@4 B@2 ~@4 C@2 D E F G@3 H I J K@3 ~ A ~ A ~@2 B@2 ~@4 C@2 ~@4 L@2 ~@4 M@2
  ~@4 L@2 ~@2
>`.pickRestart({
  A: "[f6,d7]@2 [eb6,c7] [eb6,c7]@2 [d6,bb6]@3, [eb6,c7] ~@15", // Dm Cm Gm Cm
  B: "[~@2 [a6,c7]@2 [bb6,d7] [a6,c7] [g6,bb6] [f6,a6]@8 ~]/2", // Am Bb Am Gm F
  C: "[~@2 [f6,d7]@2 [g6,eb7] [f6,d7] [eb6,c7] [d6,bb6]@7 ~@2]/2", D: "[f6,d7]@2 [eb6,c7] [eb6,c7]@2 [d6,bb6]@2 ~",
  E: "[f6,d7]@4 [eb6,c7]@2 [eb6,c7]@4 [d6,bb6]@3 ~ [d6,bb6] ~", // Dm Cm Gm
  F: "[f6,d7]@3 ~ [f6,d7]@3 ~ [eb6,c7] ~ [eb6,c7]@3 ~ [d6,bb6]@2", // Dm Cm Gm
  G: "[~@2 [d6,bb6] ~ [d6,bb6] ~ [d6,bb6] ~ [d6,bb6]@2 [c6,a6]@2 [bb5,g6] ~ [bb5,g6]@4 [a5,f6]@25 ~@5]/3", // Gm F Eb Dm
  H: "a6@2 bb6 c7@3 ~@2", I: "a6@2 bb6 c7@4 ~", J: "a6 ~ a6 ~ a6 bb6@2 c7",
  K: "[~ [g6,eb7]!4 [f6,d7] [eb6,c7] [eb6,c7]@2 [d6,bb6]@13 ~@2]/3", // Cm Dm Cm Gm
  L: "[~@2 [bb6,db7]@2 [b6,eb7] [bb6,db7] [ab6,b6] [gb6,bb6]@8 ~]/2", // Bbm B Bbm Abm Gb
  M: "[~@2 [gb6,eb7]@2 [ab6,e7] [gb6,eb7] [e6,db7] [eb6,b6]@7 ~@2]/2", // Ebm Dbm Ebm Dbm Abm
})).s("gm_rock_organ").gain(0.34).pan(0.6)

// drums · kick
const kick = s("bd").struct("<[x!8]!4 [x ~@3 x!2 ~ x]!83 [x ~@3 x!2 ~@2]>").gain(0.6)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@5 [~@3 x ~@12]!49 ~ [~@3 x ~@12]!33>").gain(0.38)

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

// drums · hihat
const hihat = s("hh").struct("<[~ x ~@14]!3 [~ x ~@3 x ~@3 x ~@3 x ~@2] [x!8]!83 [x!7 ~]>").gain(0.53)

// drums · open hat
const open_hat = s("oh").struct("<x!3 [x!4] ~@84>").gain(0.53)

// drums · crash
const crash = s("cr").struct("<~@4 x ~@63 x ~@19>").gain(0.45)

// drums · bongos
const bongos = s("bongo:4").struct("<[~@8 x!8]!2 [~@4 x ~@2 x ~ x ~@5 x] [~ x ~ x ~@4 x!2 ~@6] ~@84>").gain(0.99)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  ~@2 A B C ~@3 C ~@3 D ~@3 C ~ C ~@3 C ~@3 D ~@2 E C ~@3 C ~@3 D ~@2 E C ~@3 C ~@3 D ~@2 E C ~@3 C ~@3 D ~@3 C ~ C ~@3
  C ~@3 D ~@2 E C ~@3 C ~@3
>`.pickRestart({
  A: "~@4 x!2 ~@2", B: "x ~ x ~@7 x!4 ~@2", C: "~@3 x ~@12", D: "~@3 x ~@9 x!2 ~", E: "~@11 x!4 ~",
})).gain(0.99)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@5 A ~ A ~ A ~ A B A ~ A ~ A ~ A ~ A ~ A ~ A B A ~ A ~ A ~ A ~ A ~ A B A ~ A ~ A ~ A ~ A ~ A B A ~ A ~ A ~ A ~ A ~ A
  B A ~ A ~ A ~ A ~ A ~ A ~ A B A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@3 x",
})).gain(1.2)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~ A B C D E@3 D E@3 F E@3 D E D E@3 D E@3 F E@2 G D E@3 D E@3 F E@2 G D E@3 D E@3 F E@2 G D E@3 D E@3 F E@3 D E D E@3
  D E@3 F E@2 G D E@3 D E@2 H
>`.pickRestart({
  A: "x", B: "x ~@2 x", C: "~@4 x ~ x ~@7 x!2", D: "x ~@3 x ~@2 x!2 ~@2 x!2 ~ x ~",
  E: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~ x ~", F: "x ~@3 x ~@2 x!2 ~ x ~@5", G: "x ~@2 x!2 ~@2 x!2 ~@6 x",
  H: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@3",
})).gain(1.2)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct(`<
  ~@5 A@3 ~ A@3 ~ A@3 ~ A ~ A@3 ~ A@3 ~ A@2 ~@2 A@3 ~ A@3 ~ A@2 ~@2 A@3 ~ A@3 ~ A@2 ~@2 A@3 ~ A@3 ~ A@3 ~ A ~ A@3 ~ A@3
  ~ A@2 ~@2 A@3 ~ A@2 ~
>`.pickRestart({
  A: "~@13 x ~@2",
})).gain(0.72)

stack(
  bass, bass_soft, electric_guitar_clean, drawbar_organ, trumpet, trumpet_soft, acoustic_guitar_steel, percussive_organ,
  trumpet_2, rock_organ, kick, kick_soft, snare, hihat, open_hat, crash, bongos, bongos_2, congas, congas_2, congas_soft
)