Strudelify

Just My Imagination

The Temptations

KeyC majorTempo89 bpm
0:00/0:00
// Just My Imagination — The Temptations
// 89 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 89 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(89/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 · acoustic bass · "ACOU BASS"
const bass = note("<~ A@4 B@50 C@2 ~ A@6 D@2 A@6 B@16 E>".pickRestart({
  A: "c2@8 ~ c2@2 ~ c2@12", B: "[c2@3 a2 g2@2 a2 d2@4 a2 g2 a2 g2 a2]/2", C: "c2/2", D: "g1@8 ~ g1@2 ~ g1@12",
  E: "c2@3 ~",
})).s("gm_acoustic_bass").gain(0.3)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note("<A B@2 C@2 D E@49 ~@6 F@2 G H I J G J G J G K@2 E@4 ~@2 E@8 ~>".pickRestart({
  A: "~ d3@2 c3 d3 c3 a2 c3",
  B: "[e3@2 ~ e3@3 c3@6 d3@3 c3@3 a2@2 ~ [c3,e3]@5 ~ d3@6 c3@3 d3@3 c3@3 a2@3 c3@3, ~@4 f3@3 ~@9]/2", // C
  C: "[e3@2 ~ e3@3 c3@6 d3@3 c3@3 a2@2 ~ [c3,e3]@5 ~ d3@6 c3@3 d3@3 c3@3 a2@3 c3@3, ~@3 f3@2 ~@7]/2", // C
  D: "[e3,g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4]@2 ~ [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2, ~ e3 c3@2 ~@4", // C C5
  E: "[g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4]@2 ~ [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2", // C5
  F: "[~@4 d4 e4 c4 ~ c4@3 [g3,c4] [g3,c4]@4, ~@7 g3@2 ~@7]/2", G: "[g3,c4]@6 [g3,c4]@3 [g3,c4]@3 [g3,c4]@5 ~@7",
  H: "[g3,d4]@3 [g3,d4] [g3,d4]@4", I: "[g3,d4]@6 [g3,d4]@3 [g3,d4]@3 [g3,d4]@5 ~@7", J: "[g3,c4]@3 [g3,c4] [g3,c4]@4",
  K: "[[g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4]@2 ~ [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4]@2 ~ [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2 [g3,c4] ~@2, ~@7 [d4,f4]@3 [d4,f4]@2 ~@4]/2", // C5 Dm
})).s("gm_electric_guitar_jazz").gain(0.1).pan(0.2)

// other · orchestral harp · "HARP"
const orchestral_harp = note("<~@15 A B C ~@23 D E F G H ~@4 I@2 ~@3 J K@2 L ~@14 I@2 ~@6 I@2 ~@6>".pickRestart({
  A: "~@15 c5@5 d5@4", B: "f5@4 e5@4 d5@3 ~ c5@4 d5@4 b4@4", C: "c5 ~@3", D: "~@12 e6@4 c6@5 f6@3",
  E: "e6@4 c6@4 f6@4 e6@5 c6@4 f6@3", F: "e6@5 c6@4 f6@3 e6@4 c6@4 f6@4", G: "e6@4 c6@5 f6@3 e6@4 c6@4 ~ f6@3",
  H: "e6 c6 ~@4", I: "[~@19 d5@2 ~ f5@2 g5@3 ~@21, ~@5 g4@4 ~@7, ~@16 a4@11 ~@21, ~@6 c5@3 ~@7, ~@21 e5@2 ~@25]/2",
  J: "g4@3 a4@2 b4 c5@2",
  K: "[d5@2 e5 f5@2 ~@4 b5 [c5,c6]@2 [d5,e6]@2 [c5,f6]@2, d4@3 f4@3 g4@2 a4@2 ~@6, ~@5 g5@2 a5@2 ~@7]/2", // C Dsus2 F5
  L: "g6@2 ~@7 c5 ~@14",
})).s("gm_orchestral_harp").gain(0.2).pan(0.1)

// other · marimba
const marimba = note("<~@5 A B A B ~@47 C D E F ~@29>".pickRestart({
  A: "g4 [g4,c5] c5 g4 [g4,c5] c5 g4 [g4,c5] c5 g4 [g4,c5] c5 g4 [g4,c5] c5 g4 [g4,c5] c5 g4 [g4,c5] c5 g4 [g4,c5] c5", // C5
  B: "a4 [a4,d5] d5 a4 [a4,d5] d5 a4 [a4,d5] d5 a4 [a4,d5] d5 a4 [a4,d5] d5 a4 [a4,d5] d5 a4 [a4,d5] d5 a4 [a4,d5] d5", // D5
  C: "~@6 [a4,c5] ~@2 [a4,c5] ~@2 [a4,c5] ~@5 [g4,d5] ~@2 [g4,d5] ~@2", // Am G5
  D: "[g4,d5] ~@5 [f4,a4] ~@2 [f4,a4] ~@2 [f4,a4] ~@5 [e4,g4] ~@5", E: "g6@2 ~ e6 ~@5 c6@2 ~@13",
  F: "c5 g4 [g4,c5] c5 [g4,c5] g4 [g4,c5] c5 [g4,c5] g4 c5 [g4,c5]!2 g4 [g4,c5] c5 [g4,c5] g4 [g4,c5] c5 [g4,c5] g4 c5 g4", // C5
})).s("gm_marimba").gain(0.1).pan(0.1)

// other · french horn · "FR.HORN"
const french_horn = note(`<
  ~@19 A B C D E C ~@11 F G@2 H@2 I@2 J K ~@4 L@2 M@2 N O@2 ~@16 L@2 M@2 P@2 ~@2 L@2 M@2 P@2 ~@2 Q
>`.pickRestart({
  A: "~ f4 e4 c4 f4 e4 c4 f4", B: "e4@3 c4@3 f4@3 e4@3 c4@3 f4@3 e4@3 c4@2 ~", C: "f4 e4 c4 f4 e4 c4 f4 e4",
  D: "c4 f4 e4 c4 f4 e4 c4 f4", E: "e4 c4 f4 e4 c4 f4 e4 c4", F: "~@21 c4 d4 ~",
  G: "e4@4 c4@3 ~ f4@4 e4@4 c4@3 ~@2 f4@3", H: "e4@4 c4@3 ~@2 f4@3 e4@4 c4@3 ~@2 f4@3", I: "[g3@7 a3@9, e4@19 ~@29]/2",
  J: "g3", K: "a3@23 ~", L: "[~@18 c4 ~@2 c4@20 ~ f4@6]/2", M: "[e4@17 ~ e4 ~@2 c4@24 ~@3]/2", N: "g4@3 a4", O: "c4/2",
  P: "[[g4,b4]@3 a4 c4@4, ~@3 c5@5]/2", Q: "c4@3 ~",
})).s("gm_french_horn").gain(0.25).pan(0.8)

// chords · synth brass 2 · "SYNBRASS 2"
const synth_brass_2 = note(`<
  ~@8 A@2 ~@15 B@2 C ~ D@2 ~@6 E@2 F@2 ~@8 G@4 H I@2 ~@2 J@4 ~@10 G@4 H K L@2 G@4 H K L@2 M
>`.pickRestart({
  A: "[c4@3 ~, a3 ~]/2", B: "[~@7 [a3,c4]@7 [a3,d4]@2]/2", C: "[g3,e4]@19 ~@5",
  D: "[g3@2 ~ g3@2 ~ g3@2 ~ g3@2 ~ g3@6 a3@3 c3@21 ~@6]/2", E: "[~@18 [e3,g3]@2 ~ [f3,a3]@26 ~]/2",
  F: "[[e3,g3]@17 ~ [e3,g3]@2 ~ [f3,a3]@27]/2", // Em F
  G: "[~@18 [g3,c4] ~@2 [a3,c4]@20 ~ a3@5 ~ g3@21 ~@15 e4@6 f4@6, ~@21 c4@26 ~, ~@69 a3@25 ~@2]/4", H: "g4@3 a4",
  I: "c4/2", J: "[~@9 [c4,e4]@36 d4@6 c4@40 ~@5]/4", K: "c4", L: "[c4@21 d4@26 ~]/2", M: "e4@3 ~",
})).s("gm_synth_brass_2").gain(0.3)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~ A B C D E ~@15 F@4 G ~ H I J K L M@4 N@5 O@2 P Q R S@3 T ~ U V W X Y Z@2 AA@6 AB@2 AC@8 U AD AE@2 AF AG AH ~@2 AI
  AE@2 AF AJ AK
>`.pickRestart({
  A: "c4@12 d4@6 c4@2 d4@3 ~", B: "e4@9 g4@3 a4@5 ~ c5@6", C: "a#4 a4", D: "~ g3 a3 c4, g4", E: "e4@19 ~@5",
  F: "[~@21 e4 f4@2 ~@10 f5@2 ~@15 c6@5 b5@4 ~@3 c5@5 b4@4 a5@4 f5@4 e5@4 d5@4 e5@4 c5@4, [g3,c4]@95 ~, ~ g4@2 g4, ~@33 e5@2 ~ g5@23 ~ g5@16 ~@20]/4", // C5
  G: "[c4,e4,g4]@7 ~", H: "~@11 g3 ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3",
  I: "~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3 ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3",
  J: "~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3 ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3, ~@11 e5@6 ~ f5@6",
  K: "~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3 ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3, g5@2 [e5,g5] [f5,a5]", // Em F
  L: "~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3 ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3, [g5,b5]@2 [e5,b5] [f5,c6]", // G E5 F5
  M: "[d5 g#3 a3 d5 a#3 b3 d5 a#3 d5@2 g#3 g3 ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 g#3@2 ~@13 [g3,e4]@9 [a3,f4]@26 ~ e4@15 [f4,f6]@4 ~ e6@4, g5@20 ~@3 g3@13 ~@35 g3@25, d6@6 [d5,d6]@3 e6@3 g6@32 ~@4, ~@8 a3 ~@9 e5@3 ~@2 c3@21 ~@47 e4@4 ~]/4", // C Dm F D
  N: "[[d4,d6] [e4,e6] [c4,c6] ~@5 g3@22, ~ [g5,g6]@2 ~@7]/5", O: "[[g3,d4]@21 [a3,e4]@18 [g3,d4]@4 [f3,c4]@4 ~]/2",
  P: "b3@15 [a3,c4]@4 [b3,d4]@4 ~, e3", Q: "[c4,e4]@15 [b3,d4]@4 [a3,c4]@4 ~, d3",
  R: "g3@15 [f#3,f#4]@4 ~ g3@4, b3, ~@19 g4@4 ~", // F#
  S: "[a3@15 [g3,e5]@4 [f3,d5]@4 ~ e3@15 d3@5 e3@4 f3@15 e3@5 d3@4, c4@71 ~, d5@19 ~@5 c5@19 ~@29, f5@17 ~@55]/3", // C Dm
  T: "[e3,c4]", U: "~@11 g3 ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 [g3,c4]",
  V: "~ [g#3,c#4] [a3,d4] ~ [a#3,d#4] [b3,e4] ~ [a#3,d#4] [a3,d4] ~ [g#3,c#4] [g3,c4] ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3", // C#5 D5 D#5 E5 D#5 D5 C#5 C5
  W: "~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3 ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 c4",
  X: "c#4 ~ d4 d#4 ~ e4 d#4 ~ d4 c#4 ~ c4 c#4 ~ d4 d#4 ~ e4 d#4 ~ d4 c#4 ~@2", Y: "g4@8 ~ a4@6 b4@3 c5@6",
  Z: "[d5@6 e5@3 f5@6 g5@6 a5@6 b5@3 c6@6 d6@6 ~@3 g3 [g2,d3,e3] ~, ~@7 c6, ~@45 f3@2 ~, ~@23 f2]/2", // Em7
  AA: "[e2 d2 ~@58 e4 ~@2 c4 ~@20 e4 ~@2 c4 ~@2 f6@6 [e4,e6]@18 [g4,a5,d6]@6 e4@14 ~ [e3,e4] [d3,d4] ~ [e3,e4] [d3,d4] ~ [c3,c4] [a2,a3] ~, [c6,e6]@4 ~@8 g6@3 ~@5 [g5,c6]@4, c3 ~@11, ~ c2@71]/6", // E Gsus2 E D E D C A …
  AB: "[~@8 d3@3 e3 f3@4, g3]/2",
  AC: "[~ c3@2 d3@2 e3@8 ~ e3@3 f3@3 f#3@3 ~ d5@3 d#5@3 ~@9 g3@2 a3@3 b3@3 c4@6 g3@6 c4@6 ~@3 c4@3 ~@9 f4@3 e4@3 d4@3 ~ a5@3 b5@2 ~@9 f4@3 ~@3 d4@3 ~ e6@6 g6@48 ~@24, ~@23 g3@13 ~@29 g3@5 ~ e4@9 ~@9 c4@6 e4@9 ~@3 e4@3 ~@4 c4@55 ~@23, ~@5 e5@7 g5@3 ~ c6@2 d6 ~@13]/8",
  AD: "~ [g#3,c#4] [a3,d4] ~ [a#3,d#4] [b3,e4] ~ [a#3,d#4] [a3,d4] ~ [g#3,c#4] [g3,c4] ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3, ~@12 e4@6 f4@5 ~", // C#5 D5 D#5 E5 D#5 D5 C#5 C5
  AE: "[~@12 e5@6 f5@6 g5@18 a5@5 g4, [e4,g4]@43 ~@5]/2", // Em
  AF: "c6 g#4 a4 c6 a#4 b4 ~ a#4 a4 g5 g#4 g4 c6 g#4 a4 c6 a#4 b4 ~ a#4 a4 g5 g#4 g4, ~@3 a5 ~@5 a5 ~@2",
  AG: "c6 g#4 a4 c6 a#4 b4 ~ a#4 a4 g5 g#4 ~ [g4,c6] g#4 a4 c6 a#4 b4 ~ a#4 a4 ~ g#4 ~, ~@2 a5 ~@3 a5 g5", // C5
  AH: "[e6,g6]", // Em
  AI: "[g3,c4] [g#3,c#4] [a3,d4] ~ [a#3,d#4] [b3,e4] ~ [a#3,d#4] [a3,d4] ~ [g#3,c#4] [g3,c4] ~ g#3 a3 ~ a#3 b3 ~ a#3 a3 ~ g#3 g3, ~@12 e4@6 f4@5 ~", // C5 C#5 D5 D#5 E5 D#5 D5 C#5 …
  AJ: "c6 g#4 a4 c6 a#4 b4 ~ a#4 a4 g5 g#4 ~ g4 g#4 a4 ~ a#4 b4 ~ a#4 a4 ~ g#4 ~, ~@2 a5 ~ c6 a5 g5@2",
  AK: "[c5,e6,g6]@3 ~", // C
})).s("gm_string_ensemble_1").gain(0.25).pan(0.7)

// other · timpani
const timpani = note("<~@64 A B C D E D F C ~@17>".pickRestart({
  A: "g2 ~@8 g2 ~@2 g2 ~@11", B: "g2 ~@8 g2 ~@2 g2 ~@5 [g2,a2] g2 a2 [g2,a2] g2@2, ~@22 a2 ~",
  C: "c2 ~@8 c2 ~@2 c2 ~@11", D: "c2 ~@8 g2 ~@2 c2 ~@11", E: "c2 ~@7 g2 ~@2 c2 ~@12", F: "c2 ~@8 g2 ~ c2 ~@12",
})).s("gm_timpani").gain(0.25).pan(0.8)

// other · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz_2 = note(`<
  ~@9 A@2 B@2 C@2 D E ~@2 F@2 G H I J K@4 L M L N ~@2 O@2 ~@6 P@2 Q@2 R@2 S@4 T@2 ~@17 S@4 T@2 U@2 V@4 T@2 W@3
>`.pickRestart({
  A: "[~@7 c4@5 ~@4]/2", B: "[~@4 f4 e4@2 c4@2 ~@7]/2", C: "[~@5 c4@3 c#4@4 ~@4, ~@5 e4@7 ~@4]/2",
  D: "~@9 b3@6 ~ b3@2 ~ b3@3 ~@2, ~@9 [d#4,g#4]@14 ~", E: "a3 ~",
  F: "[~@3 f4@3 e4@3 c4@3 g4@6 [c4,e4]@3 c4@6 c4@3 f4@3 e4@3 c4@3 f4@3 e4@3 c4@2 ~, ~@4 f4 ~@2 f4 ~@8]/2", // C
  G: "f4 ~ c4 f4 ~ c4 f4 ~", H: "c4 f4 e4 c4 f4 ~ c4 f4", I: "e4 c4 f4 ~ c4 f4 e4 c4", J: "f4 e4 c4 ~@2 c4 ~@2",
  K: "[c3 ~@2 c3@3 a2@3 g2@3 c3@6 a2 ~@2 d#5@6 [c5,d5]@3 c5 ~@2 a4@2 ~ [f4,a4,c5]@6 [f4,a4]@3 [e4,g4]@5 ~@19 d#5@6 d5@3 c5@3 a4@2 ~ c5@10 ~@2]/4", // Csus2 F Em
  L: "e4@5 ~ e4@3 f4@3", M: "g4@11 ~", N: "g4@3 ~", O: "[~@3 a4@2 g4@2 c4@7 ~@2, ~@9 g4 ~@38]/2",
  P: "[~@6 [e4,g4]@3 e4@2 c4@7 ~@6]/2", Q: "[~@9 g#4@3 g4@16 ~@20]/2", R: "[~@3 d4 d#4@3 c4@5 ~@4]/2",
  S: "[c3 ~@2 c3@3 a2@3 g2@3 c3@6 a2 ~@2 d#5@6 [c5,d5]@3 c5 ~@2 a4@2 ~ [f4,a4,c5]@6 [f4,a4]@3 [e4,g4]@5 ~@19 d#5@6 d5@3 c5@12 ~@6]/4", // Csus2 F Em
  T: "[g3 ~@2 g3@2 ~ g3@3 e3@3 g3@6 a3@3 c3@15 ~@12]/2", U: "[[c4,e4]@19 ~@2 [c#4,e4]@25 ~@2]/2",
  V: "[c3 ~@2 c3@3 a2@3 a2@3 g2@6 a2 ~@2 d#5@6 [c5,d5]@3 c5 ~@2 a4@2 ~ [f4,a4,c5]@6 [f4,a4]@3 [e4,g4]@5 ~@19 d#5@6 d5@3 c5@12 ~@6]/4", // Csus2 F Em
  W: "[[c4,e4]@19 ~@2 [c#4,e4]@24 [b3,d#4]@21 ~@6]/3", // C C#m B
})).s("gm_electric_guitar_jazz").gain(0.2).pan(0.1)

// other · electric guitar jazz · "JAZZ GTR" · soft notes
const electric_guitar_jazz_3 = note("<~@12 A ~@6 B C D E F G ~@64>".pickRestart({
  A: "~ a3@5 ~@2", B: "~@15 e4@2 ~@7", C: "e4 ~@7", D: "~ e4 ~@2 e4 ~@2 e4", E: "~@5 e4 ~@2", F: "~@3 e4 ~@4",
  G: "~@3 f4 e4 ~ f4 e4",
})).s("gm_electric_guitar_jazz").gain(0.1).pan(0.1)

// drums · kick
const kick = s("bd").struct("<~@9 x ~@78 x>").gain(0.3)

// drums · rim
const rim = s("rim").struct("<~@9 [~ x ~ x]!46 ~@16 [~@3 x] [~ x ~ x]!16 ~>").gain(0.35)

// drums · snare
const snare = s("sd").struct("<~@8 [~@6 x!2] ~@80>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~@9 [x ~ x!3 ~ x ~]!46 ~@17 [x ~ x!3 ~ x ~]!16 ~>").gain(0.15)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@9 [~ x ~@3 x ~ x]!46 ~@17 [~ x ~@3 x ~ x]!16 ~>").gain(0.05)

// drums · open hat
const open_hat = s("oh").struct("<~@55 x ~@33>").gain(0.2)

// drums · crash
const crash = s("cr").struct("<~@88 x>").gain(0.2)

// drums · guiro
const guiro = s("guiro:0").struct("<~@71 [~@7 x] ~@17>").gain(5.24)

stack(
  bass, electric_guitar_jazz, orchestral_harp, marimba, french_horn, synth_brass_2, string_ensemble_1, timpani,
  electric_guitar_jazz_2, electric_guitar_jazz_3, kick, rim, snare, hihat, hihat_soft, open_hat, crash, guiro
)

More by The Temptations