Strudelify

Fly Robin Fly

Silver Convention

KeyC minorTempo100 bpm
0:00/0:00
// Fly Robin Fly — Silver Convention
// 100 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 39 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · rock organ
const rock_organ = note("<~@4 A@2 B@2 A@2 C@2 ~@19 D@2 E@2 D@2 F ~>".pickRestart({
  A: "[g5@3 ~ f5 eb5 ~ g5@17 ~@8]/2", B: "[c5@3 ~ eb5 f5 ~ c5@17 ~@8]/2", C: "[eb5 ~ f5 ~ g5 bb5 ~ c6@11 ~@14]/2",
  D: "[[g5,c6,eb6,g6]@3 ~ f6 eb6 ~ [g5,c6,eb6,g6]@18 ~@7, ~@4 [eb5,g5,c6]@3 ~@25]/2", // Cm
  E: "[[c5,eb5,g5,c6]@3 ~ eb6 f6 ~ [c5,eb5,g5,c6]@17 ~@8, ~@2 [eb5,g5,c6] ~@13]/2", F: "eb6 ~ f6 ~ g6 bb6 ~ c7@8 ~",
})).s("gm_rock_organ").gain(0.8)

// chords · piano · Cm Gm
const piano = note(`<
  ~@2
  [~@2 [g3,c4,eb4] ~@2 [g3,eb4]@2 ~ [g3,c4,eb4]@2 ~ [g3,bb3,d4]@2 ~ [g3,bb3,d4] ~, ~@5 bb3 ~@10]!13
  ~@24
>`).s("gm_piano").gain(0.5).pan(0)

// other · trumpet
const trumpet = note("<~@37 [eb5 ~ f5 ~ g5 bb5 ~ c6@8 ~] ~>").s("gm_trumpet").gain(0.8)

// bass · electric bass finger
const bass = note("<A@15 B C D E F G D E F@2 H I H J K L@7 M ~>".pickRestart({
  A: "c2 ~ c2 ~ eb2 ~ eb2 ~ c2 ~ c2 ~ g1@2 bb1@2", B: "bb1@4 ~@2 bb1@3 ~ bb2 ~ ab2 a2 bb2 ~",
  C: "bb1@2 ~@2 bb2 ~ bb1@3 ~ ab2 a2 bb2 ~ c2 d2", D: "eb2 ~ eb2 ~@3 eb2@2 ~@2 eb2 ~ bb1 ~ c2 ~",
  E: "eb2 ~ eb2 ~@3 eb2@2 ~@2 eb2 ~ bb1 ~ eb2 ~", F: "c2 ~ c2@2 ~@2 c2@2 ~@2 c2 ~ g2 ~ eb2 ~",
  G: "c2 ~ c2@2 ~@2 c2@2 ~@2 c2 ~ bb1 ~ c2 ~", H: "f2@3 ~@3 g2@3 ~ g2 ~ g2 ~ g2 ~",
  I: "ab2@3 ~@3 g2@3 ~ g2 ~ g2 ~ g2 ~", J: "ab2 ~ a2 ~ bb2 ~ b2 ~", K: "c3 ~ eb3 ~@5 c2 ~ c2 ~ g1@2 bb1 ~",
  L: "c2 ~ c2 ~ g1@2 bb1 ~ c2 ~ c2 ~ g1@2 bb1 ~", M: "eb2 ~ f2 ~ g2 bb2 ~ c3@8 ~",
})).s("gm_electric_bass_finger").gain(0.8)

// chords · piano
const piano_2 = note("<~@15 A B ~@14 C ~ C ~ C ~@3>".pickRestart({
  A: "[bb2,eb3,f3,ab3,bb3,c5,eb5,f5,ab5,bb5]@2 ~ [bb2,eb3,f3,ab3,bb3,c5,eb5,f5,ab5,bb5]@3 ~@2", // Fm7
  B: "[bb2,eb3,f3,ab3,bb3,c5,eb5,f5,ab5,bb5]@4 ~@2 [bb2,eb3,f3,ab3,bb3,c5,eb5,f5,ab5,bb5]@5 ~@5", C: "c5!3 ~@13",
})).s("gm_piano").gain(0.4)

// chords · synth brass 1
const synth_brass_1 = note("<~@17 A@2 B@2 A@2 B@2 C D E F ~@10>".pickRestart({
  A: "~@2 [g3,bb3,eb4]!2 ~@2 [g3,bb3,eb4]!2 ~@2 [g3,bb3,eb4]!2 ~@2 [g3,bb3,eb4]!2", // Eb
  B: "~@2 [g3,c4,eb4]!2 ~@2 [g3,c4,eb4]!2 ~@2 [g3,c4,eb4]!2 ~@2 [g3,c4,eb4]!2", C: "[ab3,c4,f4]@2 ~ [bb3,d4,g4]@4 ~",
  D: "[c4,f4,ab4]@4 ~@2 [bb3,d4,g4]@7 ~@3", E: "[ab3,c4,f4]@5 ~ [bb3,d4,g4]@8 ~@2",
  F: "[c4,f4,ab4]@2 ~@2 [db4,gb4,a4]@3 ~ [d4,g4,bb4]@3 ~ [d4,ab4,b4]@2 ~@2", // Fm Gbm Gm Abdim
})).s("gm_synth_brass_1").gain(0.32).pan(0)

// chords · acoustic guitar nylon · Eb Cm Eb Cm
const acoustic_guitar_nylon = note(`<
  ~@17
  [[bb3,eb4,g4,bb4] ~@2 [eb4,g4,bb4] ~@2 [eb4,g4,bb4] ~ [bb3,eb4,g4,bb4] ~@2 [eb4,g4,bb4] ~@2 [eb4,g4,bb4] ~, ~@2 bb3@2 ~ bb3@2 ~@3 bb3@2 ~ bb3@2 ~]!2
  [[c4,eb4,g4,c5] ~@2 [eb4,g4,c5] ~@2 [eb4,g4,c5] ~ [c4,eb4,g4,c5] ~@2 [eb4,g4,c5] ~@2 [eb4,g4,c5] ~, ~@2 c4@2 ~ c4@2 ~@3 c4@2 ~ c4@2 ~]!2
  [[bb3,eb4,g4,bb4] ~@2 [eb4,g4,bb4] ~@2 [eb4,g4,bb4] ~ [bb3,eb4,g4,bb4] ~@2 [eb4,g4,bb4] ~@2 [eb4,g4,bb4] ~, ~@2 bb3@2 ~ bb3@2 ~@3 bb3@2 ~ bb3@2 ~]!2
  [[c4,eb4,g4,c5] ~@2 [eb4,g4,c5] ~@2 [eb4,g4,c5] ~ [c4,eb4,g4,c5] ~@2 [eb4,g4,c5] ~@2 [eb4,g4,c5] ~, ~@2 c4@2 ~ c4@2 ~@3 c4@2 ~ c4@2 ~]!2
  ~@14
>`).s("gm_acoustic_guitar_nylon").gain(0.4).pan(0)

// chords · piano · Fm Gm Fm Gm Fm Gm Fm Gbm …
const piano_3 = note(`<
  ~@25
  [[ab3,c4,f4]@2 ~ [bb3,d4,g4]@4 ~]
  [[c4,f4,ab4]@4 ~@2 [bb3,d4,g4]@7 ~@3]
  [[ab3,c4,f4]@5 ~ [bb3,d4,g4]@8 ~@2]
  [[c4,f4,ab4]@2 ~@2 [db4,gb4,a4]@3 ~ [d4,g4,bb4]@3 ~ [d4,ab4,b4]@2 ~@2]
  [[eb4,g4,c5]!3 ~@2 [d4,g4,bb4] ~@2 [eb4,g4,c5] ~@2 [c4,eb4,g4]@2 ~ [d4,g4,bb4] ~]!8
  ~@2
>`).s("gm_piano").gain(0.6).pan(1)

// drums · kick
const kick = s("bd").struct("<[x!4]!15 [x ~@2 x ~@2 x ~]!2 [x!4]!8 [x ~@2 x ~@2 x ~]!3 [x!4]!9 [x ~@6 x ~@8] ~>")
  .gain(0.5)

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

// drums · low tom
const low_tom = s("lt").struct("<~@25 [~@7 x] [~@14 x!2]!3 ~@10>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~@17 [x!4]!8 ~@14>").gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@15 [x ~@2 x ~@4] x ~@8 [x ~@2 x ~@4]!3 ~@9 [~@7 x ~@8] ~>").gain(0.5)

// drums · crash
const crash = s("cr").struct("<~@16 [~@3 x ~@4] ~@22>").gain(0.5)

// drums · congas
const congas = s("conga:18").struct("<~@17 [x!7 ~]!8 ~@4 [x!7 ~]!8 ~@2>").gain(1.59)

// drums · congas
const congas_2 = s("conga:33").struct("<~@17 [~ x ~@3 x ~@3 x ~ x ~@2 x ~]!8 ~@4 [~ x ~@3 x ~@3 x ~ x ~@2 x ~]!8 ~@2>")
  .gain(1.59)

stack(
  rock_organ, piano, trumpet, bass, piano_2, synth_brass_1, acoustic_guitar_nylon, piano_3, kick, snare, low_tom, hihat,
  open_hat, crash, congas, congas_2
)