Strudelify

So Here I Am

UB40

KeyF minorTempo93 bpm
0:00/0:00
// So Here I Am — UB40
// 93 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(93/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A@2 B C@6 D E C E C E C E C F G F H F G F I@2 B C@6 D E C E C E C E C F G F H F G F I@2 J K L M@2 N O@2 J@2 P Q@2 R
  S@2 F G F H F G F G F H F G F G F H F G ~
>`.pickRestart({
  A: "[f3@7 ~ eb3 ~ eb3@3 ~ f3@16 ~@2]/2", B: "~@2 f3 ~ f3!4 eb3!4 c3@2 f3@2", C: "~@2 f2@2 f3!4 eb3!4 c3@2 f3@2",
  D: "~@2 f2@2 f3!4 eb3!4 c3@2 f2@2", E: "~@2 f2@2 bb2!4 ab2!4 ab2@2 bb2@2", F: "~@4 ab2@2 c3@2 eb3 ~ eb3 ~@5",
  G: "~@4 ab2@2 c3@2 eb3 ~ eb3 ~ bb2@4", H: "~@4 ab2@2 c3@2 eb3@2 bb3 ~ bb3@4", I: "[eb3@6 f3@25 ~]/2",
  J: "~@2 ab2@2 ab3!6 ~ ab3 eb3 ~ ab2@2", K: "~@2 ab2 ~ ab3!6 ~ ab3 eb3 ~ ab2@2",
  L: "~@2 db3@2 db4!6 ~ db4 ab3 ~ db3@2", M: "~@2 bb2@2 bb3!6 ~ bb3 f3 ~ bb2@2", N: "~@2 bb2@2 bb3!6 ~ bb3 f3 ~ bb2 ~",
  O: "[f3@7 ~ eb3 ~ eb3@4 f3@16 ~@2]/2", P: "~@2 db3@2 db4!6 ~ db4 ab3@2 db3@2", Q: "~@2 bb2@2 bb3!6 ~ bb3 f3@2 bb2@2",
  R: "~@2 bb2@2 bb3!6 ~ bb3 f3@2 bb2 ~", S: "[f3@6 ~@2 eb3 ~ eb3@4 f3@17 ~, ~@14 e3 ~@17]/2",
})).s("gm_acoustic_bass").gain(0.56)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~@3 A@8 B A B A B A B A C@7 D E A@8 B A B A B A B A C@7 D E F@2 G H I@2 ~@2 F@2 G H I J ~@2 C@18 ~
>`.pickRestart({
  A: "~@2 [f5,ab5,c6] ~@3 [f5,ab5,c6] ~@3 [f5,ab5,c6] ~@3 [f5,ab5,c6] ~", // Fm
  B: "~@2 [f5,bb5,db6] ~@3 [f5,bb5,db6] ~@3 [f5,bb5,db6] ~@3 [f5,bb5,db6] ~", // Bbm
  C: "~@2 [ab5,c6,eb6] ~@3 [ab5,c6,eb6] ~@3 [g5,bb5,eb6] ~@3 [g5,bb5,eb6] ~", // Ab Eb
  D: "~@2 [g5,bb5,eb6] ~@3 [ab5,c6,f6] ~@3 [ab5,c6,f6] ~@3 [ab5,c6,f6] ~", // Eb Fm
  E: "~@2 [ab5,c6,f6] ~@3 [ab5,c6,f6] ~@3 [ab5,c6,f6] ~@3 [ab5,c6,f6] ~", // Fm
  F: "~@2 [eb4,ab4,c5] ~@3 [eb4,ab4,c5] ~@3 [eb4,ab4,c5] ~@3 [eb4,ab4,c5] ~", // Ab
  G: "~@2 [f4,ab4,db5] ~@3 [f4,ab4,db5] ~@3 [f4,ab4,db5] ~@3 [f4,ab4,db5] ~", // Db
  H: "~@2 [f4,bb4,db5] ~@3 [f4,bb4,db5] ~@3 [f4,bb4,db5] ~@3 [f4,bb4,db5] ~", // Bbm
  I: "~@2 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~", // Bb
  J: "~@2 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,db5,d5] ~", // Bb
})).s("gm_piano").gain(0.52)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@3 A@8 B A B A B A B A C@2 D@3 E F G A@9 B A B A B A B A C@2 D@3 E F G A H@2 I J K L ~@2 H@2 I J L@2 ~@2 C@2 D@3 E
  C@2 D@3 E C@2 D@3 E ~
>`.pickRestart({
  A: "~@2 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~", // Fm
  B: "~@2 [bb3,db4,f4] ~@3 [bb3,db4,f4] ~@3 [bb3,db4,f4] ~@3 [bb3,db4,f4] ~", // Bbm
  C: "~@2 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~", // Ab Eb
  D: "~@2 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [bb3,eb4,gb4,g4] ~@3 [bb3,eb4,g4] ~", // Ab Eb
  E: "~@2 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [bb3,eb4,gb4,g4] ~@3 [bb3,eb4,gb4,g4] ~", // Ab Eb
  F: "~@2 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,gb4,g4] ~", // Ab Eb
  G: "~@2 [bb3,eb4,g4] ~@3 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~", // Eb Fm
  H: "~@2 [eb4,ab4,c5] ~@3 [eb4,ab4,c5] ~@3 [eb4,ab4,c5] ~@3 [eb4,ab4,c5] ~", // Ab
  I: "~@2 [f4,ab4,db5] ~@3 [f4,ab4,db5] ~@3 [f4,ab4,db5] ~@3 [f4,ab4,db5] ~", // Db
  J: "~@2 [f4,bb4,db5] ~@3 [f4,bb4,db5] ~@3 [f4,bb4,db5] ~@3 [f4,bb4,db5] ~", // Bbm
  K: "~@2 [f4,bb4,db5,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~", // Bb
  L: "~@2 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~", // Bb
})).s("gm_electric_guitar_muted").gain(0.44)

// other · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note("<~@52 A B A C D E F ~ G H I J D E K ~@21>".pickRestart({
  A: "~@4 bb4@2 c5@2 f5@3 eb5@3 c5@2", B: "bb4@4 ab4 ~ ab4@10", C: "bb4@4 c5@2 bb4@9 ~", D: "~@8 c5@2 ~ c5@2 ~ c5 ~",
  E: "c5@3 bb4@3 f4@2", F: "~@4 bb4 ab4 f4 ~", G: "~@6 eb5 f5 ab5@2 ~ ab5@2 ~ ab5 ~", H: "ab5@6 f5 eb5 f5 ab5@7",
  I: "~@6 c5 eb5 f5@2 ~ eb5@3 c5@2", J: "bb4@3 c5 ab4@4", K: "~@8 bb4@3 ab4@3 f4@2",
})).s("gm_acoustic_guitar_steel").gain(0.72)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@70 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~>".pickRestart({
  A: "~@8 [eb4,g4,bb4]@4 [db4,f4,ab4]@3 ~", // Eb Db
})).s("gm_string_ensemble_2").gain(0.5)

// chords · string ensemble 2 · "SLOWSTRING" · soft notes
const string_ensemble_2_soft = note("<~@53 A@6 ~@2 A@6 ~@21>".pickRestart({
  A: "[eb4@32 ~@31 d5@32 ~, ab4@47 bb4@49, c5@31 ~ f4@64, ~ db5 ~]/6",
})).s("gm_string_ensemble_2").gain(0.21)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~ A@2 ~@8 B C ~@2 D E ~@2 F ~ G ~ G ~ G H@2 ~@8 B C ~@2 D E ~@2 F ~ G ~ G ~ G I@2 ~@6 J@2 ~@6 J@2 F ~ G ~ G ~ F ~ G ~
  G ~ F ~ G ~ G ~@2
>`.pickRestart({
  A: "[[c4,f4,ab4,c5,f5]@7 ~ [bb3,eb4,g4,bb4,eb5] ~ [bb3,eb4,g4,bb4,eb5]@4 [c4,f4,ab4,c5,f5,c6]@17 ~]/2", // Fm Eb Fm
  B: "[db4,f4,bb4,db5]", C: "[c4,f4,ab4,c5]@3 ~", D: "[db4,f4,bb4,db5]@15 ~", E: "[c4,f4,ab4,c5]@5 ~@3",
  F: "~@4 c5@2 [ab4,db5]@2 eb5@2 [bb4,eb5] ~@5, ~@4 ab4 ~@3 bb4 ~@7", // Db5 Eb5
  G: "~@4 c5@2 [ab4,db5]@2 [bb4,eb5]@2 [bb4,eb5] ~@5, ~@4 ab4 ~@11", H: "[[bb3,eb4,bb4,eb5]@3 [f3,c4,c5,f5]@13]/2",
  I: "[[bb3,eb4,bb4,eb5]@6 ~@10 c6@15 ~, ~@3 [f3,c4,c5,f5]@13]/2", // Eb5 F5
  J: "[[c4,f4,ab4,c5,f5]@7 ~ [bb3,eb4,g4,bb4,eb5] ~ [bb3,eb4,g4,bb4,eb5]@4 [c4,f4,ab4,c5,f5]@18]/2", // Fm Eb Fm
})).s("gm_brass_section").gain(0.55)

// drums · kick
const kick = s("bd").struct("<A B C D@56 E F D@6 E F D@18 ~>".pickRestart({
  A: "~@7 x!2 ~@7", B: "x ~@6 x!2 ~ x ~@3 x ~", C: "~@7 x!2 ~ x ~ x ~ x ~", D: "x ~@2 x!2 ~@2 x", E: "x ~@3 x!2 ~ x",
  F: "~@7 x!2 ~ x!2 ~@4",
})).gain(0.64)

// drums · rim
const rim = s("rim").struct("<~@19 [~ x ~@2]!7 ~@18 [~ x ~@2]!7 ~@18 [~ x ~@2]!18 ~>").gain(0.56)

// drums · snare
const snare = s("sd").struct("<A B C B@57 D B@7 D B@18 ~>".pickRestart({
  A: "~@9 x!7", B: "~ x ~ x", C: "~ x ~@2", D: "~@4 x ~@6 x!2 ~@3",
})).gain(0.72)

// drums · clap
const clap = s("cp").struct("<~@19 [~ x ~@2]!7 ~@18 [~ x ~@2]!7 ~@18 [~ x ~@2]!18 ~>").gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<~@3 [x!8]!56 ~@2 [x!8]!6 ~@2 [x!8]!18 ~>").gain(0.72)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@3
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!56
  ~@2
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!6
  ~@2
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!17
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2]
  ~
>`).gain(0.48)

// drums · ride
const ride = s("rd").struct("<~ A B ~@56 A B ~@6 A B ~@19>".pickRestart({
  A: "x ~@3 x!2 ~ x", B: "~@2 x ~@4 x!2 ~ x ~ x ~ x ~",
})).gain(0.64)

// drums · ht
const ht = s("ht").struct("<~@2 [~@12 x!2 ~@2] ~@24 [~@12 x!2 ~@2] ~@60>").gain(0.56)

stack(
  bass, piano, electric_guitar_muted, acoustic_guitar_steel, string_ensemble_2, string_ensemble_2_soft, brass_section,
  kick, rim, snare, clap, hihat, hihat_soft, ride, ht
)

More by UB40