Strudelify

Learning to Fly

Petty

KeyC majorTempo117 bpm
0:00/0:00
// Learning to Fly — Petty
// 117 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 118 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): guitar program 27.
setcpm(117/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 · fretless bass
const bass = note(`<
  ~@3 A B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C D@2 B C B C B C B C ~@7
  A B C B C B C B C B C B C B C B C D@2 ~ E F G B C B C B C B C B C B C B C B C B C B C B C B C B C B C B H
>`.pickRestart({
  A: "~@5 c2 d2 g2", B: "f2 ~ f2 ~ f2@2 c2@3 ~ c2 ~ c2 ~ c2@2", C: "a2 ~ a2 ~ a2@2 g2@3 ~ g2 ~ g2 ~ g2 ~",
  D: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~", E: "~@5 d2 c2 d2", F: "f2 ~ f2 ~ f2@2 c2@9 ~",
  G: "a2 ~ a2 ~ a2@2 g2@6 g2@3 ~", H: "a2 ~ a2 ~ a2@2 g2@3 ~ g2 ~@5",
})).s("gm_fretless_bass").gain(0.4)

// bass · fretless bass · soft notes
const bass_soft = note("<A B C D ~@54 A B A B A B C D ~@18 E F ~@32>".pickRestart({
  A: "f2@3 c2@3 c2@2", B: "a2@6 g2@5 ~ g2@4", C: "f2@6 c2@5 ~ c2@4", D: "a2@5 ~ g2@4 ~@6", E: "f2 ~ f2 ~ f2@2 c2@10",
  F: "a2 ~ a2 ~ a2@2 g2@4 ~@6",
})).s("gm_fretless_bass").gain(0.2)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B C B D E F E D E F E D E F E D E F E D E F E D E F E D E F E D E F E D E F E D E F E D E F E G@2 D E F E D E F E A
  B C B A B C B D E F E D E F E D E F E D E F E G@2 H I H I D E F E D E F E D E F E D E F E D E F E D E F E D E F E J K
>`.pickRestart({
  A: "[f2,c3,f3,a3,f4]@2 [f2,c3,f3,a3,c4,f4] [g2,c3,e3,g3,c4,e4]@2 [g2,c3,e3,g3,c4,e4]!3", // F C
  B: "[e2,a2,e3,a3,c4,e4]@2 [e2,a2,e3,a3,c4,e4] [g2,b2,d3,g3,d4,g4]@2 [g2,b2,d3,g3,d4,g4]!3", // Am G
  C: "[f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]@2 [g2,c3,e3,g3,c4,e4]@3 ~ [g2,c3,e3,g3,c4,e4]@2 [g2,c3,e3,g3,c4,e4]@2 [g2,c3,e3,g3,c4,e4]@2", // F C
  D: "[f3,a3,c4,f4]@2 [f3,a3,c4,f4] [e3,g3,c4,e4]@2 [e3,g3,c4,e4]!3", // F C
  E: "[e3,a3,c4,e4]@2 [e3,a3,c4,e4] [d3,g3,d4,g4]@2 [d3,g3,d4,g4]!3", // Am G5
  F: "[f3,a3,c4,f4] ~ [f3,a3,c4,f4] ~ [f3,a3,c4,f4]@2 [e3,g3,c4,e4]@3 ~ [e3,g3,c4,e4]@2 [e3,g3,c4,e4]@2 [e3,g3,c4,e4]@2", // F C
  G: "[d3,g3,d4,g4]!8", H: "[f3,a3,c4,f4]!4 [f3,a3,c4,f4]@2 [e3,g3,c4,e4]@7 ~@3",
  I: "[e3,a3,c4,e4]!4 [e3,a3,c4,e4]@2 [d3,g3,d4,g4]@7 ~@3", // Am G5
  J: "[f3,a3,c4,f4]@3 ~ [f3,a3,c4,f4]@2 [e3,g3,c4,e4]@3 ~ [e3,g3,c4,e4] ~ [e3,g3,c4,e4] ~ [e3,g3,c4,e4] ~", // F C
  K: "[e3,a3,c4,e4]@3 ~ [e3,a3,c4,e4]@2 [d3,g3,d4,g4]@3 ~ [d3,g3,d4,g4] ~ [d3,g3,d4,g4] ~@3", // Am G5
})).s("gm_acoustic_guitar_steel").gain(0.13)

// other · alto sax
const alto_sax = note(`<
  ~@7 A B A C ~ D ~ E A C A C A F G H I J K L ~ M A N O P Q R O D A S I J A T ~ U O V ~@10 I W I F ~ X ~ T I Y Z AA Z AB
  Z B G J Z V G AC ~ T ~@3 AD ~@2 G J K T ~ AE AF N G J G N A AG ~ T G AH ~@3 AI ~@9
>`.pickRestart({
  A: "~@14 g3!2", B: "a3 ~ c4@3 ~ c4@3 ~@7", C: "a3@2 c4@3 ~ c4@4 ~@6", D: "c4 ~ c4@4 e4@2 ~@8",
  E: "a3@2 c4@3 ~ c4@3 ~@7", F: "c4 ~ c4@4 c3@2 ~@8", G: "~@7 g3", H: "c4 ~ c4@3 ~ c4@3 ~@7", I: "~@14 g3 ~",
  J: "f4 ~ f4 ~ f4@2 e4@6 ~@4", K: "~@14 c4!2", L: "c4 ~ c4@3 ~ c4@5 ~@5", M: "f4!3 ~ f4@2 e4@5 ~@5",
  N: "c4@3 ~ c4 ~ c4@5 ~@5", O: "~@14 c3!2", P: "c4 c4@3 ~@2 c4@4 ~@6", Q: "~@14 c3 ~", R: "c4 ~ c4@4 c3@4 ~@6",
  S: "c4 ~ c4@4 c3@3 ~@7", T: "c4 ~ c4@3 ~ c4@4 ~@6", U: "f4 f4@5 e4@6 ~@4", V: "c4@3 ~ c4 ~ c4@4 ~@6",
  W: "a3 ~ c4@4 e4 ~@9", X: "c4 ~ c4@4 e4@3 ~@7", Y: "a3 c4@2 e4 ~@4", Z: "~@15 g3", AA: "a3 c4@2 c3 ~@4",
  AB: "a3 ~ c4@4 c4@2 ~@8", AC: "f4 ~ f4@3 ~ e4@3 ~@7", AD: "~@6 g4 ~", AE: "f4 f4@4 ~ e4@6 ~@4", AF: "~@14 a3 b3",
  AG: "f4 ~ f4@4 e4@3 ~@7", AH: "f4 ~ f4 ~ f4@2 e4@5 ~@5", AI: "f4 ~ f4 ~ f4@2 e4@4 c4@4 ~@2",
})).s("gm_alto_sax").gain(0.69)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~@9 A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~@3 B ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ C
>`.pickRestart({
  A: "~@6 b3@5 ~ b3@4", B: "~@3 b3@5", C: "~@6 b3@5 ~@5",
})).s("gm_electric_guitar_clean").gain(0.19).pan(0.3)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  ~@4 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@2 A B A B A B A B ~@8 A
  B A B A B A B A B A B A B A B ~@6 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C
>`.pickRestart({
  A: "[f3,c4] ~ [f3,c4] ~ [f3,c4] ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~", // F5
  B: "[a3,c4] ~ [a3,c4] ~ [a3,c4] ~ g3 ~ g3 ~ g3 ~ g3 ~ g3 ~", C: "[a3,c4] ~ [a3,c4] ~ [a3,c4] ~ g3 ~ g3 ~ g3 ~@5",
})).s("gm_electric_guitar_muted").gain(0.38)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@48 A@2 B@2 C@5 D ~@24 A@2 E@2 F E G H I J G H I J G H I J G H I J G H I J G H I J G H I J G H
>`.pickRestart({
  A: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~", B: "[g4 c5 e5 ~@4 c5@8 ~, ~@6 e5@23 ~@3]/2",
  C: "[g4 ~ g4@2 c5@2 c5@20 ~@2 g4@6 c5 ~ g4@4 d#4@2 c4@15 ~ [g3,c4]@2 c4 ~ [g3,c4]@6 [d#3,g3]@2 [c3,e3]@10]/5", // C5 D# C
  D: "a2@3 g2@5", E: "[g4,c5]@15 ~", F: "[g4,c5]", G: "~@12 [d3,e3]@2 g3 ~", H: "a3 ~ a3 ~ a3@2 g3@7 ~@3",
  I: "~@11 d3 e3@2 g3 ~", J: "a3 ~ a3 ~ a3@2 g3@6 ~@4",
})).s("gm_distortion_guitar").gain(0.46)

// drums · kick
const kick = s("bd").struct(`<
  ~@4
  [x ~@2 x!2 ~@3]!53
  [x ~@2 x!2 ~@2 x]
  x
  ~@7
  [x ~@2 x!2 ~@3]!18
  [x!8]!4
  [x ~@2 x!2 ~@3]!30
>`).gain(0.61)

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

// drums · hihat
const hihat = s("hh").struct("<~@4 [x!8]!54 ~@8 [x!8]!18 [x!4]!4 [x!8]!30>").gain(0.41)

// drums · low tom
const low_tom = s("lt").struct("<~@48 A B ~@32 A B C D E ~@31>".pickRestart({
  A: "~@2 x!6", B: "x!8", C: "~@8 x ~@2 x!2 ~@3", D: "~@5 x!3", E: "~@13 x!2 ~",
})).gain(0.34)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@48 [x!2 ~@6] ~@33 [x!2 ~@6] ~@35>").gain(0.2)

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

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@24 A B A B A B A B ~@8 A B A B A B A B ~@2 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@6 A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "~@6 x!2", B: "x!2 ~@3 x ~@2",
})).gain(0.69)

stack(
  bass, bass_soft, acoustic_guitar_steel, alto_sax, electric_guitar_clean, electric_guitar_muted, distortion_guitar,
  kick, snare, hihat, low_tom, low_tom_soft, crash, woodblocks
)

More by Petty