Strudelify

I'm Your Captain (Closer to Home)

Grand Funk Railroad

KeyD majorTempo94 bpm
0:00/0:00
// I'm Your Captain (Closer to Home) — Grand Funk Railroad
// 94 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 168 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(94/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 · "bass"
const bass = note(`<
  A@4 B@8 C@11 D@21 E@4 F G F G F H I J F G F G F H I J B@8 C@2 D@16 K L M N K L M N K L M N K L M N K L M N K L M N K L
  M N K L O@2 P Q R S P Q R S P Q R S P Q R S P Q R S P T R S P T R S P T R S P T R S P T R S P T O U ~@2
>`.pickRestart({
  A: "[d2@31 ~]/2", B: "d2 a1 g#2 g2 ~ f2 ~ d2 ~ d2 ~ c2 a1@4", C: "d2@3 ~ d2@3 ~@9",
  D: "d2@4 c2 d2 ~ c2 ~ c2 ~ c2 a1!2 c2 a1", E: "[d2 a1 g#2 g2@2 f2@2 d2@2 a1 c2@2 b1@2 a1@2]/2",
  F: "d2@3 d2 a2@2 d2@2", G: "a#1@6 a#1@2 f2@4 a#1@3 ~", H: "a#1@2 ~ a#1 f2@2 a#1@2", I: "f1@2 ~ f1 f1@2 f1@2",
  J: "a1@2 ~ a1 a1@2 a1@2", K: "d2@3 a2", L: "d3 a2 d2 a1", M: "c2@15 ~", N: "c2 g1 a1 b1 c2 d2 e2 c2", O: "c2!8",
  P: "d2 ~ d2@4 a1@2 d2 ~ d2@5 ~", Q: "d2 ~ d2@4 a1@2 d2 ~ d2@4 a1@2", R: "c2 ~ c2@4 g1@2 c2 ~ c2@5 ~",
  S: "c2 ~ c2@4 g1@2 c2 ~ c2@4 a1@2", T: "d2 ~ d2@4 a1@2 d2 ~ d2@4 b1@2", U: "c2!4 ~@4",
})).s("gm_electric_bass_finger").gain(0.64).pan(0.7)

// chords · rock organ · "organ"
const rock_organ = note("<~@48 A@7 B A@7 B ~@104>".pickRestart({
  A: "[a4 a#4 a4 a#4 a4 a#4 [a4,c5], f4, d5@6 ~]/7", B: "[e4,a4,c#5]",
})).s("gm_rock_organ").gain(0.4)

// chords · string ensemble 1 · "strings"
const string_ensemble_1 = note(`<
  ~@90 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 D@2 E@2 F@2 G@2 H@2 C@2 I@4 J K L M N
  L O P Q R@2 S T U G@2 ~@8
>`.pickRestart({
  A: "[f#4,a4]/2", B: "[e4,g4]/2", C: "d5/2", D: "[c5@6 b4 a4]/2", E: "[f#5@3 a5]/2", F: "g5/2", G: "f#5/2", H: "e5/2",
  I: "[[f#5,a5], a4 ~@15]/4", J: "g5 f#5", K: "e5 d5", L: "a4", M: "d5@2 f#5@2 g5 f#5 d5 a4", N: "c5 b4",
  O: "f#5 ~ f#5 g5 f#5@4", P: "f#5 e5", Q: "d5 c5", R: "[b4 ~ d5@2, ~ a4@3]/2", S: "e5 f#5@2 a5", T: "c6 b5", U: "a5",
})).s("gm_string_ensemble_1").gain(0.4)

// chords · string ensemble 1 · "strings" · soft notes
const string_ensemble_1_soft = note("<~@160 A@2 B@2 C@2 D@2>".pickRestart({
  A: "e5/2", B: "f#5/2", C: "[e4,g4]/2", D: "d5/2",
})).s("gm_string_ensemble_1").gain(0.1)

// chords · acoustic guitar nylon · "Acoustic Guitar"
const acoustic_guitar_nylon = note(`<
  A B A B C D C D C D C D E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F G ~@3 H I H I H I J K H I H I
  H I J K C D C D C D C D E F E F E F E F E F E F E F E F E F ~@78
>`.pickRestart({
  A: "d3 d4 ~ d3 c4 ~ d3 b3 ~ d3 g3 a3 b3 c4 b3@2", B: "d3 d4 ~ d3 c4 ~ d3 b3 ~ d3 g3 a3 b3 c4 b3 c4",
  C: "[d3,a3,d4,f#4]@13 ~@3", D: "[g2,b2,d3,g3,b3,g4]@13 ~@3",
  E: "~@3 [a3,d4,e4]@2 f#4@2 ~@3 [d3,d4]@2 [d3,g3,d4,g4] ~ [d4,g4] ~, [d4,f#4] d3 ~@2 d4 ~@3, ~ a3@2 ~@4 g4@5 ~@4, ~@9 g3@2 ~@2 [d3,g3]@3", // Asus4 D G5 D G5
  F: "~@3 [a3,d4,e4]@2 f#4@2 ~ [d3,g3,d4]@2 [d3,g3,d4]@2 [d3,g3,d4,g4] ~ [d4,g4] ~, [d4,f#4]@2 d3@2 ~@9 [d3,g3]@3, ~ a3@2 ~@4 g4@5 ~@4", // Asus4 G5 D G5
  G: "~ a2@2 ~, f#4@13 ~@3, ~ d4@12 ~@3, ~@2 a3@11 ~@3, ~@3 d3@8 ~@5", H: "[d3,a3,d4,f4]", I: "[a#2,f3,a#3,f4]",
  J: "[f2,c3,f3,a3,c4,f4]", K: "[a3,e4,a4,c#5,e5]",
})).s("gm_acoustic_guitar_nylon").gain(0.19)

// chords · overdriven guitar · "Lead Guitar"
const overdriven_guitar = note("<~@122 A B C@2 A B C@2 A B C@2 A B C@2 ~@30>".pickRestart({
  A: "d3@2 [b3,d4]@2 [a3,d4] f#3 e3 d3", B: "f#3@2 [a3,d4] ~ [a3,d4]@2 f#3@2 [b3,d4]@4 a3@3 ~",
  C: "[a3,c4]@2 g3@2 e3@2 c3@4 [g3,c4]!2 e3 d3 c3 ~", // Am C5
})).s("gm_overdriven_guitar").gain(0.4)

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

// drums · snare
const snare = s("sd").struct(`<
  A@8 B@4 ~@11 B@21 ~@3 C B@16 A@2 D A B@4 ~@2 B@16 E@30 ~ F B@15 G B@26 ~ F ~@2
>`.pickRestart({
  A: "~@7 x", B: "~ x ~ x", C: "~@8 x!8", D: "~@14 x!2", E: "~ x", F: "~@2 x!2", G: "~@2 x ~@2 x!3",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct(`<
  A@8 B@4 C@11 D B@3 D B@3 D B@12 A C A C ~@16 A@4 B@4 A C D B@3 D B@3 D B D B D B D B ~@78
>`.pickRestart({
  A: "~ x!3", B: "x!8", C: "x!4", D: "~ x!7",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@47 [~@2 x!2 ~@4] ~@120>").gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@46 [~@5 x!3] [x!2 ~@6] ~@7 [~@12 x!4] x ~@111>").gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@46 [x!5 ~@3] ~@8 [~@8 x!5 ~@3] ~@112>").gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  A@12 ~@11 A ~@3 A ~@3 A ~@12 A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A@9 ~ A ~@3 A ~@3 A ~ A ~ A ~ A ~@33 A ~@15 A ~@27
  A@2
>`.pickRestart({
  A: "x",
})).gain(0.64)

// drums · ride
const ride = s("rd").struct("<~@48 A B@3 A B A C A B A B A B A B ~@26 B@32 A B@15 A B@20 D ~@8>".pickRestart({
  A: "~ x!3", B: "x!4", C: "x!2 ~@2", D: "x",
})).gain(0.64)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@159 [~ x!3] [x!4]!6 ~@2>").gain(0.24)

stack(
  bass, rock_organ, string_ensemble_1, string_ensemble_1_soft, acoustic_guitar_nylon, overdriven_guitar, kick, snare,
  hihat, low_tom, mid_tom, high_tom, crash, ride, ride_soft
)

More by Grand Funk Railroad