Strudelify

The Girl From Ipanema

Byrd Charlie

KeyC majorTempo130 bpm
0:00/0:00
// The Girl From Ipanema — Byrd Charlie
// 130 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 48 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/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 · piano · "A.PIANO 1"
const piano = note(`<
  A B A B C D E F G@3 H C D E F I@2 J K L M N O P Q R S T U V W X Y Z AA C D E F G@3 H A H AB@2
>`.pickRestart({
  A: "f2@3 [f3,a3,c4,e4] [c4,e4]!2 ~ [f#3,a#3,c#4,f4], ~@3 c3@3 c2@2, ~@2 [f3,a3] ~", // Fmaj7 C F#maj7 F
  B: "~ [a#3,c#4,f4]@2 [f#3,a#3] [f#3,a#3,c#4,f4]@2 [f#3,a#3,c#4,f4] ~, f#2@3 ~@3 c#2@2, ~ f#3 ~ c#3@3 ~@2", // A#m F# F#maj7
  C: "[f3,a3,c4,e4] ~@2 [f3,a3,c4,e4]!3 ~ [f3,a3,c4,e4], f2@3 c3@3 c2@2", // Fmaj7
  D: "~ [f3,a3,c4]@2 ~@2 c4 e4 g4, f2@3 [c3,f3]@3 c2@2, ~ e4@4 ~@3, ~@2 a3 ~", // F F5
  E: "[g3,b3,d4,g4] ~@2 [g3,b3,d4,g4]!3 ~ [g3,b3,d4,g4], g2@3 d3@3 d2@2", // G
  F: "~ [g3,b3,d4,g4]@2 ~@3 g4 b4, g2@3 g3@4 ~, ~@3 d3@3 d2@2, ~@4 b3@3 ~, ~@5 d4@2 ~", // G
  G: "[[g3,a#3,d4,g4,a#4] ~@2 [g3,a#3,d4,g4,a#4]!3 ~@2 f#2@3 [f#3,a#3,c#4,f4,a#4]!3 ~@2 f2@3 [f3,a3,c4,e4] [c4,e4]!2 ~ [f#3,a#3,c#4,f4], g2@3 d3@3 g2@2 ~@6 c#2@2 ~@6 c2@2, ~@7 c#4@3 ~@5 e4@4 ~ [f3,a3]@2 ~@2, ~@7 [f#3,a#3,f#4,a#4]@2 ~@2 c#3@3 ~ [f3,a3,c4]@3 ~ c3@3 ~@2]/3", // Gm F#maj7 Fmaj7 C F#maj7 F F# F
  H: "~ [a#3,c#4,f4]@2 [f#3,a#3] a#3!2 ~ f4, f#2@3 ~ [f#3,c#4,f4]@2 ~@2, ~ f#3 ~ c#3@3 [c#2,c#4]@2", // A#m F# F#maj7 C#
  I: "[[g3,a#3,d4,g4,a#4] ~@2 [g3,a#3,d4,g4,a#4]!3 ~@2 f#2@3 [f#3,a#3,c#4,f4,a#4]!2 a#3 c#4 f#4, g2@3 d3@3 g2@2 ~@6 c#2@2, ~@7 c#4@3 ~@6, ~@7 [f#3,a#3,f#4,a#4]@2 ~@2 c#3@3 ~@2]/2", // Gm F#maj7 F#
  J: "[f2,f3,a3,c4,e4]@3 [f3,a3,c4,e4] [c4,e4]!2 ~ [f3,a3,c4,e4], ~@3 c3@3 c2@2, ~@2 [f3,a3] ~", // Fmaj7 C Fmaj7 F
  K: "~ [f3,a3,c4,e4] ~ [f3,a3,c4,e4] ~@3 e4, f2@3 c3@3 [c2,c4]@2, ~@5 a3@3", // Fmaj7 C
  L: "[f#3,a#3,c#4,f4] ~@2 [f#3,a#3,c#4,f4]!3 ~ [f#3,a#3,c#4,f4], f#2@3 c#3@3 c#2@2", // F#maj7
  M: "~ [f#3,a#3,f4] ~@4 f4 f#4, f#2@3 c#3@3 c#2@2, ~ c#4@2 f#3@5, ~ a#3, ~@5 c#4@3", // F#maj7
  N: "[f#3,a3,b3,d#4,f#4] ~@2 [f#3,a3,b3,d#4,f#4]!3 ~ [f#3,a3,b3,d#4,f#4], b1@3 f#2@3 f#1@2", // B7
  O: "~ [a3,b3,d#4,f#4]@2 ~@3 d#4 f#4, b1@3 f#2@3 f#1@2, ~ f#3 ~ f#3@5, ~ a3, ~@5 b3@3", // B7
  P: "[f#3,a3,c#4,e4,g#4] ~@2 [f#3,a3,c#4,e4,g#4]!3 ~ [f#3,a3,c#4,e4,g#4], f#2@3 c#3@3 c#2@2", // F#m7
  Q: "~ [c#4,e4,g#4]@2 ~@3 e4 g#4, f#2@3 c#3@3 c#2@2, ~ [f#3,a3] ~ f#3@5, ~ a3, ~@5 c#4@3", // C#m F#m
  R: "[d3,f#3,a3,c4,e4] ~@2 [d3,f#3,a3,c4,e4]!3 ~ [d3,f#3,a3,c4,e4], d2@3 a2@3 a1@2", // D7
  S: "~ [d3,f#3,a3,c4,e4]@2 ~@3 c4 e4, d2@3 d3@5, ~@3 a2@3 d2@2, ~ f#3, ~@5 a3@3", // D7
  T: "[g3,a#3,d4,f4,g4] ~@2 [g3,a#3,d4,f4,g4]!3 ~ [g3,a#3,d4,f4,g4], g2@3 d3@3 d2@2", // Gm7
  U: "~ [g3,a#3] ~@4 f4 g4, g2@4 ~ d4@3, ~ [d4,f4,g4]@3 a#3@4, ~@3 g3@5, ~@3 d3@3 d2@2", // Gm G7
  V: "[d#3,g3,a#3,c#4,f4] ~@2 [d#3,g3,a#3,c#4,f4]!3 ~ [d#3,g3,a#3,c#4,f4], d#2@3 a#2@3 a#1@2", // D#7
  W: "~ [g3,a#3,c#4,f4]@2 ~@3 c#4 f4, d#2@3 a#2@3 d#2@2, ~ d#3 ~ d#3@5, ~ g3, ~@5 a#3@3", // Gm7b5
  X: "[a3,c4,e4,g4]@3 a3@2 ~@2 e4, a1, ~@3 [e2,g4]@5, ~@3 e4@3 [e1,c4]@2, ~@3 c4@2 a3@3", // Am7 Em C
  Y: "[f#3,a3,c4,d#4]@3 a3@2 ~ c4 d#4, d2@3 a1, ~@3 [a2,f#3,c4,d#4]@3 ~@2, ~@5 a3@3", // F#dim Adim
  Z: "[g2,g3,a#3,d4,g4]@3 [d4,g4]@2 ~@2 g4, ~@3 g3@5, ~@3 d3@3 [d2,d4]@2, ~@3 a#3 ~ a#3@3", // Gm G5 D
  AA: "[c2,c3,e3,g3,a#3,c#4]@3 c2 ~ g3 a#3 c#4, ~@3 [c3,e3,g3,a#3,c#4]@2 ~@3, ~ c2", AB: "[[f1,f3,a3,c4,e4]@3 ~]/2",
})).s("gm_piano").gain(0.6).pan(0.7)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  A B A B A@2 C@2 D B A B A@2 C@2 D B A@2 B@2 E@2 B@2 F G C@2 H I J F C K A@2 C@2 D B A B A B L@2
>`.pickRestart({
  A: "f2@3 c3@3 c2@2", B: "f#2@3 c#3@3 c#2@2", C: "g2@3 d3@3 d2@2", D: "g2@3 d3@3 g2@2", E: "b1@3 f#2@3 f#1@2",
  F: "d2@3 a2@3 a1@2", G: "d2@3 a2@3 d2@2", H: "d#2@3 a#2@3 a#1@2", I: "d#2@3 a#2@3 d#2@2", J: "a1@3 e2@3 e1@2",
  K: "c2@3 c2 c2@4", L: "[f1@3 ~]/2",
})).s("gm_electric_bass_finger").gain(0.5).pan(0.2)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x!2 ~@2 x]!46 x ~>").gain(0.64)

// drums · guiro
const guiro = s("guiro:0").struct("<[~ x ~ x ~ x ~ x]!46 ~@2>").gain(8.45)

// drums · guiro
const guiro_2 = s("guiro:4").struct("<[x!4]!46 ~@2>").gain(8.45)

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

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@2
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~", B: "~@2 x ~@2 x ~@2",
})).gain(1.16)

stack(piano, bass, kick, guiro, guiro_2, woodblocks, woodblocks_2)