Strudelify

Best of You

Kenny Thomas

KeyG♯ minorTempo100 bpm
0:00/0:00
// Best of You — Kenny Thomas
// 100 bpm, 4/4, key G# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 103 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · piano
const piano = note(`<
  A B C D ~@11 E F ~@2 E F E F E G E F H ~@11 E F ~@2 E F E F E G E F H ~@16 F E F E G E F H F E F E G E F H F E F E G E
  F H F E F E G E F H ~@3
>`.pickRestart({
  A: "[e3,g#3,c#4]", B: "[d#3,g#3,b3]", C: "c#4@5 c#4@2 e4, [e3,g#3,b3]",
  D: "[g#3,b3,d#4,f#4]@2 [g#3,b3,d#4,f#4] [g#3,b3,d#4,f#4]@2 [g#3,b3,d#4,f#4] ~@18", E: "~@2 [b4,b5] [a4,a5]",
  F: "[g#4,g#5]", G: "[g#4,g#5]@3 ~", H: "[b4,b5]@4 ~ [b4,b5] ~@18",
})).s("gm_piano").gain(0.4).pan(0.3)

// bass · electric bass finger
const bass = note(`<
  ~@3 A B C D E F G H I J E K E K E K L M E N O P O P Q B C D E F G H I J E K E K E K R M E N O P O P Q B C D E F G H I
  S T S U V W X Y ~@6 J Z B C D E F G H I B C D E F G H I B C D E F G H AA AB@3
>`.pickRestart({
  A: "g#1 ~", B: "e1@5 ~ e1@3 c#1@3 e1@2 ~@3 f#1 e1@3 f#1@3", C: "g#1@2 ~@2 g#1 c#1 e1 f#1",
  D: "e1@5 ~ e1@3 ~@2 f#1 e1@3 ~@2 e1 e1@3 f#1@3", E: "g#1@9 ~@2 g#1 c#1@3 d#1@3 e1@3 f#1@3",
  F: "e1@4 ~@2 e1@3 c#1@3 e1@3 ~@2 c#1 e1@3 f#1@3", G: "g#1@11 ~ g#1@3 c#1@3 e1@3 f#1@3",
  H: "e1@5 ~ e1@3 f#1@3 e1@4 ~ e1 e1@3 f#1@3", I: "g#1@4 ~ a#0 b0@3 c1@3 c#1@10 ~@2",
  J: "e1@4 ~@2 e1@3 c#1@3 e1@3 ~@2 e1 e1@3 f#1@3", K: "e1@5 ~ e1@3 c#1@3 e1@4 ~ e1 e1@3 f#1@3",
  L: "g#1@3 ~@2 a#1 b1@3 c2@3 c#2@6 ~@6", M: "e1@3 ~@2 e1 e1@3 c#1@3 e1@3 ~@2 e1 e1@3 f#1@3",
  N: "e1@4 ~ e1 e1@3 c#1@3 e1@3 ~@2 e1 e1@3 f#1@3", O: "g#1@10 ~ g#1 c#1@3 d#1@3 e1@3 f#1@3",
  P: "e1@4 ~ e1 e1@3 c#1@3 e1@4 ~ e1 e1@3 f#1@3", Q: "g#1@7 ~@17", R: "g#1@3 ~@2 a#0 b0@3 c1@3 c#1@6 ~@6",
  S: "a1@5 ~ a1@3 g1@3 a1@4 ~ a1 a1@3 a#1@3", T: "b1@11 ~ b1@3 e1@3 f#1@3 g1@3", U: "b1@11 ~ d1@3 e1@3 g1@3 b1@3",
  V: "a1@4 ~ a1 a1@3 g1@3 a1@4 ~ a1 a1@3 a#1@3", W: "b1@10 ~ b1 d1@3 e1@3 g1@3 b1@3",
  X: "a1@5 a1 a1@3 g1@3 a1@5 ~ a1@3 a#1@3", Y: "b1 ~@2 e1", Z: "g#1 ~@3", AA: "g#1@4 ~ a#0 b0@3 c1@3 c#1@11 ~",
  AB: "[~ e1@59 ~@12]/3",
})).s("gm_electric_bass_finger").gain(0.38)

// chords · epiano2
const epiano2 = note(`<
  ~@4 A B A C D E F G H I H I H I H I H I H I H I H J A B A C D E F G H I H I H I H I H I H I H I H K A B A C D E F L M
  N M N M N M N H I H I H I H J H I H I H I H J H I H I H I H J H I H I H I H J O@3
>`.pickRestart({
  A: "[e3,g#3,c#4]@3 [g#3,c#4,e4]", B: "[f#3,b3,d#4]@3 [f#3,b3,d#4]", C: "[f#3,b3,d#4]@2 [g#3,b3,e4] [f#3,a3,e4]",
  D: "[e3,g#3,c#4]@17 ~ [g#3,c#4,e4]@3 g#4@3", E: "[b3,d#4,f#4]@2 [b3,d#4,f#4] [a3,d#4,f#4]",
  F: "[g#3,c#4,e4]@3 [g#3,c#4,e4]", G: "[f#3,b3,d#4]@12 ~@2 [b3,d#4,f#4]@3 ~ [b3,d#4,f#4]@6",
  H: "[g#4,c#5,e5]@3 [e4,g#4,c#5]@2 ~@3 [e4,g#4,c#5]@2 ~@2 [e4,g#4,c#5]@6 [g#4,c#5,e5]@3 [e4,g#4,c#5]@3", // C#m
  I: "[b4,d#5,f#5]@3 [g#4,b4,d#5]@2 ~@3 [g#4,b4,d#5]@2 ~@4 [g#4,b4,d#5]@2 ~@2 [b4,d#5,f#5]@3 [g#4,b4,d#5]@2 ~", // B G#m B G#m
  J: "[b4,d#5,f#5]@5 [b4,d#5,f#5]@2 ~@17", K: "[b4,d#5,f#5]@3 [b4,d#5,f#5]@2 ~@19", L: "[f#3,b3,d#4] ~",
  M: "[e4,g4,b4]", N: "[d4,f#4,a4]", O: "[~ [g#3,c#4,e4]@60 ~@11]/3",
})).s("gm_epiano2").gain(0.3).pan(0.7)

// chords · pad sweep
const pad_sweep = note(`<
  ~@20 A@6 B C ~@16 A@6 B D ~@8 E F E G H I H J A@6 B C A@6 B C A@6 B C A@6 B C K@3
>`.pickRestart({
  A: "[[e3,g#3] [d#3,f#3], b3]/2", B: "[e3,g#3,b3]", C: "[d#3,f#3,b3]@3 f#3 ~ [d#3,f#3,b3] ~@18", D: "[d#3,f#3,b3] ~@7",
  E: "[e4,g4,b4]", F: "[d4,f#4,a4]@2 [f#4,a4,d5] [f#4,a4,c5]",
  G: "[d4,f#4,a4]@12 [f#4,a4,d5]@3 [f#4,a4,c5]@3 [f#4,a4,b4] a4 g4 e4 ~@2", H: "[e4,g4,b4]@3 [g4,b4,e5]",
  I: "[f#4,a4,d5]@3 [f#4,a4,c5]", J: "[f#4,a4,d5]@7 ~", K: "[~ [e3,g#3,b3]@59 ~@12]/3",
})).s("gm_pad_sweep").gain(0.3)

// other · percussive organ
const percussive_organ = note("<~@60 A B A B A C D E F ~@34>".pickRestart({
  A: "~@3 e4 ~@2 e4 ~ g4 ~@2 [e4,a4] b4@12", B: "~@3 e4 ~@2 e4 ~ g4 ~@2 e4 d5@2 ~ c5@2 ~ b4 a4 g4 e4 ~@2",
  C: "~@3 e4 ~@2 e4 ~ g4 ~@2 e4 b4@2 ~ c5@2 ~ b4 a4 g4 e4 ~@2",
  D: "~@3 e4 ~@2 e4 ~ g4 ~@2 e4 b4@2 ~ d5@2 d5 e5@4 ~ [e5,f5], ~@12 a4 ~@11", // Fmaj7
  E: "d5@11 ~ e5 d5 c5 b4 a4 g4 e4 d4 c4 b3 a3 g3", F: "g#3 ~",
})).s("gm_percussive_organ").gain(0.5)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A@2 B@2 A@2 C D A@2 E@2 ~@8 F@2 G@4 H@2 ~@16 F@2 G@4 H@2 A@2 C D A@2 E@2 ~@16 A@2 C D A@2 E@2 A@2 C D A@2 E@2 A@2 C D
  A@2 E@2 I@3
>`.pickRestart({
  A: "[g#5@7 c#6]/2", B: "[b5@11 ~@5]/2", C: "b5", D: "c#5 d#5 e5 f#5", E: "[b5@11 c#6@5]/2",
  F: "[g#4@30 b3@7 ~@5 f#4@6]/2", G: "[g#4@15 b3@2 ~@4 f#4@3]/2", H: "[g#4@5 ~@3]/2", I: "[~ g#5@58 ~@13]/3",
})).s("gm_string_ensemble_1").gain(0.25).pan(0.3)

// other · pan flute
const pan_flute = note(`<
  ~@4 A B A B C D A E ~@16 A B A B C D A E ~@16 A B A B C D A E F G F H I J I K ~@8 A B A B C D A E A B A B C D A E A B
  A B C D A L ~@3
>`.pickRestart({
  A: "~@3 b5 ~ c#6 b5 ~@2 g#5 ~@2 b5 ~ c#6 b5@3 e5@3 g#5@3", B: "f#5 ~",
  C: "~@3 b5 ~ c#6 b5 ~@2 g#5 ~@2 b5 ~ c#6 b5@3 g#5@3 c#6@3", D: "b5 ~", E: "f#5@7 ~", F: "b5", G: "a5@6 d6@3 c6@2 ~",
  H: "a5@2 d6 c6", I: "b5@3 e6", J: "d6@3 c6", K: "d6@5 ~@3", L: "f#5@11 ~",
})).s("gm_pan_flute").gain(0.4).pan(1)

// other · piccolo
const piccolo = note(`<
  ~@3 A B@2 C D E F G H ~@8 I@4 J K L A B@2 C D E F G H ~@8 I@4 J K L M B@2 C D E F G H ~@8 L N L N J O L P B@2 C D E F
  G H B@2 C D E F G H B@2 C D E F G H Q@3
>`.pickRestart({
  A: "b5@2 b5 b5@2 b5 ~@18", B: "[g#4@17 ~ b4@3 a4@3]/2", C: "g#4@6 e4 g#4", D: "f#4@2 b4 a4", E: "g#4@7 c#5",
  F: "b4@2 b4 a4", G: "g#4", H: "b4@3 c#5@5", I: "[g#5@5 b4 b5 a5]/2", J: "g#5@16 ~ [a5,b5] c#6@6", K: "b5@3 a5",
  L: "g#5", M: "b5@5 ~@19", N: "f#5@2 b5 a5", O: "b5@2 b5 a5", P: "b5 ~", Q: "[~ g#4@59 ~@12]/3",
})).s("gm_piccolo").gain(0.25).pan(0)

// other · pad new age
const pad_new_age = note("<~@20 A B A B C D A E ~@16 A B A B C D A F ~@16 A B A B C G A H ~@24 I@3>".pickRestart({
  A: "g#5", B: "f#5@2 b5 a5", C: "g#5@3 c#6", D: "b5@3 a5", E: "b5@4 ~ b5 ~@18", F: "b5 ~@5", G: "b5@5 ~ b5@3 a5@3",
  H: "b5@19 ~@5", I: "[~ e6@56 ~@15]/3",
})).s("gm_pad_new_age").gain(0.3)

// other · lead 8 bass lead
const lead_8_bass_lead = note(`<
  ~@3 A B C B C B C B D ~@15 A B C B C B C B D ~@39 A B C B C B C B E B C B C B C B F B C B C B C B G ~@3
>`.pickRestart({
  A: "~@12 a4 ~@2 g#4 ~@2 g#4 ~@2 f#4 ~@2", B: "e4", C: "d#4@10 ~@2 a4 ~@2 g#4 ~@2 g#4 ~@2 f#4 ~@2", D: "d#4@3 ~",
  E: "d#4@11 ~ a4 ~@2 g#4 ~@2 g#4 ~@2 f#4 ~@2", F: "d#4@12 a4 ~@2 g#4 ~@2 g#4 ~@2 f#4 ~@2",
  G: "d#4@12 a4 ~@3 g#4 ~@2 g#4 ~@2 f#4 ~",
})).s("gm_lead_8_bass_lead").gain(0.4).pan(0.7)

// other · trumpet
const trumpet = note("<~@60 [~@3 e5 ~@20] ~ [~@3 e5 ~@20] ~ [~@3 e5 ~@20]!3 ~@36>").s("gm_trumpet").gain(0.45)

// drums · kick
const kick = s("bd").struct("<A@3 B A@23 B A@23 B A@15 B A@7 B A@23 C D ~@2>".pickRestart({
  A: "x!4", B: "x", C: "x ~@5 x ~@5 x ~@6 x ~@4", D: "~ x ~@22",
})).gain(0.5)

// drums · clap
const clap = s("cp").struct("<A@3 ~ A@23 ~ A@23 ~ A@15 ~ A@31 B ~@3>".pickRestart({
  A: "~ x ~ x", B: "~@6 x ~@12 x ~@4",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  [x ~@5 x ~@2 x ~ x!2 ~ x!2 ~@2 x ~@2 x ~ x]!99
  [x ~@5 x ~@2 x ~ x!2 ~ x ~ x ~@2 x ~@2 x ~]
  [x!2 ~@22]
  ~@2
>`).gain(0.25)

// drums · hihat
const hihat = s("hh").struct(`<
  [x ~@2 x ~@2 x ~ x!2 ~@2 x ~@5 x ~@2 x ~@2]!99
  [x ~@2 x ~@2 x ~ x!2 ~@2 x ~@6 x ~@2 x ~]
  ~@3
>`).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct("<[~@3 x ~@3 x]!99 [~@9 x ~@12 x ~] ~@3>").gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<[~@5 x ~@2]!99 [~@2 x] ~@3>").gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@7 A ~@7 B ~@2
>`.pickRestart({
  A: "x", B: "~ x ~@22",
})).gain(0.5)

// drums · high tom
const high_tom = s("ht").struct("<[~@2 x ~@2 x]!99 [~@8 x ~@12 x ~@2] ~@3>").gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<x!100 [~ x ~@22] ~@2>").gain(0.25)

// drums · shaker
const shaker = s("sh").struct(`<
  [x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x]!99
  [x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x ~ x ~ x!2 ~ x!2 ~]
  [x!2 ~@22]
  ~@2
>`).gain(0.25)

// drums · triangle
const triangle = s("triangles:35").struct("<A@3 B A@23 B A@23 B A@15 B A@7 B A@23 C D ~@2>".pickRestart({
  A: "x!4", B: "x", C: "x ~@5 x ~@5 x ~@6 x ~@4", D: "~ x ~@22",
})).gain(2.16)

stack(
  piano, bass, epiano2, pad_sweep, percussive_organ, string_ensemble_1, pan_flute, piccolo, pad_new_age,
  lead_8_bass_lead, trumpet, kick, clap, snare, hihat, low_tom, open_hat, crash, high_tom, tambourine, shaker, triangle
)