Strudelify

Computer Love

Slipstream

KeyG minorTempo128 bpm
0:00/0:00
// Computer Love — Slipstream
// 128 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 156 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/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.

// chords · pad warm · "WARM PAD"
const pad_warm = note(`<
  A@3 ~ A@3 ~@30 B C D ~@2 C D ~ E C D ~ E C D F G H I J K L M ~ N C D ~@2 C D ~ E C D ~ E C D F G H I J K L M ~@16 O P
  Q@2 ~ P R@2 O P Q@2 ~ P R@2 ~@40
>`.pickRestart({
  A: "[~@7 bb3@3 ~@5 bb4@3 ~@6]/3", B: "~@7 [bb5,d6]", C: "[g5,c6]@5 ~@2 [bb5,d6]", D: "[g5,c6]@5 ~@3",
  E: "c6@2 a5 bb5@3 ~@2", F: "g5@2 bb5!2 ~@3 g5", G: "bb5@2 c6 c6@2 bb5 ~@2", H: "g5@2 bb5 bb5@2 ~@2 g5",
  I: "bb5 c6 d6@2 bb5 ~@3", J: "g5@2 bb5!2 ~@4", K: "~@3 c6@2 d6 bb5 ~", L: "g5@2 bb5 g5 bb5@2 c6@2",
  M: "d6 c6 a5 f5@5", N: "~@5 [bb5,d6]@3", O: "[g5,bb5] ~@3", P: "~@2 c6@3 bb5 ~@2, ~ g5@2 ~",
  Q: "[~@7 [g5,bb5]@3 ~@6]/2", R: "[~@7 [f5,c6]@3 ~@6]/2",
})).s("gm_pad_warm").gain(0.12)

// chords · pad warm · "WARM PAD" · soft notes
const pad_warm_soft = note("<~@40 A@2 ~@2 B@2 ~@2 B@2 ~@14 A@2 ~@2 B@2 ~@2 B@2 ~@82>".pickRestart({
  A: "[[g5,bb5,d6]@3 ~]/2", B: "[[g5,d6]@7 ~, bb5@3 ~@5]/2",
})).s("gm_pad_warm").gain(0.06)

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@37 A B@2 C@2 B@2 C@2 B@2 C@2 B@2 D E D E D F D G ~ H B@2 C@2 B@2 C@2 B@2 C@2 B@2 D E D E D F D G ~@16 D E D E D F D
  G D E D E D F D G D E D E D F D G D E D E D F D G D E D E D F D G D E D E D F D G D E D E D F D I
>`.pickRestart({
  A: "~@10 c2 ~@3 c2 ~", B: "c2 ~@3 c2@3 c2 ~ c2@3 c2 ~@3", C: "g1 ~@3 g2@3 g1 ~ g1@3 g1 ~@3",
  D: "eb1 ~@3 eb1@3 eb1 ~ eb1@3 eb1 ~@3", E: "g1 ~@3 g1@3 g1 ~ bb1@3 bb1 ~ bb1 c2",
  F: "g1 ~@3 g1@3 g1 ~ bb1@3 bb1 ~ bb1 ~", G: "f1 ~@3 f1@3 f1 ~ f1@3 f1 ~@3", H: "~@11 c2 ~@2 c2 ~", I: "f1 ~@7",
})).s("gm_synth_bass_1").gain(0.2)

// other · lead 8 bass lead · "BASS&LEAD"
const lead_8_bass_lead = note("<~@8 A B C D E F@3 ~@8 G H I J K L@2 M ~@68 A B C D E F@3 ~@48>".pickRestart({
  A: "g5 f5 bb5 f5 c6 d6 g5 bb5 f5 c6 d6 f5 bb5 f5 c6 d6", B: "g5 bb5 f5 c6 d6 f5 bb5 f5 c6 f5 d6 f5 ~ bb5 c6 d6",
  C: "g5 bb5 f5 c6 d6 f5 bb5 f5 c6 d6 f5 bb5 f5 c6 d6 g5", D: "bb5 f5 bb5 f6 bb6 d6!2 bb5!2 f5 bb5 f6 bb6 d6!2 bb5",
  E: "d6 g5 d6 f5 bb5 bb6 g6 f6 d6 g5 bb5 f5 d6 g5 d6 f5", F: "bb5 g5 d6 f5 bb5 g5 d6 f5 bb5 g5 d6 f5 bb5 g5 d6 f5",
  G: "d7 f6 bb6 f6 c7 d7 f6 bb6 f6 c7 d7 f6 bb6 f6 c7 d7", H: "f6 bb6 f6 c7 d7 f6 bb6 f6 bb6 g7 f7 f6 bb6 f6 c7 d7",
  I: "f6 bb6 f6 c7 d7 f6 bb6 f6 d7 f6 bb6 f6 d7 f6 bb6 f6", J: "f7 bb7 c7 f6 ~ bb6 f6 bb6 f6 d7 f6 bb6 ~ f7 ~ f6",
  K: "~ d7 f6 d7 ~ f6 bb6 g7 f7 d7 bb6 d7 ~ f6 bb6 d7", L: "f6 bb6 g6 d7 f6 bb6 g6 d7 f6 bb6 g6 d7 f6 bb6 g6 d7",
  M: "f7 bb6 d7 g6 f6 bb6 g6 f7 f6 d7 g6 bb6 f6 bb6 g6 d7",
})).s("gm_lead_8_bass_lead").gain(0.14).pan(0.7)

// chords · clavinet
const clavinet = note(`<
  ~@16 A B C D A B C D A B C D A B C D E@6 F@21 G E@2 F@21 G ~@24 A B C D A B C H F@15 I F@7 I A B C J A B C H A B C J A
  B C ~
>`.pickRestart({
  A: "c4 d4 bb3 f3 ~ c4 d4 bb3 f3 g3 c4 d4 bb3 f3 g3 c4", B: "d4 bb3 ~ g3 ~ d4 bb3 f3 ~ c4 d4 bb3 ~ g3 c4 d4",
  C: "~ f3 g3 c4 ~ bb3 f3 g3 c4 d4 bb3 f3 ~ c4 d4 bb3", D: "f3 g3 c4 d4 ~ f3 g3 c4 d4 bb3 f3 g3 ~@4",
  E: "~@2 f3 ~ [g3,bb3,d4] ~ f3 [g3,bb3,d4] ~@2 f3 ~ [g3,bb3,d4] ~ f3 [g3,bb3,d4]", // Gm
  F: "~@2 f4 ~ [g4,bb4,d5] ~ f4 [g4,bb4,d5] ~@2 f4 ~ [g4,bb4,d5] ~ f4 [g4,bb4,d5]", G: "~@2 f4 ~@3 f4 ~@3 f4 ~@3 f4 ~",
  H: "f3 g3 c4 d4 ~ f3 g3 c4 d4 bb3 f3 g3 c4 d4 ~ f3",
  I: "~@2 f4 ~ [a4,c5,f5] ~ f4 [a4,c5,f5] ~@2 f4 ~ [a4,c5,f5] ~ f4 [a4,c5,f5]", // F
  J: "f3 g3 c4 d4 ~ f3 g3 c4 d4 bb3 f3 g3 ~ bb3 f3 g3",
})).s("gm_clavinet").gain(0.16).pan(0.1)

// other · clavinet
const clavinet_2 = note(`<
  ~@16 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 E@6 F@21 G E@2 F@21 G ~@24 A@2 H@2 C@2 I@2 F@15 J F@7 J A@2 B@2 C@2 D@2 A@2 B@2
  C@2 D ~
>`.pickRestart({
  A: "g3 bb3 f3 c4 ~ bb3 f3 ~ g3 bb3 f3 c4 ~ bb3 f3 ~", B: "bb4 c5 g4 f4 bb4 c5 g4 f4 bb4 c5 g4 f4 bb4 c5 g4 f4",
  C: "g3 f3 bb3 g3 ~ f3 bb3 g3!2 f3 bb3 g3 ~ f3 bb3 g3", D: "bb4 f4 g4 c5 bb4 f4 g4 c5 bb4 f4 g4 c5 bb4 f4 g4 c5",
  E: "~@3 f3 ~ [g3,bb3,d4] ~ f3 ~@3 f3 ~ [g3,bb3,d4] ~ f3", // Gm
  F: "~ f4 ~ f4 ~ [g4,bb4,d5] ~ f4 ~ f4 ~ f4 ~ [g4,bb4,d5] ~ f4", G: "~ f4 ~ f4 ~@3 f4 ~ f4 ~ f4 ~@3 f4",
  H: "bb3 c4 g3 f3 bb3 c4 g3 f3 bb3 c4 g3 f3 bb3 c4 g3 f3", I: "bb3 f3 g3 c4 bb3 f3 g3 c4 bb3 f3 g3 c4 bb3 f3 g3 c4",
  J: "~ f4 ~ f4 ~ [a4,c5,f5] ~ f4 ~ f4 ~ f4 ~ [a4,c5,f5] ~ f4", // F
})).s("gm_clavinet").gain(0.12).pan(0.9)

// chords · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note("<A B A C D E D F A B A C D E D F ~@84 A B A C D E D F ~@48>".pickRestart({
  A: "eb3 c4 bb3 g3 eb3 c4 bb3 g3 eb3 c4 bb3 g3 eb3 c4 bb3 ~", B: "g4 d5 bb4 f4 g4 d5 bb4 f4 g4 d5 bb4 f4 g4 d5 bb4 f4",
  C: "bb4 f4 d5 g4 bb4 f4 d5 g4 bb4 f4 d5 g4 bb4 f4 d5 g4",
  D: "g3 bb3 c4 eb3 g3 bb3 c4 eb3 g3 bb3 c4 eb3 g3 bb3 c4 eb3",
  E: "g4 bb4 d5 f4 g4 bb4 d5 f4 g4 bb4 d5 f4 g4 bb4 d5 f4", F: "g4 bb4 c5 f4 g4 bb4 c5 f4 g4 bb4 c5 f4 g4 bb4 c5 f4",
})).s("gm_synth_brass_1").gain(0.14).pan(0.3)

// chords · synth brass 1 · "SYNBRASS 1" · soft notes
const synth_brass_1_soft = note("<A B C D E F G H I B C D E F G H J ~@83 A B C D E F G H ~@48>".pickRestart({
  A: "~@2 eb3 c4 bb3 g3 eb3 c4 bb3 g3 eb3 c4 bb3 g3 eb3 c4", B: "bb3 ~ g4 d5 bb4 f4 g4 d5 bb4 f4 g4 d5 bb4 f4 g4 d5",
  C: "bb4 f4 eb3 c4 bb3 g3 eb3 c4 bb3 g3 eb3 c4 bb3 g3 eb3 c4",
  D: "bb3 ~ bb4 f4 d5 g4 bb4 f4 d5 g4 bb4 f4 d5 g4 bb4 f4", E: "d5 g4 g3 bb3 c4 eb3 g3 bb3 c4 eb3 g3 bb3 c4 eb3 g3 bb3",
  F: "c4 eb3 g4 bb4 d5 f4 g4 bb4 d5 f4 g4 bb4 d5 f4 g4 bb4",
  G: "d5 f4 g3 bb3 c4 eb3 g3 bb3 c4 eb3 g3 bb3 c4 eb3 g3 bb3",
  H: "c4 eb3 g4 bb4 c5 f4 g4 bb4 c5 f4 g4 bb4 c5 f4 g4 bb4",
  I: "c5 f4 eb3 c4 bb3 g3 eb3 c4 bb3 g3 eb3 c4 bb3 g3 eb3 c4", J: "c5 f4 ~@14",
})).s("gm_synth_brass_1").gain(0.08).pan(0.3)

// other · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note("<~@51 A B C D E B F G H ~@15 A B C D E B F G H ~@72>".pickRestart({
  A: "~@7 [f3,f4]", B: "[g3,g4]@2 [bb3,bb4]!2 ~@3 [g3,g4]", C: "[bb3,bb4]@2 [c4,c5] [c4,c5]@2 [bb3,bb4] ~@2",
  D: "[g3,g4]@2 [bb3,bb4] [bb3,bb4]@2 ~@2 [g3,g4]", E: "[bb3,bb4] [c4,c5] [d4,d5]@2 [bb3,bb4] ~@3",
  F: "[bb3,bb4]@2 [c4,c5] [c4,c5]@2 [d4,d5] [bb3,bb4] ~", G: "[g3,g4]@2 [bb3,bb4] [g3,g4] [bb3,bb4]@2 [c4,c5]@2",
  H: "[d4,d5] [c4,c5] [a3,a4] [f3,f4]@5", // D C A F
})).s("gm_synth_strings_1").gain(0.14).pan(0.9)

// other · synth strings 1 · "SYN STR 1" · soft notes · Gm F Gm F
const synth_strings_1_soft = note(`<
  ~@124
  [~ [g4,bb4,d5] ~ [g4,bb4,d5]]!7
  [~ [a4,c5,f5] ~ [a4,c5,f5]]
  [~ [g4,bb4,d5] ~ [g4,bb4,d5]]!7
  [~ [a4,c5,f5] ~ [a4,c5,f5]]
  ~@16
>`).s("gm_synth_strings_1").gain(0.09).pan(0.9)

// other · pad bowed · "BOWEDGLASS"
const pad_bowed = note("<~@123 A B@2 C@2 B@2 D@2 B@2 C@2 B@2 E@2 ~@16>".pickRestart({
  A: "~@7 g5", B: "[d6@3 ~@2 bb5 c6 g5@2 bb5 c6 f5@2 bb5 ~ g5]/2", C: "[d6@3 ~@2 bb5 c6 g5@2 bb5 c6 f5@2 ~@2 g5]/2",
  D: "[d6@3 ~@2 bb5 d6 c6@3 ~@5 g5]/2", E: "[d6@3 ~@2 bb5 d6 c6@3 ~@6]/2",
})).s("gm_pad_bowed").gain(0.2)

// other · woodblock
const woodblock = note("<~@32 A B C D ~@24 B C ~@22 A B C E ~@68>".pickRestart({
  A: "bb8 a8 ab8 g8 gb8 f8 e8 eb8 d8 db8 c8 b7 bb7 a7 ab7 g7",
  B: "gb7 f7 e7 eb7 d7 db7 c7 b6 bb6 a6 ab6 g6 gb6 f6 e6 eb6",
  C: "d6 db6 c6 b5 bb5 a5 ab5 g5 gb5 f5 e5 eb5 d5 db5 c5 b4",
  D: "bb4 a4 ab4 g4 gb4 f4 e4 eb4 d4 db4 c4 b3 bb3 a3 ab3 g3",
  E: "bb4 a4 ab4 g4 gb4 f4 e4 eb4 d4 db4 c4 b3 bb3 a3 ab3 ~",
})).s("gm_woodblock").gain(0.17).pan(0.8)

// other · synth drum
const synth_drum = note(`<
  ~@15 A B ~@14 A B ~@2 A B ~@22 A B ~@27 C@8 D E D A B ~@22 A B ~@14 A B ~@13 A B
>`.pickRestart({
  A: "[b1,c2] [d2,e2] f2 [g2,a2] [b2,c3,d3] [e3,f3] [g3,a3] [b3,c4] [d4,e4] [f4,g4,a4] [b4,c5] [d5,e5] [f5,g5,a5] [b5,c6,d6] [e6,f6,g6] [a6,b6,c7,d7]", // Cmaj7 Dsus2 Gsus2 Bm Fmaj7 Gsus2 Cmaj7 Dsus2 …
  B: "[e7,f7,g7,a7] b7 ~@14", C: "~@2 ab4 ab5 d6 ~ ab4 ~ ab4 ab5 ~ ab4 ~@4", D: "~@2 ab4 ~ d6 ~ ab4 d5 ~ ab4 ab5 ~@5",
  E: "ab4 ~ d5 ~ ab6 ~ d5 ab5 ~ d5 d6 ~@5",
})).s("gm_synth_drum").gain(0.25)

// drums · kick
const kick = s("bd").struct("<~@8 A@24 B ~@3 B ~ A@22 B ~ A@21 C A@3 ~ A@11 B A@14 ~@2 A@23 B A@15 B>".pickRestart({
  A: "x!4", B: "x", C: "x!2 ~@2",
})).gain(0.22)

// drums · snare
const snare = s("sd").struct(`<
  ~@7 A B C B D B E B F B C B C B E B E B C B C B E B F G ~@2 H ~ I B C B E B E B E B E B E B J B C B E B C B C B I B C
  B E B C B E B C B E B K B C B E B C B L ~@4 F M F M N O ~ P N Q N ~ R S R T R S R U R S R T R S ~ V R S R T R S R I R
  S R T R S R W R S R T R S R V R S R T R S R T R S R T R S R ~
>`.pickRestart({
  A: "~@10 x!2 ~ x ~ x", B: "~@7 x ~@8", C: "~@7 x ~ x ~@6", D: "~@7 x ~ x ~@4 x ~", E: "~@7 x ~ x ~@4 x!2",
  F: "~@14 x!2", G: "x", H: "~@12 x!4", I: "~@8 x!3 ~ x!2 ~ x", J: "~ x ~@2 x ~@4 x ~@2 x!4",
  K: "~ x ~@2 x ~@4 x!2 ~ x!4", L: "~@9 x ~@6", M: "~@7 x", N: "~@4 x ~@2 x ~@8", O: "~@4 x ~@2 x ~@6 x!2",
  P: "~@4 x ~@2 x ~ x ~@4 x ~", Q: "~@4 x ~@2 x ~ x ~@4 x!2", R: "~@4 x ~@2 x ~@4 x ~@3",
  S: "~@4 x ~@2 x ~ x ~@2 x ~ x!2", T: "~@4 x ~@2 x ~ x ~@2 x ~@3", U: "~@4 x ~@2 x!4 ~ x!2 ~ x",
  V: "~@4 x!3 ~ x!2 ~ x!2 ~ x ~", W: "~@4 x ~@2 x ~ x!2 ~ x!2 ~@2",
})).gain(0.15)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@4 [x!4]!28 ~@6 [x!4]!117 x>").gain(0.22)

// drums · pedal hat · soft notes
const pedal_hat_soft = s("hh").struct("<~@4 [~@3 x ~@3 x ~@3 x ~@3 x]!28 ~@6 [~@3 x ~@3 x ~@3 x ~@3 x]!117 ~>")
  .gain(0.02)

// drums · open hat
const open_hat = s("oh").struct("<~@4 [~ x ~ x ~ x ~ x]!28 ~@6 [~ x ~ x ~ x ~ x]!117 ~>").gain(0.2)

// drums · shaker
const shaker = s("sh").struct("<~@4 [~@3 x ~@3 x ~@3 x ~@3 x]!28 ~@6 [~@3 x ~@3 x ~@3 x ~@3 x]!117 ~>").gain(0.2)

stack(
  pad_warm, pad_warm_soft, bass, lead_8_bass_lead, clavinet, clavinet_2, synth_brass_1, synth_brass_1_soft,
  synth_strings_1, synth_strings_1_soft, pad_bowed, woodblock, synth_drum, kick, snare, pedal_hat, pedal_hat_soft,
  open_hat, shaker
)