Strudelify
Amazing Grace cover art

Amazing

Amazing Grace

Judy Collins

KeyF majorTempo75 bpm
0:00/0:00
// Amazing Grace — Judy Collins
// 75 bpm, 3/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 70 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(75/3)

// 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.

// other · tubular bells · "Bells"
const tubular_bells = note("<A@5 B@8 C@4 ~@53>".pickRestart({
  A: "[~@8 bb3@8 eb4@15 ~ g4@6 ~@2 g4@16 f4@8 eb4@15 ~ c4@8 bb3@15 ~ bb3@8 eb4@8]/5",
  B: "[~@8 g4@5 ~@3 g4@16 f4@6 ~@2 bb4@40 g4@8 bb4@16 g4@8 eb4@15 ~ bb3@5 ~@3 c4@16 eb4@7 ~ bb3@15 ~ bb3@7 ~ eb4@8]/8",
  C: "[~@4 g4@2 ~@2 g4@7 ~ f4@3 ~ eb4@25 ~@3]/4",
})).s("gm_tubular_bells").gain(0.8)

// chords · church organ
const church_organ = note("<A@2 B@8 C@5 D@2 E@2 F@2 G@2 H@2 I@3 J K L M N ~@37>".pickRestart({
  A: "[~ [bb3,eb4,g4]@2]/2", // Eb
  B: "[~ db4 [ab3,c4,ab4]@3 g4@9 d4@3 d4@3 [bb3,eb4,g4]@4, ~ eb4@6 f4@3 ~@2, ~@5 bb3@15 ~@4]/8", // Ab Eb
  C: "[~ db4 [ab3,c4,eb4]@3 [bb3,eb4,g4]@3 [c4,eb4,g4]@3 [bb3,d4,f4]@3 [eb4,ab4,c5]]/5", // Ab Eb Cm Bb Ab
  D: "[~ [d4,g4,bb4]@9 [c4,f4,ab4]@10 [bb3,eb4,g4]@28]/2", E: "[eb5@22 ~@2 db5@23 ~, [eb4,g4,bb4]@23 ~]/2",
  F: "[[eb4,ab4,c5]@23 ~ [eb4,g4,bb4]@23 ~, eb5@47 ~]/2", G: "[eb4,g4,bb4,eb5]/2", H: "[bb4,d5,f5]/2",
  I: "[eb5 db5 [ab4,c5,eb5], eb4@71 ~, [g4,bb4]@2 ~]/3", J: "[eb4,g4,bb4,eb5]", K: "[g4,c5,eb5]", L: "[f4,bb4,d5,f5]",
  M: "[ab4,c5,eb5]", N: "[eb4,g4,bb4]@2 ~",
})).s("gm_church_organ").gain(0.24)

// chords · piano
const piano = note(`<
  ~@16 A B@2 C D E F G@2 H I J K L M N O P@2 Q R S T U@2 V W X Y Z AA AB AC AD@2 AE AF AG AH AI@2 AJ AK AL AM AN AO AP
  AQ AN AO AR@3
>`.pickRestart({
  A: "~@16 [bb3,bb4]@5 [c4,c5]@3", // Bb C
  B: "[[eb2,eb3,bb3,eb4,g4,eb5,eb6]@16 [eb2,eb4,g4,bb4]@3 ~@2 [ab2,ab4,c5]@3 [eb2,g4,bb4]@8 [f2,ab4]@8 [g2,bb4]@8, ~@21 eb4@11 ~@16]/2", // Eb Ab Eb Fm Gm
  C: "[ab2,ab4,c5,eb5]@7 [ab2,ab4,c5,eb5]", D: "bb4@16 ~@5 [c4,c5]@3, [eb2,g4,eb5], ~@2 [bb3,bb4]",
  E: "[eb2,eb3,bb3,eb4,g4]@16 [eb2,eb4,g4,bb4]@3 ~@2 [ab2,eb4,ab4,c5]@3", // Eb Ab
  F: "[eb2,eb4,g4,bb4]@16 ~@5 [a2,a4]@3, ~@2 [g2,g4,g5], ~@19 [ab2,ab4,ab5]@5", // Eb A G Ab
  G: "[[bb2,f4,bb4,d5]@8 ~@7 [d4,d5,d6], bb1@29 [d4,d5]@3 [eb3,eb4,eb5]@3 [f3,f4,f5]@2 [g3,g4,g5]@3 [bb3,bb4,bb5]@3 [c4,c5,c6]@5, ~ bb2, ~@24 [bb3,bb4]@3 [c4,c5]@2 d3@19, ~@8 d5 c3@7]/2", // Bb D Eb F G Bb C Bb …
  H: "[eb4,g4,bb4,eb5,eb6]@16 [eb2,eb4,g4,bb4]@3 ~@2 [ab2,eb4,ab4,c5]@3", // Eb Ab
  I: "[eb2,eb4,g4,bb4]@8 [f2,ab4]@8 [g2,bb4]@5 eb2@3", // Eb Fm Gm
  J: "[ab2,ab4,c5,eb5]@16 [ab2,ab4,c5,eb5]@3 ~@2 [ab2,ab4,c5,eb5]@3", // Ab
  K: "eb2@16 ~@5 b3@3, [g4,eb5], bb4@19 [bb3,bb4]@5, ~@2 eb2", // Cm Bb
  L: "c4@13 ~@8 g4@3, [c2,c3], g4@7 ~, eb4@2 eb4, ~@13 c4@10 ~", // C
  M: "bb2@13 ~@8 f4@3, bb1, [d4,f4]@19 d4@5, bb3@2 bb3, ~@13 bb2@11", N: "[ab2,c4,eb4,ab4] [g2,bb3,g4] [f2,ab3,f4]",
  O: "~@16 [b3,b4]@5 [db4,db5]@3, [eb2,eb4,g4,bb4]@7 ~", // B Db Eb
  P: "[[e2,e3,b3,e4,ab4,e5,e6]@16 [e2,e4,ab4,b4]@3 ~@2 [a2,a4,db5]@3 [e2,ab4,b4]@8 [gb2,a4]@8 [ab2,b4]@8, ~@21 e4@11 ~@16]/2", // E A E Gbm Abm
  Q: "[a2,a4,db5,e5]@7 [a2,a4,db5,e5]", R: "b4@16 ~@5 [db4,db5]@3, [e2,ab4,e5], ~@2 [b3,b4]",
  S: "[e2,e3,b3,e4,ab4]@16 [e2,e4,ab4,b4]@3 ~@2 [a2,e4,a4,db5]@3", // E A
  T: "[e2,e4,ab4,b4]@16 ~@5 [bb2,bb4]@3, ~@2 [ab2,ab4,ab5], ~@19 [a2,a4,a5]@5", // E Bb Ab A
  U: "[[b2,gb4,b4,eb5]@8 ~@7 [eb4,eb5,eb6], b1@29 [eb4,eb5]@3 [e3,e4,e5]@3 [gb3,gb4,gb5]@2 [ab3,ab4,ab5]@3 [b3,b4,b5]@3 [db4,db5,db6]@5, ~ b2, ~@24 [b3,b4]@3 [db4,db5]@2 eb3@19, ~@8 eb5 db3@7]/2", // B Eb E Gb Ab B Db B …
  V: "[e4,ab4,b4,e5,e6]@16 [e2,e4,ab4,b4]@3 ~@2 [a2,e4,a4,db5]@3", W: "[e2,e4,ab4,b4]@8 [gb2,a4]@8 [ab2,b4]@5 e2@3",
  X: "[a2,a4,db5,e5]@16 [a2,a4,db5,e5]@3 ~@2 [a2,a4,db5,e5]@3", Y: "e2@16 ~@5 c4@3, [ab4,e5], b4@19 [b3,b4]@5, ~@2 e2",
  Z: "db4@13 ~@8 ab4@3, [db2,db3], ab4@7 ~, e4@2 e4, ~@13 db4@10 ~", // Db
  AA: "b2@13 ~@8 gb4@3, b1, [eb4,gb4]@19 eb4@5, b3@2 b3, ~@13 b2@11", AB: "[a2,db4,e4,a4] [ab2,b3,ab4] [gb2,a3,gb4]",
  AC: "[e2,e4,ab4,b4]@2 [c2,c3,e4,g4,c5]", // E C
  AD: "[[f2,f3,c4,f4,a4,f5,f6]@16 [f2,f4,a4,c5]@3 ~@2 [bb2,bb4,d5]@3 [f2,a4,c5]@8 [g2,bb4]@8 [a2,c5]@8, ~@21 f4@11 ~@16]/2", // F Bb F Gm Am
  AE: "[bb2,bb4,d5,f5]@7 [bb2,bb4,d5,f5]", AF: "c5@16 ~@5 [d4,d5]@3, [f2,a4,f5], ~@2 [c4,c5]",
  AG: "[f2,f3,c4,f4,a4]@16 [f2,f4,a4,c5]@3 ~@2 [bb2,f4,bb4,d5]@3", // F Bb
  AH: "[f2,f4,a4,c5]@16 ~@5 [b2,b4]@3, ~@2 [a2,a4,a5], ~@19 [bb2,bb4,bb5]@5", // F B A Bb
  AI: "[[c3,g4,c5,e5]@8 ~@7 [e4,e5,e6], c2@29 [e4,e5]@3 [f3,f4,f5]@3 [g3,g4,g5]@2 [a3,a4,a5]@3 [c4,c5,c6]@3 [d4,d5,d6]@5, ~ c3, ~@24 [c4,c5]@3 [d4,d5]@2 e3@19, ~@8 e5 d3@7]/2", // C E F G A C D C …
  AJ: "[f4,a4,c5,f5,f6]@16 [f2,f4,a4,c5]@3 ~@2 [bb2,f4,bb4,d5]@3", AK: "[f2,f4,a4,c5]@8 [g2,bb4]@8 [a2,c5]@5 f2@3",
  AL: "[bb2,bb4,d5,f5]@16 [bb2,bb4,d5,f5]@3 ~@2 [bb2,bb4,d5,f5]@3", // Bb
  AM: "f2@16 ~@5 db4@3, [a4,f5], c5@19 [c4,c5]@5, ~@2 f2", AN: "d4@13 ~@8 a4@3, [d2,d3], a4@7 ~, f4@2 f4, ~@13 d4@10 ~",
  AO: "c3@13 ~@8 g4@3, c2, [e4,g4]@19 e4@5, c4@2 c4, ~@13 c3@11", AP: "[bb2,d4,f4,bb4] [a2,c4,a4] [g2,bb3,g4]",
  AQ: "[f2,f4,a4,c5]@7 ~", AR: "[[bb2,d4,f4,bb4]@4 [a2,c4,a4]@5 [g2,bb3,g4]@5 [f2,f4,a4,c5]@13 ~@9]/3",
})).s("gm_piano").gain(0.55).pan(0.4)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@33 A B C D A E F G A B H A I J K L M N O P M Q R@2 M N S M T U V P T U W@3
>`.pickRestart({
  A: "[b4,e5,ab5]", B: "[b4,d5,ab5]", C: "[a4,db5,e5,a5]", D: "[ab4,b4,e5]", E: "[e5,ab5,b5]", F: "[eb5,gb5,b5]",
  G: "[b3,b4]@3 [db4,db5]@2 [eb4,eb5]@3 [e4,e5]@3 [gb4,gb5]@2 [ab4,ab5]@3 [b4,b5]@3 [db5,db6]@2 [eb5,eb6]@3", // B Db Eb E Gb Ab B Db …
  H: "[db5,e5,a5]", I: "[db5,e5,ab5]", J: "[b4,eb5,gb5]", K: "[a4,db5,e5]", L: "[ab4,b4,e5]@2 [g4,c5,e5]",
  M: "[c5,f5,a5]", N: "[c5,eb5,a5]", O: "[bb4,d5,f5,bb5]", P: "[a4,c5,f5]", Q: "[f5,a5,c6]", R: "[e5,g5,c6]",
  S: "[d5,f5,bb5]", T: "[d5,f5,a5]", U: "[c5,e5,g5]", V: "[bb4,d5,f5]", W: "[[bb4,d5,f5]@28 [a4,c5,f5]@29 ~@15]/3",
})).s("gm_string_ensemble_1").gain(0.28)

// bass · electric bass pick · "Bass"
const bass = note(`<
  ~@17 A B C A D E F G H B C I J K L M N O P N Q R S T U O P V W X Y Z AA AB AC AA AD AE AF AG AH AB AC AI AJ AK AL AM
  AJ AK AN@3
>`.pickRestart({
  A: "eb2@7 bb2", B: "eb2 f2 g2", C: "ab2", D: "eb3@2 bb2", E: "eb2@16 g2@3 ab2@2 a2@3", F: "bb2@7 f2", G: "bb2 c3 d3",
  H: "eb3@7 bb2", I: "eb2@19 bb2@2 b2@3", J: "c3", K: "bb2@7 ~", L: "ab2 g2 f2", M: "eb2@2 b2", N: "e2@7 b2",
  O: "e2 gb2 ab2", P: "a2", Q: "e3@2 b2", R: "e2@16 ab2@3 a2@2 bb2@3", S: "b2@7 gb2", T: "b2 db3 eb3", U: "e3@7 b2",
  V: "e2@19 b2@2 c3@3", W: "db3", X: "b2@7 ~", Y: "a2 ab2 gb2", Z: "e2@2 c3", AA: "f2@7 c3", AB: "f2 g2 a2", AC: "bb2",
  AD: "f3@2 c3", AE: "f2@16 a2@3 bb2@2 b2@3", AF: "c3@7 g2", AG: "c3 d3 e3", AH: "f3@7 c3", AI: "f2@19 c3@2 db3@3",
  AJ: "d3", AK: "c3@7 ~", AL: "bb2 a2 g2", AM: "f2@2 c3", AN: "[bb2@4 a2@5 g2@5 f2@15 ~@7]/3",
})).s("gm_electric_bass_pick").gain(0.71)

// chords · acoustic guitar steel · "Acoustic Guitar"
const acoustic_guitar_steel = note(`<
  ~@17 A@2 B A@3 C@2 A@2 B A D C E F G@2 H G@3 I@2 G@2 H G J I K L M@2 N M@3 O@2 M@2 N M P O Q M P O R@2 ~
>`.pickRestart({
  A: "eb2 [g3,bb3,eb4]!2", B: "ab2 [ab3,c4,eb4]!2", C: "bb2 [f3,bb3,d4]!2", D: "c3 [g3,c4,eb4]!2",
  E: "ab2 [g3,bb3,eb4] [ab3,c4,eb4]", F: "eb2 [g3,bb3,eb4] [gb3,b3,eb4]", G: "e2 [ab3,b3,e4]!2", H: "a2 [a3,db4,e4]!2",
  I: "b2 [gb3,b3,eb4]!2", J: "db3 [ab3,db4,e4]!2", K: "a2 [ab3,b3,e4] [a3,db4,e4]", L: "e2 [ab3,b3,e4] [g3,c4,e4]",
  M: "f2 [a3,c4,f4]!2", N: "bb2 [bb3,d4,f4]!2", O: "c3 [g3,c4,e4]!2", P: "d3 [a3,d4,f4]!2",
  Q: "bb2 [a3,c4,f4] [bb3,d4,f4]", R: "[bb2@4 [a3,c4,f4]@5 [bb3,d4,f4]@5 f2@5 ~@5]/2",
})).s("gm_acoustic_guitar_steel").gain(0.71).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@17 x!50 [x ~@3 x ~@4 x ~@2] [~ x ~@4] ~>").gain(0.6)

// drums · rim
const rim = s("rim").struct("<~@17 [~@2 x]!32 ~@21>").gain(0.6)

// drums · snare
const snare = s("sd").struct("<~@49 [~@2 x]!18 ~@3>").gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@56 [~@7 x] ~@13>").gain(0.6)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@17 [x ~@4 x ~@2 x ~@4 x ~@2 x ~@4 x ~@2]!32 ~@21>").gain(0.6)

// drums · mid tom
const mid_tom = s("mt").struct("<~@56 [~@2 x] ~@13>").gain(0.6)

// drums · high tom
const high_tom = s("ht").struct("<~@56 [~@8 x ~@2 x ~ x ~@10] ~@13>").gain(0.6)

// drums · crash
const crash = s("cr").struct("<~@49 x ~@7 x ~@9 [x ~@3 x ~@4 x ~@2] [~ x ~@4] ~>").gain(0.6)

// drums · ride
const ride = s("rd").struct(`<
  ~@49
  [x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2]!18
  [x ~@3 x ~@4 x ~@2]
  [~ x ~@4]
  ~
>`).gain(0.6)

stack(
  tubular_bells, church_organ, piano, string_ensemble_1, bass, acoustic_guitar_steel, kick, rim, snare, low_tom,
  pedal_hat, mid_tom, high_tom, crash, ride
)