Strudelify

The Captain of Her Heart

Double

KeyB♭ majorTempo96 bpm
0:00/0:00
// The Captain of Her Heart — Double
// 96 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 111 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(96/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@8 B C D E B C D E B C F@2 D C B@2 G H C B G H C B G H C B G H C B A@4 G H C B G H C B A@8 B C D E B C D E B C F@2 D
  C B@2 G H C B G H C B G H C B G H C B G H C B G H C B G H C B G H C B G H I
>`.pickRestart({
  A: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~", B: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~",
  C: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~", D: "gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~",
  E: "gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ ab2 ~ ab2 ~", F: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~",
  G: "c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~", H: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  I: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~@5",
})).s("gm_acoustic_bass").gain(0.26)

// chords · pad warm · "WARM PAD"
const pad_warm = note(`<
  A@8 B@4 C@4 D@2 E@4 F@2 G@3 H G@3 I J@3 K J@3 K ~@4 J@3 K J@3 K ~@8 B@4 L@4 M@2 E@4 N@2 J@3 K J@3 K J@3 K J@3 K J@3 K
  J@3 K J@3 K J@3 K J@3
>`.pickRestart({
  A: "[[bb1,f3,bb3,db4,eb4]@63 ~]/4", B: "[[bb3,db4]@15 ~ [ab3,c4]@15 ~ [gb3,bb3,db4]@32, f4]/4",
  C: "[~@16 [ab3,c4]@15 ~ [gb3,bb3,db4]@32, f4, [bb3,db4] ~]/4", D: "[[bb3,db4] [ab3,c4], f4@31 ~]/2",
  E: "[[g3,bb3]@31 ~ gb3@15 ~ [ab3,c4]@16, eb4]/4", F: "[f3,ab3,bb3,db4]/2",
  G: "[g3 a3 [ab3,eb4], [c4,g4], e4@31 ~@17]/3", H: "[f3,bb3,d4,f4]", I: "[f3,bb3,d4,f4]@15 ~",
  J: "[g3 a3 [ab3,eb4], c4, e4@31 ~@17]/3", K: "[f3,bb3,d4]@15 ~",
  L: "[~@16 [ab3,c4]@15 ~ [gb3,bb3]@32, f4, [bb3,db4]@32 db4@15 ~@17]/4", M: "[~ [ab3,c4], [bb3,db4,f4]]/2",
  N: "[f3,bb3,db4]/2", // Bbm
})).s("gm_pad_warm").gain(0.15).pan(0.7)

// chords · pad warm · "WARM PAD" · soft notes
const pad_warm_soft = note("<~@40 A@4 ~@8 A@8 ~@51>".pickRestart({
  A: "[[f3,bb3,db4,eb4]@63 ~]/4", // Bbm
})).s("gm_pad_warm").gain(0.1).pan(0.7)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  A@8 B ~@15 C D@2 E ~@4 F D@2 E ~@4 G@4 H I@2 E ~@4 J@8 K@4 ~ L@3 M@2 N@2 O@2 P ~ Q D@2 E ~@2 R ~ S T@2 E ~@12 U D@2 V
  W ~@3 U D@2
>`.pickRestart({
  A: "[~@31 ab3, ~@2 f3@12 f4@29 db4@9 bb3@7 db4 bb3@4, ~@2 bb3@7 f3@6 bb3@2 f3@6 f4@9, ~@6 db4@5 db4@9 bb3@7 db4@9 bb3@14 f3@14, ~@4 eb4@7 db4 eb4@7 db4 eb4@7 db4 eb4@4]/4",
  B: "~@3 ab4@4 ~", C: "~@2 e4@2 g4@2 e4 ~ g4@2 e4 ~ g4@2 ~ a4, ~@2 eb4 ~@13",
  D: "[~@6 e4!3 ~ e4 f4 ~ g4 ~ eb4@3 c4 ~@13]/2", E: "~@6 bb3 ~ d4@2 eb4 d4 ~ bb3 ~ c4",
  F: "~@2 e4 ~ g4 ~ e4 ~ g4 ~@3 g4@2 ~ a4",
  G: "[~@2 f3@2 bb3@2 db4@2 eb4@3 ~@7 f3@2 bb3@2 db4@2 eb4@3 ~@7 f3@2 bb3@2 db4@2 eb4@3 ~@3 f4@2 ~@2 f3@2 bb3@2 db4@2 eb4@4 db4@4, db2@7 f4@2 ~@6 bb3@2 ~@15, ~@11 db4@7 ~@9 db4@7 ~@9 db4@7 ~@14, ~@16 db2@14 ~@2 db2@14 ~@2 db2@15 ~]/4",
  H: "c4@13 ~@3", I: "[~@6 e4 d4 [eb4,e4] ~ e4 f4 ~ g4 ~ eb4@3 c4 ~@13]/2",
  J: "[~@31 ab3, db2@6 db2@5 db4@7 f3@12 bb3@2 db2@2 f3@12 f4@13 db4 bb3@4, ~ f3@6 f4@12 db4 eb4@7 db2@5, ~@4 bb3@12 db2@4 bb3@2 db4@2 eb4@14 db2@5 db4@7 f3@14, ~@6 db4@2 eb4@14 db2@5 db4@9 bb3@12 db2@4 bb3@2 db4@2 eb4@8]/4",
  K: "[~@3 bb3@9 [ab3,db4]@3 ~@3 [db4,f4] [db4,f4]@2 [db4,f4]@2 [db4,f4]@2 [db4,f4]@2 [db4,f4]@2 ~@3, ~@15 [bb3,eb4]@4 ~@13]/4", // Db5 Db Eb5
  L: "[~@8 [ab3,db4]@4 [bb3,eb4]@2 ~@6 [db4,f4]@2 [db4,f4]@8 [db4,f4]@17 ~, ~@7 [bb3,eb4]@4 ~@13]/3", // Db5 Eb5 Db Eb5
  M: "[~ [f4,bb4]!2 f4@2 [db4,f4]!2 [db4,f4]@6 ~@3, ~@3 bb4@4 ~@9]/2", // Bb5 Db
  N: "[~@3 [g3,bb3] ~ [bb3,db4]@2 [g3,bb3]@7 ~@2]/2", O: "[~@3 [bb3,eb4]@2 [ab3,db4]@2 [bb3,eb4]@5 [ab3,db4]@4]/2",
  P: "~ f3@15, [bb0,bb3]@15 ~", Q: "~@2 e4@2 g4@2 e4 ~ g4@2 e4 ~ g4@2 e4 a4, ~@2 eb4 ~@13", R: "~@7 a3 c4 d4 ~@6",
  S: "~@2 e4@2 g4 ~@3 g4@2 ~@2 g4@2 ~ a4, ~@2 eb4 ~@13", T: "[~@6 e4!3 ~@2 f4 ~ g4 ~ eb4@3 c4 ~@13]/2",
  U: "~@2 e4@2 g4 ~ e4 ~ g4@2 ~@2 g4@2 ~ [ab4,a4], ~@2 eb4 ~@13", // Amaj7
  V: "~@6 [bb2,bb3] ~ [d3,d4]@2 [eb3,eb4] d4 ~ [bb2,bb3] ~ [c3,c4]", W: "~@10 [c3,c4]!2 ~@4",
})).s("gm_piano").gain(0.46).pan(0.3)

// chords · piano · "A.PIANO 2" · soft notes
const piano_soft = note("<~@24 A ~@7 B ~@28 C ~ D@2 ~ E@2 ~@6 F ~@9 G H ~@14 I ~@2 J ~@4 I ~@2>".pickRestart({
  A: "~@14 e4 ~", B: "~@10 e4 ~@3 e4 ~", C: "~@6 [bb3,eb4] ~", D: "[~@5 [db4,f4]@2 [db4,f4]@2 [db4,f4]@2 [db4,f4]@5]/2",
  E: "[~@12 [bb3,eb4]@19 ~]/2", F: "bb1@15 ~", G: "~@6 e4 ~@3 e4 ~@3 e4 ~", H: "~@10 e4 ~@5",
  I: "~@2 d4 ~@7 e4 ~@3 e4 ~", J: "~@11 d3 ~@4",
})).s("gm_piano").gain(0.23).pan(0.3)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A@8 B C D@2 B C D@2 B C E@2 F G H@2 I J@7 K@8 ~@4 K@8 ~@8 L@4 M@4 N@2 O@4 P@2 I J@7 K@8 Q@3 R Q@3 R Q@3 R Q@3 R S@3
>`.pickRestart({
  A: "[[bb1,f3,bb3,db4,eb4]@63 ~]/4", B: "[bb3,db4,f4]", C: "[ab3,c4,f4]", D: "[gb3,bb3,db4,f4]/2", E: "[g3,bb3,eb4]/2",
  F: "[gb3,bb3,eb4]", G: "[ab3,bb3,eb4]", H: "[~@7 ab3@24 ~, [f3,bb3,db4]]/2", I: "g4", J: "g4/7", K: "g4/8",
  L: "[[bb3,db4]@15 ~ [ab3,c4]@15 ~ [gb3,bb3,db4]@32, f4]/4", // Bbm Ab Gb
  M: "[[bb3,db4]@16 [ab3,c4]@15 ~ [gb3,bb3]@32, f4, ~@32 db4@15 ~@17]/4", N: "[[bb3,db4] [ab3,c4], f4@31 ~]/2",
  O: "[[g3,bb3]@31 ~ gb3@15 ~ [ab3,c4]@16, eb4]/4", P: "[[bb3,db4,f4]@31 ~]/2",
  Q: "[g3 a3 [ab3,eb4], c4, e4@31 ~@17]/3", R: "[f3,bb3,d4]@15 ~", S: "[g3 a3 ab3, c4, e4@31 ~ eb4@12 ~@4]/3",
})).s("gm_synth_strings_1").gain(0.07).pan(0.2)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@24 A@7 B C@8 ~@4 C@8 ~@24 A@7 B C@8 ~@19>".pickRestart({
  A: "[g3 a3 [ab3,eb4] [bb3,d4,f4] ~ a3 [ab3,eb4], g4, c4@3 ~ c4@3, e4@2 ~@2 e4@2 ~]/7", B: "[bb3,d4,f4]",
  C: "[~@8 a3@8 [ab3,eb4]@8 [bb3,d4,f4]@8 ~@8 a3@8 [ab3,eb4]@8 [bb3,d4,f4]@7 ~, g4, c4@3 ~ c4@3 ~, e4 ~ e4 ~]/8", // Ab5 Bb Ab5 Bb
})).s("gm_string_ensemble_2").gain(0.04).pan(0.3)

// chords · pad sweep · "SWEEP PAD"
const pad_sweep = note("<~@24 A@2 ~@6 A@2 ~@42 A@2 ~@33>".pickRestart({
  A: "[c4,e4,g4]/2", // C
})).s("gm_pad_sweep").gain(0.09).pan(0.2)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~@24 A B C D A B C D A B C D A B C D ~@4 A B C D A B C D ~@24 A B C D A B C D A B C D A B C D A B C D A B C D A B C D
  A B C D A B E
>`.pickRestart({
  A: "~@2 [e3,g3,c4,e4] ~@2 [e3,g3,c4,e4] ~@2 [e3,g3,c4,e4] ~ [e3,g3,c4,e4] [e3,g3,c4] [e3,g3,c4,e4]!2 ~@2", // C
  B: "~@2 [e3,a3,c4,e4] ~@2 [e3,a3,c4,e4] ~ a3 [e3,a3,c4,e4] ~ [e3,a3,c4,e4] [e3,a3] [e3,a3,c4,e4]!2 ~ a3", // Am A5 Am
  C: "~@2 [ab3,c4,eb4,g4] ~@2 [ab3,c4,eb4,g4] ~ c4 [ab3,c4,eb4,g4] ~ [ab3,c4,eb4]!2 [ab3,c4,eb4,g4]!2 ~@2", // Abmaj7 Ab Abmaj7
  D: "~@2 [g3,bb3,d4,g4] ~@2 [g3,bb3,d4,g4] ~ [g3,bb3,d4] [g3,bb3,d4,g4] ~ [g3,bb3,d4,g4] [g3,bb3,d4] [g3,bb3,d4,g4]!2 ~ [d4,g4]", // Gm G5
  E: "~@2 [ab3,c4,eb4,g4] ~@2 [ab3,c4,eb4,g4] ~@10", // Abmaj7
})).s("gm_acoustic_guitar_nylon").gain(0.06).pan(0.9)

// chords · acoustic guitar nylon · "NYLON GTR" · soft notes
const acoustic_guitar_nylon_2 = note(`<
  ~@24 A B C D A B C D A B C D A B C D ~@4 A B C D A B C D ~@24 A B C D A B C D A B C D A B C D A B C D A B C D A B C D
  A B C D A B ~
>`.pickRestart({
  A: "~@7 [e3,g3,c4,e4] ~@3 e4 ~@3 [e3,g3,c4,e4]", B: "~@7 [e3,c4,e4] ~@7 [e3,c4,e4]",
  C: "~@7 [ab3,eb4,g4] ~@7 [ab3,c4,eb4,g4]", D: "~@7 g4 ~@7 [g3,bb3]",
})).s("gm_acoustic_guitar_nylon").gain(0.04).pan(0.9)

// other · orchestral harp · "HARP"
const orchestral_harp = note("<~@58 A B@2 C ~@30 D@2 E F D@2 E F D@2 E F D@2 E F D@2 G>".pickRestart({
  A: "db3 [eb3,f3] [ab3,bb3] [db4,eb4] [f4,ab4] [bb4,db5,eb5] [f5,ab5] [bb5,db6] [eb6,f6] [bb5,db6,eb6] [f5,ab5] [db5,eb5] [ab4,bb4] [eb4,f4] [bb3,db4] [f3,ab3]", // Ebsus2 Absus2 Dbsus2 Fm Eb7 Fm Bbm Ebsus2 …
  B: "[db3,eb3] [eb3,f3] [ab3,bb3] [db4,eb4] [f4,ab4] [bb4,db5,eb5] [f5,ab5] [bb5,db6] [eb6,f6] [bb5,db6,eb6] [f5,ab5] [db5,eb5] [ab4,bb4] [eb4,f4] [bb3,db4] [f3,ab3]", // Dbsus2 Ebsus2 Absus2 Dbsus2 Fm Eb7 Fm Bbm …
  C: "eb3 ~@15", D: "[g3,g4] [c4,c5] [b3,b4] [g3,g4]@4 [e3,e4]",
  E: "[g3,g4]@2 [c4,c5]@2 [bb3,bb4]@2 [c3,c4]@4 [d3,d4]@3 ~ [eb3,eb4]@2", F: "~@2 [f3,f4]@3 ~ [g3,g4]@7 ~@3",
  G: "[g3,g4] [c4,c5] [bb3,bb4] [c3,c4]@2 ~@3", // G C Bb C
})).s("gm_orchestral_harp").gain(0.11)

// chords · epiano2 · "E.PIANO 2" · C
const epiano2 = note("<~@24 [~@3 c5@4 ~@9, [g4,e5]@7 ~@9] ~@86>").s("gm_epiano2").gain(0.08).pan(0.1)

// other · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note("<~@92 A@2 B C A@2 B C A@2 B C A@2 B C A@2 D>".pickRestart({
  A: "g4 c5 b4 g4@4 e4", B: "g4@2 c5@2 bb4@2 c4@4 d4@3 ~ eb4@2", C: "~@2 f4@3 ~ g4@7 ~@3", D: "g4 c5 bb4 c4@2 ~@3",
})).s("gm_acoustic_guitar_steel").gain(0.28)

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

// drums · snare
const snare = s("sd").struct("<A@4 B@3 C B@35 C B@8 ~ D ~ D ~ D ~ C B@50 A>".pickRestart({
  A: "~ x ~@2", B: "~ x ~ x", C: "~ x ~@2 x!2 ~@4 x!3 ~@2 x", D: "~@3 x",
})).gain(0.48)

// drums · low tom
const low_tom = s("lt").struct("<A@8 ~@32 A@4 ~@8 A ~ A ~ A ~ A ~@52>".pickRestart({
  A: "~@3 x",
})).gain(0.42)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C
  ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C
>`.pickRestart({
  A: "x!2 ~ x", B: "~ x ~ x", C: "x!2 ~@2",
})).gain(0.12)

// drums · crash
const crash = s("cr").struct("<~@8 x ~@51 x ~@50>").gain(0.24)

// drums · tambourine
const tambourine = s("tb").struct("<~@42 A ~@9 A ~ A ~ A ~ A ~@4 A ~@3 A ~ A ~ A ~ A ~ A ~@35>".pickRestart({
  A: "~@3 x",
})).gain(0.54)

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

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@8 A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A
  B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B D
>`.pickRestart({
  A: "~@5 x!3 ~@6 x ~", B: "~@3 x ~@3 x", C: "~@5 x ~@2", D: "~@3 x ~@4",
})).gain(0.61)

// drums · claves
const claves = s("clave:2").struct("<A ~ A ~ A ~ A ~@33 A ~ A ~@9 A ~ A ~ A ~ A ~@52>".pickRestart({
  A: "~@3 x ~@2 x ~@9",
})).gain(1.76)

stack(
  bass, pad_warm, pad_warm_soft, piano, piano_soft, synth_strings_1, string_ensemble_2, pad_sweep,
  acoustic_guitar_nylon, acoustic_guitar_nylon_2, orchestral_harp, epiano2, acoustic_guitar_steel, kick, snare, low_tom,
  hihat, hihat_soft, crash, tambourine, cabasa, cabasa_soft, claves
)