Strudelify

Good Morning Sunshine

Aqua

KeyF majorTempo110 bpm
0:00/0:00
// Good Morning Sunshine — Aqua
// 110 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 102 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/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.

// bass · synth bass 1 · "Bass"
const bass = note(`<
  ~@5 A B C D A B C E A B C F A B C F A B C B G H I J K L G H I J M N J O A B C D A B C F A B C F A B C B G H I J K L G
  H I J M N J P Q D R D@2 R@4 S T U V G H I J K L G H I J M N J O Q ~@5
>`.pickRestart({
  A: "d2@2 ~ d2 ~@2 d2 ~ d2@5 ~ d2 ~", B: "c2@2 ~ c2 ~@2 c2 ~ c2 ~ c2 ~@3 c2 ~",
  C: "bb1@2 ~ bb1 ~@2 bb1 ~ bb1@5 ~ bb1 ~", D: "g1@2 ~ g1 ~@2 g1 ~ g1 ~ g1 ~@3 g1 ~",
  E: "g1@2 ~ g1 ~@2 g1 ~ g1 ~ bb1 ~ c2 ~ db2 ~", F: "g1@2 ~ g1 ~@2 g1 ~ g1 ~ f1 ~ a1 ~ f1 ~",
  G: "f2@2 ~ f2 ~@2 f2 ~ f2 ~ f2!3 ~ f2 ~", H: "e2@2 ~ e2 ~@2 e2 ~ e2@4 a1@4", I: "eb2@2 ~ eb2 ~@2 eb2@5 ~@3 eb2 ~",
  J: "bb1@2 ~ bb1 ~@2 bb1 ~ bb1@4 ~@2 bb1 ~", K: "db2 ~@2 db2 ~@2 db2 ~ db2@4 ~@2 db2@2",
  L: "eb2 ~@2 eb2 ~@2 eb2 ~ eb2@4 ~@2 eb2@2", M: "g1@2 ~ g1 ~@2 g1 ~ g1@4 ~@2 g1 ~",
  N: "a1@2 ~ a1 ~@2 a1 ~ a1@4 ~@2 a1 ~", O: "db2", P: "db2@2 ~ db2 ~@2 db2 ~ db2@4 bb2@4", Q: "d2",
  R: "g1@2 ~ g1 ~@2 g1 ~ g1 ~@2 g1!2 ~ g1 ~", S: "g1", T: "a1", U: "bb1", V: "db2@3 c2",
})).s("gm_synth_bass_1").gain(0.45)

// chords · epiano2 · "Piano Chords"
const epiano2 = note(`<
  ~@5 A B C D A B C D A B C D A B C D A B C E F E G C H I F E G C D J C H A B C D A B C D A B C D A B C E F E G C H I F
  E G C D J C H A D ~ K ~ D ~ K ~ D J C H F E G C H I F E G C D J C H ~@6
>`.pickRestart({
  A: "[a3,d4,f4]", B: "[g3,c4,e4]", C: "[bb3,d4,f4]", D: "[bb3,d4,g4]", E: "[c4,e4,g4]", F: "[c4,f4,a4]",
  G: "[c4,eb4,a4]", H: "[bb3,db4,f4]", I: "[bb3,eb4,g4]", J: "[a3,c4,f4]", K: "[a3,c4,g4]",
})).s("gm_epiano2").gain(0.25)

// other · acoustic guitar nylon · "Guitar Lead (Nylon)"
const acoustic_guitar_nylon = note(`<
  ~@4 A B C D A B C D E F ~@14 G ~@5 H ~@3 A B C D E ~@15 G ~@5 H ~@20 I ~@5 G ~@10
>`.pickRestart({
  A: "~@12 d4 e4 f4 g4", B: "a4", C: "~@12 g4 a4 bb4 c5", D: "d5", E: "~@6 f4 g4 a4@4 f4@4", F: "d4",
  G: "~@6 f4 [bb4,c5] d5@8", H: "~@6 [bb3,f4] [bb4,c5] d5@8", I: "~@6 [bb3,f4] [bb4,c5] ~@8",
})).s("gm_acoustic_guitar_nylon").gain(0.35).pan(0.3)

// other · acoustic guitar nylon · "Guitar Lead (Nylon)" · soft notes
const acoustic_guitar_nylon_2 = note("<~@28 A ~@29 A ~@26 B ~@5 A ~@10>".pickRestart({
  A: "~@6 bb3 ~@9", B: "~ d5",
})).s("gm_acoustic_guitar_nylon").gain(0.25).pan(0.3)

// chords · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  ~@5 A B C@2 A B C@2 A B C@2 A B C@2 A B D B E@3 F@2 G E@3 H@2 I@3 A B C@2 A B C@2 A B C@2 A B D B E@3 F@2 G E@3 H@2
  I@3 A J@2 K@2 J@2 K@2 L M N@2 E@3 F@2 G E@3 H@2 I@3 ~@6
>`.pickRestart({
  A: "[a3,d4,f4]", B: "[g3,c4,e4]", C: "[f3 g3, [bb3,d4]]/2", D: "[f3,bb3,d4]",
  E: "[f4 [e4,g4] [c4,eb4], a4, c4@2 ~]/3", F: "[d4 db4, [f4,bb4]]/2", G: "[bb3,eb4,g4]", H: "[d4,f4,bb4]/2",
  I: "[[c4,a4] d4 db4, f4, ~ bb4@2]/3", J: "[d4,g4,bb4]/2", K: "[g4,a4,c5]/2", L: "[d4,g4,bb4]", M: "[f4,a4,c5]",
  N: "[d5 db5, [f4,bb4]]/2", // Bb5
})).s("gm_string_ensemble_2").gain(0.16)

// other · string ensemble 1 · "High Strings"
const string_ensemble_1 = note(`<
  ~@70
  [d5 ~ d5 ~ d5 ~ d5 ~]!2
  [c5 ~ c5 ~ c5 ~ c5 ~]!2
  [d5 ~ d5 ~ d5 ~ d5 ~]!2
  [c5 ~ c5 ~ c5 ~ c5 ~]!2
  ~@24
>`).s("gm_string_ensemble_1").gain(0.22)

// drums · rim
const rim = s("rim").struct("<[x!4] ~@101>").gain(0.24)

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

// drums · clap
const clap = s("cp").struct("<~ A@3 B A@7 B A@11 B A@13 ~ A@3 B A@11 B A@14 ~ A@8 ~@4 A@13 ~@7>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.8)

// drums · snare
const snare = s("sd").struct("<~ A@3 B A@7 B A@11 C A@13 D A@3 B A@11 C A@14 E A@8 ~@3 E A@13 D ~@6>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x!2 ~ x!3 ~", C: "~@4 x ~@7 x!3 ~", D: "~@12 x!2 ~@2", E: "~@9 x!2 ~ x!3 ~",
})).gain(0.8)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@38 [~@7 x] ~@56 [~@7 x] ~@6>").gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~ [~@7 x]!37 ~ [~@7 x]!39 ~@3 [~@7 x]!14 ~@7>").gain(0.64)

// drums · crash
const crash = s("cr").struct("<~@5 A ~@7 A ~@11 A ~@5 A ~@7 A ~@3 A ~@11 A ~@5 A ~@7 A ~@12 A ~@5 A ~@13>".pickRestart({
  A: "x",
})).gain(0.64)

// drums · bongos
const bongos = s("bongo:4").struct("<~ A@37 ~ A@30 ~ A@8 ~@4 A@13 ~@7>".pickRestart({
  A: "x!2 ~ x ~ x ~ x",
})).gain(0.84)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~ A@37 ~ A@30 ~ A@8 ~@4 A@13 ~@7>".pickRestart({
  A: "~@3 x ~@3 x ~@3 x ~@3 x",
})).gain(0.84)

// drums · congas
const congas = s("conga:13").struct("<~ A@37 ~ A@30 ~ A@8 ~@4 A@13 ~@7>".pickRestart({
  A: "~ x ~@3 x ~@3 x ~@3 x ~@2",
})).gain(1.02)

stack(
  bass, epiano2, acoustic_guitar_nylon, acoustic_guitar_nylon_2, string_ensemble_2, string_ensemble_1, rim, kick, clap,
  snare, hihat, mid_tom, open_hat, crash, bongos, bongos_2, congas
)

More by Aqua