Strudelify

Life

Des'ree

KeyD♭ majorTempo104 bpm
0:00/0:00
// Life — Des'ree
// 104 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 5 choir aahs (copy of ch 16 piano)
// 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(104/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 · electric bass finger
const bass = note(`<
  ~@8 A B C D E F C D G H I J K H I J K B C D E F C D G H I J K H I J K L M H I J K H I J K N O P Q N R S T H I J K H I
  J K H I J K H I J K H I J K H I J K U ~@4
>`.pickRestart({
  A: "~@9 gb2 gb3@2 db4 ab1@3", B: "db2@3 ab1@3 ~ f1 f1@7 ~", C: "ab1@6 ~ ab1 ab1@4 f1@4", D: "bb1@3 ab1@3 ~ f1@7 ~ f1",
  E: "gb1@6 ~ gb1 gb1@4 ab1@3 ~", F: "db2@3 ab1@3 ~ f1 f1@8", G: "gb1@6 ~ db2 gb2@2 f2 eb2 ~ db2@3",
  H: "db2@3 ab1@3 ~ f1 f1@4 ~ f1 bb1 ~", I: "ab1@6 ~ ab1 eb2@2 ~ eb2 ab1@3 f1", J: "bb1@3 ab1@3 ~ f1@5 ~ f1 ab1 ~",
  K: "gb1@6 ~ db2 gb2!2 db2@2 gb1@4", L: "a1@3 db2@3 e2@2 ab2@3 e2@3 db2@2", M: "b1@4 ~ b1 eb2 b1 gb2@2 eb2@2 b1@3 ~",
  N: "db2@12 ~ db2 eb2@2", O: "ab1@15 f1", P: "bb1@13 ~ bb1 f1", Q: "gb1@11 db2 gb2@3 ab1", R: "ab1@13 ~ ab1 f1",
  S: "bb1@15 f1", T: "gb1 ~ gb1 ~ gb1@2 ~ gb1 gb2@2 f2 eb2 ~ db2@3", U: "db2",
})).s("gm_electric_bass_finger").gain(0.5)

// chords · piano
const piano = note("<~@17 A@4 B@4 ~@8 A@4 B@4 ~@18 A@4 B@4 A@4 B@4 ~@5 C@3 ~@5>".pickRestart({
  A: "[~@4 [ab3,db4]@2 ~@7 [ab3,db4] ~ [ab3,c4]@3 ab3 ~@5 eb4@3 ~ eb4@2 ~ f4@2 eb4 db4@2 ~@8 [f3,bb3,eb4]@2 ~ [gb3,bb3,db4]@3 gb3 ~@13, ~@24 c4@6 ~ bb3@5 ~@28]/4", // Db5 Ab Ebsus2 Gb
  B: "[~@4 [ab3,db4]@2 ~@7 [ab3,db4] ~ [ab3,c4]@3 ab3 ~@5 eb4@3 ~ eb4@2 ~ bb3@3 [eb4,gb4] [db4,ab4]@2 eb4@2 db4@2 ~@3 [f3,bb3,eb4]@2 ~ [gb3,bb3,db4]@3 gb3 ~@13, ~@24 c4@6 ~ f4@2 ~@4 bb3@4 ~@23]/4", // Db5 Ab Ebm Db5 Ebsus2 Gb
  C: "[~@8 eb4@3 ~ eb4@2 ~ bb3@3 [eb4,gb4] [db4,ab4]@2 eb4@2 db4@2 ~@3 [f3,bb3,eb4]@2 ~ [gb3,bb3,db4]@3 gb3 ~@13, ~@8 c4@6 ~ f4@2 ~@4 bb3@4 ~@23]/3", // Ebm Db5 Ebsus2 Gb
})).s("gm_piano").gain(0.05)

// chords · piano
const piano_2 = note(`<
  ~@9 A B C D E B C F G H C@2 G H C@2 A B C D E B C F G H C@2 G H C@2 I J K L@2 M N O@2 P A B C D E B C F G H C@2 G H
  C@2 G H C@2 G H C@2 K L@2 M N O@2 P ~@5
>`.pickRestart({
  A: "[ab3,db4,f4]@7 ~", B: "[ab3,c4,eb4]@15 ~", C: "[bb3,db4,f4]@15 ~", D: "[gb3,bb3,db4]@15 ~",
  E: "[ab3,db4,f4]@15 ~", F: "[bb3,db4,gb4]", G: "[ab3,db4,f4] ~ ab3 [ab3,db4,f4] ~ [ab3,c4,f4] ~ [ab3,db4,f4]@8 ab3",
  H: "[ab3,c4,eb4]@14 ~ c4", I: "[a3,db4,e4]@7 ~ [ab3,b3,e4]@7 ~", J: "[b3,eb4,gb4]@11 ~ [b3,eb4,gb4]@4",
  K: "db3@6 ab3 ~ eb4 f4 ~ [ab3,eb4]@2 ~ [ab3,db4]@2, ~@8 db3@4 ~ db3@2 ~, ~@4 ab3 ~@3", // Ab5 Db5
  L: "[[ab2,ab3,eb4]@6 ~@2 c4 db4 ~ c4@2 ~@3 [bb2,f3,db4]@6 bb2@2 [f3,ab3,db4]@2 ~ [f3,ab3,eb4]@2 bb2 [f3,ab3] ~, ~@6 ab2@6 ~ ab2@2 ~@11 bb2@2 ~@4, ~@8 [eb3,ab3]@2 ~ eb3@3 ab3@9 ~@7 db4@2]/2", // Ab5 Bbm Db Fm7 Fm Ab5
  M: "[bb3,db4]@2 ~ [bb3,db4] ab4 gb4 ~ [bb3,db4,gb4] ~ [bb3,db4,f4] ~ [bb3,db4] ~ [bb3,db4]@3, [gb2,gb3]@7 ~ gb2@7 ~, ~@4 [bb3,db4]@2 ~@2 gb3@3 f4@5, ~@6 gb3 ~", // Bbm Gb Bbm Gb Bbm
  N: "db3@6 ab3 ~ f4 gb4 ~ [ab3,f4]@2 [db3,ab3,db4]@2 ~, ~@2 db3 ~, ~@4 ab3 ~@3", // Db Db5
  O: "[[ab2,ab3,eb4]@6 ~@2 c4 db4 ~ c4@2 ~@3 [db4,f4] ~ db4 [db4,f4,db5] ~ [db4,f4,c5] ~ [db4,f4,c5] ~ [db4,f4,bb4] ~ [f4,bb4]@2 bb3 db4@2, ~@6 ab2@6 ~ ab2@2 ~ bb2@15 ~, ~@8 [eb3,ab3]@2 ~ eb3@3 ab3@9 ~@4 db4 ~@4, ~@16 bb3@7 ~ bb3@4 ~@4, ~@8 db5 ~@7]/2", // Ab5 Db Dbmaj7 Bbm Bb5 Ab5
  P: "gb4@2 db4 [db4,gb4,db5] ~ [db4,gb4,c5] ~ [db4,gb4,c5] ~ [db4,gb4,bb4] ~ [gb4,bb4]@2 gb3 [db4,gb4] ~, [gb2,gb3]@7 ~ gb2@7 ~, db5 ~@7 gb3@3 db4 ~@4", // Gb5 Gb Gb5 Gb
})).s("gm_piano").gain(0.38)

// chords · glockenspiel
const glockenspiel = note("<~@8 A@2 ~@48 A@2 ~@28>".pickRestart({
  A: "[~@6 [e6,f6,g6] [a6,b6,c7,d7] [e7,f7,g7,a7] c8 [e7,f7,g7,a7] [b6,c7,d7] ~ [b6,c7] e7 a7 a7 g6 [a6,b6] [f7,a7] a6@3 c7 ~@8, ~@9 b7@2 a6@4 ~@17, ~@6 g6 [f7,g7]@2 ~@7, ~@13 e6@3 ~@2 e6@4 ~@10]/2", // Em D7 Fmaj7 Bm Cmaj7 Asus2 F Fsus2
})).s("gm_glockenspiel").gain(0.09).pan(0.7)

// chords · glockenspiel · soft notes · G7 Em G7 Em
const glockenspiel_soft = note(`<
  ~@8
  [~@14 d7 ~]
  [e7 ~ e7 g7 [f6,g6,d7] b6@2 ~ [e7,f7,g7] ~ b6 ~@5, ~@7 d6@3 ~@6]
  ~@48
  [~@14 d7 ~]
  [e7 ~ e7 g7 [f6,g6,d7] b6@2 ~ [e7,f7,g7] ~ b6 ~@5, ~@7 d6@3 ~@6]
  ~@28
>`).s("gm_glockenspiel").gain(0.04).pan(0.7)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<~@51 A B C D E F G H ~@29>".pickRestart({
  A: "~@6 db4@9 ~, f4@7 ~, ~@3 ab3@11 ~@2", B: "c4@15 ~, eb4@13 ~@3", C: "[bb3,db4]@15 ~, f4@13 ~@3",
  D: "~@3 [bb3,db4] ~ [bb3,db4] ~ bb3@3 bb3@2 ~@2 bb3@2, ~@2 gb3@4 ~ [gb3,db4]@7 ~@2", // Bbm Gb5
  E: "[ab3,db4,f4]@10 ~@3 f4@2 ~, ~@5 ab3@2 ~, ~@11 db4@4 ~", F: "[c4,eb4]@7 ab4@2 ~ c4@5 ~, ~@9 eb4@5 ~@2",
  G: "[bb3,db4,f4]@10 ~ [bb3,f4] ~ [bb3,db4,f4] ~@2", // Bbm Bb5 Bbm
  H: "[bb3,db4]@4 ~ [bb3,db4]@2 gb3 [gb3,bb3,db4] ~ gb3 [gb3,bb3,db4] ~ [gb3,eb4]@2 ~, gb3@5 ~@11", // Bbm Gb Ebm
})).s("gm_acoustic_guitar_steel").gain(0.19).pan(0.6)

// chords · acoustic guitar steel · soft notes
const acoustic_guitar_steel_2 = note("<~@51 A@2 ~ B ~ C D E ~@29>".pickRestart({
  A: "[~@15 ab3@15 ~@2]/2", B: "[gb3,bb3,db4] ~@7", C: "ab3@5 ~@3", D: "~@11 db4 ~@4", E: "~@4 bb3 ~@8 bb3@2 ~",
})).s("gm_acoustic_guitar_steel").gain(0.13).pan(0.6)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A ~@3 B C D E F G H ~@2 I H ~@3 J@2 K ~ L@3 I H ~@2 I H ~@3 J@2 K ~ J@2 K ~ M N@4 O P Q R I H ~@2 I H ~@3 J@2 K ~ J@2
  K ~ J@2 K ~ J@2 K I S@2 K ~ J@2 K ~@5
>`.pickRestart({
  A: "~@14 eb5 ~", B: "~@8 gb5 ~@2 eb5 ~ db5@3", C: "db5", D: "c5@7 bb5 ~ ab5 f5 eb5 ab5 f5 eb5 db5",
  E: "f5 eb5 db5 bb4 eb5 db5 bb4 ab4 bb4@4 ~ bb4 ab4 f4", F: "bb4@5 bb5 ab5 bb5 db6 ~@3 eb6 ~@3",
  G: "[db4,db5,db6] ~@3 [ab3,ab4] ~@2 [gb3,gb4] [f3,f4] ~@6 [f3,f4]", H: "[eb3,eb4] ~@15",
  I: "[db4,db5] ~@3 [ab3,ab4] ~@2 [gb3,gb4] [f3,f4] ~@6 [f3,f4]", // Db Ab Gb F
  J: "[~@6 [ab3,ab4] ~ [bb3,bb4] [db4,db5] ~ [db4,db5] ~@2 [bb3,bb4]@5 ~@13]/2", // Ab Bb Db Bb
  K: "~@6 [ab3,ab4] ~ [bb3,bb4] [db4,db5] ~ [db4,db5] ~ [bb3,bb4] [db4,db5]@2", // Ab Bb Db Bb Db
  L: "[~@6 [ab3,ab4] ~ [bb3,bb4] [db4,db5] ~ [db4,db5] ~@2 bb3@4 ~@22 db5@8, ~@13 bb4@26 ~@9]/3", M: "b5 gb6",
  N: "[ab6@23 ~ eb6@2 ~@2 eb6@3 db6@12 ~ f6@3 gb6@16 ~]/4", O: "f6", P: "eb6", Q: "db6@11 ~ f6@4", R: "gb6@7 ~",
  S: "[[eb3,eb4] ~@5 [ab3,ab4] ~ [bb3,bb4] [db4,db5] ~ [db4,db5] ~@2 [bb3,bb4]@5 ~@13]/2", // Eb Ab Bb Db Bb
})).s("gm_string_ensemble_1").gain(0.46).pan(0.4)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<A B C D@2 ~@78 E F G@3>".pickRestart({
  A: "~@13 ab4 db5 ~", B: "[db5,f5]", C: "[c5,eb5]@15 ~", D: "[db5@12 eb5@4 db5@8 ~@2 f5 ~@5, bb4@3 ~]/2",
  E: "f5, db5 ~@15", F: "[c5,eb5]", G: "[db5@3 eb5 db5@8, bb4]/3",
})).s("gm_string_ensemble_1").gain(0.29).pan(0.4)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~ A B C D A B C E ~@7 F G H I@2 J H I@2 ~@7 F G H I@2 J H I@2 K L M@2 N@2 M@2 N@2 ~@7 F G H I@2 J H I@2 G H I@2 J H
  I@2 G H I@2 J H I@2 O P Q R@2
>`.pickRestart({
  A: "[ab3,f4]@15 ~", B: "[ab3,eb4]@15 ~", C: "[bb3,f4]@15 ~", D: "[bb3,gb4]@15 ~", E: "~ db5, [bb3,gb4]@15 ~",
  F: "~@8 [gb4,gb5]@2 [f4,f5] [eb4,eb5] ~ [db4,db5] ~@2", G: "[ab3,ab4]", H: "eb4@15 ~", I: "f4/2", J: "ab3",
  K: "a4 ab4, db5", L: "[gb4,b4]", M: "[[db4,f4]@15 ~ c4@16, ab3@31 ~, ~@8 eb4@7 ~]/2", N: "[f4 gb4, [bb3,db4]]/2",
  O: "[ab3,f4]", P: "[ab3,eb4]", Q: "[bb3,f4]", R: "[bb3,gb4]/2",
})).s("gm_string_ensemble_1").gain(0.22).pan(0.6)

// other · rock organ
const rock_organ = note("<~@26 A B ~@2 A B ~@20 A B ~@2 A B ~@30>".pickRestart({
  A: "~@12 [ab5,ab6] ~ [c6,c7] ~", B: "[bb5,bb6]@3 [f5,f6] ~@12",
})).s("gm_rock_organ").gain(0.18)

// chords · pad warm
const pad_warm = note(`<
  ~ A@2 B@2 A@2 B@2 ~@8 A@2 B@2 A@2 B@2 ~@8 A@2 B@2 A@2 B@2 C D A@2 B@2 A@2 B@2 ~@8 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2
  B@2 A@2 B@2 E@2 F@3
>`.pickRestart({
  A: "[[db4,f4] [c4,eb4], ab3]/2", B: "[~ gb3, [bb3,db4,f4]]/2", C: "[a3,db4] [ab3,b3], e4", D: "[b3,eb4,gb4]",
  E: "[[db2,db4,f4] [ab1,c4,eb4], ab3]/2", F: "[bb1@15 ~ [gb1,gb2,gb3]@32, [bb3,db4,f4]]/3",
})).s("gm_pad_warm").gain(0.03).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@8 A B@7 C B@15 C B@25 D B@24 ~@5>".pickRestart({
  A: "~@8 x ~@4 x ~@2", B: "x!2", C: "x ~@7 x ~@4 x ~@2", D: "x ~@7 x ~@2 x ~ x ~@2",
})).gain(0.8)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@9 A@3 B A@7 B A@3 B A@3 B A@7 B A@3 B A@5 B A@3 B A@11 B A@3 B A@3 B A@3 B A@3 B A@3 B ~@5
>`.pickRestart({
  A: "~@7 x ~@8", B: "~@7 x ~@3 x ~@4",
})).gain(0.24)

// drums · clap
const clap = s("cp").struct("<~@17 [~ x ~ x]!8 ~@8 [~ x ~ x]!18 ~@8 [~ x ~ x]!24 ~@5>").gain(0.56)

// drums · snare
const snare = s("sd").struct("<~@8 [~@11 x!2 ~@3] [~ x ~ x]!42 ~@6 [~ x ~ x] [~ x!2 ~@3 x ~] [~ x ~ x]!24 ~@5>")
  .gain(0.8)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@16 [~@11 x ~@4] ~@15 [~@11 x ~@4] ~@18 [~ x ~ x]!6 ~@31>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@9 A@4 B A@2 C A@7 D A@4 B A E C A@3 D A@3 D A@5 D A@3 D A@4 B A F G A@3 D A@3 D A@3 D A@3 D A@3 D A@3 D ~@5
>`.pickRestart({
  A: "x!8", B: "~ x!7", C: "x!4 ~@4", D: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", E: "x ~ x!3 ~ x!2",
  F: "~@2 x ~ x ~ x ~ x ~ x ~ x ~ x!2", G: "x ~@3 x!4",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@20 A ~@15 A ~@9 A ~@15 A ~@7 A ~@7 A ~@9>".pickRestart({
  A: "~@3 x",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@13 A ~@2 B ~@7 C ~@4 A ~ D B ~@3 C ~@3 C ~@5 C ~@3 C ~@4 A ~ A ~@4 C ~@3 C ~@3 C ~@3 C ~@3 C ~@3 C ~@5
>`.pickRestart({
  A: "x", B: "~@4 x!2 ~@2", C: "~@15 x", D: "~ x ~@3 x ~@2",
})).gain(0.64)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@17 [x!16]!8 ~@7 x [x!16]!18 ~@8 [x!16]!24 ~@5>").gain(0.24)

// drums · bongos
const bongos = s("bongo:4").struct("<~@17 [~ x!3]!8 ~@8 [~ x!3]!18 ~@8 [~ x!3]!24 ~@5>").gain(0.84)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@17 [~@3 x ~@3 x]!8 ~@8 [~@3 x ~@3 x]!18 ~@8 [~@3 x ~@3 x]!24 ~@5>").gain(0.84)

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

// drums · congas · soft notes
const congas_soft = s("conga:13").struct("<~@9 A@42 B A B A B A B A@25 ~@5>".pickRestart({
  A: "~@9 x ~@6", B: "~@9 x ~@5 x",
})).gain(1.02)

// drums · congas
const congas_2 = s("conga:18").struct("<~@9 A@42 B A B A B A B A@25 ~@5>".pickRestart({
  A: "x ~@2 x ~@12", B: "x",
})).gain(1.54)

// drums · congas · soft notes
const congas_soft_2 = s("conga:18").struct("<~@51 A ~ A ~ A ~ A ~@30>".pickRestart({
  A: "~@3 x ~@12",
// … 47 more lines

More by Des'ree