Strudelify

Get Here

Oleta Adams

KeyB♭ majorTempo54 bpm
0:00/0:00
// Get Here — Oleta Adams
// 54 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 60 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(54/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 · piano
const piano = note(`<
  A B C A B D A E F G A H F I A H F G A H F J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN
  AO AP AQ AR@2 ~ AS@2
>`.pickRestart({
  A: "~@9 f4@13 ~@11 f4@13 ~@2, eb3@11 ~ eb3@11 ~, ~@3 f3@19 ~@5 f3@19 ~@2, ~@3 bb3@8 ~@4 bb3@8 ~",
  B: "~@9 f4@13 ~@2 [bb4,d5]@2 ~ [c5,eb5]@2 ~ [bb4,d5]@2 ~ [a4,c5]@2 ~ [bb4,d5]@5 ~ d4@2 ~ bb3@2 ~, d3@22 ~@2 [d3,g3]@19 ~@5, ~@3 f3@19 ~@26, ~@3 bb3@8 ~@13", // Bb Cm Bb Am Bb G5
  C: "eb5@8 ~ eb5@5 ~ eb4@2 ~ d5@2 ~ bb4@2 ~ eb5@2 ~ d5@2 ~ bb4@10 ~@2 c4@5 ~, [c3,g3]@11 ~ [c3,f3]@11 ~", // C5 F5
  D: "eb5@8 ~ eb5@5 ~ eb4@2 ~ d5@2 ~ bb4@2 ~ eb5@2 ~ d5@2 ~ bb4@11 ~ c4@5 ~, [c3,g3]@11 ~ [c3,f3]@11 ~", // C5 F5
  E: "~@9 f4@13 ~@2 [bb4,d5]@2 ~ [c5,eb5]@2 ~ [bb4,d5]@2 ~ [a4,c5]@2 ~ [bb4,d5]@10 ~@2, d3@22 ~@2 [d3,g3]@19 ~@5, ~@3 f3@19 ~@26, ~@3 bb3@8 ~@13", // Bb Cm Bb Am Bb G5
  F: "[c4,g4,eb5]@5 ~@4 [c4,g4,eb5]@10 ~@5 [f3,g4,bb4,eb5]@19 ~@5, c3@11 ~@13", // Cm Eb
  G: "[f4,a4,c5]@7 ~@8 f5@8 ~ [f4,a4,c5]@7 ~@11 f3@5 ~, ~@9 [g4,bb4,d5]@15 ~@9 [g4,bb4,d5]@13 ~@2", // F Gm
  H: "~@9 f4@13 ~@2 [bb4,d5]@2 ~ [c5,eb5]@3 [bb4,d5]@2 ~ [a4,c5]@2 ~ [bb4,d5]@10 ~@2, d3@22 ~@2 [d3,g3]@19 ~@5, ~@3 f3@19 ~@26, ~@3 bb3@8 ~@13", // Bb Cm Bb Am Bb G5
  I: "d4@5 ~ eb4@2 ~ d4@5 ~ eb4@2 ~ d4@25 ~@5, [bb2,bb3]@43 ~@5", // Bb
  J: "[bb2,f3,bb3,d4]@22 ~@2 [g3,c4,eb4]@11 ~ [bb3,d4,f4]@11 ~", K: "[bb3,eb4,g4]@18 d4@2 ~ bb4@2 ~ [eb3,g3,c4]@21 ~@3",
  L: "[d4,f4,a4]@33 ~@3 [a3,d4,f4]@11 ~", M: "g4@14 ~ g4@2 ~ d5@2 ~ bb4@2 ~ [d4,g4,c5]@23 ~, [bb3,d4]@23 ~@25",
  N: "[d4,g4,bb4]@38 ~ [g4,bb4,d5,f5]@8 ~", O: "[eb4,g4,bb4,c5]@15 ~",
  P: "[eb3,bb3]@20 ~@2 c4 bb3 c4@12 ~@3 d4@2 ~ g4@6, ~@21 d4@2 ~@13 eb2@8 ~@4", // Eb5
  Q: "~@3 f4@11 ~ c5@2 ~ bb4@2 ~ a4@2 ~@10 g3@3 bb3@3 c4@2 ~ d4@3 f4@2 ~, ~@8 bb4@5 ~@3",
  R: "eb4@5 ~ d4@2 ~ eb4@8 ~ d4@3 bb3@2 ~ eb4@2 ~ d4@2 ~ bb3@8 ~@8 bb3@2, ~@45 g3@2 ~",
  S: "c4@4 c4@4 ~@2 c4@2 d4@2 ~@2 d4@4 ~ d4@2 ~ f4@2 d4 ~ f4@2 g4 ~ f4@2 g4@2 bb4@2 g4@2 bb4@2 c5 ~ bb4@2 c5@2",
  T: "~ d5@2 ~ db5@2 d5@2 ~ bb4@4 c5@11 ~@12 g5@5 ~@5 [c5,eb5]@2, [g4,db5]@2 ~@2 g4@21 ~@20 f5@2 ~", // Cm Gdim
  U: "f5@11 ~@4 c6@2 ~ bb5@2 ~ a5@2 ~ bb5@10 ~@5 c5@2 ~ d5@2 ~ f5@2 ~",
  V: "eb5@4 ~@2 d5@2 ~ eb5@8 ~ d5@2 ~ bb4@2 ~ eb5@2 ~ d5@2 ~ bb4@11 ~@4 bb4 ~@2",
  W: "[bb2,d4,f4,bb4]@11 ~ [g3,c4,eb4]@5 ~ [a3,d4,f4]@5 ~", X: "[bb3,eb4,g4]@18 d5@3 bb4@2 ~ [eb4,g4,c5]@23 ~",
  Y: "[d4,f4,a4]@31 ~@5 [a3,d4,f4]@7 ~@5", Z: "~@15 d3@2 ~ g3@3 bb3@2 ~ [bb3,d4,f4]@16 ~@8, [bb3,d4,g4]@19 ~@29",
  AA: "[g3,bb3,d4]@11 ~ [d4,g4,bb4]@27 [g4,bb4,d5,f5]@9", AB: "[eb4,g4,bb4,c5]@47 ~", AC: "~@24 [bb3,c4,eb4]@19 ~@5",
  AD: "[f3,bb3,d4]@19 ~@5 d4@18 d4@3 bb3 ~@2, ~@12 [g3,bb3]@11 ~", // Bb Gm
  AE: "[c4,eb4,g4]@5 ~@4 [c4,eb4,g4]@10 ~@5 [f3,c4,eb4,g4]@19 ~@5, c3@11 ~@13", // Cm
  AF: "[g3,c4,d4]@7 ~@2 [g3,bb3,d4]@10 ~@5 [g3,c4,d4]@7 ~@2 [g3,bb3,d4]@13 ~@2", // Gsus4 Gm Gsus4 Gm
  AG: "[eb4,bb4]@11 ~ c5@5 ~ d5@5 ~, ~@12 f5@11 ~", AH: "[d4,bb4]@19 ~@5 [d4,g4,bb4]@19 ~@5",
  AI: "[c4,eb4,g4]@2 ~ [f3,c4,eb4,g4]@2 ~", AJ: "[eb3,bb3,d4,f4]@31 ~@5 [bb3,d4,f4]@7 ~@5, ~@33 eb3@10 ~@5",
  AK: "[bb3,d4,f4]@13 ~@11 [g3,bb3,d4]@13 ~@11, d3@19 ~@5 d3@19 ~@5", // Bb Gm
  AL: "eb4@5 ~ d4@3 ~@3 c3@6 d4@3 bb3@2 ~ eb4@3 d4@2 ~@7 f3@7 ~@5, [c4,g4,bb4]@19 ~@5 [c4,g4,bb4]@13 ~@11, c3@9 eb4@10 ~@5 f3@6 bb3@11 ~@7", // C7
  AM: "[eb3,bb3,d4,f4]@19 ~@5 [bb3,d4,f4]@10 ~@2 [eb3,bb3,d4,f4]@10 ~@2, eb2@15 ~, ~@21 eb3@13 ~@14", // Bb
  AN: "[d2,bb3]@11 ~ [g3,bb3,d4]@8 ~@4, d3@5 ~, [d4,f4]@8 ~@4 g2@11 ~", // Gm Dm
  AO: "eb4@4 ~@2 d4@2 ~ eb4@9 d4@3 bb3@2 ~ eb4@2 ~ d4@2 ~ bb3@10 ~@2 c4@5 ~, [c3,c4,g4,bb4]@19 ~@5 [f3,c4,g4,bb4]@19 ~@5", // C7 Fsus4
  AP: "[eb3,bb3,d4,f4]@19 ~@5 [bb3,d4,f4]@10 ~@2 [eb3,bb3,d4,f4]@7 ~@5, eb2@43 ~@5, ~@21 eb3@10 ~@17", // Bb
  AQ: "[bb3,d4,f4]@8 ~@4 [g2,d3,g3,bb3,d4]@11 ~, [d2,d3] ~", // Bb Gm D
  AR: "[~@6 bb4@5 ~ [f2,f3,c4,eb4,g4,bb4]@35 ~, [c2,c3,c4,eb4,g4]@11 ~@37]/2", AS: "[[bb1,bb2,d3,f3,bb3]@71 ~@25]/2",
})).s("gm_piano").gain(0.4)

// bass · fretless bass
const bass = note(`<
  ~@3 A@2 ~@8 B C D E F G H I J C K L M N O P I Q R S T J U K L V W X Y E Z AA AB I AC AD AE AF AG AH AI AJ AK@2 ~ AL ~
>`.pickRestart({
  A: "[~@24 eb2@47 ~@25]/2", B: "~@45 bb1@2 ~", C: "eb2@47 ~", D: "d2@20 ~ a1@2 ~ g1@23 ~", E: "c2@23 ~ f2@23 ~",
  F: "g2@44 ~ d2@2 ~", G: "eb2@20 ~ bb1@2 ~ eb2@23 ~", H: "d2@17 ~ f2@2 ~ a2@2 ~ g2@8 ~ d2@2 ~ g1@11 ~",
  I: "c2@23 ~ f2@20 ~@4", J: "bb1@23 ~ c2@11 ~ d2@11 ~", K: "d2@35 ~ f2@11 ~", L: "g2@23 ~ f2@23 ~",
  M: "eb2@2 ~ eb2@2 ~ bb2@2 ~ f3@2 ~ eb3@2 ~ d3@2 ~ eb3 d3 ~ bb2@2 ~ eb2@14 ~ g2@5 ~@4", N: "c2@5 ~ f1@5 ~",
  O: "eb2@32 ~ bb2@2 ~ eb3@5 ~ bb2@3 eb2@2 ~", P: "d2@23 ~ bb2@2 ~ a2@2 ~ g2@17 ~",
  Q: "g1@8 ~ a1@2 ~ bb1 d2 ~ f2@2 ~ g2@2 ~ a2@2 ~ bb2 g2@7 ~ d2@2 ~ g1@11 ~", R: "eb2@26 ~ c3@2 ~ a3@3 bb3@2 ~ g3@11 ~",
  S: "d2@11 ~ f3@11 ~ g2@17 ~ bb1@2 ~ d2@2 ~", T: "c2@23 ~ f2@2 ~ [bb2,eb3]@8 ~ f2@2 ~ [eb3,g3]@8 ~",
  U: "eb2@15 g2@2 ~ c3@3 bb2@2 ~ eb2@23 ~", V: "eb2@35 ~ [c3,c4]@2 ~ [bb2,bb3]@2 ~ [f2,f3] [g2,g3] ~ [d2,d3]@2 ~",
  W: "[c2,c3]@23 ~ f2@23 ~", X: "eb2@14 ~ bb1@2 ~ c2@2 ~ bb1@2 ~ eb2@8 ~ bb2@5 ~@4 eb3@5 ~",
  Y: "d3@5 ~@16 a2@2 ~ d2 g2@20 ~@3", Z: "~@15 c3@2 ~ d3 f3 ~ a3@2 ~ g3@2 ~ d3@2 ~ g2@17 ~, g2@5 ~@3",
  AA: "eb2@20 ~ bb2@2 ~ f3@11 ~ g3@11 ~", AB: "d2@23 ~ g2@23 ~",
  AC: "eb2@14 ~ bb2@2 ~ f3@2 ~ g3@2 ~ f3@8 ~ bb2@2 ~ eb2@11 ~", AD: "d2@17 ~@4 f2@2 ~ a2 g2@7 ~ d2@2 ~ g1@11 ~",
  AE: "c2@23 ~ f2@8 ~ g3@2 ~ bb3 g3 ~ f3@2 ~ d3@2 ~ f3@2 ~",
  AF: "eb2@14 ~ g2@2 ~ bb2@2 ~ d3@2 ~ f3@5 ~ eb3@2 ~ bb2@2 ~ eb2@11 ~",
  AG: "d2@20 ~ f2@2 ~ a2@2 ~ g2@2 ~ f2@2 ~ d2@2 ~ g1@11 ~", AH: "c1@20 ~ eb1@2 ~ f1@17 ~ c1@2 ~ f1@2 ~",
  AI: "eb2@14 ~ bb1@2 ~ c2@2 ~ bb1@2 ~ g1@8 ~ bb1@2 ~ eb2@11 ~", AJ: "d2@20 ~ a2@2 ~ f2@2 ~ g2@20 ~",
  AK: "[c2@23 ~ f2@47 ~@25]/2", AL: "bb1@47 ~",
})).s("gm_fretless_bass").gain(0.35)

// chords · string ensemble 1
const string_ensemble_1 = note("<A@6 B@8 C@8 D E ~@10 F D E ~@3 G@2 H I J@2 K L@2 M L@2 M N@2 O@3 ~@2>".pickRestart({
  A: "[f5@71 ~ d5@2 ~ eb5@2 ~ d5@2 ~ c5@2 ~ d5@11 ~ eb5@26 ~ d5@2 ~@13 c5@5 ~, bb4@137 ~@7]/3",
  B: "[f5@71 ~ d5@2 ~ eb5@2 ~ d5@2 ~ c5@2 ~ d5@11 ~ eb5@47 ~ d5@47 ~ f5@71 ~ d5@2 ~ eb5@2 ~ d5@2 ~ c5@2 ~ d5@11 ~ eb5@47 ~ d5@47 ~, bb4@383 ~]/8",
  C: "[f5@71 ~ d5@2 ~ eb5@2 ~ d5@2 ~ c5@2 ~ d5@11 ~ eb5@47 ~ d5@47 ~ f5@71 ~ d5@2 ~ eb5@2 ~ d5@2 ~ c5@2 ~ d5@11 ~ eb5@47 ~ d5@23 ~ [c4,eb4]@11 ~ [d4,f4]@11 ~, bb4@359 ~@25]/8", // Cm Dm
  D: "eb4@23 ~ c4@23 ~, g4@47 ~", E: "[d4,f4]@47 ~", F: "~@24 [c4,eb4]@11 ~ [d4,f4]@11 ~",
  G: "[f4@47 ~ d4@47 ~, bb3@95 ~]/2", H: "eb4@23 ~ f4@23 ~, c4@47 ~", I: "[bb3,d4]@47 ~",
  J: "[f5@47 ~ d5@47 ~, bb4@95 ~]/2", K: "eb5@23 ~ f5@23 ~, c5@47 ~", L: "[g5@47 ~ f5@47 ~, bb4@95 ~]/2",
  M: "g5@23 ~ f5@23 ~, c5@47 ~", N: "[g5@47 ~ f5@44 ~@4, bb4@95 ~]/2", O: "[g5@23 ~ f5@119 ~, c5@143 ~]/3",
})).s("gm_string_ensemble_1").gain(0.25).pan(0.3)

// chords · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@24 A@2 ~@5 B C D ~@3 A@2 ~@19 E@2>".pickRestart({
  A: "[[d5,g5]@95 ~]/2", B: "[g4,g5]@47 ~", C: "[f4,f5]@47 ~", D: "[eb4,eb5]@47 ~",
  E: "[[bb3,f4,bb4,f5,bb5]@83 ~@13]/2", // Bb5
})).s("gm_string_ensemble_1").gain(0.15).pan(0.3)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@21 A ~ A ~ A ~@4 A ~@3 B ~ A ~ A ~@7 B ~@13>".pickRestart({
  A: "~@3 x", B: "~@14 x!2",
})).gain(0.3)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 A ~@3 B C ~@3 D ~@3 E ~@3 B C ~@3 F ~@2 E ~@2 G ~@5 H ~@4>".pickRestart({
  A: "~ x", B: "~@5 x ~@2", C: "~@3 x", D: "~@34 x!2 ~@12", E: "~@10 x!4 ~@2", F: "~@11 x!2 ~@3", G: "~@10 x!2 ~@2 x!2",
  H: "~@5 x ~@10",
})).gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@14 A ~@3 A ~@3 B ~ B C B ~@4 B ~@3 B ~ B C B@2 ~@3 B ~@2 B@8 D ~@4>".pickRestart({
  A: "~ x ~@2", B: "x", C: "~@13 x ~@2", D: "x!2",
})).gain(0.25)

// drums · ride
const ride = s("rd").struct("<~@22 [~ x!47] [x!48]!3 ~@9 [~ x!47] [x!48]!3 ~@21>").gain(0.15)

// drums · bongos
const bongos = s("bongo:4").struct("<~@47 A B A B A B A B ~@5>".pickRestart({
  A: "~@3 x!2 ~ x ~@9", B: "~@3 x!2 ~ x ~@5 x ~ x ~",
})).gain(0.91)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@47 [~@2 x ~@4 x ~@2 x ~@4 x]!8 ~@5>").gain(0.91)

// drums · congas
const congas = s("conga:18").struct("<~@47 A B A B A B A B ~@5>".pickRestart({
  A: "~ x ~@6 x!2 ~ x!2 ~ x ~", B: "x!2 ~@6 x!2 ~ x ~@4",
})).gain(0.79)

// drums · shaker
const shaker = s("sh").struct("<~@17 [~@24 x!24] [x!12 ~@36] ~@28 [x!16]!8 [x!9 ~@7] ~@4>").gain(0.25)

stack(
  piano, bass, string_ensemble_1, string_ensemble_1_soft, kick, snare, low_tom, hihat, mid_tom, crash, ride, bongos,
  bongos_2, congas, shaker
)

More by Oleta Adams