Strudelify

New York - Rio - Tokio

Trio Rio

KeyD majorTempo120 bpm
0:00/0:00
// New York - Rio - Tokio — Trio Rio
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 121 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · string ensemble 1
const string_ensemble_1 = note("<A B A B ~@20 A B ~@86 A B A B ~@5>".pickRestart({
  A: "[f#4,d5] [e4,c#5]", B: "[g4,b4] [f#4,a4]",
})).s("gm_string_ensemble_1").gain(0.16)

// chords · overdriven guitar
const overdriven_guitar = note("<A B A B C D E@2 ~@16 A B C F ~@84 A B A B C D E@2 G>".pickRestart({
  A: "[f#3,d4] [e3,c#4]", B: "[g3,b3] [f#3,a3]", C: "[f#1,c#2,f#2] [g1,d2,g2]", D: "[a1,e2,a2] [b1,f#2,b2]",
  E: "[a0,a1,e2,a2]/2", F: "[a1,e2,a2]", G: "[a1,d2,a2]@3 ~@13",
})).s("gm_overdriven_guitar").gain(0.15).pan(0.9)

// other · brass section
const brass_section = note("<A@8 ~@16 B@4 ~@30 C ~@28 D@3 E F G@2 H@4 E I ~@2 J@4 E F K@2 L M@8 ~ N>".pickRestart({
  A: "[~@60 [f#4,f#5] ~ [g4,g5] ~ [c#3,f#3]@8 [d3,g3]@8 [e3,a3]@8 [f#3,b3]@8 [e3,a3]@31 ~, [a3,d4,e4,a4]@63 [a4,a5]@64 ~]/8", // F# G F#5 G5 A5 B5 A5 Asus4 …
  B: "[~@28 [f#4,f#5] ~ [g4,g5] ~ [c#3,f#3]@8 [d3,g3]@8 [e3,a3]@15 ~, [a3,d4,e4,a4]@31 [a4,a5]@32 ~]/4", // F# G F#5 G5 A5 Asus4 A
  C: "~@9 [d2,e2,f#2,g2] [a2,b2,c#3,d3,e3] [f#3,g3,a3,b3] [c#4,d4,e4,f#4,g4] [a4,b4,c#5,d5] ~@2", // Em7 A Gmaj7 C#dim Dmaj7
  D: "[~@12 [f#4,f#5] ~ [g4,g5] [a4,a5]@31 ~@2]/3", // F# G A
  E: "[g4,g5] ~ [f#4,f#5] ~ [g4,g5] ~ [f#4,f#5] ~ [g4,g5] ~ [f#4,f#5] ~ [d4,d5] ~ [b3,b4] ~", // G F# G F# G F# D B
  F: "[d4,d5]@3 [e4,e5]@4 ~ [f#4,f#5]@4 [g4,g5]@4", G: "[[a4,a5]@15 ~]/2",
  H: "[[g4,g5] ~ [f#4,f#5] ~ [g4,g5] ~ [f#4,f#5] ~ [g4,g5] ~ [f#4,f#5] ~ [d4,d5] ~ [b3,b4] [a3,a4]@4 ~ [g3,g4] [a3,a4] [b3,b4] ~ [d4,d5] ~ [e4,e5] ~ [f#4,f#5] ~ [g4,g5] [a4,a5]@23 ~@10]/4", // G F# G F# G F# D B …
  I: "[d4,d5]@3 [e4,e5]@4 ~@9", // D E
  J: "[[g4,g5]!2 [f#4,f#5] ~ [g4,g5]!2 [f#4,f#5] ~ [g4,g5]!2 [f#4,f#5] ~ [d4,d5] ~ [b3,b4] [a3,a4]@4 ~@2 [a3,a4] [b3,b4] ~ [d4,d5] ~ [e4,e5] ~ [f#4,f#5] ~ [g4,g5] [a4,a5]@23 ~@10]/4", // G F# G F# G F# D B …
  K: "[[a4,a5]@20 ~@10 [g#4,g#5] ~]/2", // A G#
  L: "[g4,g5] ~ [d#4,d#5] [f#4,f#5] ~ [d4,d5] ~ [e4,e5] ~ [d4,d5] [c#4,c#5] [b3,b4] [a3,a4] [g3,g4] [f#3,f#4] [g3,g4]", // G D# F# D E D C# B …
  M: "[[g3,g4,b5] [f#3,f#4] [e3,e4] [d3,d4] [a3,a4] [d3,d4] [g3,g4] [f#3,f#4] ~@4 [f#4,f#5] ~ [g4,g5] ~@61 [f#4,f#5] ~ [g4,g5] ~ [c#3,f#3]@8 [d3,g3]@8 [e3,a3]@8 [f#3,b3]@8 [e3,a3]@16, ~@15 [a4,a5]@56 ~@8 [a4,a5]@49, ~ [a3,d4,e4]@4 ~@3]/8", // G F# E D A D G F# …
  N: "[d4,f#4,a4,d5,d6]@3 ~@13", // D
})).s("gm_brass_section").gain(0.35).pan(0.4)

// bass · slap bass 2
const bass = note(`<
  A@4 B C D@2 E F G H E F G H E F G H E F G I A@2 B J E F G H E F G H E F G H E F G I K L K L M N O P@3 Q R Q R Q S T U
  E F G H E F G H E F G H E F G I K L K L M N O P@3 E F G H E F G H E F G H E F G H E F G H E F G H A@4 B C D@2 V
>`.pickRestart({
  A: "d2/2", B: "f#1 g1", C: "a1 b1", D: "a1/2", E: "d2@2 ~@5 d3 d2@2 ~@6", F: "b1@2 ~@5 b2 b1 ~ b1 ~ b2 b1 ~@2",
  G: "e1@2 ~@5 e2 e1@2 ~@6", H: "a1@2 ~@5 a2 a1 ~ a1 ~ a2 a1 ~@2", I: "a1@2 ~ a2 a1@2 ~ a2 a1@2 ~ a2 a1@2 g1@2",
  J: "a1", K: "f#1@2 ~@5 g1@8 ~", L: "f#1@3 ~ c#2@2 ~ b1@8 ~", M: "f#1@2 ~@5 g#1@8 ~", N: "a1@3 ~ a#1@2 ~ b1@8 ~",
  O: "e1@3 ~ f#1@3 ~ g1@3 ~@2 g#1@2 ~", P: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 a1@2 a2",
  Q: "d2 ~ d2 ~ e2 ~ e2 f#2@3 ~ f#3 f#2@3 ~", R: "g2 ~ g2 ~ f#2 ~ f#2 ~ f2@3 e2@4 ~",
  S: "g2 ~ g2 ~ f2 ~ f2 ~ e2@4 ~ e2@3", T: "d#2", U: "[d#2,d#3]", V: "d2 ~@15",
})).s("gm_slap_bass_2").gain(0.42)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A@4 B C D@2 E F G@2 E F G@2 E F G@2 E F G@2 A@2 B H E F G@2 E F G@2 E F G@2 E F G@2 I J I J K L M N@3 O P O P O Q R S
  E F G@2 E F G@2 E F G@2 E F G@2 I J I J K L M N@3 E F G@2 E F G@2 E F G@2 E F G@2 E F G@2 E F G@2 A@4 B C D@2 ~
>`.pickRestart({
  A: "[d2,d3,d4,f#4,a4]/2", B: "f#4 g4", C: "a4 b4", D: "[d5 c#5 b4 a4, [a1,a2]]/2",
  E: "e4 f#4 e4 f#4, [d4,a4] [c#4,a4]", F: "e4 f#4@3, [b3,d4,a4]", G: "[[b3,g4] [d4,a4], e4]/2", H: "a4@3 ~",
  I: "[f#3,f#4,a4] ~@2 [g3,d4,g4,b4]@5", J: "[f#3,d4,f#4,a4]@4 [b2,b3,d4,f#4]@2 e4 [d3,a3,d4,f#4]@9",
  K: "[f#3,d4,f#4,a4] ~@2 [g#3,e4,g#4,b4]@5", L: "[a3,c#4,e4,a4]@4 [a#3,f#4]@2 e4 [b3,d4,f#4,a4]@9",
  M: "[e3,g4] [f#3,f#4] [g3,d4] [g#3,b3], b4, d4 ~", N: "[a3,d4,e4,a4]/3",
  O: "[f#3,d4,f#4,d5] ~ [f#3,d4,f#4,d5] ~ [g3,d4,g4,d5] ~ [g3,d4,g4,d5] [a3,d4,a4,d5]@2 ~@7", // D G5 D5
  P: "[b3,d4,b4,d5] ~ [b3,d4,b4,d5] ~ [a3,d4,a4,d5] ~ [a3,d4,a4,d5] ~ [g#3,d4,g#4,d5]@4 [g3,d4,g4,d5]@4", // Bm D5 G#dim G5
  Q: "[b3,d4,b4,d5] ~ [b3,d4,b4,d5] ~ [a3,d4,a4,d5] ~ [a3,d4,a4,d5] ~ [g#3,d4,g#4,d5]@4 ~@2 [g#3,d4,g#4,d5]@2", // Bm D5 G#dim
  R: "[g3,a#3,d4,g4,d5]", S: "[g3,a#3,d4,g4,a#4]",
})).s("gm_synth_strings_1").gain(0.12).pan(0.6)

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

// drums · snare
const snare = s("sd").struct("<~@8 A@19 ~ A@25 B A@7 B A@25 B A@23 C ~@8 D>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@4 x ~@4 x!4 ~ x!2", D: "x",
})).gain(0.4)

// drums · clap
const clap = s("cp").struct("<~@45 A ~ A ~ A ~@4 A ~ A ~ A ~@20 A ~ A ~ A ~@37>".pickRestart({
  A: "~@3 x",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<[x!16]!54 [x!8]!8 [x!16]!58 x>").gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@7 A ~@19 A ~@25 A ~@7 A ~@25 A ~@7 A ~@7 A ~@15 A ~>".pickRestart({
  A: "~@6 x!2",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@7 A ~@19 A ~@25 A ~@7 A ~@25 A ~@7 B ~@7 B ~@15 A ~>".pickRestart({
  A: "~@6 x!5 ~@5", B: "~@8 x!4 ~@4",
})).gain(0.35)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@8
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!19
  x
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!25
  x
  ~@8
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!58
  x
>`).gain(0.75)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@8
  [~ x ~@3 x ~@3 x ~@3 x ~@2]!19
  ~
  [~ x ~@3 x ~@3 x ~@3 x ~@2]!25
  ~@9
  [~ x ~@3 x ~@3 x ~@3 x ~@2]!58
  ~
>`).gain(0.5)

stack(
  string_ensemble_1, overdriven_guitar, brass_section, bass, synth_strings_1, kick, snare, clap, hihat, mid_tom,
  high_tom, crash, cabasa, cabasa_soft
)