Strudelify

the moon represents my heart

Teresa Teng

KeyD majorTempo78 bpm
0:00/0:00
// the moon represents my heart — Teresa Teng
// 78 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Transcription provider: pdmx. https://musescore.com/score/3987681; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 65 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(78/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · pizzicato strings
const pizzicato_strings = note("<A B@2 C ~@3 D E F G H ~@20 I J K L ~@29>".pickRestart({
  A: "~@2 d5 ~ f#5 ~ d5 ~ a5 ~@7", B: "~@2 d5 ~ f#5@2 d5 ~ b5 ~@7", C: "~@2 a4 ~ e5 ~ d5 ~ c#5@2 ~@6", D: "~@6 f#4 e4",
  E: "d4@3 d4 d4@2 f#4 e4", F: "d4@3 d4 d4@2 e4 f#4", G: "f#4 e4@2 d4 b3@2 f#4@2", H: "e4@3 ~",
  I: "~@2 [d4,f#4] ~ d5 ~ c#5 ~ [b4,d5] ~@7", J: "~@2 [d4,f#4] ~ b4 ~ a4 ~ [g4,b4] ~@7",
  K: "~@2 [e4,a4] ~ [b4,e5] ~ [a4,d5] ~ [a4,c#5]@2 ~@2 [e4,a4]@2 ~@2", L: "[a4,d5] ~@3",
})).s("gm_pizzicato_strings").gain(0.3)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A B C D ~@11 E F G H I J B K L M N O P Q R S@2 T U V W X Y Z AA T U AB AC J B K L M N O AD ~@13
>`.pickRestart({
  A: "a4@5 f#4 e4 d4", B: "f#4", C: "b4@5 f#4 e4 d4", D: "c#4@3 ~", E: "~@4 d4 e4 f#4 a4", F: "b4@4 ~ b4 d5 e5",
  G: "f#5", H: "g5 a5", I: "d5@4 ~@2 c#4 e4", J: "d4", K: "e4@4 c#4@3 b3", L: "a3@3 f#4", M: "a4@6 c#5 d5",
  N: "e5@5 c#5 d5 c#5", O: "d5@4 f#5@2 f#5 b5", P: "a5@4 ~@3 a3", Q: "d4@3 f#4 a4@3 d4", R: "c#4@3 f#4 a4@3 a4",
  S: "[b4@3 c#5 d5@3 b4@2 a4@3 ~@2 f#4 e4]/2", T: "d4@3 d4 d4@2 f#4 e4", U: "d4@3 d4 d4@2 e4 f#4",
  V: "f#4 e4@2 d4 c#4@2 e4@2", W: "d4@2 ~ a4", X: "d5@3 f#5 a5@3 d5", Y: "c#5@3 f#5 a5@3 f#5", Z: "d5@3 e5 f#5@3 g5",
  AA: "f#5@4 ~@2 f#4 e4", AB: "e4@3 b3 c#4@2 d4 e4", AC: "d4@4 ~@2 c#4 e4", AD: "a4 ~",
})).s("gm_string_ensemble_1").gain(0.3)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@56 A B C D E F G@3>".pickRestart({
  A: "b3", B: "d4", C: "e4 f#4", D: "d4@4 ~@2 d5 c#5", E: "b4@4 b4 c#5 d5 c#5", F: "b4@3 a4 b4 g4 f#4 d4",
  G: "[d4@3 f#4@3 d4@6 ~@4]/3",
})).s("gm_string_ensemble_1").gain(0.2)

// other · pizzicato strings
const pizzicato_strings_2 = note(`<
  ~@8
  [~@2 f#4 ~ d5 ~ c#5 ~ b4 ~@7]
  [~@2 d4 ~ b4 ~ a4 ~ g4 ~@7]
  [~@2 e4 ~ b4 ~ a4 ~ g#4@3 ~@3 b4 ~]
  [a4 ~@15]
  ~@53
>`).s("gm_pizzicato_strings").gain(0.25)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~@19 A B C D E B F G H I J K@2 L M N O P Q R S T U V W B C D E B F G H ~@7 X Y Z AA@3
>`.pickRestart({
  A: "~@6 f#4 a4", B: "f#4@3 e4 d4@2 a4@2", C: "c#4", D: "b3", E: "a3@3 a4", F: "c#4@6 b3 c#4",
  G: "d4@3 d4 d4@2 d4 f#4", H: "e4 ~", I: "d4@3 e4 f#4@3 d4", J: "c#4@3 f#4 a4@3 f#4",
  K: "[g4@4 b4@3 a4@2 f#4@3 ~@4]/2", L: "d3@3 e3", M: "g3@3 a3", N: "g#3 a3", O: "d3@2 ~ a3", P: "d4@3 f#4 a4@3 d4",
  Q: "c#4@3 f#4 a4@3 a4", R: "b4@3 c#5 d5@3 b4", S: "a4@4 ~@2 f#4 e4", T: "d4@3 d4 d4@2 f#4 e4",
  U: "d4@3 d4 d4@2 e4 f#4", V: "e4@3 b3 c#4@2 d4 e4", W: "d4@4 ~@2 f#4 a4", X: "~@6 d4 c#4", Y: "d4@4 b3 a3 g3 a3",
  Z: "b3@3 a3 c#4 b3 a3 e3", AA: "[g3@3 d4@3 a3@6 ~@4]/3",
})).s("gm_string_ensemble_1").gain(0.4)

// other · pizzicato strings
const pizzicato_strings_3 = note("<A B C D ~@4 E F G H ~@4 E F I J ~@36 K F I J ~@5>".pickRestart({
  A: "~@2 d4 ~ f#4 ~ d4 ~ a4 ~@7", B: "~@2 d4 ~ f#4 ~ d4 ~ b4 ~@7", C: "~@2 d4 ~ f#4 ~ d4 ~ d5 ~@7",
  D: "~@2 a3 ~ d4 ~ b4 ~ a4 ~@7", E: "~@2 f#3 ~ d4 ~ c#4 ~ b3 ~@7", F: "~@2 d3 ~ b3 ~ a3 ~ g3 ~@7",
  G: "~@2 e3 ~ b3 ~ a3 ~ g#3@3 ~@3 b3 ~", H: "a3 ~@15", I: "~@2 d3 ~ e4 ~ d4 ~ c#4@2 ~@2 a3@2 ~@2", J: "d4 ~@3",
  K: "~@2 d3 ~ d4 ~ c#4 ~ b3 ~@7",
})).s("gm_pizzicato_strings").gain(0.3)

// other · string ensemble 1
const string_ensemble_1_3 = note(`<
  A B C D ~@8 E F G H ~@4 I J K L M N O P ~@3 Q R S T U V W X Y Z AA AB AC I J K L M N O P ~@3 Q AD AE AF AG AD AE AH
  AI@2
>`.pickRestart({
  A: "a3@5 f#3 e3 d3", B: "f#3", C: "b3@5 f#3 e3 d3", D: "c#3@3 ~", E: "d3@5 a3 f#3 d3", F: "c#3@5 a3 f#3 c#3",
  G: "b2 g3", H: "f#3 ~", I: "a3@4 d3@3 e3", J: "f#3@6 b2 c#3", K: "b2@3 c#3 b2@3 a2", L: "f#3@3 a3",
  M: "f#3@3 e3 d3@2 a3@2", N: "c#3@6 b2 c#3", O: "d3@3 d3 d3@2 d3 f#3", P: "e3 ~", Q: "~@6 f#3 e3",
  R: "d3@3 d3 d3@2 ~ f#3", S: "g3@3 g3 g3@2 g3 a3", T: "e3@3 b3 a3@3 ~", U: "~@4 f#3 e3 ~ d3 c#3@4 a2@4",
  V: "d3@3 f#3 a3@3 d3", W: "c#3@3 f#3 a3@3 f#3", X: "d3@3 c#3 d3@3 b2", Y: "a2 ~", Z: "b2@6 c#3 e3", AA: "d3@6 e3 f#3",
  AB: "e3@3 b2 c#3@2 d3 e3", AC: "d3 ~", AD: "d3@3 d3 d3@2 f#3 e3", AE: "d3@3 d3 d3@2 e3 f#3",
  AF: "f#3 e3@2 d3 c#3@2 d3 e3", AG: "d3@4 ~@2 f#3 e3", AH: "f#3@2 e3@4 ~ d3@2 a2@4 d3@2 ~", AI: "[e3 d3@9 ~@6]/2",
})).s("gm_string_ensemble_1").gain(0.4)

// other · pizzicato strings
const pizzicato_strings_4 = note("<~@4 A B C D E F G H ~@4 I J K L ~@8 A B M N ~@19 O A B C P ~@9>".pickRestart({
  A: "d3@3 d3 d3@3 e3", B: "f#3@3 f#3 f#3@3 f#3", C: "g3@3 g3 g3@3 a3", D: "d3@3 d3 d3@2 d3 c#3",
  E: "b2@3 b2 b2@2 ~ f#3", F: "g3@3 g3 g3@2 g3 f#3", G: "e3@3 e3 e3@2 d3 b2", H: "a2@3 f#3 a3 ~@3",
  I: "~@2 f#2 ~ d3 ~ c#3 ~ b2 ~@7", J: "~@2 d2 ~ b2 ~ a2 ~ g2 ~@7", K: "~@2 d2 ~ e3 ~ d3 ~ c#3@2 ~@2 a2@2 ~@2",
  L: "d3 ~@3", M: "g3@2 ~ f#3 g3@3 a3", N: "f#3@2 ~ e3 f#3 ~@3", O: "~@7 a2", P: "d3 ~",
})).s("gm_pizzicato_strings").gain(0.25)

// bass · contrabass
const bass = note("<~@19 A B C D E B C F G ~@3 H I J K L M N O P Q J K R B C D E B C F G ~@7 H S J T U@2>".pickRestart({
  A: "~@3 a2", B: "d2@6 d2@2 d2@4 ~@2 d2 e2", C: "f#2@3 f#2 f#2@2 ~ f#2", D: "e2@3 e2 a2@2 ~ a1",
  E: "d2@3 d2 d2@2 a1!2", F: "e2@3 e2 e2@2 d2 b1", G: "a1@3 e2 a2@2 ~@2", H: "~@6 d2 c#2", I: "b1@3 b1 b1@2 ~ f#2",
  J: "g2@3 g2 g2@2 g2 f#2", K: "e2@3 e2 a2@3 a1", L: "d2@2 ~ a1", M: "d2@3 d2 d2@3 e2", N: "f#2@3 f#2 f#2@3 f#2",
  O: "g2@3 g2 g2@3 a2", P: "d2@3 d2 d2@2 d2 c#2", Q: "b1@3 b1 b1@3 f#2", R: "d2@3 ~@3 a2@2", S: "b1@3 b1 b1@3 e2",
  T: "e2@7 e2@2 a2@7", U: "[a1 d2@9 ~@6]/2",
})).s("gm_contrabass").gain(0.55)

// bass · acoustic bass
const bass_2 = note("<A B C D E F G A B H I J E F G A B H K L ~@8 E F G M ~@19 N E F G A O H P L ~@5>".pickRestart({
  A: "d2@3 d2 d2@2 d2 c#2", B: "b1@3 b1 b1@2 ~ f#2", C: "g2@3 g2 g2@2 g2 g#2", D: "a2@3 e2 a1@2 ~@2",
  E: "d2@3 d2 d2@3 e2", F: "f#2@3 f#2 f#2@3 f#2", G: "g2@3 g2 g2@3 a2", H: "g2@3 g2 g2@2 g2 f#2",
  I: "e2@3 e2 e2@2 d2 b1", J: "a1@3 f#2 a2 ~@3", K: "e2@3 d2 a2@3 a2", L: "d2 ~", M: "d2@3 d2 d2@2 ~@2", N: "~@7 a1",
  O: "b1@3 b1 b1@3 e2", P: "e2@3 e2 a2@3 a1",
})).s("gm_acoustic_bass").gain(0.4)

stack(
  pizzicato_strings, string_ensemble_1, string_ensemble_1_soft, pizzicato_strings_2, string_ensemble_1_2,
  pizzicato_strings_3, string_ensemble_1_3, pizzicato_strings_4, bass, bass_2
)