Strudelify

Don't Be a Stranger

Dina Carroll

KeyD minorTempo125 bpm
0:00/0:00
// Don't Be a Stranger — Dina Carroll
// 125 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 135 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(125/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 · "Track 2"
const bass = note(`<
  ~@32 A B C@5 D E B F@2 G H ~@8 I ~ I ~ J ~ K ~ L M N O P@4 Q R S T U R V W A B X@3 Y Z D E B F@2 G H AA@2 AB AC AD AE
  AF AG AH AI AJ AK AL@2 AM AN AO AP AQ@3 AR AS@4 AT AU AV AW AX AY@4 ~@8
>`.pickRestart({
  A: "f2@11 ~ f2@2 g2@2", B: "a2", C: "[d2@64 g2@24 ~@5 g2@5 f2@23 ~ f2@8 e2@30]/5", D: "c2@31 ~",
  E: "f2@21 ~@3 f2@4 g2@4", F: "[d2@63 ~]/2", G: "g2 a2", H: "c3", I: "d2@4 ~@7 d2@4 ~@17", J: "d2@2 ~@3 d2@2 ~@9",
  K: "d2@5 ~@6 d2@4 ~@17", L: "bb1@31 ~", M: "c2", N: "a1@29 ~@3", O: "d2", P: "[bb1@64 c2@59 ~@5]/4",
  Q: "g2@25 ~@3 g2@4", R: "d2@11 ~ d2@4", S: "f2@21 ~@3 f2@8", T: "c2@20 ~@4 c2@7 ~", U: "g2@11 ~ g2@4",
  V: "f2@5 ~ f2@2", W: "c2@5 ~ c2@2", X: "[d2@64 g2@24 g2@7 ~]/3", Y: "f2@23 ~ f2@6 ~@2", Z: "e2",
  AA: "[d2@26 ~@4 a1 ~]/2", AB: "d2@29 ~ a1@2", AC: "~@2 d2@2 ~@6 d2@17 ~ a1@3 ~", AD: "~ c2@14 g1",
  AE: "~@2 c2@2 ~@6 c2@17 ~ c2@3 ~", AF: "e2@29 ~ b1@2", AG: "~@2 e2@2 ~@6 e2@18 b1@3 ~", AH: "d2@14 ~ a1",
  AI: "~@2 d2@2 ~@6 d2@15 ~@3 d2@4", AJ: "~ f2@14 c2", AK: "~@2 f2@2 ~@6 f2@5 ~ f2@3 ~ e2@3 ~@3 d2@6",
  AL: "[~@2 c2@28 g1@4 c2@2 ~@6 c2@21 ~]/2", AM: "~@2 a2@11 ~ a2@2 ~@2 a2@13 ~",
  AN: "~@2 b2@10 ~@2 b2@2 ~@2 b2@4 a2@3 ~ g2@6", AO: "~@2 c3@21 ~@3 b2@4 c3@2", AP: "~@2 d3@25 ~@5",
  AQ: "[~@2 g2@21 ~@3 g2@4 a2@4 b2@22 ~@2 b2@8 e2@25 ~@3 e2@2]/3", AR: "~ e2@11 e2@4",
  AS: "[~@2 a2@24 ~@4 a2@4 g2@21 ~@3 g2@8 gb2@25 ~@3 gb2@4 d2@20 ~@2 d2@6 ~@2]/4", AT: "g2@21 ~@3 g2@4 a2@4",
  AU: "b2@21 ~@3 b2@8", AV: "e2@13 ~ e2 ~", AW: "~@2 e2@2 ~@2 e2@4 ~@4 e2@7 ~@5 e2@4 ~@2", AX: "~ a2@7 ~ b2@6 ~",
  AY: "[d3@49 ~@15]/4",
})).s("gm_electric_bass_finger").gain(0.59)

// other · piano
const piano = note("<A@8 B ~@37 A@8 B ~@37 A@2 C ~@31 D@8 E>".pickRestart({
  A: "[d1,d3]!32", B: "[d1,d3]@7 ~", C: "[d1,d3] ~@31", D: "[e1,e3]!32", E: "[e1,e3]@7 ~",
})).s("gm_piano").gain(0.39)

// other · acoustic guitar nylon · "guit"
const acoustic_guitar_nylon = note("<A@8 ~@38 A@8 ~@72 B@8 ~>".pickRestart({
  A: "[~@4 d4@4 f4@4 a4@4 g4@8 f4@4 g4@8 f4@8 g4@7 ~ a4@16 d4@4 f4@4 a4@4 g4@8 f4@4 g4@8 f4@8 d4@20]/4",
  B: "[~@4 e4@4 g4@4 b4@4 a4@8 g4@4 a4@8 g4@8 a4@7 ~ b4@16 e4@4 g4@4 b4@4 a4@8 g4@4 a4@8 g4@8 e4@20]/4",
})).s("gm_acoustic_guitar_nylon").gain(0.59)

// other · string ensemble 1 · "strings"
const string_ensemble_1 = note("<~ A@8 ~@14 B ~@23 A@8 ~@14 B ~@57 C@8>".pickRestart({
  A: "[a5@15 ~]/8", B: "~@6 bb5@2 ~@2 d6 ~@3 f6 ~@3 bb6@2 ~@12", C: "[b5@15 ~]/8",
})).s("gm_string_ensemble_1").gain(0.41)

// other · string ensemble 1 · "strings" · soft notes
const string_ensemble_1_soft = note("<~@93 A@5 ~@37>".pickRestart({
  A: "[~@20 c7@137 ~@3]/5",
})).s("gm_string_ensemble_1").gain(0.16)

// chords · string ensemble 2 · "Slo strin"
const string_ensemble_2 = note(`<
  A@8 ~ B C D E B F G H B I J K@2 L@2 M N@2 O M P@2 O Q@2 R@2 S@2 L@2 T@2 U@2 V W A@8 ~ B C D E B F G H B I J K@2 L@2 M
  N@2 O M P@2 O Q@2 R@2 S@2 L@2 T@2 U@2 V W ~@2 X@2 Y@8 Z@6 AA@2 AB@2 AC@2 AD@2 AE@2 AF@2 AG AH@3 AI@8 ~
>`.pickRestart({
  A: "[d4,a4,d5,f5,a5]/8", B: "[c4,g4,c5,e5]", C: "~ [bb3,f4,bb4,d5]@15", D: "[a4,c5], a3@7 ~",
  E: "[d4,f4,d5,f5], a4@7 ~", F: "[bb3,d5], bb4@29 ~@3, f4@13 ~@3", G: "[a3,e4,a4,c5]", H: "[bb3,f4,bb4,d5]",
  I: "[a3,e4,g4,db5]", J: "[d4,f4,a4,d5,f5]", K: "[g3,d4,g4,bb4,d5]/2", L: "[c4,e4,g4,c5,e5]/2", M: "[g3,d4,g4,bb4,d5]",
  N: "[[d3,d4,f4]@13 ~@3 [f3,c4,f4,c5]@16, a4@57 ~@7]/2", O: "[c3,c4,e4,g4]",
  P: "[[d3,d4,f4]@15 [f3,c4,f4,c5]@17, a4]/2", Q: "[[f3,c4,f4,a4] [a3,e4,a4,e5], c5@61 ~@3]/2",
  R: "[a4@29 ~@3 [a4,c5]@32, [d4,f4,d5,f5]@29 ~@3]/2", S: "[[g3,g4] [f3,f4], [bb4,d5]@31 ~]/2",
  T: "[[f3,c4,f5] [a3,e5], a4@15 ~, c5@27 ~@5]/2", U: "[a4 [a4,c5], [d4,f4,d5,f5]@57 ~@7]/2",
  V: "[g3,g4,bb4,d5] [a3,a4,c5,f5]", W: "[d4,bb4,d5,f5]", X: "[~ [d4,a4,d5,f5,a5]@63]/2",
  Y: "[~@2 [g4,c5]@60 ~@4 [b4,e5,b5]@60 ~@35 gb4@24 ~@8 f5@16 g5@16 ~@24 c5@2 ~@2 c4@3, ~ e5@60 ~@68 [d5,a5]@61 ~@3 c5@32 f5@29 ~@2, ~@2 g5@125 ~@3 gb5@61 ~@2 [a5,c6]@61 ~@2, ~@2 c4@57 ~@3 e4@61 ~@3 d4@58 ~@4 f4@61 ~@7, ~@130 a4@57 ~@6 a4@57 ~@6]/8", // C5 E5 D5 Am
  Z: "[~ [c5,g5]@59 ~@22 e5@15 [b5,d6]@33 ~@22 e4@3 ~@4 gb6 ~ [gb4,d6,gb6]@28 ~@3, e5@60 ~@5 [c5,a5,c6,e6]@32 b4@26 ~@7 [g4,e6]@30 ~ [a4,a6]@31, ~ g4@56 ~@3 a4@37 f6@2 ~@31 c4@24 ~@3 d4@32 ~@3, ~ a5 ~@95 g6@62 ~@33, ~@131 c6@29 ~@32]/6", // C5 Bm D Am C A
  AA: "[[g3,d4,g4,b4] [b3,gb4,b4,gb5], d5@61 ~@3]/2", AB: "[b4@29 ~@3 [b4,d5]@32, [e4,g4,e5,g5]@29 ~@3]/2",
  AC: "[[a3,a4] [g3,g4], [c5,e5]@31 ~]/2", AD: "[d4,gb4,a4,d5,gb5]/2",
  AE: "[[g3,d4,g5] [b3,gb5], b4@15 ~, d5@27 ~@5]/2", AF: "[b4 [b4,d5], [e4,g4,e5,g5]@57 ~@7]/2",
  AG: "[a3,a4,c5,e5] [b3,b4,d5,g5]", AH: "[e4,c5,e5,g5]/3", AI: "[[e4,b4,e5,g5,b5]@57 ~@7]/8",
})).s("gm_string_ensemble_2").gain(0.32)

// other · piano · "E piano"
const piano_2 = note("<~@34 A B ~@6 C D ~@79 E F@2 G ~@8>".pickRestart({
  A: "~@24 d6@2 ~@2 d6@3 ~", B: "a5 ~@3 a5@2 ~@2 f5 ~@2 f5@2 ~@2 d5@2 ~@2 d5@2 ~@11", C: "~@22 d6@2 ~@2 d6@2 ~@2 a5 ~",
  D: "~@2 a5@2 ~ f5 ~@4 f5@2 ~@2 d5 ~@3 d5@2 ~@12", E: "[d1,d2,d3,d5] [d1,d2,d3,d4,d5]!31", F: "[d1,d2,d3,d4,d5]!32",
  G: "d4 ~@31",
})).s("gm_piano").gain(0.39)

// chords · string ensemble 1 · "String3"
const string_ensemble_1_2 = note("<~@16 A B C D E@2 F@2 ~@38 A B C D E@2 F@2 ~@65>".pickRestart({
  A: "[bb2,d3,f3], [bb1,f2]@29 ~@3", B: "[c3,e3,g3]@29 ~@3, [c2,g2]@23 ~@9", C: "[a2,db3]@29 ~@3, a1@23 ~@9",
  D: "[d2,a2,d3,f3,a3]@13 ~@3", E: "[[bb2,bb3,d4]@31 ~, f3@57 ~@7]/2", F: "[[c3,g3,c4,e4]@7 ~]/2",
})).s("gm_string_ensemble_1").gain(0.46)

// drums · kick
const kick = s("bd").struct("<~@94 A@16 B C@3 B C@2 D C E F G H I ~@11>".pickRestart({
  A: "~ x ~@5 x ~@8", B: "~@2 x ~@10 x ~@18", C: "~ x ~@11 x ~@18", D: "~ x ~@3 x ~@7 x ~@6 x ~@11",
  E: "~ x ~@10 x ~@19", F: "x ~@2 x ~@4", G: "~ x ~@3 x ~@7 x ~@7 x ~@10", H: "~@2 x ~@14 x ~@14", I: "~ x ~@30",
})).gain(0.75)

// drums · snare
const snare = s("sd").struct("<~@93 A B C B ~ B@3 ~ B@7 D B C E F B E@2 G E H@2 I J K ~@11>".pickRestart({
  A: "~@17 x ~@7 x ~@6", B: "~@9 x ~@6", C: "~@9 x ~@3 x ~@2", D: "~@31 x", E: "~@17 x ~@14", F: "~@17 x ~@8 x ~@5",
  G: "~@3 x", H: "~ x", I: "~@25 x ~@6", J: "~ x ~@15 x ~@14", K: "~ x ~@30",
})).gain(0.75)

// drums · low tom
const low_tom = s("lt").struct("<~@101 [~@15 x] [~ x ~@14] ~@6 [~@6 x ~@11 x ~@4 x ~@3 x ~@4] ~@25>").gain(0.75)

// drums · mid tom
const mid_tom = s("mt").struct("<~@98 [~ x ~@14] ~@2 [~@14 x!5 ~@3 x ~@3 x ~@5] ~@33>").gain(0.75)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@97
  [~ x ~ x ~@3 x ~@3 x ~@3 x]
  ~@2
  [~@30 x!2]
  [x!3 ~@3 x!5 ~@21]
  ~@7
  [~@10 x!5 ~@17]
  ~@25
>`).gain(0.75)

// drums · crash
const crash = s("cr").struct("<~@8 A ~@37 A ~@7 A ~@39 A ~@3 B ~@3 B ~@3 B A B C ~@12 D E F@2 ~@9>".pickRestart({
  A: "x", B: "~ x ~@14", C: "~ x ~@2 x ~@11", D: "~@2 x ~@14 x ~@14",
  E: "~ x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~", F: "x!16",
})).gain(0.38)

// drums · ride
const ride = s("rd").struct("<A B@2 C B@4 ~@38 A B@2 C B@4 ~@38 B C ~@41>".pickRestart({
  A: "~@23 x!9", B: "x!32", C: "~ x!31",
})).gain(0.38)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<[x!23 ~@9] ~@45 [x!23 ~@9] ~@88>").gain(0.23)

// drums · claves
const claves = s("clave:2").struct(`<
  ~@8 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@90
>`.pickRestart({
  A: "~@5 x ~@10",
})).gain(2.21)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@8 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~@90
>`.pickRestart({
  A: "~@3 x ~@3 x ~@8", B: "~@5 x ~@8 x ~@17",
})).gain(0.65)

stack(
  bass, piano, acoustic_guitar_nylon, string_ensemble_1, string_ensemble_1_soft, string_ensemble_2, piano_2,
  string_ensemble_1_2, kick, snare, low_tom, mid_tom, high_tom, crash, ride, ride_soft, claves, woodblocks
)