Strudelify

TVB

Grandi

KeyE majorTempo108 bpm
0:00/0:00
// TVB — Grandi
// 108 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 5/4 at bar 52, 4/4 at bar 53, 5/4 at bar 84, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 13 electric guitar muted (copy of ch 12 electric guitar clean)
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(108/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 · trumpet · "T.V.B." · Bmaj7
const trumpet = note("<[[a#4,b4] ~]!7 ~ [[a#4,b4] ~]!29 ~@64>").s("gm_trumpet").gain(0.1).pan(1)

// bass · electric bass finger
const bass = note(`<
  ~@3 A B C B D B C B C B C B C B C B C B C B C B C B C B C B C E B C B C B C B C E F G H G H G H G I J K L K L K L K M
  ~ N O P K L K L K L K L K L Q R S T S T S T U V@8 W@8 ~@2
>`.pickRestart({
  A: "~@9 b1 c3 a#1@4 ~", B: "e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1",
  C: "e1@2 e2 e1 d2 e2@2 e2@2 a1 b1!2 ~ a#1 g1 ~", D: "e1 ~ e1 ~ e1!2 ~ e1@6 ~@3",
  E: "e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 ~", F: "b1@2 b1@2 b1 ~ b1!2 ~ b1 e1!2 a1 f#1!2 g1",
  G: "a1 ~ a1 c#1@2 d#1 e1@3 e1 ~ e1 g1 e1 d1@2", H: "a1 ~ a1 c#1@2 a1 e1@3 d#1 ~ e1 g0 e1 d1@2",
  I: "a1 ~ a1 c#1@2 a1 e1@3 e1 e1@2 g1 ~@3", J: "~@4 e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2",
  K: "~ a#1 a1 g1 e1@2 e2 e1 d2 e2@2 e2@2 a1 b1!2", L: "~ a#1 g1 ~ e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2",
  M: "~ a#1 g1 ~ e1@2 e1 ~@9", N: "~@4 e1@2 e1 ~@9", O: "~@13 a1 a#1 b1",
  P: "~ a#1 a1 g1 e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2", Q: "~ a#1 a1 g1 b1@2 b1@2 b1 ~ b1!2 ~ b1 e1!2",
  R: "a1 f#1!2 g1 a1 ~ a1 c#1@2 d#1 e1@3 e1 ~ e1", S: "g1 e1 d1@2 a1 ~ a1 c#1@2 a1 e1@3 d#1 ~ e1",
  T: "g0 e1 d1@2 a1 ~ a1 c#1@2 d#1 e1@3 e1 ~ e1", U: "g1 e1 d1@2 a1 ~ a1 c#1@2 a1 e1@3 e1 e1@2",
  V: "[g1 ~@7 e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1 e1@2 e2 e1 d2 e2@2 e2@2 a1 b1!2 ~ a#1 g1 ~ e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1 e1@2 e2 e1 d2 e2@2 e2@2 a1 b1!2 ~ a#1 g1 ~ e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1 e1@2 e2 e1 d2 e2@2 e2@2 a1 b1!2 ~ a#1 g1 ~ e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1 e1@2 e2 e1 d2 e2@2 e2]/8",
  W: "[~ a1 b1!2 ~ a#1 g1 ~ e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1 e1@2 e2 e1 d2 e2@2 e2@2 a1 b1!2 ~ a#1 g1 ~ e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1 e1@2 e2 e1 d2 e2@2 e2@2 a1 b1!2 ~ a#1 g1 ~ e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1 e1@2 e2 e1 d2 e2@2 e2@2 a1 b1!2 ~ a#1 g1 ~ e1@2 e2 e1 d2 e2 e1 e2@2 a1 b1!2 ~ a#1 a1 g1 e1@2 e2 e1 d2 ~ e1 d2, ~@125 e2@2 ~]/8",
})).s("gm_electric_bass_finger").gain(0.56)

// chords · reed organ · Cmaj7 Em7 Dm7 G Cmaj7 Em7 Bdim Dm …
const reed_organ = note(`<
  ~@23
  [~@11 [b1,c2] [d2,e2,f2,g2] [a2,b2,c3,d3,e3,f3] [g3,a3,b3,c4,d4] [e4,f4,g4,a4,b4,c5]]
  [[d5,e5,f5,g6] [b5,c6,d6,e6,f6] [d5,e5,f5,g5,a5] [g4,a4,b4,c5] [e4,f4] ~@11]
  ~@5
  [~@12 [d3,e3,f3,g3] [a3,b3,c4] [d4,e4,f4,g4] [a4,b4,c5,d5]]
  [[e5,f5,g5] ~@15]
  ~@69
>`).s("gm_reed_organ").gain(0.25).pan(1)

// chords · reed organ · soft notes · Gsus2 Bm Fmaj7
const reed_organ_soft = note("<~@23 [~@11 [g1,a1] ~@4] [~@4 [b3,c4,d4] [e3,f3,g3,a3] ~@10] ~@76>")
  .s("gm_reed_organ").gain(0.1).pan(1)

// chords · epiano2
const epiano2 = note("<~@27 A B C D ~ E@3 F G H I H I H J ~@8 K@7 L@2 ~@6 M N@4 O@5 ~@7 P@8 Q@8 ~@2>".pickRestart({
  A: "f#3 g3 f#3 e3 ~ e3 c#4 d4 ~@2 a3 ~@4 g#3", B: "f#3 g3 f#3 e3 ~ b2 ~@10", C: "~@11 b2 f#3 g3 f#3 e3",
  D: "d3 e3 ~@14",
  E: "[f#3 g3 f#3 e3 d3 e3 ~ e3 ~@2 d3 e3 ~@3 [a3,b3,d4]@11 ~ [a#3,c4,d#4] ~ [g#3,a#3,d4] ~ [a3,b3,d4]@9 ~@5 [g#3,c#4,d4,f#4] ~@2, ~@15 g#3 ~@32]/3", // Bm7 Cm7 A#7 Bm7 C#sus4
  F: "[a3,b3,d4,f#4]@5 ~@3", G: "[b3,e4,g#4]@15 ~", H: "[a3,d4,f#4]@15 ~",
  I: "[b3,e4,g#4]@10 ~ [b3,e4,g#4] ~ [b3,e4,g#4] ~@2", J: "[b3,e4,f#4,b4]",
  K: "[~@4 [e2,e3,b3,e4,g#4]@14 ~ [e2,e3,a3,d4,f#4]@16 ~ [e2,e3,b3,e4,g#4]@14 ~ [a3,d4,f#4]@8 ~ [a3,c#4,e4]@7 ~ [e2,e3,b3,e4,g#4]@14 ~ [e2,e3,a3,d4,f#4]@16 ~ [e2,e3,b3,e4,g#4]@12, ~@51 [e2,e3]@16 ~@45]/7", // E D E D A E D E
  L: "[~@3 [a3,d4,f#4]@8 ~@2 d4 ~@18, ~@3 [e2,e3]@17 ~@12, ~@3 [a3,c#4,e4]@2 ~@3]/2", // D E A
  M: "~@12 [b3,e4,a4]@3 [a#3,d#4,g#4]", // Esus4 D#sus4
  N: "[~ [a3,d4,g4] ~ [e3,a3,d4,f#4]@16 ~ [e3,b3,e4,g#4]@15 ~ [e3,a3,d4,f#4]@15 ~ [e3,b3,e4,g#4]@12]/4", // Dsus4 D E D E
  O: "[~ [b3,e4,a4] ~@2 [e3,a3,d4,f#4]@15 ~ [e3,b3,e4]@15 ~ [a3,d4,f#4]@13 ~@3 [b3,e4,f#4,b4]@16 ~@12, ~@20 g#4@13 ~@3 e3@16 ~@28]/5", // Esus4 D E5 D Bsus4
  P: "[~@8 [b3,e4,g#4]@12 ~@3 [e2,e3,a3,d4,f#4]@15 ~@2 [e2,e3,b3,e4,g#4]@13 ~@2 [e3,a3,d4,f#4]@8 ~ [a3,c#4,e4]@6 ~@2 [b3,e4,g#4]@12 ~@3 [e2,e3,a3,d4,f#4]@14 ~@3 [e2,e3,b3,e4,g#4]@13 ~@2 [e2,e3,a3,d4,f#4]@8 [e2,e3], ~@8 [e2,e3]@14 ~@33 e2@16 ~ [e2,e3]@14 ~@42, ~@63 e3@8 ~@57]/8", // E D E D A E D E …
  Q: "[[a3,c#4,e4]@6 ~@2 [e2,e3,b3,e4,g#4]@13 ~@3 [e2,e3,a3,d4,f#4]@15 ~ [e2,e3,b3,e4,g#4]@13 [b3,e4,g#4] ~ [e2,e3,a3,d4,f#4]@8 ~ [a3,c#4,e4]@6 ~@2 [e2,e3,b3,e4,g#4]@14 ~ e3 ~@13 e2@2 ~ [e2,e3,b3,e4,g#4]@13 [e2,e3,b3,e4,g#4] ~ [e2,e3,a3,d4,f#4]@9, ~@63 [e2,e3]@8 ~@16 [e2,a3,d4,f#4]@14 ~@27, ~@98 e3@5 ~@25]/8", // A E D E D A E D …
})).s("gm_epiano2").gain(0.11).pan(0.7)

// other · clavinet
const clavinet = note(`<
  ~@27
  [f#3 g3 f#3 e3 ~ e3 c#4 d4 ~@2 a3 ~@4 g#3]
  [f#3 g3 f#3 e3 ~ b2 ~@10]
  [~@11 b2 f#3 g3 f#3 e3]
  [d3 e3 ~@14]
  ~
  [f#3 g3 f#3 e3 d3 e3 ~ e3 ~@2 d3 e3 ~@4]
  ~@68
>`).s("gm_clavinet").gain(0.14).pan(0.6)

// chords · pad sweep
const pad_sweep = note("<~@24 A@2 ~@6 B ~ C D@2 E@7 ~@7 F@8 ~@4 G@2 ~ H I@4 J@5 ~@7 K@4 L@12 ~@2>".pickRestart({
  A: "[~@14 d5@11 e5@2 ~@5]/2", B: "~ d4@6 ~@9", C: "~@4 d5@6 e5@3 ~@3", D: "[~@10 d5@5 e4@14 ~@3]/2",
  E: "[[a3,d4,f#4]@14 [b3,e4,g#4]@16 [a3,d4,f#4]@16 [b3,e4,g#4]@16 [a3,d4,f#4]@17 [b4,e5,f#5]@18 ~@15]/7", // D E D E D Bsus4
  F: "[~@4 [e4,g#4,b4]@16 [d4,f#4,a4]@16 [e4,g#4,b4]@16 [d4,f#4,a4]@8 [c#4,e4,a4]@8 [e4,g#4,b4]@16 [d4,f#4,a4]@16 [e4,g#4,b4]@16 [d4,f#4,a4]@7 [e4,a4,c#5]@5]/8", // E D E D A E D E …
  G: "[~@14 e5@15 ~@3]/2", H: "~@5 e4@3",
  I: "[~@4 [a3,d4,f#4]@16 [b3,e4,g#4]@16 [a3,d4,f#4]@15 ~ g#4@12, ~@51 [b3,e4]@13]/4", // D E D E5
  J: "[~ [a3,d4,f#4]@4 [b3,e4,g#4]@4 [a3,d4,f#4]@4 [b4,e5,f#5]@4 ~@3]/5", // D E D Bsus4
  K: "[~@8 [e4,g#4,b4]@14 ~ f#4@17 [e4,g#4,b4]@15 [d4,f#4,a4]@9, ~@22 [d4,a4]@17 ~@25]/4", // E D D5
  L: "[[e4,a4,c#5]@8 [e4,g#4,b4]@14 ~ f#4@17 [e4,g#4,b4]@15 [d4,f#4,a4]@9, ~@22 [d4,a4]@17 ~@25]/4", // A E D D5
})).s("gm_pad_sweep").gain(0.2).pan(0.3)

// chords · synth strings 1
const synth_strings_1 = note("<~@35 A B A B A B C D ~@8 E@6 F@3 ~@7 G@7 H@2 ~@7 I@4 J@8 K@4 ~@2>".pickRestart({
  A: "[a3,d4,f#4]", B: "[b3,e4,g#4]", C: "[f#4,a4,d5]", D: "[e4,f#4,b4]",
  E: "[~@4 [b3,e4,g#4]@16 [a3,d4,f#4]@16 [b3,e4,g#4]@16 [a3,d4,f#4]@8 [a3,c#4,e4]@8 [b3,e4,g#4]@15 ~ [a3,d4,f#4]@12]/6", // E D E D A E D
  F: "[~ [b3,e4,g#4]@4 [d4,f#4]@2 [c#4,e4]@2 ~@3, ~@5 a3@4 ~@3]/3", // E D C#m
  G: "[~ [a3,d4,f#4]@4 [b3,e4,g#4]@4 [a3,d4,f#4]@4 [b3,e4,g#4]@4 [a3,d4,f#4]@4 [b3,e4,g#4]@4 [f#4,a4,d5]@3]/7", // D E D E D E D
  H: "[~ [e4,f#4,b4]@4 ~@3]/2", I: "[~ [b3,e4,g#4]@2 [a3,d4,f#4]@2 [b3,e4,g#4]@2 [a3,d4,f#4]]/4",
  J: "[[a3,c#4,e4]@8 [b3,e4,g#4]@15 ~ [a3,d4,f#4]@15 ~ [b3,e4,g#4]@16 [d4,f#4]@8 [c#4,e4]@8 [b3,e4,g#4]@16 [a3,d4,f#4]@16 [b3,e4,g#4]@16 [a3,d4,f#4]@8, ~@7 a3@2 ~@7]/8", // A E D E D C#m E D …
  K: "[[a3,c#4,e4]@8 [b3,e4,g#4]@15 ~ [a3,d4,f#4]@15 ~ [b3,e4,g#4]@16 [a3,d4,f#4]@8]/4", // A E D E D
})).s("gm_synth_strings_1").gain(0.09)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@43 A B A C A B D E ~@24 F G F H I G J K L ~@17>".pickRestart({
  A: "~ b4 [b4,e5]!2 ~@6 e5 ~ f#5 e5 ~@2, [a#4,e5] ~@7", B: "~ b4 [b4,e5]!2 ~@12, [a#4,e5] ~@7",
  C: "~ b4 [b4,e5]!2 ~@5 [d4,g4] ~@3 [d4,g4] ~@2, [a#4,e5] ~@7", // E5 G5 A#dim
  D: "~ b4 [b4,e5]!2 ~@5 e5 ~@2 f#5 e5 ~@2, [a#4,e5] ~@7", E: "[a#4,d#5] [b4,e5]!3 ~@5 [d4,g4] ~@2 [d4,g4] ~@3",
  F: "~@5 b4 [b4,e5]!2 ~@6 e5 ~, ~@2 [a#4,e5] ~@5", G: "f#5 e5 ~@3 b4 [b4,e5]!2 ~@8, ~@2 [a#4,e5] ~@5",
  H: "f#5 e5 ~@3 b4 [b4,e5]!2 ~@5 [d4,g4] ~@2, ~@2 [a#4,e5] ~@5", // E5 G5 A#dim
  I: "~ [d4,g4] ~@3 b4 [b4,e5]!2 ~@6 e5 ~, ~@2 [a#4,e5] ~@5", J: "~@5 b4 [b4,e5]!2 ~@5 e5 ~@2, ~@2 [a#4,e5] ~@5",
  K: "f#5 e5 ~@2 [a#4,d#5] [b4,e5]!3 ~@5 [d4,g4] ~@2", L: "[d4,g4] ~@15",
})).s("gm_electric_guitar_clean").gain(0.22).pan(0.9)

// drums · kick
const kick = s("bd").struct("<~@2 A@5 B A@24 C A@17 C D E@7 D E@11 D E@11 F G@14 H ~@2>".pickRestart({
  A: "x ~ x ~@4 x ~@2 x ~@3 x ~", B: "x ~ x ~ x!2 ~ x ~@8", C: "x ~ x ~@4 x ~@2 x ~@5", D: "~@4 x ~ x ~@4 x ~@2 x ~",
  E: "~@2 x ~ x ~ x ~@4 x ~@2 x ~", F: "~@8 x ~ x ~@4 x", G: "~@2 x ~@3 x ~ x ~ x ~@4 x", H: "~ x ~ x!3 ~@2",
})).gain(0.61)

// drums · clap
const clap = s("cp").struct("<~@43 A@8 ~@24 B C@7 D ~@15 A E>".pickRestart({
  A: "~ x ~ x", B: "~ x", C: "x!2", D: "x", E: "~ x ~@2",
})).gain(0.34)

// drums · snare
const snare = s("sd").struct("<~ A B@5 C B@34 D B@8 E F@6 G F@12 H F@3 H F@7 I B@7 J B@7 ~@2>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "x ~ x ~ x!2 ~ x ~@4 x ~@3", D: "~@4 x ~@7 x ~ x!2", E: "~ x", F: "x!2", G: "x ~ x!2",
  H: "x ~ x!2 ~@4 x ~@7", I: "x ~@2 x", J: "~@4 x!2 ~@6 x ~@3",
})).gain(0.41)

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

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~ x ~@6]!5 ~ [~ x ~@6]!43 [~@3 x ~@4]!32 [~@5 x ~@2]!16 ~@2>").gain(0.48)

// drums · crash
const crash = s("cr").struct(`<
  ~@7 A ~@8 B ~@7 B ~@8 B ~@2 A ~@3 B ~@2 B ~@2 A ~@3 C@2 ~@7 B ~@3 C ~@3 C ~@3 C ~@3 C ~@3 B ~@2 B D ~ C ~ E ~@3 E ~@2
  A C ~@5
>`.pickRestart({
  A: "~@3 x", B: "x", C: "~ x ~@2", D: "x!2", E: "~ x",
})).gain(0.27)

// drums · tambourine
const tambourine = s("tb").struct("<~@51 A B@7 C ~@23 D B@15 E ~>".pickRestart({
  A: "~@5 x!11", B: "x!16", C: "x!2 ~@14", D: "~@8 x!8", E: "x",
})).gain(0.2)

// drums · ride
const ride = s("rd").struct("<~@43 A B@6 C ~@24 D B@7 E ~@17>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!7 ~", D: "~@3 x!5", E: "x",
})).gain(0.27)

// drums · bongos
const bongos = s("bongo:18").struct("<A@2 B@5 ~ B@42 C D E@7 F G@9 E@14 H I@15 ~@2>".pickRestart({
  A: "x!4 ~@2 x!4 ~@2 x!4", B: "x!4 ~@2 x!2 ~@5 x!3", C: "x!4 ~@2 x!2 ~@8", D: "~@4 x!4 ~@2 x!2 ~@4",
  E: "~ x!7 ~@2 x!2 ~@4", F: "~@4 x!3 ~@3 x!2 ~@4", G: "~ x!6 ~@3 x!2 ~@4", H: "~@8 x!4 ~@2 x!2", I: "~@5 x!7 ~@2 x!2",
})).gain(0.54)

// drums · congas
const congas = s("conga:13").struct(`<
  [~@2 x ~@2 x ~@2]!7
  ~
  [~@2 x ~@2 x ~@2]!43
  [~@4 x ~@2 x]!32
  [~@3 x]
  [~ x ~@4 x ~]!15
  ~@2
>`).gain(1.3)

stack(
  trumpet, bass, reed_organ, reed_organ_soft, epiano2, clavinet, pad_sweep, synth_strings_1, electric_guitar_clean,
  kick, clap, snare, hihat, open_hat, crash, tambourine, ride, bongos, congas
)

More by Grandi