Strudelify

Marrakesh Express

Crosby, Stills, Nash & Young

KeyG majorTempo120 bpm
0:00/0:00
// Marrakesh Express — Crosby, Stills, Nash & Young
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 78 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// chords · clavinet · "Accompaniment"
const clavinet = note(`<
  A B A C D E F G H I J K D E F G H I J K L M L N O P Q P R S T J U V D E F G H I J K L M L N W L M L N X P Y P Z AA
  AB@2 AC@18 ~
>`.pickRestart({
  A: "[b4,d5]", B: "[f4,a4]", C: "a4 f4@3", D: "b3 d4", E: "c4@8 ~@4 c4 c4@3", F: "c4 b3@3 d4@4", G: "f4!2", H: "g4",
  I: "c#4@6 f#4 f4, ~@14 f#4 ~", J: "e4", K: "f#4 g4 a4 c5", L: "c4 g4", M: "c4@2 d4 ~", N: "g4 e4 c#4@2",
  O: "e4@2 a4@2 f#4@2 d5@2 g4@4 d5 e5@3, ~@6 g4 ~@9", P: "[b4,d5,g5]@3 [a4,c5,f5]", Q: "[g4,b4,e5]@4 [g4,b4]@8 d5 e5@3",
  R: "[g4,b4,e5] [g4,b4] ~@2", S: "f#4", T: "d4",
  U: "[e5,g5,b5]@3 a5 g5@2 [f#5,a5]@3 g5 f#5@2 [e5,g5]@2 [f#5,a5]@2, ~@3 d5@3 ~@2", // Em F#m Em F#m
  V: "[g5,b5]@3 a5 g5@2 [f#5,a5]@3 g5 f#5@2 [c5,e5,g5]@4, e5@3 d5@3 ~@2", W: "e4 a4 f#4 d5 g4@2 ~@2",
  X: "e4@4 f#4@2 d5@2 g4@4 d5 e5@3, ~@8 a4 ~@7", Y: "[g4,b4]@12 d5 e5@3, e5 ~@3", Z: "[g4,b4]@12 d5 e5@2 e5, e5 ~@3",
  AA: "[b4,d5,g5]", AB: "[c5,e5,a5]/2",
  AC: "[g5,b5]@2 [f5,a5]@2 [e5,g5]@2 [f5,a5]@2 [e5,g5]@2 [d5,f5] [e5,g5]@2 [d5,f5] [e5,g5]@2", // G F Em F Em Dm Em Dm …
})).s("gm_clavinet").gain(0.26)

// chords · acoustic guitar steel · "Chords"
const acoustic_guitar_steel = note(`<
  A B A B C D C D E F G H C D C D E F G H I@3 J K L C L C M C E G@2 C D C D E F G H I@3 J K I@3 J K L C L C A N@2 O@18 ~
>`.pickRestart({
  A: "[g4,b4,d5]", B: "[a4,d5,f5]", C: "[b3,d4,g4]", D: "[d4,f4,a4]", E: "[b3,e4,g4]", F: "[c#4,e4,a4]",
  G: "[c4,e4,g4]", H: "[d4,f#4,a4]", I: "[c4,e4,g4] [b3,d4,g4]", J: "[b3,e4,g4] [c#4,e4,a4]",
  K: "[c4,e4,g4] [d4,f#4,a4] [b3,d4,g4]@2", L: "[b3,d4,g4]@3 [f4,a4,c5]", M: "[d4,f#4,b4]", N: "[a4,c5,e5]",
  O: "[g3,b3,d4]!2", // G
})).s("gm_acoustic_guitar_steel").gain(0.26)

// bass · electric bass pick · "Bass"
const bass = note(`<
  A B A B A B A B C D E B A B A B C D E B F@3 G H I@3 A J A K L@2 A B A B C D E B F@3 G H F@3 G H A@7 M A@17 ~
>`.pickRestart({
  A: "g2!4", B: "d3!4", C: "e3@2 e3@2 ~@2 b3 a#3, e4@3 ~, ~ e3", D: "a2!4, a3", E: "c3!4, g3", F: "c3!2 d3!2",
  G: "e3 e2 a2!2", H: "c3 d3 g3!2", I: "g2@2 g2@2 g2@2 g2 d2", J: "[b1,b2]!4", K: "e2!4", L: "c3",
  M: "g2 ~@3 g2@4 g2@4 g2@4",
})).s("gm_electric_bass_pick").gain(0.26)

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

// drums · snare
const snare = s("sd").struct(`<
  A@5 B A@8 B A@10 B A@5 B A B A@3 C A@3 B A@2 B A@7 B A@10 B A B A B A@8 D ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x ~@2 x ~@3", C: "x!3 ~ x ~ x ~@5 x ~@3", D: "x!14 ~ x",
})).gain(0.36)

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

// drums · crash
const crash = s("cr").struct("<~@37 [~@3 x] x ~@38 x>").gain(0.36)

// drums · ride
const ride = s("rd").struct(`<
  A@4 B C D@2 A D@2 B A@2 C A@5 B A@4 C A@4 E C A C A@3 ~ A B A C A@2 C D A B A@4 C A@3 B A@6 C D C A C A E A@2 D F B A
  ~@2
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~ x!3 ~@3 x ~@3", C: "x ~@3 x ~@3 x ~ x!3 ~ x!2", D: "x ~@3 x ~@2 x!2 ~@3 x ~@3",
  E: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", F: "x ~ x!3 ~ x ~",
})).gain(0.31)

// drums · tambourine
const tambourine = s("tb").struct("<[x!8]!37 ~ [x!8]!38 ~@2>").gain(0.26)

stack(clavinet, acoustic_guitar_steel, bass, kick, snare, open_hat, crash, ride, tambourine)

More by Crosby, Stills, Nash & Young