Strudelify
Car Wash cover art

Car Wash

Car Wash

Rose Royce

KeyD majorTempo114 bpm
0:00/0:00
// Car Wash — Rose Royce
// 114 bpm, 4/4, key D major. 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: ch 7 "Wha Gtr" named as a guitar, played on electric guitar clean (its lead 5 charang patch is not one)
// note: Full arrangement: all 111 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(114/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 · slap bass 2 · "Bass Gtr"
const bass = note(`<
  ~@24 A B A C A B A D A B A E A F A G H I H I H I J K A B A E A F A L H I H I H I J M A B A E A F A N O P O P O Q R H I
  H I H I J S H I H I H I H I H I H I H I H L O P T U@4 ~
>`.pickRestart({
  A: "d2@2 ~@2 d2@3 c2 d2@2 ~@2 d2@3 c2", B: "d2@2 ~@2 d2@3 c2 f2 ~ a1 c2 f2 d2 a1 c2",
  C: "d2@2 ~@2 d2@3 a1 c2@2 a1 ~ a1@2 c2@2", D: "d2@2 d3!2 c3!2 a2 f2 g2@2 f2 ~ d2@3 ~",
  E: "d2@2 d3 ~ b1@2 b2 ~ c2@2 a1@2 b1@2 c2@2", F: "d2@2 ~@2 d2@3 c2 f2!2 a1 c2 f2 d2 a1 c2",
  G: "d2@2 d3@2 e3@2 e3@2 f3@2 f3 ~ g3@2 a3@2", H: "d2@2 d3 ~ b1@2 b2 ~ c2@2 c3 ~ c#2@2 c#3 ~",
  I: "d2@2 d3 ~ b1@2 b2 ~ c2@2 a1@2 b1 a1 c2 a1", J: "d2@2 d3 ~ b1@2 b2 ~ c2@2 c3 ~ c#2@3 ~",
  K: "~@3 c3 d3!2 c3 f2 g2@2 f2@2 d2@3 ~", L: "d2 d3 e3!2 f3!2 g3 a3", M: "~@3 c3 d3!2 c3 f2 g2@2 f2 ~ d2@3 ~",
  N: "d2@2 ~@2 d2@2 ~ c2 c2@2 b1@2 a1@2 c2@2", O: "g2 ~@2 f#2 ~@2 e2@9 e1", P: "e1@7 e2 e2@8", Q: "e1@7 e2 e2@6 b1 ~",
  R: "g1!3 ~@5 a1!3 ~ a1 ~ a1 ~", S: "~@2 f3@2 d3 c3 ~ f2 g2@2 f2@2 d2@3 ~", T: "g1!3 ~@5 a1!3 ~ a1 ~@2 a1",
  U: "[~ d2@31]/4",
})).s("gm_slap_bass_2").gain(0.37)

// bass · piano · "Ac.Piano"
const bass_2 = note(`<
  ~@15 A B A C A B A B ~@2 A C A B A B ~@2 A B A B A B ~@2 A B A B A B ~@2 A C A B A B ~@2 A C A C A B ~@2 A B A B A B
  ~@9 A C A C A B ~@2 A B A C A B A B A B A B A B A D ~@7
>`.pickRestart({
  A: "~@10 d1 a1 c2 a1 c2 d2", B: "d1 ~@15", C: "d1 ~@7", D: "g1 ~@15",
})).s("gm_piano").gain(0.31).pan(0.3)

// chords · electric guitar jazz · "Jazz Gtr"
const electric_guitar_jazz = note(`<
  ~@7 A ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ A ~ C ~ D ~ C ~ E ~ C ~ D ~ C ~ D ~ C ~ D ~ C F G ~ C ~ D ~ C ~ D ~ C ~ D ~ C F G
  ~ C ~ D ~ C ~ D ~@6 H ~ C ~ D ~ C F G ~ C ~ D ~ C ~ D ~ C ~ D ~ C ~ D ~@2 I J@5
>`.pickRestart({
  A: "~@10 [f#4,a4,d5]!3 ~@3", B: "~@14 d5 ~", C: "~@4 [a3,c4]!3 [b3,d4] ~@2 [c4,f4] ~ [c4,e4] [a3,d4] ~@2",
  D: "~@4 [d4,f#4]!2 [d4,f4] [c4,e4] ~@2 [d4,f#4] ~ [d4,f#4] [e4,a4] ~@2", E: "[f#3,d4,f#4] ~@15",
  F: "~@14 [d4,f4] [d4,f#4]", G: "[a3,d4] ~@13 [a3,d4] ~", H: "g4!3 ~@5 a4!3 ~ a4 ~ a4 ~",
  I: "g4!3 ~@5 a4!3 ~ a4 ~@2 a4", J: "[~ f#4@32 ~@7]/5",
})).s("gm_electric_guitar_jazz").gain(0.12).pan(0.7)

// chords · acoustic guitar nylon · "NylonGtr"
const acoustic_guitar_nylon = note(`<
  ~@9 A B C B C B C B C B C B C B C D E D E D E D F D E G E G E D H G E D E D E G F D I D E D E D F G E G I D I D H D E
  G E D I D F J@2 K@2 L@2 M D E G E D I D H D E D I G I G I G E D I G E D I L@2 N O@5
>`.pickRestart({
  A: "~@14 d5 ~", B: "~@7 c4 ~@2 d4 ~ d4 c4 ~@2", C: "~@7 c4 ~@2 d4 ~@3 d5 ~",
  D: "[f#3,a3] ~@5 [f#3,a3] ~@3 [a3,c4]@2 ~ [g3,b3]@2 ~", E: "[f#3,a3] ~@9 [a3,c4]@2 ~ [g3,b3]@2 ~", F: "[f#3,a3] ~@15",
  G: "[f#3,a3]@2 ~@4 [f#3,a3] ~@3 [a3,c4]@2 ~ [g3,b3]@2 ~", H: "[f#3,a3] ~@7",
  I: "[f#3,a3]@2 ~@8 [a3,c4]@2 ~ [g3,b3]@2 ~", J: "[[b3,d4] ~@2 [a3,c#4] ~@2 [g3,b3]@24 ~@2]/2",
  K: "[[b3,d4] ~@2 [a3,c#4] ~@2 [g3,b3]@23 ~@3]/2", L: "[[b3,d4] ~@2 [a3,c#4] ~@2 [g3,b3]@25 ~]/2",
  M: "[b3,d4]!3 ~@5 [c#4,e4]!3 ~ [c#4,e4] ~ [c#4,e4] ~", N: "[b3,d4]!3 ~@5 [c#4,e4]!3 ~@2 [c#4,e4] ~ [c#4,e4]",
  O: "[~ [a3,c#4]@32 ~@7]/5", // A
})).s("gm_acoustic_guitar_nylon").gain(0.17)

// chords · electric guitar muted · "Mute Gtr"
const electric_guitar_muted = note(`<
  ~@5 A B@18 C D C D C D C E C D C D C D C D C D C D C D C E C D C D C D C D C D C D C D C E C D C D C D C D ~@7 C D C D
  C D C E C D C D C D C D C D C D C D C D ~@8
>`.pickRestart({
  A: "~@14 c4 d4", B: "~@2 c4 d4 ~@2 c4 d4 ~@2 c4 d4 ~@2 c4 d4",
  C: "[d4,f4] [d4,f#4] ~@4 [d4,f4] [d4,f#4] ~@4 [d4,f4] [d4,f#4] ~@2", D: "[d4,f4] [d4,f#4] ~@14", E: "[d4,f#4] ~@15",
})).s("gm_electric_guitar_muted").gain(0.21)

// other · electric guitar clean · "Wha Gtr"
const electric_guitar_clean = note("<~@6 A@25 ~ B@15 ~ B@15 ~ B@8 ~@7 B@7 ~ B@16 ~@8>".pickRestart({
  A: "d3!16", B: "d4!16",
})).s("gm_electric_guitar_clean").gain(0.08)

// chords · epiano2 · "El.Piano"
const epiano2 = note("<~@72 A@2 B@4 C ~@24 A@2 D E@5>".pickRestart({
  A: "[[b3,d4,g4] ~@2 [a3,c#4,f#4] ~@2 [g3,b3,d4]@24 ~@2]/2", B: "[[b3,d4,g4] ~@2 [a3,c#4,f#4] ~@2 [g3,b3,d4]@25 ~]/2",
  C: "[b3,d4,g4]!3 ~@5 [c#4,e4,a4]!3 ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~", // G A
  D: "[b3,d4,g4]!3 ~@5 [c#4,e4,a4]!3 ~ [e4,a4] c#4 ~ [c#4,e4,a4]", E: "[~ [c#4,f#4,a4]@33 ~@6]/5",
})).s("gm_epiano2").gain(0.33)

// other · string ensemble 1 · "String 1"
const string_ensemble_1 = note(`<
  ~@23 A B C D E F@2 G H ~@7 A I J K@2 I L M H ~@7 A I J K@2 I L M H ~@8 N@2 O@4 P I J Q@2 I L M H I J Q@2 I J Q@2 I J
  K@2 I J Q@2 N@2 R S@5
>`.pickRestart({
  A: "~@8 f4 [g4,a4] b4 [c5,d5] e5 [f5,g5] a5 [b5,c6]", B: "d6@6 c6 a5 c6 ~ d6@6", C: "~@2 c6@2 d6@2 c6 f6 ~ c6 d6@6",
  D: "~@2 a6 g6 a6@4 g6@4 f6@3 ~", E: "d6 f6 c6 d6@8 ~ a5 b5 d6 b5",
  F: "[d6@6 c6 a5 c6 ~ d6@8 c6 ~ d6@2 c6 f6 ~ c6 d6@6]/2", G: "~@2 a6 g6 a6@4 g6@4 f6@4", H: "d6 ~@13 d6 ~",
  I: "d6@13 ~ d6 e6", J: "f6!2 e6 ~ d6@2 b5 ~ a5@7 ~", K: "[d6@27 ~ e5 [f5,g5] a5 [b5,c6]]/2",
  L: "f6!2 e6 ~ d6@2 b5 ~ a5@8", M: "~@12 a5 b5 d6 b5", N: "[g6 ~@2 f#6 ~@2 e6@25 ~]/2",
  O: "[g6 ~@2 f#6 ~@2 e6@24 ~@2]/2", P: "g6!3 ~@5 a6!3 ~ a6 [e5,f5,g5] [a5,a6] [b5,c6]",
  Q: "[d6@28 e5 [f5,g5] a5 [b5,c6]]/2", R: "g6!3 ~@5 a6!3 ~@2 a6 ~ a6", S: "[~ f#6@32 ~@7]/5",
})).s("gm_string_ensemble_1").gain(0.27).pan(0.3)

// other · string ensemble 1 · "String 2"
const string_ensemble_1_2 = note(`<
  ~@24 A B C D A E C F ~@8 G H I@2 G J K F ~@8 G H I@2 G J K F ~@8 L@2 M@4 N G H O@2 G J K F G H O@2 G H O@2 G H P@2 G H
  O@2 L@2 Q@6
>`.pickRestart({
  A: "d5@6 c5 a4 c5 ~ d5@6", B: "~@2 c5 ~ d5@2 c5 f5 ~ c5 d5@6", C: "~@2 a5 g5 a5@3 ~ g5@3 ~ f5@3 ~",
  D: "d5 f5 c5 d5@8 ~ a4 b4 d5 b4", E: "~@2 c5 ~ d5 ~ c5 f5 ~ c5 d5@6", F: "d5 ~@13 d5 ~", G: "d5@13 ~ d5 e5",
  H: "f5!2 e5 ~ d5@2 b4 ~ a4@7 ~", I: "[d5@27 ~@5]/2", J: "f5!2 e5 ~ d5@2 b4 ~ a4@8", K: "~@12 a4 b4 d5 b4",
  L: "[g5 ~@2 f#5 ~@2 e5@25 ~]/2", M: "[g5 ~@2 f#5 ~@2 e5@24 ~@2]/2",
  N: "g5!3 ~@5 a5!3 ~ [e4,a5] [f4,g4] [a4,a5] [b4,c5]", O: "[d5@27 ~ e4 [f4,g4] a4 [b4,c5]]/2", P: "[d5@13 ~@3]/2",
  Q: "[g5!3 ~@5 a5!3 ~ a5 ~@2 a5@2 ~ [d4,a4]@71 ~@7, ~@6 c#5@23 ~@3]/6", // D5
})).s("gm_string_ensemble_1").gain(0.4).pan(0.8)

// other · brass section · "Brass"
const brass_section = note(`<
  ~@40 A B C D A E F G ~@8 A B C D H I F G ~@8 J@6 K L B C D A I F G A B C D A B C D H B C D H B C D J@2 M N@5
>`.pickRestart({
  A: "~@8 d4@3 ~ a4@4", B: "d4@3 ~ a4@12", C: "~@7 c5 d5!2 c5 ~@4 c5", D: "d5!2 c5 ~@3 c5 d5 ~@2 d5 g4 a4 c5 ~@2",
  E: "d4@4 a4@11 ~", F: "~@7 c5 d5!2 c5 ~@5", G: "[d4,d5] ~@13 [d4,d5] ~", H: "~@8 d4@3 ~ a4@3 ~", I: "d4@3 ~ a4@11 ~",
  J: "[[g4,g5] ~@2 [f#4,f#5] ~@2 [e4,e5]@25 ~]/2", K: "[g4,g5]!3 ~@5 [a4,a5]!3 ~ [a4,a5] ~ [a4,a5] ~", L: "~@2 d4 a4",
  M: "[g4,g5]!3 ~@5 [a4,a5]!3 ~ [a4,a5] ~@2 [a4,a5]", N: "[~ a5@34 ~@5, ~ c#5@33 ~@6]/5",
})).s("gm_brass_section").gain(0.64)

// other · piccolo · "Flt/Picc"
const piccolo = note(`<
  ~@23 A B C D E F@2 G H ~@7 A I J K@2 I L M H ~@7 A I J K@2 I L M H ~@8 N@2 O@4 P I J K@2 I L Q H I J K@2 I J K@2 I J
  K@2 I J K@2 R@2 S T@5
>`.pickRestart({
  A: "~@8 f5 [g5,a5] b5 [c6,d6] e6 [f6,g6] a6 [b6,c7]", B: "d7@6 c7 a6 c7 ~ d7@6", C: "~@2 c7 ~ d7@2 c7 f7 ~ c7 d7@6",
  D: "~@2 a7 g7 a7@4 g7@4 f7@3 ~", E: "d7 f7 c7 d7@8 ~ a6 b6 d7 b6",
  F: "[d7@6 c7 a6 c7 ~ d7@8 c7 ~ d7 ~ c7 f7 ~ c7 d7@6]/2", G: "~@2 a7 g7 a7@4 g7@4 f7@4", H: "d7 ~@13 d7 ~",
  I: "d7@13 ~ d7 e7", J: "f7!2 e7 ~ d7@2 b6 ~ a6@7 ~", K: "[d7@28 e6 [f6,g6] a6 [b6,c7]]/2",
  L: "f7!2 e7 ~ d7@2 b6 ~ a6@8", M: "~@12 a6 b6 d7 b6", N: "[g7 ~@2 f#7 ~@2 e7@25 ~]/2",
  O: "[g7 ~@2 f#7 ~@2 e7@24 ~@2]/2", P: "g7!3 ~@5 a7!3 ~ [e6,a7] [f6,g6] [a6,a7] [b6,c7]", Q: "~@13 b6 d7 b6, ~@6 a6 ~",
  R: "[g7@2 ~ f#7 ~@2 e7@25 ~]/2", S: "g7!3 ~@5 a7!3 ~ a7 ~@2 a7", T: "[~@2 f#7@65 ~@13]/5",
})).s("gm_piccolo").gain(0.25).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@6 A@8 B@9 C B D B E B E B F B E B E B E B E B D B G B D B F B E B E B E B E B D B G B D B F B E B E B E B E H I H I
  H I J B D B G B D B F B D B G B D B E B D B G B D B E H I K L ~@4
>`.pickRestart({
  A: "~ x ~ x", B: "x!4", C: "x!3 ~", D: "x ~ x ~ x!3 ~", E: "x ~ x ~ x!4", F: "x ~@6 x", G: "x ~ x ~ x ~ x!2",
  H: "x ~@2 x ~@2 x ~@9", I: "x!2 ~@2 x!2 ~@2", J: "x ~ x!6", K: "x ~@3 x ~ x ~ x ~ x ~ x ~@2 x", L: "~ x ~@6",
})).gain(0.45)

// drums · clap
const clap = s("cp").struct("<~@2 A B A B A B A B A B A B A B A B A B A B A B A@82 ~@5>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@2 x!2 ~ x ~ x ~@3",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  ~@23 A B@7 C B@7 D B@7 C B@7 D B@7 C B@7 D E B E B E B F B@7 C B@7 D B@7 D E B G H ~@4
>`.pickRestart({
  A: "~@6 x ~ x!5 ~@3", B: "~ x ~ x", C: "x ~@6 x", D: "~@4 x ~@4 x!7", E: "~@3 x", F: "x!3 ~@5 x!3 ~ x ~ x ~",
  G: "x!3 ~@5 x!3 ~ x ~@2 x", H: "~ x ~@6",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<A B ~@8 C B@12 D B@7 E B@15 E B@15 E B@8 ~@7 B@24 ~@8>".pickRestart({
  A: "x!2", B: "x!4", C: "~ x!3", D: "x ~ x ~ x!3 ~", E: "x ~@6 x",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@10 A@13 B A@7 ~ A@15 ~ A@15 ~ A@8 ~@7 A@24 ~@8>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~@4",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@72 A ~ A ~ A ~@2 B ~@23 A ~@2 C ~@4>".pickRestart({
  A: "x ~@2 x ~@2 x ~@9", B: "x", C: "~ x ~@6",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@24 A ~@16 A ~@14 A ~@15 B C B C B C ~@9 A ~@7 A ~@7 B C ~@6>".pickRestart({
  A: "x", B: "~@8 x!8", C: "x!16",
})).gain(0.25)

// drums · congas
const congas = s("conga:33").struct("<~@23 [x!16] x ~@86>").gain(0.79)

stack(
  bass, bass_2, electric_guitar_jazz, acoustic_guitar_nylon, electric_guitar_muted, electric_guitar_clean, epiano2,
  string_ensemble_1, string_ensemble_1_2, brass_section, piccolo, kick, clap, snare, hihat, open_hat, crash, ride,
  congas
)

More by Rose Royce