Strudelify

Sometimes

Erasure

KeyC majorTempo108 bpm
0:00/0:00
// Sometimes — Erasure
// 108 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 synth brass 1 (copy of ch 2 pad poly)
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(108/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 · synth strings 2
const synth_strings_2 = note(`<
  A B C D E F C D F G D ~ H I D ~ H I J K L M N O P Q N O Q R D ~ H I D ~ H I J K L M N O P Q N O Q R D ~ H I D ~ H I J
  K L M N O P Q N O P Q N O Q R N O P Q N O Q R N O P Q N O Q R N O P Q N O Q S ~@8
>`.pickRestart({
  A: "[d#4,g#4,c5,d#5,g#5]", B: "[f4,a#4,d5,f5,a#5]", C: "[e4,g4,c5,e5] ~@3", D: "[d4,g4,b4,d5] ~@3",
  E: "[d#4,g#4,c5,d#5] ~@3", F: "[f4,a#4,d5,f5] ~@3", G: "[f4,a4,c5,f5] ~@3", H: "[d4,g4,b4,d5,g5]",
  I: "[f4,a4,c5,f5] [e4,g4,c5,e5]", J: "[c4,e4,a4]", K: "[d4,f4,a4]", L: "[d4,f4,a#4] [c4,f4,a4]", M: "[d4,g4,b4]",
  N: "[e4,g4,c5,e5]", O: "[d4,g4,b4,d5]", P: "[d#4,g#4,c5,d#5]", Q: "[f4,a#4,d5,f5]", R: "[f4,a4,c5,f5]",
  S: "[f4,a4,c5,f5]@15 [c3,c4,e4,g4,c5,e5,g5]", // F C
})).s("gm_synth_strings_2").gain(0.36)

// other · pad poly
const pad_poly = note("<~@2 A@2 B C A@2 D@2 ~@96>".pickRestart({
  A: "[~@6 g5!2 g5@2 f5@2 e5@2 d5@4 g4@4 ~@10]/2", B: "~@2 c5@2 d5 d#5 d5 c5", C: "g5 f5 d#5 f5@2 ~@3",
  D: "[~@6 f5!2 f5@2 d#5@2 d5@2 c5@4 f4@4 ~@10]/2",
})).s("gm_pad_poly").gain(0.46)

// chords · music box
const music_box = note("<~@12 A B ~@2 A B ~@14 A B ~@2 A B ~@14 A B ~@2 A B ~@48>".pickRestart({
  A: "[d4,g4,d5,g5]", B: "[c4,f4,c5,f5] [c4,g4,c5,g5]",
})).s("gm_music_box").gain(0.45)

// other · timpani
const timpani = note(`<
  ~@22 A@2 B C A@2 D@2 ~@12 A@2 B C A@2 D@2 ~@16 A@2 B C A@2 D@2 A@2 B C A@2 D@2 A@2 B C A@2 D@2 A@2 B C A@2 D@2 ~@8
>`.pickRestart({
  A: "[~@6 g5!2 g5@2 f5@2 e5@2 d5@4 g4@4 ~@10]/2", B: "~@2 c5@2 d5 d#5 d5 c5", C: "g5 f5 d#5 f5@2 ~@3",
  D: "[~@6 f5!2 f5@2 d#5@2 d5@2 c5@4 f4@4 ~@10]/2",
})).s("gm_timpani").gain(0.46)

// chords · electric guitar clean · G5 F5 C5 G5 F5 C5
const electric_guitar_clean = note(`<
  ~@12
  [[d4,g4,d5,g5]]
  [[c4,f4,c5,f5] [c4,g4,c5,g5]]
  ~@2
  [[d4,g4,d5,g5]]
  [[c4,f4,c5,f5] [c4,g4,c5,g5]]
  ~@88
>`).s("gm_electric_guitar_clean").gain(0.48)

// other · pad sweep
const pad_sweep = note("<~@22 A B C D A B E F ~@76>".pickRestart({
  A: "~@6 g5!3 ~ f5 ~ e5 ~ d5 ~", B: "~@2 g4 ~@13", C: "~@4 c5 ~@3 d5 ~ d#5 ~ d5 ~ c5 ~", D: "g5 ~ f5 ~ d#5 ~ f5 ~@9",
  E: "~@6 f5!3 ~ d#5 ~ d5 ~ c5 ~", F: "~@2 f4 ~@13",
})).s("gm_pad_sweep").gain(0.54)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<~@32 A B ~@2 A B ~@14 A B ~@2 A B ~@48>".pickRestart({
  A: "[d4,g4,d5,g5]", B: "[c4,f4,c5,f5] [c4,g4,c5,g5]",
})).s("gm_acoustic_guitar_steel").gain(0.48)

// other · trombone
const trombone = note("<~@50 A B@2 ~ C D@2 ~ E F G@2 ~@44>".pickRestart({
  A: "[g4,a4,a#4] ~@5 g4@6 b4@3 ~, b4@3 ~@5", B: "[a4 g4 f4 g4@13]/2", C: "b4@6 c5@5 ~ [c5,c#5] ~@3, ~@3 d5",
  D: "[d5 c5 b4 c5@13]/2", E: "b4@3 c5@2 d5 a4@2", F: "e5 d5 c5 d5@4 ~", G: "[e5 d5 c5 f5@2 e5 c5 d5@9]/2",
})).s("gm_trombone").gain(0.56)

// chords · pizzicato strings
const pizzicato_strings = note("<~@12 A B ~@2 A B C D E F ~@30 A B ~@2 A B C D E F ~@44>".pickRestart({
  A: "[g4,b4,d5] ~@3 [g4,b4,d5] ~@2 [g4,b4,d5] ~ [g4,b4,d5]!2 ~ [g4,b4,d5] ~@3", // G
  B: "[f4,a4,c5] ~@3 [f4,a4,c5] ~@2 [g4,c5,e5] ~ [g4,c5,e5]!2 ~ [g4,c5,e5] ~@3", // F C
  C: "[c6,e6,a6]!2 ~ [c6,e6,a6]!7 ~ [c6,e6,a6]!5", D: "[d6,f6,a6]!2 ~ [d6,f6,a6]!7 ~ [d6,f6,a6]!5",
  E: "[d6,f6,a#6]!2 ~ [d6,f6,a#6]!5 [c6,f6,a6]!2 ~ [c6,f6,a6]!5", F: "[d6,g6,b6]!2 ~ [d6,g6,b6]!7 ~ [d6,g6,b6]!2 ~@3",
})).s("gm_pizzicato_strings").gain(0.48)

// chords · pizzicato strings · soft notes
const pizzicato_strings_soft = note("<~@18 A B C D ~@36 A B C D ~@44>".pickRestart({
  A: "~@2 [c6,e6,a6] ~@7 [c6,e6,a6] ~@5", B: "~@2 [d6,f6,a6] ~@7 [d6,f6,a6] ~@5",
  C: "~@2 [d6,f6,a#6] ~@7 [c6,f6,a6] ~@5", D: "~@2 [d6,g6,b6] ~@7 [d6,g6,b6] ~@5",
})).s("gm_pizzicato_strings").gain(0.28)

// other · timpani
const timpani_2 = note("<~@22 A B C D A B E F ~@76>".pickRestart({
  A: "c6 ~ g5 ~@3 c6 ~ g5 ~@3 c6 ~ g5 ~", B: "d6 ~ g5 ~@3 d6 ~ g5 ~@3 d6 ~ g5 ~",
  C: "c6 ~ g#5 ~ d#5 ~ g#4 ~@3 g#5 ~ c6 ~ g#5 ~", D: "a#5 ~ f5 ~ d5 ~ a#4 ~@9",
  E: "a#5 ~ f5 ~ d5 ~ a#4 ~@3 f5 ~ a#5 ~ f5 ~", F: "f5 ~ c5 ~@3 f5 ~ c5 ~@3 f5 ~ c5 ~",
})).s("gm_timpani").gain(0.41)

// chords · cello
const cello = note("<~@32 A B ~@2 A B C D E F ~@64>".pickRestart({
  A: "[g4,b4,d5] ~@3 [g4,b4,d5] ~@2 [g4,b4,d5] ~ [g4,b4,d5]!2 ~ [g4,b4,d5] ~@3", // G
  B: "[f4,a4,c5] ~@3 [f4,a4,c5] ~@2 [g4,c5,e5] ~ [g4,c5,e5]!2 ~ [g4,c5,e5] ~@3", // F C
  C: "[c6,e6,a6]!2 ~ [c6,e6,a6]!7 ~ [c6,e6,a6]!5", D: "[d6,f6,a6]!2 ~ [d6,f6,a6]!7 ~ [d6,f6,a6]!5",
  E: "[d6,f6,a#6]!2 ~ [d6,f6,a#6]!5 [c6,f6,a6]!2 ~ [c6,f6,a6]!5", F: "[d6,g6,b6]!2 ~ [d6,g6,b6]!7 ~ [d6,g6,b6]!2 ~@3",
})).s("gm_cello").gain(0.39)

// chords · cello · soft notes · Am Dm A# F G
const cello_soft = note(`<
  ~@38
  [~@2 [c6,e6,a6] ~@7 [c6,e6,a6] ~@5]
  [~@2 [d6,f6,a6] ~@7 [d6,f6,a6] ~@5]
  [~@2 [d6,f6,a#6] ~@7 [c6,f6,a6] ~@5]
  [~@2 [d6,g6,b6] ~@7 [d6,g6,b6] ~@5]
  ~@64
>`).s("gm_cello").gain(0.22)

// other · tremolo strings
const tremolo_strings = note("<~@42 A B C D A B E F ~@56>".pickRestart({
  A: "c6 ~ g5 ~@3 c6 ~ g5 ~@3 c6 ~ g5 ~", B: "d6 ~ g5 ~@3 d6 ~ g5 ~@3 d6 ~ g5 ~",
  C: "c6 ~ g#5 ~ d#5 ~ g#4 ~@3 g#5 ~ c6 ~ g#5 ~", D: "a#5 ~ f5 ~ d5 ~ a#4 ~@9",
  E: "a#5 ~ f5 ~ d5 ~ a#4 ~@3 f5 ~ a#5 ~ f5 ~", F: "f5 ~ c5 ~@3 f5 ~ c5 ~@3 f5 ~ c5 ~",
})).s("gm_tremolo_strings").gain(0.41)

// other · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@62 A B C D E F G H E F I J E F G H E F I J E F G H E F I J E F G H E F I K ~@8
>`.pickRestart({
  A: "[c5,c6] ~ [g4,g5] ~@3 [c5,c6] ~ [g4,g5] ~@3 [c5,c6] ~ [g4,g5] ~", // C G C G C G
  B: "[d5,d6] ~ [g4,g5] ~@3 [d5,d6] ~ [g4,g5] ~@3 [d5,d6] ~ [g4,g5] ~", // D G D G D G
  C: "[c5,c6] ~ [g#4,g#5] ~ [d#4,d#5] ~ [g#3,g#4] ~@3 [g#4,g#5] ~ [c5,c6] ~ [g#4,g#5] ~", // C G# D# G# C G#
  D: "[a#4,a#5] ~ [f4,f5] ~ [d4,d5] ~ [a#3,a#4] ~@9", E: "c6 ~ g5 ~@3 c6 ~ g5 ~@3 c6 ~ g5 ~",
  F: "d6 ~ g5 ~@3 d6 ~ g5 ~@3 d6 ~ g5 ~", G: "c6 ~ g#5 ~ d#5 ~ g#4 ~@3 g#5 ~ c6 ~ g#5 ~", H: "a#5 ~ f5 ~ d5 ~ a#4 ~@9",
  I: "a#5 ~ f5 ~ d5 ~ a#4 ~@3 f5 ~ a#5 ~ f5 ~", J: "f5 ~ c5 ~@3 f5 ~ c5 ~@3 f5 ~ c5 ~",
  K: "f5 ~ c5 ~@3 f5 ~ c5 ~@3 f5 ~ c5 c6",
})).s("gm_acoustic_guitar_nylon").gain(0.41)

// other · synth bass 1
const synth_bass_1 = note("<~ A ~@7 A ~@11 A ~@7 A ~@11 A ~@31 A ~@32>".pickRestart({
  A: "c6 g5 c5 c6 g5 c5 c6 g5 c5 c6 g5 c5 c6 g5 c5 c6",
})).s("gm_lead_8_bass_lead").gain(0.54)

// other · acoustic guitar nylon · G F E D G F E D
const acoustic_guitar_nylon_2 = note(`<
  ~@31
  [~@10 [g4,g5,g6] ~ [f4,f5,f6] ~ [e4,e5,e6] ~]
  [[d4,d5,d6] ~@15]
  ~@2
  [~@10 [g4,g5,g6] ~ [f4,f5,f6] ~ [e4,e5,e6] ~]
  [[d4,d5,d6] ~@15]
  ~@69
>`).s("gm_acoustic_guitar_nylon").gain(0.43)

// other · tremolo strings
const tremolo_strings_2 = note("<~@49 A ~@15 A ~@15 A ~@7 A ~@7 A ~@8>".pickRestart({
  A: "c6 g5 c5 c6 g5 c5 c6 g5 c5 c6 g5 c5 c6 g5 c5 c6",
})).s("gm_tremolo_strings").gain(0.54)

// drums · kick
const kick = s("bd").struct("<~@2 [x!2]!60 x ~@3 [x!2]!31 [x ~@7 x ~@6 x] ~@8>").gain(0.41)

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

// drums · hihat
const hihat = s("hh").struct("<~@2 A B@7 C B@27 D B@23 ~ E B@34 ~@8>".pickRestart({
  A: "x ~ x ~@3 x!3 ~ x!2 ~@2 x!2", B: "x ~ x!2 ~@2 x!3 ~ x!2 ~@2 x!2", C: "x ~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2",
  D: "x ~ x!3 ~ x!3 ~ x!2 ~@2 x!2", E: "~@14 x!2",
})).gain(0.26)

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~ x ~ x]!60 ~ [~@3 x] [~ x ~ x]!34 ~@8>").gain(0.31)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@2 A B@7 C B@27 D B@23 ~@4 B@32 ~@8>".pickRestart({
  A: "~@3 x ~@8 x ~@3", B: "~ x ~ x", C: "~@2 x!2", D: "~@3 x",
})).gain(0.26)

// drums · cowbell
const cowbell = s("cb").struct("<~@10 A B C B C B C B ~@12 C B C B C B C B ~@12 C B C B C B C B ~@48>".pickRestart({
  A: "~@10 x!2 ~@4", B: "~@2 x!2 ~@6 x ~@3 x!2", C: "~@2 x!2 ~@6 x!2 ~@2 x ~",
})).gain(0.26)

stack(
  synth_strings_2, pad_poly, music_box, timpani, electric_guitar_clean, pad_sweep, acoustic_guitar_steel, trombone,
  pizzicato_strings, pizzicato_strings_soft, timpani_2, cello, cello_soft, tremolo_strings, acoustic_guitar_nylon,
  synth_bass_1, acoustic_guitar_nylon_2, tremolo_strings_2, kick, snare, hihat, open_hat, crash, tambourine, cowbell
)

More by Erasure