Strudelify
KeyB♭ minorTempo128 bpm
0:00/0:00
// Wrap It Up — The Fabulous Thunderbirds
// 128 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 92 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/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.

// other · alto sax · "sax"
const alto_sax = note(`<
  A@2 B C B C B C B ~@7 A@2 B C B C B C B ~@7 A@2 B C B C B C B ~@19 A@2 B C B C B C D ~@2 A@2 B C B C B C B D B C B C B
  E ~@5
>`.pickRestart({
  A: "[~@10 bb3@2 db4 ~ [f4,bb4]@10 eb4 db4 bb3 ~ bb3@2 db4 ~]/2", B: "[f4,bb4]@2 eb4@2 eb4@2 db4 eb4@5 bb3@2 db4@2",
  C: "[f4,bb4]@8 eb4 db4 bb3 ~ bb3@2 db4 ~", D: "~@8 eb4 db4 bb3 ~ bb3@2 db4 ~",
  E: "[f4,bb4]@8 eb4 db4 bb3 ~ bb3@2 ~@2", // Bb5
})).s("gm_alto_sax").gain(0.64)

// other · alto sax · "sax" · soft notes
const alto_sax_soft = note("<~@86 A B C@4>".pickRestart({
  A: "~@14 db4 ~", B: "[f4,bb4]@2 eb4@2 eb4@2 db4 eb4@5 bb3@2 db4@2",
  C: "[~ db5 bb4@2 [f4,bb4]@4 eb4 db4 bb3@2 [bb3,bb4]@2 [db4,db5]@4 [eb4,eb5]@2 eb4@2 db4 eb4@5 ab5@2 f5 eb5@2 db5 bb4@2 [f4,bb4]@4 eb4 db4 bb3@2 [bb3,bb4]@2 [db4,db5]@4 ~@14]/4", // Bb5 Bb Db Eb Bb5 Bb Db
})).s("gm_alto_sax").gain(0.08)

// bass · acoustic bass · "bass"
const bass = note(`<
  A@2 B C D E F G H I J K L J I M N O P Q R O P Q R K S T J@2 U K I O P Q R O P Q R V@4 W X Y Z AA Y AB AC J K AD AE T I
  S J O P Q R O P AF AG@3 AH O P Q R O P Q R O P Q R O P Q R ~@4
>`.pickRestart({
  A: "[~@14 bb2@5 ~ bb2@4 f2 ~ f2@2 bb2@2 a2 ~]/2", B: "ab2@7 ~ eb2 ~ eb2@2 ab2 ~ ab2@2",
  C: "db2@3 ~ db2@3 ~ ab2 ~ ab2@2 db2 ~ d2@2", D: "eb2@3 ~ eb2@3 ~ eb2@3 ~ ab2 ~ a2 ~",
  E: "bb2@3 ~ bb2@3 ~ f2 ~ f2@2 bb2 ~ a2 ~", F: "ab2@7 ~ eb2 ~ eb2@2 ab2@2 ab2@2",
  G: "db2@3 ~ db2@3 ~ ab2 ~ ab2 ~ db2 ~ d2@2", H: "eb2@3 ~ eb2@3 ~ eb2@3 ~ ab2 ~ a2@2",
  I: "bb2@3 ~@3 bb2@4 bb2 ~ ab2 ~ a2@2", J: "bb2@3 ~@3 bb2@3 ~ bb2 ~ ab2 ~ a2@2", K: "bb2@3 ~@3 bb2@4 bb2 ~ ab2@2 a2@2",
  L: "bb2@3 ~@3 bb2@3 ~ bb2 ~ ab2 ~ a2 ~", M: "bb2@3 ~@3 bb2@3 ~ bb2@2 ab2 ~ a2@2",
  N: "bb2@3 ~@3 bb2@3 ~ bb2@2 ab2 ~ a2 ~", O: "bb2@4 ~@2 bb2 f2@2 f2 f2@2 bb2@2 a2@2",
  P: "ab2@4 ab2@3 eb2@2 eb2 eb2@2 ab2@2 bb2@2", Q: "db3@4 db3@3 ab2@2 ab2 ab2@2 db3@2 d3@2",
  R: "eb3@4 eb3@3 g2@2 g2 g2@2 ab2@2 a2@2", S: "bb2@3 ~@3 bb2@3 ~ bb2 ~ ab2@2 a2@2",
  T: "bb2@4 ~@2 bb2@3 ~ bb2 ~ ab2 ~ a2@2", U: "bb2@3 ~@3 bb2@4 bb2@2 ab2 ~ a2@2",
  V: "bb2@4 d3@4 eb3 eb3@2 e3!2 f3 ab3@2", W: "g2@2 g2@2 gb2 ~ gb2@2 f2 ~ f2@2 gb2 ~ gb2@2",
  X: "g2 ~ g2@2 gb2@2 gb2 ~ f2 ~ f2@2 gb2 ~ gb2@2", Y: "g2 ~ g2@2 gb2 ~ gb2@2 f2 ~ f2@2 gb2 ~ gb2@2",
  Z: "g2 ~ g2@2 gb2 ~ gb2@2 f2@2 f2@2 gb2 ~ gb2@2", AA: "g2 ~ g2@2 gb2 ~ gb2@2 f2 ~ f2@2 gb2@2 gb2@2",
  AB: "g2@2 g2@2 gb2 ~ gb2@2 f2 ~ f2@2 gb2 ~ db2@2", AC: "a2@3 ~ f2@4 c2@3 ~ f2@3 ~",
  AD: "bb2@3 ~@3 bb2@4 bb2 ~ ab2 ~ a2 ~", AE: "bb2@4 ~@2 bb2@3 ~ bb2 ~ ab2 ~ a2 ~",
  AF: "db3@4 db3@3 ab2@2 ab2 ab2@2 db3@2 bb3@2", AG: "bb2@2 ~ g3 g2!2 ab2 a2 bb2!2 db3 d3 eb3@2 gb3@2",
  AH: "g3@2 ~ g3 g2!2 ab2 a2 bb2!2 db3 d3 eb3@2 gb3@2",
})).s("gm_acoustic_bass").gain(0.72)

// chords · percussive organ · "organ"
const percussive_organ = note(`<
  ~ A B C D E B C D F G F G H G F I A B J K A B J K F L F G F G F G A B J M@2 N O D ~@4 P ~ Q R S T U V F G H I H G F I
  A B J M@2 B O A ~@3 A B J M@2 B O W@3 J M@2 B X ~@5
>`.pickRestart({
  A: "[f4,bb4,db5,f5]", B: "[eb4,ab4,c5,eb5]@15 ~", C: "[db4,f4,ab4,db5]@15 ~", D: "[bb3,eb4,g4,bb4]@15 ~",
  E: "[f4,bb4,db5,f5]@15 ~", F: "~@3 [db4,f4]@5", G: "bb4@5 ~ [db4,f4,db5]@6 ~@4", H: "~@6 [db4,f4]@9 ~",
  I: "bb4@5 ~ [db4,f4,db5]@5 ~@5", J: "[ab4,db5,f5,ab5]", K: "[bb3,eb4,g4,bb4]", L: "bb4@6 [db4,f4,db5]@5 ~@5",
  M: "[db5 ~ eb5 ~@3 db4 eb4@5 f5@2 db5 ~ [f4,f5]@15 ~, [bb3,g4,bb4]@15 ~ bb4@4 ~@12, eb4@6 ~@9 eb5@2 ~@15, ~@8 db5 ~@7]/2", // F Eb
  N: "[eb4,ab4,c5,eb5]", O: "[ab4,db5,f5,ab5]@15 ~", P: "[g3,d4,g4] [db4,gb4,db5,gb5] [f3,c4,f4,c5] [db4,gb4,db5,gb5]",
  Q: "[g4,d5]@3 ~ [gb4,db5]@4 [f4,c5]@3 ~ [gb4,db5]@3 ~", R: "[g4,d5] [gb4,db5] [f4,c5] [gb4,db5]",
  S: "[g4,bb4,d5,g5]@4 [gb4,bb4,d5,f5]@4 [bb4,db5,f5] ~ bb4@2 [gb4,bb4]@4, ~@4 f4 ~@3", // Gm Bb Bbm Gb
  T: "[g4,bb4,d5]@4 [gb4,bb4,d5,f5]@4 [f4,bb4,d5,f5]@4 [gb4,bb4,d5]@3 ~", // Gm Bb Gbaug
  U: "[g4,bb4,d5]@4 [gb4,bb4,d5]@3 ~ [f4,bb4,d5]@3 ~ [gb4,bb4,d5]@4", V: "[a4,c5,g5]",
  W: "[db5 ~ eb5 ~@3 db4 eb4@5 f5@2 db5 ~ [f4,bb4,db5,f5]@16 [eb4,ab4,c5]@15 ~, [bb3,g4,bb4]@5 ~@11, eb4@2 ~@3 eb5@11]/3", // Bbm Ab Eb
  X: "[f5,ab5]", // Fm
})).s("gm_percussive_organ").gain(0.4)

// chords · percussive organ · "organ" · soft notes
const percussive_organ_soft = note("<~@86 A B@3 C D>".pickRestart({
  A: "[ab4,db5]@15 ~", // Db5
  B: "[db5 ~ eb5 ~@3 db4 eb4@5 f5@2 db5 ~ [f4,bb4,db5,f5]@16 [eb4,ab4,c5]@15 ~, [bb3,g4,bb4]@5 ~@11, eb4@2 ~@3 eb5@11]/3", // Bbm Ab Eb
  C: "[ab4,db5,f5,ab5]", D: "db5 ~ eb5 ~@3 db4 eb4@5 f5@2 db5 ~, [bb3,g4,bb4]@15 ~, eb4@3 ~@5",
})).s("gm_percussive_organ").gain(0.12)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@85
  [~@8 x!3 ~@5]
  [x ~@5 x ~ x!3 ~@5]
  [x ~@3 x ~@3 x!3 ~@5]
  [x ~@5 x ~ x!3 ~@5]!3
  [x ~@3 x ~@3 x!3 ~@5]
>`).gain(0.16)

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!4 ~@87>").gain(0.64)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@85
  [~@3 x]
  [~ x ~ x]
  [~@2 x ~@3 x!4 ~ x!3 ~ x]
  [~ x ~ x]!3
  [~@2 x ~@3 x!4 ~ x!3 ~@2]
>`).gain(0.16)

// drums · low tom
const low_tom = s("lt").struct("<~@52 [~@14 x!2] ~@39>").gain(0.64)

// drums · hihat
const hihat = s("hh").struct(`<
  A B@7 C B@7 C B@3 C B@3 C B@7 C B@3 C B@3 C B@11 D B@7 C B@3 C B@3 ~@3 E B@3 C B@3 C B@3 C B E ~@6
>`.pickRestart({
  A: "x ~ x ~ x ~ x!2", B: "x!8", C: "x!10 ~ x!2 ~@2 x", D: "x!2 ~@2", E: "x!4 ~@4",
})).gain(0.64)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@85 [~@4 x!4] [x!8] [x!10 ~ x!2 ~@2 x] [x!8]!3 [x!10 ~ x!2 ~@3]>").gain(0.16)

// drums · mid tom
const mid_tom = s("mt").struct("<~@52 [~@11 x!3 ~@2] ~@18 [~@12 x!2 ~@2] ~@20>").gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@52 [~@8 x!3 ~@5] ~@18 [~@8 x!4 ~@2 x!2] ~@20>").gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~@6 A@2 ~@3 A ~@3 A ~@7 A ~@3 A ~@15 A ~@6 A@2 ~@3 A ~@6 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.64)

stack(
  alto_sax, alto_sax_soft, bass, percussive_organ, percussive_organ_soft, kick, kick_soft, clap, snare, snare_soft,
  low_tom, hihat, hihat_soft, mid_tom, high_tom, crash
)

More by The Fabulous Thunderbirds