Strudelify

Indian Reservation

Paul Revere & The Raiders

KeyC♯ minorTempo128 bpm
0:00/0:00
// Indian Reservation — Paul Revere and The Raiders
// 128 bpm, 4/4, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 1 "Track 1" piano (copy of ch 2 "Track 2" electric bass finger)
// note: Full arrangement: all 91 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/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 finger · "Track 2"
const bass = note(`<
  ~@3 A@2 B A C@2 D E A@2 B A C@2 D E A@2 B A C@2 D E A@2 B A C@2 D E F G H I J K L M N O ~ A@2 B A C@2 D E A@2 B A C@2
  D E F G H I J K L M N O ~ B P K ~@5 B P A Q K ~@5
>`.pickRestart({
  A: "c#2@3 ~@3 c#2@3 ~@3 c#2@4 b1@2 c#2@4 b1@2", B: "c#2@3 ~@3 c#2@3 ~@3 c#2@3 ~ b1@2 c#2@4 b1@2",
  C: "f#2@3 ~@3 f#2@3 ~@3 f#2@4 e2@2 f#2@4 e2@2", D: "f#2@3 ~@3 f#2@3 ~@3 f#2@3 ~ e2@2 f#2@4 e2@2",
  E: "f#2@3 ~@3 f#2@3 ~@3 f#2@3 ~ e2@2 f#2@3 ~ e2 ~", F: "c#2@3 ~@3 c#2@3 ~@3 c#2@4 b1@2 c#2@3 ~ b1@2",
  G: "c#2@3 ~@3 c#2@3 ~@3 c#2@3 ~ b1@2 c#2@3 ~ b1 ~", H: "c#2@3 ~@3 c#2@3 ~@3 c#2@3 ~ c#2 ~ e2@2 c#2 ~ e2@2",
  I: "f#2 ~@7", J: "~@8 g2 f#2 e2 b1", K: "c#2 ~@7", L: "~@16 c#2@2 e2@2 c#2@2 e2 ~", M: "f#2 ~@5",
  N: "~@8 e2 f#2 e2 f#2", O: "g#2@3 ~@5", P: "c#2@3 ~@3 c#2@3 ~@3 c#2@3 ~ b1@2 c#2@3 ~ b1@2",
  Q: "c#2@3 ~@3 c#2@2 ~@4 c#2@3 ~ b1@2 c#2@4 b1@2",
})).s("gm_electric_bass_finger").gain(0.76)

// chords · distortion guitar · "Track 3"
const distortion_guitar = note("<~@22 A@8 B@8 ~@53>".pickRestart({
  A: "[~@22 [b3,e4]@19 ~@5 [b3,e4]@17 ~@7 [b3,e4]@17 ~@7 [b3,e4]@14 ~@9 [f#3,b3]@16 ~@9 [f#3,b3]@14 ~@10 [f#3,b3]@14 ~@9 [f#3,b3]@3]/8", // E5 B5
  B: "[~@22 [b3,e4]@14 ~@10 [b3,e4]@14 ~@10 [b3,e4]@13 ~@11 [b3,e4]@10 ~@14 [f#3,b3]@13 ~@11 [f#3,b3]@13 ~@11 [f#3,b3]@12 ~@14]/8", // E5 B5
})).s("gm_distortion_guitar").gain(0.57)

// chords · drawbar organ · "Track 4"
const drawbar_organ = note("<~ A@2 B@2 ~@80 C D@2 E@2 ~>".pickRestart({
  A: "[g#4@16 ~ g#4 f#4@2 e4 c#4@2 b3]/2", B: "[c#4@47 ~]/2", C: "~@11 c#5 c#5@2 ~ g#5@3 ~@6, ~@7 g5 ~@4",
  D: "[~@7 c#5 ~ c#5 g5 g#5@2 ~ g#5@3 ~ e5@2 c#5 ~@2 [g#4,c#5]@2 ~@2 [g#4,c#5]@3 ~ e4@2 c#4 ~ b3@2 [g#3,c#4]@2 ~@2 [f#3,b3]@2 ~ [g#3,c#4]@4, ~@14 g5 ~@2 f#5@2 ~@3 b4@2 ~@24, ~@23 g4 ~@3 g4 ~@2 f#4@2 ~@16]/2", // C#5 B5 C#5
  E: "[g#2,c#3,g#3,c#4]/2", // C#5
})).s("gm_drawbar_organ").gain(0.62)

// other · string ensemble 1 · "Track 5"
const string_ensemble_1 = note(`<
  ~ A@4 ~@32 B C D E F C G H ~ I J K@2 ~@14 L C D M L C N O@2 P Q R ~ S T U@2 ~@10
>`.pickRestart({
  A: "[[g#4,g#5]@32 ~@2 [g#4,g#5]@2 [f#4,f#5]@3 ~ e4@2 [c#4,c#5]@4 ~@2 [c#4,c#5]@47 ~, ~@39 e5@3 ~@4 b3@3 ~@47, ~@47 b4@3 ~@46]/4", // G# F# C#
  B: "~@16 c#5 ~ e5 ~ c#5 ~ e5@2", C: "f#5 ~@11", D: "~@8 g5 f#5 e5 b4", E: "c#5 ~@11", F: "~@16 c#5 ~ e5@2 c#5 ~ e5 ~",
  G: "~@16 e5 ~ f#5 ~ e5 ~ f#5 ~", H: "g#5@23 ~", I: "~ g#5!2 g5 ~ g5 f#5!2 ~ f5!2 e5!2 ~ d#5 ~ d#5 d5!2 ~ c#5!2 ~ c5",
  J: "c5 ~ b4!2 ~ a#4!2 a4 ~ a4 g#4 ~ g#4 g4!2 ~ f#4!2 f4 ~ f4 e4!2 ~", K: "[d#4!2 ~ d4!2 c#4@27 ~@16]/2",
  L: "~@8 c#5 e5 c#5 e5", M: "c#5 ~@7", N: "~@16 e5 ~ f#5@2 e5@2 f#5 ~", O: "[g#5@35 ~@13]/2",
  P: "g#5!2 ~ g5!2 ~ f#5!2 f5 ~ f5 e5!2 d#5 ~ d#5 d5!2 ~ c#5!2 c5!2 ~",
  Q: "b4!2 a#4!2 ~ a4!3 g#4 ~ g4!2 ~ f#4!2 f4!2 ~ e4!2 d#4!2 d4 ~", R: "d4 c#4@19 ~@4", S: "e5@3 d#5",
  T: "~ f#3 [c#3,a3] [f#2,c#4], c#5 e5", U: "[c4@15 ~, d#5@43 ~@5, g#2@35 ~@13]/2",
})).s("gm_string_ensemble_1").gain(0.48)

// other · orchestra hit · "Track 6"
const orchestra_hit = note("<~@27 A B@2 C ~@4 B C D E F G H I J K ~@19 L I F G M I N O ~@19>".pickRestart({
  A: "~@2 c#5 ~@5", B: "~@3 c#5 ~@8", C: "~@6 c#5 ~@17", D: "~@16 c#5 ~ e5 ~ c#5 ~ e5 ~", E: "f#5 ~@23",
  F: "~@8 g5 f#5 e5 b4", G: "c#5 ~@7", H: "~@16 c#5 ~ e5@2 c#5 ~ e5 ~", I: "f#5 ~@11", J: "~@16 e5@2 f#5@2 e5 ~ f#5 ~",
  K: "g#5 ~@11", L: "~@16 c#5@2 e5@2 c#5 ~ e5@2", M: "~@16 c#5 ~ e5@2 c#5@2 e5@2", N: "~@16 e5 ~ f#5 ~ e5@2 f#5@2",
  O: "g#5 ~@7",
})).s("gm_orchestra_hit").gain(0.58)

// chords · vibraphone · "Track 8"
const vibraphone = note("<~@38 A@2 B@2 C@2 D@2 ~@19 E@2 F@2 G ~ H@2 ~@18>".pickRestart({
  A: "[[c#5,f#5]@35 ~@13]/2", B: "[[e5,g#5]@47 ~]/2", C: "[[c#5,f#5]@3 ~]/2", D: "[[d#5,g#5]@17 ~@7]/2",
  E: "[[c#5,f#5]@2 ~]/2", F: "[[e5,g#5]@9 ~@7]/2", G: "[c#5,f#5]@11 ~", H: "[[d#5,g#5]@5 ~]/2",
})).s("gm_vibraphone").gain(0.54)

// chords · pad warm · "Track 9"
const pad_warm = note("<~@50 A@4 B@2 C ~ D@2 E@2 F@3 ~@26>".pickRestart({
  A: "[[g#4,c#5]@85 ~@11]/4", B: "[[g#4,b4]@6 a#4 f#4]/2", C: "g#4", D: "[[c#5,e5]@6 d#5 b4]/2", E: "[c#5@19 ~@5]/2",
  F: "[[g#4,b4]@36 a#4@6 f#4@5 g#4@19 ~@6]/3", // G#m
})).s("gm_pad_warm").gain(0.46)

// other · french horn · "Track 11"
const french_horn = note("<~@50 A@2 B@2 C@3 ~ D@4 E@3 ~@26>".pickRestart({
  A: "[b3@6 a#3 f#3]/2", B: "[g#3@31 ~@17]/2", C: "b3/3", D: "[c#4@7 ~]/4", E: "[b3@65 ~@7]/3",
})).s("gm_french_horn").gain(0.54)

// drums · kick
const kick = s("bd").struct("<~@3 A@28 B@6 ~ C ~ C ~ C ~@3 A@12 B@6 ~ C ~ C ~ C ~@3 A@2 C ~@5 A@4 C ~@5>".pickRestart({
  A: "x ~@2 x ~@2 x ~ x!2 ~ x", B: "x ~@2 x!2 ~", C: "x",
})).gain(0.69)

// drums · snare
const snare = s("sd").struct("<~@31 A@6 ~@7 B C ~@12 A@6 ~@7 B C ~@18>".pickRestart({
  A: "~ x ~ x", B: "~@3 x!3 ~@3 x!3", C: "~@9 x!3",
})).gain(0.69)

// drums · clap
const clap = s("cp").struct("<~@81 [~ x!3] [x!4]!3 x ~@5>").gain(0.76)

// drums · low tom
const low_tom = s("lt").struct("<~@37 A ~ A ~ A ~ A ~ B ~@18 A ~ A ~ A ~ A ~ B ~@18>".pickRestart({
  A: "~@9 x!3", B: "~@3 x!6 ~@3",
})).gain(0.69)

// drums · hihat
const hihat = s("hh").struct("<[x!4] ~@90>").gain(0.69)

// drums · mid tom
const mid_tom = s("mt").struct("<~@37 A ~ A ~ A ~ A B C ~@18 A ~ A ~ A ~ A B C ~@18>".pickRestart({
  A: "~@3 x!6 ~@3", B: "x!3 ~@3 x!3 ~@3", C: "x!3 ~@9",
})).gain(0.61)

// drums · open hat
const open_hat = s("oh").struct("<~@31 [x!4]!6 ~@21 [x!4]!6 ~@27>").gain(0.76)

// drums · high tom
const high_tom = s("ht").struct("<~@37 A ~ A ~ A ~ A ~@20 A ~ A ~ A ~ A ~@20>".pickRestart({
  A: "x!3 ~@9",
})).gain(0.69)

// drums · crash
const crash = s("cr").struct("<~@15 A@3 ~ A@3 ~ A@3 ~ A@4 ~@4 A@2 ~@54>".pickRestart({
  A: "~ x ~@2",
})).gain(0.69)

stack(
  bass, distortion_guitar, drawbar_organ, string_ensemble_1, orchestra_hit, vibraphone, pad_warm, french_horn, kick,
  snare, clap, low_tom, hihat, mid_tom, open_hat, high_tom, crash
)

More by Paul Revere & The Raiders