Strudelify

Closer to Me

The Outfield

KeyA majorTempo120 bpm
0:00/0:00
// Closer to Me — The Outfield
// 120 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 102 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): STEEL GTR.
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 · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@4 A B A C ~@8 A B A C D@2 E@2 F@2 G H ~@8 A B A C D@2 E@2 F@2 G H D@2 E@2 F@2 G H ~@8 A B A C D@2 E@2 F@2 G H D@2
  E@2 F@2 G H D@2 E@2 F@2 G H D@2 E@2 F@2 G H ~@2
>`.pickRestart({
  A: "b3, e3@7 ~", B: "~@4 d4@2 ~@4 d4@5 ~, e4@5 ~ e4@9 ~, ~@2 a3@13 ~", C: "~@2 d4 ~@2 d4@3, e4@3 e4@5, ~ a3@7",
  D: "[[g2,d3,b3,d4]@5 ~ [d3,a3,d4]@7 ~ [e3,a3,c#4]!2 [e3,a3,c#4]@16, ~@7 a2@8 ~]/2", // G D5 A
  E: "[[g2,d3,b3,d4]@5 ~ [d3,a3,d4]@7 ~ [e3,a3,c#4]!2 [e3,a3,c#4]@15 ~, ~@7 a2@8 ~]/2", // G D5 A
  F: "[[g2,d3,b3,d4]@5 ~ [d3,a3,d4]@7 ~ [e3,a3,c#4]!2 [e3,a3,c#4]@14 [f#3,b3,d4]!2, ~@7 a2@8 ~]/2", // G D5 A Bm
  G: "[b2,f#3,b3,d4]@15 ~", H: "[d3,a3,d4]@15 ~",
})).s("gm_acoustic_guitar_steel").gain(0.31).pan(0.4)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  A B C D E F G H I J K L I J K L M N M O P Q R S T U V W I J K L I J K L M N M O P Q R S T U V X T U T U T U V X Y ~@2
  Z I J K L M N M O T U T U T U V X T U T U T U V X T U T U T U V X T U T U T U V X ~@2
>`.pickRestart({
  A: "e2@2 e2@2 ~@6 c#2@2 c#2 ~ d2 ~", B: "d2!2 ~@6", C: "e2@2 e2@3 ~@5 c#2@2 c#2 ~ d2@2", D: "d2 ~ d2@3 ~@11",
  E: "e1@2 e1 ~ e1@2 e1@2 e1 ~ c#2@2 c#2 ~ d2 ~", F: "d2@2 d2@2 d2 ~ d2@2 d2@2 d2@2 d2@2 d2 ~",
  G: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ c#2 ~ c#2 ~ d2 ~", H: "d2@2 d2 ~ d2@2 d2 ~ d2@2 d2 ~ d2 ~ d2@2",
  I: "a1@2 a1@2 ~@2 a1@2 a1@2 c#2 ~ c#2@2 a1@2", J: "d2@2 d2@2 ~@2 d2@2 d2@2 c#2 ~ c#2@2 a1@2",
  K: "b1@2 b1@3 ~ b1@2 b1@2 c#2@2 c#2@2 d2@2", L: "d2@2 d2@3 ~ d2@2 d2@2 c#2 ~ c#2@2 a1@2",
  M: "e1@2 e1 ~ e1@2 e1 ~ e1 ~ c#2@2 c#2 ~ d2@2", N: "d2@2 d2@2 d2@2 d2@2 d2@2 c#2 ~ c#2@2 a1@2",
  O: "d2@2 d2@2 d2 ~ d2@2 d2@2 d2@2 d2@2 d2@2", P: "g1 ~ g1 ~ g1 ~ d2@3 ~ d2@2 ~@2 a1@2",
  Q: "a1 ~ a1 ~ a1@2 a1 ~ a1@2 a1 ~ a1@2 a1 ~", R: "g1@2 g1 ~ g1 ~ d2@3 ~ d2@3 ~ a1 ~",
  S: "a1@2 a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", T: "g1 ~ g1 ~ g1 ~ d2 ~ d2 ~ d2 ~ d2 ~ a1 ~",
  U: "a1@2 a1 ~ a1@2 a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", V: "b1 ~ b1 ~ b1@2 b1 ~ b1 ~ b1 ~ b1 ~ b1 ~",
  W: "d2@2 d2 ~ d2@2 d2 ~ d2@2 d2 ~ d2@2 a1 ~", X: "d2@2 d2 ~ d2@2 d2 ~ d2@2 d2 ~ d2@2 a1@2", Y: "a1@9 ~@7",
  Z: "~@6 d2@2 ~@2 c#2 ~ c#2 ~ a1@2",
})).s("gm_fretless_bass").gain(0.49)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@8 A B C B A B C B D E D F ~@8 A B C B A B C B D E D F ~@16 A B C B A B C B D E D F ~@34
>`.pickRestart({
  A: "[a2,e3]@2 [a2,e3]@2 ~@2 [a2,e3]@2 [a2,e3]@2 [c#3,g#3] ~ [c#3,g#3]@2 [a2,e3]@2", // A5 C#5 A5
  B: "[d3,a3]@2 [d3,a3]@2 ~@2 [d3,a3]@2 [d3,a3]@2 [c#3,g#3] ~ [c#3,g#3]@2 [a2,e3]@2", // D5 C#5 A5
  C: "[b2,f#3]@2 [b2,f#3]@2 ~@2 [b2,f#3]@2 [b2,f#3]@2 [c#3,g#3] ~ [c#3,g#3]@2 [d3,a3]@2", // B5 C#5 D5
  D: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ c#3 ~ c#3 ~ d3 ~", E: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ c#3 ~ c#3 ~ a2 ~",
  F: "d3@2 d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~",
})).s("gm_electric_guitar_muted").gain(0.31).pan(0.6)

// chords · flute
const flute = note(`<
  ~@20 A B@2 C D E F G H ~@11 A B@2 C D I F G J ~@19 A K A C D I F G L K A C D I F G M ~@5 N O P ~@9
>`.pickRestart({
  A: "~@4 [g4,b4]@2 [f#4,a4]@3 ~ [f#4,a4]@2 [f#4,a4]@2 [f#4,a4]@2", // G F#m
  B: "[[f#4,a4]@2 [e4,a4]@2 [e4,a4]@3 ~ [e4,a4]@4 [d4,f#4]@2 [c#4,e4]@4 ~@2 [g4,b4]@2 [f#4,a4]@3 ~ [f#4,a4]@2 [f#4,a4]@2 [f#4,a4]@2]/2", // F#m A5 D C#m G F#m
  C: "[f#4,a4] [e4,a4]!3 [a4,c#5]@2 [f#4,b4] [e4,a4]", D: "~@4 [g4,b4]@2 [f#4,a4]@3 ~ f#4@2 f#4@2 f#4@2",
  E: "f#4@2 e4@2 e4@3 ~ e4@4 f#4@3 ~", F: "~@4 [f#4,b4]@2 [f#4,b4]@3 ~ [f#4,a4]@2 [f#4,a4]@2 [f#4,a4]@2",
  G: "[f#4,a4]@2 [e4,a4]@2 [f#4,a4]@3 ~ [f#4,a4]@2 [e4,a4]@2 [f#4,a4]@2 [f#4,a4]@2", H: "~ [d4,f#4] [c#4,e4]@2 ~@12",
  I: "f#4@2 e4@2 e4@3 ~ e4@4 f#4@4", J: "~ [e4,g4] [b3,d4]@3 ~@11",
  K: "[f#4,a4]@2 [e4,a4]@2 [e4,a4]@3 ~ [e4,a4]@4 [d4,f#4]@2 [c#4,e4]@2", // F#m A5 D C#m
  L: "~ [e4,g4] [d4,f#4]@2 [g4,b4]@2 [f#4,a4]@3 ~ [f#4,a4]@2 [f#4,a4]@2 [f#4,a4]@2", M: "~ [e4,g4] [d4,f#4]@3 ~@11",
  N: "~@4 [f#4,b4]@2 [f#4,b4]@3 ~ [f#4,a4] ~ a4@2 [f#4,a4] ~, ~@12 f#4 ~@3", // B5 F#m
  O: "[f#4,a4] a4 [f#4,a4] ~ [f#4,a4] e4 [f#4,a4]!2, ~@2 e4 ~@7 a4 ~@5", P: "~ [e4,g4] [d4,f#4]@2 ~@12",
})).s("gm_flute").gain(0.29).pan(0.4)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@48 A B C D A E F G@2 ~@26 H A I C J A K L A@2 I C J A K L M@3>".pickRestart({
  A: "d5!8", B: "d5 c#5!2 ~ c#5@3 d5", C: "d5!7 e5", D: "e5!3 ~ e5@3 d5", E: "d5 c#5!2 ~ c#5@3 b4", F: "b4!5 a4 b4 d5",
  G: "[d5 c#5 d5 c#5 d5 c#5 d5 c#5@3 ~@6]/2", H: "~@7 d5", I: "d5 c#5!2 ~ c#5!3 d5", J: "e5!7 d5",
  K: "d5 c#5!2 ~ c#5!3 b4", L: "b4!5 c#5!2 d5", M: "[d5!7 c#5@17]/3",
})).s("gm_overdriven_guitar").gain(0.4).pan(0.6)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~@4 A@4 ~@8 A@4 B@2 C@2 D@2 E F ~@8 A@4 B@2 C@2 D@2 E F B@2 C@2 D@2 E F ~@8 A@4 B@2 C@2 D@2 E F B@2 C@2 D@2 E F B@2
  C@2 D@2 E F B@2 C@2 D@2 E F ~@2
>`.pickRestart({
  A: "[b4@14 a4@18 b4@14 a4@17 ~, e5@63 ~]/4", B: "[[d5,g5]@3 [d5,f#5]@4 [c#5,e5]@9]/2",
  C: "[[d5,g5]@3 [d5,f#5]@4 [c#5,e5]@8 ~]/2", D: "[[d5,g5]@5 ~ [d5,f#5]@7 ~ [c#5,e5]@17 ~]/2", E: "[d5,f#5]@15 ~",
  F: "[d5,f#5]", // D
})).s("gm_percussive_organ").gain(0.2)

// chords · clavinet
const clavinet = note("<~@56 A B C D E F G H ~@38>".pickRestart({
  A: "e4 ~ e4!6 ~ e4 ~ e4!5", B: "[d4,e4]!4 e4!2 [d4,e4] e4 [d4,e4] e4 [d4,e4]!4 e4 [d4,e4]",
  C: "e4!3 ~ e4 ~ e4 ~ e4!8", D: "[d4,e4] e4 [d4,e4] d4 ~@2 [d4,e4]!5 e4!2 [d4,e4]!3", E: "e4!5 ~ e4!2 ~ e4!7",
  F: "[d4,e4]!3 d4 e4 ~ [d4,e4] d4 [d4,e4]!2 e4!2 [d4,e4]!3 e4", G: "e4!9 ~ e4 ~ e4!4",
  H: "~ e4 [d4,e4]!2 e4!2 [d4,e4]!6 e4!2 [d4,e4] ~", // Dsus2
})).s("gm_clavinet").gain(0.16)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note(`<
  A B C D E@2 F@2 ~@8 E@2 F@2 G@4 H@2 I J ~@8 E@2 F@2 G@4 H@2 I J G@4 H@2 I J ~@8 E@2 F@2 G@4 H@2 I J G@4 H@2 I J G@4
  H@2 I J G@4 H@2 I J ~@2
>`.pickRestart({
  A: "[b3,e4]@2 [b3,e4]@3 ~@5 [g#3,c#4]@2 [g#3,c#4]@2 [a3,d4]@2", B: "[a3,d4]@2 [a3,d4]@3 ~@11",
  C: "[b3,e4]@2 [b3,e4]@3 ~@5 [g#3,c#4]@2 [g#3,c#4] ~ [a3,d4]@2", D: "[a3,d4] ~ [a3,d4]@3 ~@11",
  E: "[[b3,e4]@9 ~ [g#3,c#4]@3 ~ [a3,d4]@17 ~]/2", F: "[[b3,e4]@9 ~ [g#3,c#4]@2 ~@2 [a3,d4]@17 ~]/2",
  G: "[[d3,g3]@6 [a3,d4]@8 [e3,a3]@17 ~]/2", H: "[[d3,g3]@3 [a3,d4]@4 [e3,a3]@9]/2", I: "[f#3,b3]@15 ~", J: "[a3,d4]",
})).s("gm_overdriven_guitar").gain(0.25).pan(0.7)

// chords · lead 5 charang · "CHARANG"
const lead_5_charang = note(`<
  A B C D E@4 ~@8 E@4 F@6 G H ~@8 E@4 F@6 G H F@6 G H ~@8 E@4 F@6 G H F@6 G H F@6 G H F@6 G H ~@2
>`.pickRestart({
  A: "[e3,b3]@2 [e3,b3]@3 ~@5 [c#3,g#3]@2 [c#3,g#3] ~ [d3,a3]@2", B: "[d3,a3]@2 [d3,a3]@3 ~@11",
  C: "[e3,b3]@2 [e3,b3]@3 ~@5 [c#3,g#3]@2 [c#3,g#3]@2 [d3,a3] ~", D: "a3@2 [d3,a3]@3 ~@11, d3 ~@15",
  E: "[[e3,b3]@9 ~ [c#3,g#3]@3 ~ [d3,a3]@17 ~]/2", F: "[[g2,d3]@5 ~ [d3,a3]@7 ~ [a2,e3]@17 ~]/2", G: "[b2,f#3]@15 ~",
  H: "[d3,a3]@15 ~", // D5
})).s("gm_lead_5_charang").gain(0.25).pan(0.2)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel_2 = note(`<
  ~@20 A ~ A ~ A ~@2 B ~@12 A ~ A ~ A ~@2 B ~@20 A ~ A ~ A ~@2 B A ~ A ~ A ~@2 B ~@18
>`.pickRestart({
  A: "a4@5 ~ f#4@7 ~@3", B: "f#4@15 ~",
})).s("gm_acoustic_guitar_steel").gain(0.29).pan(0.6)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_3 = note("<~@48 A B A B A C D E@2 ~@26 F A G H A@2 I J K A G H A@2 I J L@3>".pickRestart({
  A: "a4!8", B: "a4!3 ~ a4@3 a4", C: "a4!3 ~ a4@3 d4", D: "d4!7 f#4", E: "[f#4 e4 f#4 e4 f#4 e4 f#4 e4@4 ~@5]/2",
  F: "~@7 a4", G: "a4!3 ~ a4!4", H: "a4!4 a4@2 a4!2", I: "a4!3 ~ a4!3 d4", J: "d4!5 e4!2 f#4", K: "f#4!8",
  L: "[f#4!7 e4@17]/3",
})).s("gm_overdriven_guitar").gain(0.4).pan(0.4)

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

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

// drums · hihat
const hihat = s("hh").struct(`<
  A B A@2 ~@4 C D E F@2 D@2 G H I J K ~@8 C D E F@2 D@2 G H I J K ~@20 H D@2 G H I J K ~@34
>`.pickRestart({
  A: "~ x ~@2", B: "~ x ~ x", C: "~ x!2 ~ x ~ x ~", D: "x!4", E: "x ~ x!3 ~ x!2", F: "x!7 ~", G: "x ~ x ~ x ~ x!2",
  H: "~ x!6 ~", I: "x!3 ~ x ~ x!2", J: "~ x!4 ~ x!2", K: "x ~ x ~ x!4",
})).gain(0.33)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@8 A B C ~ D B@2 E D F G H ~@8 A B C ~ D B@2 E D F G H ~@20 D B@2 E D F G H ~@34
>`.pickRestart({
  A: "~@3 x ~ x ~ x", B: "~ x ~ x ~ x ~ x", C: "~ x ~@3 x ~@2", D: "~@7 x", E: "~ x ~ x ~ x ~@2", F: "~@3 x ~ x ~@2",
  G: "~@5 x ~@2", H: "~ x ~@6",
})).gain(0.16)

// drums · open hat
const open_hat = s("oh").struct("<~@11 [~@7 x] ~@19 [~@7 x] ~@70>").gain(0.44)

// drums · crash
const crash = s("cr").struct(`<
  A ~ A ~ B ~ B ~ B ~@7 B ~ B ~ C ~ C ~ C ~ B@3 ~@7 B ~ B ~ C ~ C ~ C ~ B@2 C ~ C ~ C ~ B@3 ~@7 B ~ B ~ C ~ C ~ C ~ B@2
  C ~ C ~ C ~ B@2 C ~ C ~ C ~ B@2 C ~ C ~ C ~ B@2 ~@2
>`.pickRestart({
  A: "x ~@4 x ~ x", B: "x", C: "x ~@6 x",
})).gain(0.38)

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

// drums · ride · soft notes
const ride_soft = s("rd").struct(`<
  ~@21 A B ~ B ~ C D ~@13 A B ~ B ~ C D ~ A B ~ B ~ C E ~@13 A B ~ B ~ C D ~ A B ~ B ~ C D ~ A B ~ B ~ C D ~ A B ~ B ~ C
  D ~@2
>`.pickRestart({
  A: "x ~@4 x ~@2", B: "~ x ~@6", C: "~ x ~ x ~ x ~ x", D: "~@3 x ~@4", E: "~@3 x ~@3 x",
})).gain(0.22)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@20 A B C D E F G H ~@12 A B C D E F G H A B C D E F G H ~@12 A B C D E F G H A B C D E F G H A B C D E F G H A B C D
  E F G I ~@2
>`.pickRestart({
  A: "x!16", B: "x!11 ~ x ~ x!2", C: "x ~ x!5 ~ x ~ x ~ x ~ x ~", D: "x!8", E: "x ~ x!5 ~ x!3 ~ x ~ x!2",
  F: "x!5 ~ x ~ x ~ x ~ x ~ x ~", G: "x ~ x ~ x ~ x ~ x!7 ~", H: "x!5 ~ x ~ x!3 ~ x!4", I: "x!5 ~ x ~ x!3 ~ x!3 ~",
})).gain(0.16)

// drums · tambourine · soft notes
// … 13 more lines