Strudelify

Between the Sheets

Fourplay

KeyA minorTempo85 bpm
0:00/0:00
// Between the Sheets — Fourplay
// 85 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 121 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(85/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.

// other · vibraphone · "Backup"
const vibraphone = note("<~@80 A B ~@3 C ~@2 A D ~@3 E ~@7 C ~@6 F G ~@8 H ~@2>".pickRestart({
  A: "~@14 g4 ~", B: "a4@4 e4@2 g4@2 a4@4 e4@3 ~", C: "e4 f4 g4@2 ~ g4@11", D: "a4@2 e4 g4 a4@2 e4@2",
  E: "e4 f4 g4 ~@2 g4@11", F: "~@12 g4 e4 g4!2", G: "a4 g4 g4@8 ~@6", H: "e4 ~ e4 c4 d4!2 c4@8 ~@2",
})).s("gm_vibraphone").gain(0.35)

// chords · epiano1 · "E Piano"
const epiano1 = note("<~@15 A@3 ~ B@3 ~@17 A@3 ~ B@3 ~@9 A@3 ~ A@3 ~ A@3 ~ B@3 ~@51>".pickRestart({
  A: "[~@16 a5@13 ~@3 [g5,b5]@13 ~@3, ~@15 [c6,e6]@14 ~@2 d6@14 ~@3]/3", // G C
  B: "[~@16 a5@12 ~@4 [g5,b5]@15 ~, ~@15 [c6,e6]@13 ~@3 d6@15 ~@2]/3", // G C
})).s("gm_epiano1").gain(0.22)

// chords · percussive organ · "Pad1"
const percussive_organ = note(`<
  A B C D E F E G A B C D E H E G I J K L I M N O A B C D E H E G A B C D E H E G I J K L I M N O A B C D E H E G I J K
  L I J K L I J K L I M N O ~@49
>`.pickRestart({
  A: "[g4,a4,c5,e5]@6 ~@2 [g#4,b4,d5,f5]@7 ~", // Am7 G#dim
  B: "[g4,b4,c5,e5]@3 [g4,a4,c5,e5] ~@4 [a4,a#4]@2 ~@2 [f4,a#4,d5]@2 ~@2, ~@8 [f4,d5] ~@3 a4 ~@3", // Cmaj7 Am7 A#maj7 A# Dm
  C: "[g4,a4,c5,e5]@3 ~ [g#4,b4,d5,f5]@3 ~", // Am7 G#dim
  D: "[g4,b4,c5,e5]@3 [g4,a4,c5,e5] ~@4 [f4,a4,a#4,d5]@2 ~@2 [f4,a4,a#4,d5]@2 ~@2", // Cmaj7 Am7 A#maj7
  E: "[f4,a4,d5]@3 ~ [g#4,c5,d5,f5]@3 ~", // Dm Dm7b5
  F: "[g4,b4,c5,e5]@3 [g4,a4,c5,e5] ~@4 [f4,a4,d5] ~@3 [f4,a4,a#4,d5]@2 ~@2, ~@4 a#4 ~@3", // Cmaj7 Am7 Dm A#maj7
  G: "b4@2 a4 b4@6 ~ c5@3 d5@2 ~",
  H: "[g4,b4,c5,e5]@3 [g4,a4,c5,e5] ~@4 [f4,a4,d5] ~@3 [f4,a4,a#4]@2 ~@2, ~@8 a#4@2 ~@2 d5 ~@3", // Cmaj7 Am7 Dm A#maj7
  I: "[f4,a4,c5,e5]@7 ~ [f4,a4,c5,d5]@7 ~", J: "[e4,g4,b4,d5]@8 [e4,g4,a4,c5]@7 ~", K: "[f4,a4,d5]@7 ~ [g#4,c5,f5]@7 ~",
  L: "[g4,a4,c5,e5]", M: "[e4,g4,b4,d5]@7 ~ [e4,g4,a4,c5]@7 ~", N: "[f4,a4,d5]@7 ~ [g#4,c5,f5]@6 ~@2",
  O: "b4@2 a4 b4@7 c5@3 d5@2 ~",
})).s("gm_percussive_organ").gain(0.15)

// chords · acoustic guitar steel · "Pad2"
const acoustic_guitar_steel = note(`<
  A B A B C D C E A B A B C D C E F@2 ~ G H@2 ~ E A B A B C D C E A B A B C D C E F@2 ~ G H@2 ~ E A B A B C D C E F@2 ~
  G I@2 ~ G J@2 ~ G H@2 ~ E ~@7 K ~@7 K ~@7 K ~@7 K ~@7 K ~@9
>`.pickRestart({
  A: "[g3,a3,c4,e4]@3 ~ [g#3,b3,d4,f4]@3 ~", // Am7 G#dim
  B: "[g3,b3,c4,e4]@2 ~ [g3,a3,c4,e4] ~@4 [f3,a3,a#3,d4]@2 ~@2 [f3,a3,a#3,d4]@2 ~@2", // Cmaj7 Am7 A#maj7
  C: "[f3,a3,d4]@5 ~@3 [g#3,c4,d4,f4]@6 ~@2", // Dm Dm7b5
  D: "[g3,b3,c4,e4]@2 ~ [g3,a3,c4,e4] ~@4 [f3,a3,a#3,d4] ~@3 [f3,a3,a#3,d4]@2 ~@2", // Cmaj7 Am7 A#maj7
  E: "[b3,b4]@2 [a3,a4] [b3,b4]@6 ~ [c4,c5]@3 [d4,d5]@2 ~", F: "[~@6 [g4,g5]@5 ~@5]/2",
  G: "~@8 [a3,a4] [b3,b4] ~ [c4,c5] ~ [d4,d5] ~ [d4,d5]", H: "[[e4,e5]@8 ~@4 [g4,g5]@11 ~@9]/2",
  I: "[[e4,e5]@11 ~ [g4,g5]@10 ~@10]/2", J: "[[e4,e5]@5 ~ [g4,g5]@5 ~@5]/2",
  K: "[b3,b4]@2 [a3,a4] [b3,b4]@7 [c4,c5]@3 [d4,d5]@3", // B A B C D
})).s("gm_acoustic_guitar_steel").gain(0.17)

// chords · piano · "Pad3"
const piano = note(`<
  ~@72 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 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~
>`.pickRestart({
  A: "[[g3,a3,c4,e4]@3 [g3,a3,c4,e4] ~@2 [g3,b3,d4]@25 ~]/2", // Am7 G
  B: "[[g3,a3,c4,e4]@3 [g3,a3,c4,e4] ~@4 [b3,d4,e4,g4]@3 [a3,d4,f#4]@21]/2", // Am7 Em7 D
  C: "[[g3,a3,c4,e4]@2 ~ [g3,a3,c4,e4] ~@2 [g3,b3,d4]@26]/2", // Am7 G
  D: "[[g3,a3,c4,e4]@3 [g3,a3,c4,e4] ~@2 [g3,b3,d4] ~ [e3,g3,a3,c4]@22 ~@2]/2", // Am7 G Am7
})).s("gm_piano").gain(0.29)

// other · clavinet · "System"
const clavinet = note(`<
  ~@72 A B C D E B F G H I J K L M N O A B C D E B F G H I J K L M N O A B C D E B F G H I J K L M N O ~
>`.pickRestart({
  A: "e5 a4 e5 d5 e5 a4 g5 d5 a5 a4 e5 d5 g5 a4 e5 d5", B: "e5 a4 e5 d5 g5 a4 e5 d5 a5 a4 e5 d5 g5 a4 e5 d5",
  C: "g5 a4 e5 d5 e5 a4 g5 d5 e5 a4 a5 d5 e5 a4 g5 d5", D: "g5 a4 e5 d5 e5 a4 g5 d5 a5 a4 e5 d5 g5 a4 e5 d5",
  E: "e5 a4 e5 d5 e5 a4 a5 d5 a5 a4 e5 d5 g5 a4 e5 d5", F: "e5 a4 g5 d5 e5 a4 g5 d5 a5 a4 e5 d5 g5 a4 e5 d5",
  G: "e5 a4 e5 d5 e5 a4 g5 d5 a5 a4 e5 d5 g5 a4 e5 a4", H: "e5 d5 e5 a4 g5 d5 e5 a4 a5 d5 e5 a4 g5 d5 e5 a4",
  I: "e5 d5 e5 a4 g5 d5 e5 d5 a5 a4 e5 d5 g5 a4 e5 d5", J: "g5 a4 e5 d5 g5 a4 e5 d5 a5 a4 e5 d5 g5 a4 e5 d5",
  K: "e5 a4 e5 a4 g5 d5 e5 a4 a5 d5 e5 a4 g5 d5 e5 a4", L: "g5 d5 e5 a4 g5 d5 e5 a4 e5 d5 g5 a4 a5 d5 e5 a4",
  M: "g5 d5 e5 a4 a5 d5 e5 a4 g5 d5 e5 a4 a5 d5 e5 a4", N: "g5 d5 e5 a4 e5 d5 e5 a4 a5 d5 e5 a4 g5 d5 e5 a4",
  O: "g5 d5 e5 a4 g5 d5 e5 a4 a5 d5 e5 a4 g5 d5 e5 a4",
})).s("gm_clavinet").gain(0.25)

// chords · string ensemble 1 · "Stringz"
const string_ensemble_1 = note("<~@72 A@8 ~@16 A@8 ~@17>".pickRestart({
  A: "[e5,a5]/8", // A5
})).s("gm_string_ensemble_1").gain(0.09)

// bass · synth bass 2 · "Bass"
const bass = note(`<
  A B A C D C E F A B A C D C E F G H D I J H E K A B A C D C E F A B A C D C E F G H D I J H E K A B A C D C E F G H D
  I G H D I G H D I J H E K L@2 M@2 L@2 N@2 L@2 M@2 L@2 N@2 L@2 M@2 L@2 N@2 L@2 M@2 L@2 N@2 L@2 M@2 L@2 N@2 L@2 M@2 L@2
  N@2 ~
>`.pickRestart({
  A: "f1@2 ~ f1 ~@2 d1 ~ e1@2 ~@6", B: "a1@2 ~ a1 ~@2 g#1 ~ g1@2 ~@2 c2@2 ~@2",
  C: "a1@2 ~ a1 ~@2 g#1 ~ g1@2 ~@2 c2@3 ~", D: "b1 ~@2 b1 ~@2 d1 ~ e1@2 ~@6", E: "b1@2 ~ b1 ~@2 d1 ~ e1@2 ~@6",
  F: "b2@2 a2 b2@7 c3@3 d3@2 ~", G: "d2@2 ~ d2 ~@2 f1 ~ g1@2 ~@6", H: "c2 ~@2 c2 ~@2 g1 ~ a1@2 ~@6",
  I: "a1@2 ~ a1 ~@3 e1 a1 ~ b1 ~ c2@3 ~", J: "d2 ~@2 d2 ~@2 f1 ~ g1 ~@7", K: "b2@2 a2 b2@7 c3@2 ~ d3@2 ~",
  L: "[f2@3 a1@13, e2 ~@31]/2", M: "[f2@8 a1@3 e1@21, e2 ~@31]/2", N: "[f2@3 f1@3 e1@2 a1@24, e2 ~@31]/2",
})).s("gm_synth_bass_2").gain(0.45)

// drums · kick
const kick = s("bd").struct("<[x!2]!118 [x ~@2 x ~@2 x ~@9] ~@2>").gain(0.45)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!118 ~@3>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@117 [~@5 x!2 ~] ~@3>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct(`<
  A@72 B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C ~@3
>`.pickRestart({
  A: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", B: "x!14 ~@2", C: "x!10 ~@2 x!2 ~@2",
})).gain(0.35)

// drums · low tom
const low_tom = s("lt").struct("<~@117 [~@7 x] ~@3>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@117 [~@12 x!2 ~@2] ~@3>").gain(0.5)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@72 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 ~@3
>`.pickRestart({
  A: "~@7 x", B: "~@5 x ~ x",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@118 [x ~@2 x ~@2 x ~@6 x!3] [x!13 ~@3] ~>").gain(0.25)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@118 [~@11 x!3 ~@2] [~@12 x!4] [x!2 ~@6]>").gain(0.1)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@8 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@50
>`.pickRestart({
  A: "~@4 x!2 ~@10",
})).gain(0.65)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct(`<
  ~@8 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@50
>`.pickRestart({
  A: "~@3 x ~@2 x ~@9",
})).gain(0.65)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<A ~@15 A ~@3 A ~@19 A ~@3 A ~@43 A ~@32>".pickRestart({
  A: "x",
})).gain(1.07)

// drums · bell tree
const bell_tree = s("marktrees:0").struct(`<
  ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@11 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@25
>`.pickRestart({
  A: "~@15 x",
})).gain(1.48)

stack(
  vibraphone, epiano1, percussive_organ, acoustic_guitar_steel, piano, clavinet, string_ensemble_1, bass, kick, clap,
  snare, hihat, low_tom, mid_tom, open_hat, crash, crash_soft, woodblocks, woodblocks_2, jingle_bells, bell_tree
)