Strudelify

Ever and Ever

Just Friends

KeyD♭ majorTempo138 bpm
0:00/0:00
// Ever and Ever — Just Friends
// 138 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 111 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(138/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 pick
const bass = note(`<
  ~@2 A@2 B@2 C@2 D E F G H I F G J H F G H I K H L M N O H P N O H Q R J S R@2 J H@2 F G H I F G J H F G H I K H L M N
  O H P N O H Q R J S R@2 J H@2 F G H I F G J H F G H I F G H I F G J H F G H I F G H I F G J H F G H T ~
>`.pickRestart({
  A: "db1/2", B: "[ab1@11 gb1@2 ab1@3]/2", C: "[db1@31 ~]/2", D: "gb1", E: "ab1", F: "db2!4", G: "bb1!4", H: "ab1!4",
  I: "gb1!2 ab1!2", J: "gb1!4", K: "f1!2 gb1!2", L: "db1!4", M: "db1!3 gb1", N: "b1!4", O: "b1!3 bb1", P: "ab1!3 bb1",
  Q: "ab1!3 gb1", R: "e1!4", S: "ab1!2 gb1!2", T: "gb1!2 ~@2",
})).s("gm_electric_bass_pick").gain(0.36)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@2 A@4 B@3 C D@2 E@2 F G@2 H D@2 E@2 I J@3 ~@16 D@2 E@2 F G@2 H D@2 E@2 I J@3 ~@16 D@2 E@2 F G@2 H D@2 E@2 D@2 E@2 F
  G@2 H D@2 E@2 D@2 E@2 F G@2 H D@2 K@2 ~
>`.pickRestart({
  A: "[~@15 bb2@16 ~ ab2@16 ~@6 [gb3,gb4]@3 ~ [ab2,ab3,ab4]@6, db3@8 ~@16 gb2@5 ~@3, ~@4 [db4,db5]@49 ~@11]/4", // Gb Ab Db
  B: "[db3@16 ~@8 eb5@7 ~ [gb2,gb3]@16, [db4,db5]@23 eb4@8 [f4,f5]@16 ~, ~ [bb2,bb3] ~]/3", // Gb Db F Bb
  C: "[eb4,eb5] [f4,f5] [gb4,gb5] [ab4,ab5], [ab2,ab3]", // Eb F Gb Ab
  D: "[[db3,db4,db5,db6]@15 ~ [bb3,bb4,bb5]@16, ~@15 bb2@16 ~]/2", // Db Bb
  E: "[[ab2,ab3,ab4]@2 [gb2,gb3,gb4] [ab2,ab3,ab4], [eb5,eb6]]/2", F: "[db3,db4,db5,db6]",
  G: "[[bb2,bb3,bb4,bb5]@15 ~ [gb2,gb3,gb4]@16, ~@15 [eb5,eb6]@16 ~]/2", // Bb Gb Eb
  H: "[eb5,eb6] [f5,f6] [gb5,gb6] [ab5,ab6], [ab2,ab3,ab4]", I: "[f2,f3] [gb2,gb3], [db5,db6]",
  J: "[[ab2,ab3,c5,c6]@15 ~ [db2,db3,db4]@32, ~@15 [db5,db6]@31 ~@2]/3", // Ab Db
  K: "[[ab2,ab3,ab4]@2 [gb2,gb3,gb4] ~, [eb5,eb6]@23 ~@9]/2", // Ab Gb Eb
})).s("gm_synth_strings_1").gain(0.14)

// chords · piano
const piano = note("<~@25 A B@2 C@2 D@2 E@2 F G H@2 I@2 J@2 ~@15 A B@2 C@2 D@2 E@2 F G H@2 I@2 J@2 ~@37>".pickRestart({
  A: "~@5 [ab2,f3,ab3,c4]@3", B: "[~@13 g1 ab1 a1, [db3,ab3,db4,f4]@31 ~]/2",
  C: "[~@12 bb1 ab1 bb1 eb2, bb1@19 ~@13, ~ [bb2,bb3,db4,f4]@7]/2", // Bbm
  D: "[~@13 g1 ab1 a1, db2@21 ~@11, ~@4 [db3,ab3,db4,f4]@27 ~]/2", // Db
  E: "[~@2 [bb2,bb3,db4,f4]@10 ab1 bb1 db2 bb1, bb1@10 ~@3 [ab2,ab3,db4,f4]@3]/2", F: "[gb1,gb2,bb3], [gb3,db4]@7 ~",
  G: "[ab3,c4,eb4]@7 ~, [ab1,ab2]", // Ab
  H: "[[bb1,bb2,bb3,db4,f4]@9 ~ [ab1,ab2,ab3,c4,eb4]@3 ~ [gb3,bb3,db4]@7 ~ db4@2 db4@2 bb3@5 ~, ~@7 [gb1,gb2]@8 ~, ~@22 gb3@9 ~, ~@22 bb3 ~ ab3 ~@7]/2", // Bbm Ab Gb
  I: "[[gb3,bb3,db4]@3 ~ [bb3,db4]@3 ~ [bb3,db4] ~ [gb3,bb3,db4]@3 ~@7 [c4,eb4]@3 ~ [c4,eb4] ~ [ab3,c4,eb4]@3 ~@3, [gb1,gb2] [ab1,ab2], ~@14 [ab3,c4,eb4]@5 ~ ab3@4 ~@8]/2", // Gb Bbm Gb Cm Ab Gb Ab
  J: "[~@2 [bb2,ab4,bb4,d5] ~ [bb2,ab4,bb4,d5] ~ [bb2,bb4] [ab4,bb4,d5] bb2 bb4 [bb2,ab4,bb4,d5] ~ [bb2,ab4,bb4,d5] ~ [bb2,ab4,bb4,d5] ~ [ab4,bb4] ~@2 bb2@2 [ab4,bb4,eb5] ~@2 [bb2,ab4,bb4,f5]@2 ~ [bb2,eb5] ~ [bb2,d5]@2 ~, bb1@21 bb2@2 ~@9, ~@16 bb2@2 [ab4,bb4,d5]@3 ~@6 bb4@2 ~@3]/2", // Bb7 Bb Bb7 Absus2 Bb7 Eb5 Bb Bb7
})).s("gm_piano").gain(0.3).pan(0.6)

// chords · piano · soft notes
const piano_soft = note("<~@37 A B ~ C D ~@27 A B ~ C D ~@37>".pickRestart({
  A: "~@10 db4@5 ~", B: "~@4 gb3@3 ~ gb3 ~@7", C: "~@6 [ab4,d5] ~@2 [ab4,d5] ~@6", D: "d5 ~@10 ab4@2 ab4@2 ~",
})).s("gm_piano").gain(0.17).pan(0.6)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@10 A@2 B C@4 D@3 B E@8 ~@5 F G H@8 I@5 J@3 B E@8 ~@5 F G H@8 I@5 J@3 K@4 I@5 J@3 L@8 M N@3 O P ~
>`.pickRestart({
  A: "[ab4 bb4, [f4,db5]]/2", B: "[eb4,ab4,c5]",
  C: "[[db4,gb4,bb4] [eb4,c5] ~@4 [db4,gb4]@2, ~ ab4@3 bb4@4, ~ [f4,db5]@2 ~]/4", // Gb Cm Gb5 Db
  D: "[[eb4,c5] ~ bb4, ab4@2 ~, ~ [f4,db5]@2]/3", // Cm Db
  E: "[[db4,gb4,bb4]@4 c5@4 [c4,f4]@4 [db4,gb4]@4 c4@8 [db4,f4]@13 ~@27, ~@4 ab4@33 ~@27, ~ eb4@3 eb4@12]/8", // Gb F5 Gb5 Db
  F: "[gb4,gb5]@2 [ab4,ab5] ~@3 [ab4,ab5] ~@3 [ab4,ab5]@2 ~@2 [ab4,ab5]@2", // Gb Ab
  G: "~@2 [ab4,ab5]@2 ~@2 [ab4,ab5] ~@3 [ab4,ab5] ~@3 [ab4,ab5]@2", // Ab
  H: "[~@2 [gb4,gb5]@2 [ab4,ab5]@2 [b4,b5]@2 [bb4,bb5]@2 [gb4,gb5]@2 ~@2 eb5@2 [gb4,gb5]@2 [ab4,ab5] ~@3 [ab4,ab5] ~@3 [ab4,ab5]@2 ~@2 [ab4,ab5]@2 ~@2 [ab4,ab5]@2 ~@2 [ab4,ab5] ~@3 [ab4,ab5] ~@3 [ab4,ab5]@2 ~@2 [ab4,ab5]@2 ~@2 [ab4,ab5] ~@3 [ab4,ab5] ~@3 [ab4,ab5]@32 ~@2 ab4@16 bb4@16, ~@7 eb4@57, ~@3 [f4,db5]]/8", // Gb Ab B Bb Gb Ab Db
  I: "[[ab4,c5]@2 [db4,gb4,bb4] c5 ~@4 [db4,gb4]@2, eb4@3 eb4@7, ~@3 ab4@3 bb4@4, ~@2 [f4,db5]@2 ~]/5", // Ab Gb Gb5 Db
  J: "[c5 ~ bb4, eb4, ab4@2 ~, ~ [f4,db5]@2]/3", // Db
  K: "[[ab4,c5]@2 [db4,gb4,bb4] c5 ~@2 bb4@2, eb4@3 eb4@5, ~@3 ab4@3 ~@2, ~ [f4,db5]]/4", // Ab Gb Db
  L: "[[ab4,c5]@2 [db4,gb4,bb4] c5 ~@2 bb4@2 [ab4,c5]@2 [db4,gb4,bb4] c5 ~@2 bb4@2, eb4, ~@3 ab4@3 ~@5 ab4@3 ~@2, ~ [f4,db5] ~ [f4,db5]]/8", // Ab Gb Ab Gb Db
  M: "[db4,gb4]", N: "[c5 ~ bb4, ab4@2 ~, ~ [f4,db5]@2]/3", O: "[ab4,c5]", P: "[db4,gb4,bb4] ~",
})).s("gm_string_ensemble_1").gain(0.14).pan(0.4)

// other · clavinet
const clavinet = note(`<
  ~@10 A B C D A B E C A B C D A C A@2 ~@16 A B C D A B E C A B C D A C A@2 ~@16 A B C D A B E C A B C D A B C D A B E C
  A B C D A B C D A B E C A B C F ~
>`.pickRestart({
  A: "db3@2 ~ db3 ab3 ~ db3 db4 ~ db3 ab3 ~ bb3 ~ db4 ~", B: "bb2@2 ~ bb2 f3 ~ bb2 bb3 ~ bb2 f3 ~ ab3 ~ bb3 ~",
  C: "ab2@2 ~ ab2 eb3 ~ ab2 ab3 ~ ab2 eb3 ~ f3 ~ ab3 ~", D: "gb2@2 ~ gb2 db3 ~ gb2 ab3 ~ gb2 db3 ~ f3 ~ ab3 ~",
  E: "gb2@2 ~ gb2 db3 ~ gb2 gb3 ~ gb2 db3 ~ eb3 ~ gb3 ~", F: "gb2@2 ~ gb2 db3 ~ gb2 ~@9",
})).s("gm_clavinet").gain(0.3).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@6 [x!4]!101 ~@4>").gain(0.63)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@10 [~@7 x ~@8]!97 ~@4>").gain(0.32)

// drums · snare
const snare = s("sd").struct("<~@9 A B@13 C B@17 C B@13 C B@17 D B@19 D B@12 E ~@4>".pickRestart({
  A: "~@11 x!5", B: "~ x ~ x", C: "~@4 x ~@6 x!5", D: "~@2 x ~ x ~ x!2 ~@3 x!5", E: "~@2 x ~ x ~ x!2 ~@3 x!2 ~@3",
})).gain(0.32)

// drums · clap
const clap = s("cp").struct("<[x!4 ~ x!7 ~ x!3]!10 ~@101>").gain(0.19)

// drums · hihat
const hihat = s("hh").struct("<[x!2 ~ x!3 ~ x!3 ~ x!3 ~ x]!106 [x!2 ~ x!3 ~ x!3 ~ x!2 ~@3] ~@4>").gain(0.19)

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

// drums · china
const china = s("cr").struct(`<
  ~@10 A ~@3 B ~@9 B ~@17 B ~@3 B ~@9 B ~@17 B ~@3 B ~@10 C ~@4 A ~@3 B ~@3 B ~@8
>`.pickRestart({
  A: "~ x ~@2", B: "x", C: "~ x",
})).gain(0.38)

// drums · tambourine
const tambourine = s("tb").struct("<[x!8]!10 [x!16]!96 [x!12 ~@4] ~@4>").gain(0.19)

stack(
  bass, synth_strings_1, piano, piano_soft, string_ensemble_1, clavinet, kick, kick_soft, snare, clap, hihat, open_hat,
  china, tambourine
)