Strudelify
Again cover art
KeyA majorTempo78 bpm
0:00/0:00
// Again — Lenny Kravitz
// 78 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 11 overdriven guitar (copy of ch 7 overdriven guitar, 0.25 beats late)
// note: Full arrangement: all 91 bars on a 48-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(78/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
const bass = note(`<
  ~ A B C@2 D E F E D E F E A B G H A B G H I E F E D E F E A B G H A B G J K ~@3 L B G H L M N J A B G H A B O P A B G
  H A B Q R A B G H A B O P A B G S A B O P A B G J A B O P T@2
>`.pickRestart({
  A: "a1@3 ~@3 a1@5 ~ a1@3 ~@3 a1@5 ~ a1@2 ~@4 a1@5 ~ a1@2 ~@4 a1@5 ~",
  B: "f#1@3 ~@3 f#1@6 f#1@3 ~@3 f#1@5 ~ f#1@2 ~@4 f#1@5 ~ f#1@3 ~@3 f#1@6",
  C: "[e2@3 ~@3 e2@6 e2@3 ~@3 e2@5 ~ e2@2 ~@4 e2@5 ~ e2@3 ~@3 d2@53 ~]/2",
  D: "d2@3 ~@3 d2@5 ~ d2@3 ~@3 d2@5 ~ d2@2 ~@4 d2@5 ~ d2@2 ~@4 d2@5 ~",
  E: "e2@3 ~@3 e2@6 e2@3 ~@3 e2@5 ~ f#2@2 ~@4 f#2@5 ~ f#2@3 ~@3 f#2@6",
  F: "d2@3 ~@3 d2@6 d2@3 ~@3 d2@5 ~ d2@2 ~@4 d2@5 ~ d2@3 ~@3 d2@5 ~",
  G: "e2@3 ~@3 e2@6 e2@3 ~@3 e2@5 ~ e2@2 ~@4 e2@5 ~ e2@3 ~@3 e2@6",
  H: "d2@3 ~@3 d2@5 ~ d2@3 ~@3 d2@5 ~ d2@2 ~@4 d2@5 ~ d2@3 ~@3 d2@6",
  I: "d2 ~@5 d2@5 ~ d2@3 ~@3 d2@5 ~ d2@2 ~@4 d2@5 ~ d2@2 ~@4 d2@5 ~",
  J: "d2@3 ~@3 d2@5 ~ f#1@3 ~@3 f#1@5 ~ g1@2 ~@4 g1@5 ~ g#1@3 ~@3 g#1@6", K: "a1 ~@7",
  L: "a1@3 ~@3 a1@5 ~ a1@3 ~@3 a1@5 ~ a1@2 ~@4 a1@5 ~ a1@2 ~@4 g#1@5 ~",
  M: "f#1@3 ~@3 f#1@6 f#1@3 ~@3 f#1@5 ~ f#1@2 ~@4 f#1@5 ~ f#2@3 f#2@2 ~ f2@6",
  N: "e2@3 ~@3 e2@2 e2@3 ~ e2@3 ~@3 e2@2 e2@3 ~ e2@2 ~@4 e2@2 e2@3 ~ e2@3 e2@2 ~ d#2@6",
  O: "e2@3 ~@3 e2@6 e2@3 ~@3 e2@5 ~ e2@2 ~@4 e2@5 ~ e2@3 ~@3 b2@6",
  P: "a2@3 ~@3 a2@6 c#2@3 ~@3 c#2@5 ~ d2@2 ~@4 e2@5 ~ f#2@3 ~@2 e2@6 ~",
  Q: "e2@3 ~@3 e2@6 e2@3 ~@3 e2@5 ~ e2@2 ~@4 e2@5 ~ f#1@3 ~@3 f#1@6",
  R: "d2@3 ~@3 d2@6 f#1@3 ~@3 f#1@5 ~ g1@2 ~@4 g1@5 ~ g#1@3 ~@2 g#1@6 ~",
  S: "d2@3 ~@3 d2@5 ~ d2@3 ~@3 d2@5 ~ d2@2 ~@4 e2@5 ~ d2@3 ~@3 d2@6", T: "a1/2",
})).s("gm_electric_bass_finger").gain(0.65)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~ A@4 B C B C B C B C D@3 B D@3 B@2 C B C B C B C D@3 B D@3 B E@4 D@3 B D@3 B D@3 B D@3 B D@3 B D@3 B D@3 B D@3 B D@3
  B D@3 B D@3 B D@3 B F@2
>`.pickRestart({
  A: "[c#4@8 b3@15 [d4,f#4]@9, a3@191 ~, e4@23 ~@9]/4", B: "[a3,d4,f#4]", C: "[g#3,b3,e4]@3 [f#3,a#3,c#4]@5",
  D: "[c#4 ~ g#3, e4@143 ~, a3@95 ~@49, ~ b3@2]/3", E: "[[a2,a3,c4] [e3,g3,b3] [a2,a3,c4] [e3,g3,b3], e4]/4",
  F: "[[a3,c#4,e4]@95 ~]/2", // A
})).s("gm_synth_strings_1").gain(0.36).pan(0.6)

// other · overdriven guitar
const overdriven_guitar = note("<~@40 A B C@2 D E F G H ~@42>".pickRestart({
  A: "~@30 d4@11 ~ d4@5 ~", B: "b4@47 ~", C: "[b4@44 ~@2 a4@4 e5@25 ~ e5@4 d5@3 ~ c#5@3 ~ d5@4 e5@4]/2",
  D: "b4@9 a4@2 b4@2 a4@2 ~ a4 ~@2 a4 ~@2 a4@2 ~ a4@2 e4@3 a4@3 g#4@3 a4@3 b4@3 c#5@3 d5@3, ~@15 b4@2 ~ b4@2 ~ b4@2 ~ b4@2 ~@22",
  E: "e5@17 ~ e5@10 ~ e5@8 ~@4 a5@7", F: "~@5 a5@23 ~@2 b5@7 ~ b5@5 ~ b5@4",
  G: "a5@5 ~ b5@3 ~ a5@16 ~@3 b5@4 c6@2 ~ b5@10 ~@2",
  H: "a5@3 b5@3 a5@9 ~@3 [a3,c4]@3 [a3,c4]@3 c4@2 a3@2 ~ a3@3 [g2,g3]@10 a3@4 ~@2, ~@14 c4 ~@9", // Am G
})).s("gm_overdriven_guitar").gain(0.56).pan(0.4)

// chords · distortion guitar
const distortion_guitar = note(`<
  ~ A@4 B@4 C@2 B@2 D@8 E@2 B@2 C@2 B@2 F@8 ~@4 F@24 G@8 H ~@3 H ~@3 H ~@3 H ~@3 I@2
>`.pickRestart({
  A: "[~@29 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@25 c#4@5 ~@6 a3@6 ~, ~@6 a3@12 a3@23 ~@13 a3@12 a3@23 ~@13 a3@12 a3@23 ~@13 a3@12 a3@23 ~@7, ~@12 b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3@2 ~@4 b3@12 ~, ~@23 e4@48 e4@48 e4@48 e4@2 ~@23, ~@7 f#4]/4",
  B: "[[d3,a3,d4,f#4]@47 ~ [b3,e4]@17 ~ a#4@17 ~ [f#3,c#4,a#4]@11 ~, ~@47 [e3,g#3]@18 [f#3,c#4,f#4]@18 ~@13]/2", // D E5 F# E F#5
  C: "[~ f#4@46 ~ [b3,e4]@17 ~ a#4@17 ~ [f#3,c#4,a#4]@11 ~, [d3,a3,d4]@47 [e3,g#3]@18 [f#3,c#4,f#4]@18 ~@13]/2", // E5 F# D5 E F#5
  D: "[~@29 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@25 c#4@5 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@25 c#4@5 ~@6 a3@6 ~, ~@6 a3@12 a3@23 ~@13 a3@12 a3@23 ~@12 g#3@12 g#3@23 ~@14 a3@12 a3@23 ~@13 a3@12 a3@23 ~@13 a3@12 a3@23 ~@12 g#3@12 g#3@23 ~@14 a3@12 a3@23 ~@7, ~@12 b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3@2 ~@4 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3@2 ~@4 b3@13, ~@23 e4@48 e4@48 e4@48 e4@2 ~@46 e4@48 e4@48 e4@48 e4@2 ~@23, ~@168 f#4@47 ~@145 f#4@24]/8",
  E: "[[d3,d4]@47 ~ [b3,e4]@17 ~ a#4@17 ~ [f#3,c#4,a#4]@11 ~, f#4@23 ~@73, a3@5 ~@42 [e3,g#3]@18 [f#3,c#4,f#4]@18 ~@13]/2", // D E5 F# E F#5
  F: "[~@29 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@25 c#4@5 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@25 c#4@5 ~@6 a3@7, ~@6 a3@12 a3@23 ~@13 a3@12 a3@23 ~@12 g#3@12 g#3@23 ~@14 a3@12 a3@23 ~@13 a3@12 a3@23 ~@13 a3@12 a3@23 ~@12 g#3@12 g#3@23 ~@14 a3@12 a3@23 ~@7, ~@12 b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3@2 ~@4 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3@2 ~@4 b3@13, ~@23 e4@48 e4@48 e4@48 e4@2 ~@46 e4@48 e4@48 e4@48 e4@2 ~@23, ~@168 f#4@47 ~@145 f#4@24]/8",
  G: "[~@29 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@25 c#4@5 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@24 c#4@6 ~@6 a3@12 ~@25 c#4@5 ~@6 a3@6 ~, ~@6 a3@12 a3@23 ~@13 a3@12 a3@23 ~@12 g#3@12 g#3@23 ~@14 a3@12 a3@23 ~@13 a3@12 a3@23 ~@13 a3@12 a3@23 ~@12 g#3@12 g#3@23 ~@14 a3@12 a3@23 ~@7, ~@12 b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3@2 ~@4 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3 ~@5 b3@24 ~ b3@17 b3@2 ~@4 b3@12 ~, ~@23 e4@48 e4@48 e4@48 e4@2 ~@46 e4@48 e4@48 e4@48 e4@2 ~@23, ~@168 f#4@47 ~@145 f#4@24]/8",
  H: "[c#4,e4,a4]@2 ~ [c#4,e4,a4]@2 [c#4,e4,a4]@40 ~@3", I: "[[c#4,e4,a4]@2 ~ [c#4,e4,a4]@2 [c#4,e4,a4]@90 ~]/2",
})).s("gm_distortion_guitar").gain(0.29).pan(0.4)

// chords · string ensemble 1
const string_ensemble_1 = note("<~@73 A B A B A B A B C D C D C D C D E F>".pickRestart({
  A: "[a2,e3]@2 ~@4 [a2,e3]@2 ~@4 [a2,e3,a3]@2 ~@4 [a2,e3,a3]@2 ~@4 [a2,e3,a3]@2 ~@4 a3@2 ~@4 a3@2 ~@3 [a2,e3,a3]@2 ~@5, a3 ~@5 a3 ~@22 [a2,e3]@2 ~@4 [a2,e3]@2 ~@11", // A5
  B: "[f#2,d3,a3]@2 ~@4 a3@2 ~@4 [e3,b3]@2 ~@4 [f#2,e3,b3]@2 ~@4 [d3,a3]@2 ~@4 [f#2,d3,a3]@2 ~@4 [e3,b3]@2 ~@3 [f#2,d3]@2 ~@5, ~@5 [f#2,d3]@2 ~@5 f#2 ~@11 f#2 ~@11 f#2 ~@4 a3 ~@6", // D E5 Esus2 D5 D E5 D
  C: "[a3,e4,a4] ~@5 [a3,e4,a4] ~@5 [a2,e3,a3,e4,a4]@2 ~@4 [a2,e3,a3,e4,a4]@2 ~@4 [a2,e3,a3,d4,g4]@2 ~@4 [a3,d4,g4]@2 ~@4 [a3,d4,g4]@2 ~@4 d4@2 ~@4, [a2,e3]@2 ~@4 [a2,e3]@2 ~@21 [a2,e3]@2 ~@4 [a2,e3]@2 ~@4 [a2,e3,a3,g4]@2 ~@5", // A5 Asus4 Dsus4 A5 A7
  D: "[f#2,d3,a3]@2 ~@4 [e4,a4] ~@5 [e3,b3,e4,a4]@2 ~@4 [f#2,e3,b3]@2 ~@4 [d3,a3,d4]@2 ~@4 [f#2,d3,a3,d4]@2 ~@4 [e3,b3,d4]@2 ~@3 [f#2,d3,d4]@2 ~@5, [e4,a4] ~@4 [f#2,d3]@2 ~@5 f#2 ~@11 f#2 ~@11 f#2 ~@11, ~@6 a3@2 ~@9 [e4,a4]@2 ~@22 a3 ~@6", // D A5 Esus4 Esus2 D5 D E7 D …
  E: "[a3,e4,a4] ~@5 [e4,a4] ~@5 [e4,a4]@2 ~@4 [e4,a4]@2 ~@4 [e4,a4] ~@5 [e4,a4] ~@5 [e4,a4]@2 ~@4 e4@2 ~@4, [a2,e3]@2 ~@39 a4@2 ~@5", // A5
  F: "[e4,a4] ~@5 [e4,a4] ~@5 [e4,a4]@2 ~@4 [e4,a4]@2 ~@4 [e4,a4] ~@5 [e4,a4] ~@5 [e4,a4]@2 ~@4 e4@2 ~@4, ~@41 a4@2 ~@5", // A5
})).s("gm_string_ensemble_1").gain(0.46).pan(0.3)

// chords · piano
const piano = note(`<
  ~@14 A@2 B@2 ~@2 C@2 ~@8 A@2 B@2 ~@2 D ~@13 E@2 B@2 ~@2 C@2 E@2 B@2 ~@2 C@2 E@2 B@2 ~@2 F ~@18
>`.pickRestart({
  A: "[~@4 [f#3,c#4]@3 [g#3,b3]@3 ~@6]/2", B: "[[f#3,a3]@2 [e3,a3,d4]@5 [e3,a3,c#4]@3 ~@6]/2",
  C: "[[f#3,a3,d4]@2 [e3,a3,b3]@2 [e3,a3,d4]@3 [f#3,a3,c#4]@3 ~@6]/2", // D Esus4 Dsus2 F#m
  D: "[f#3,a3,d4]@2 [e3,a3,b3]@2 [e3,a3,d4]@3 [f#3,a3,c#4]", E: "[~@4 [f#3,c#4]@3 [g#3,b3]@8 ~]/2",
  F: "[f#3,a3,d4]@4 [e3,a3,d4]@3 [f#3,a3,c#4]", // D Dsus2 F#m
})).s("gm_piano").gain(0.07)

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

// drums · rim
const rim = s("rim").struct("<~@37 [~@4 x!2 ~@6 x!2 ~@2]!3 ~@51>").gain(0.48)

// drums · clap
const clap = s("cp").struct("<~@37 [~@4 x!2 ~@6 x!2 ~@2]!3 ~@51>").gain(0.48)

// drums · snare
const snare = s("sd").struct("<[~@11 x!3 ~@2] [~ x ~ x]!3 ~ [~ x ~ x]!32 ~@4 [~ x ~ x]!48 ~@2>").gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<~@88 [~@12 x ~ x!2] ~@2>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~ [x!7 ~]!3 ~ [x!7 ~]!32 ~@4 [x!7 ~]!48 x ~>").gain(0.64)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ [~@7 x]!2 ~@2 [~@7 x]!32 ~@4 [~@7 x]!48 ~@2>").gain(0.32)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@7 x] ~@87 [~@9 x ~@6] ~@2>").gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@3 [~@7 x] ~@87>").gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~ B ~ A ~@7 A ~@7 A ~@7 A ~@11 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~
>`.pickRestart({
  A: "x", B: "~@7 x",
})).gain(0.56)

// drums · shaker
const shaker = s("sh").struct("<A B@2 C ~ B@32 ~@4 B@48 D ~>".pickRestart({
  A: "~@15 x", B: "~ x ~@3 x ~@3 x ~ x ~ x ~@2", C: "~ x ~@3 x ~@3 x ~ x ~ x ~ x", D: "~ x ~@14",
})).gain(0.24)

stack(
  bass, synth_strings_1, overdriven_guitar, distortion_guitar, string_ensemble_1, piano, kick, rim, clap, snare,
  low_tom, hihat, hihat_soft, mid_tom, open_hat, crash, shaker
)

More by Lenny Kravitz