diff --git a/.gitignore b/.gitignore
index b510c1d..21246c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -196,7 +196,7 @@ score_audio_mozart_k265_var1.wav
performance_audio*/
score_audio*/
notebook/
-
.claude/
src/
scripts/
+
diff --git a/matchmaker/assets/simple_mozart_k265_var1.match b/matchmaker/assets/simple_mozart_k265_var1.match
new file mode 100644
index 0000000..07906de
--- /dev/null
+++ b/matchmaker/assets/simple_mozart_k265_var1.match
@@ -0,0 +1,99 @@
+info(matchFileVersion,1.0.0).
+info(piece,-).
+info(scoreFileName,-).
+info(midiFileName,-).
+info(composer,-).
+info(performer,-).
+info(midiClockUnits,480).
+info(midiClockRate,500000).
+scoreprop(keySignature,C,1:1,0,0.0000).
+scoreprop(timeSignature,2/4,1:1,0,0.0000).
+snote(p0n0,[D,n],5,1:1,0,1/16,0.0000,0.2500,[v1,staff1])-note(n1,74,10,91,72,0,0).
+snote(p0n1,[C,n],3,1:1,0,1/4,0.0000,1.0000,[v5,staff2])-note(n0,48,1,65,70,0,0).
+snote(p0n2,[C,n],5,1:1,1/16,1/16,0.2500,0.5000,[v1,staff1])-note(n2,72,137,210,53,0,0).
+snote(p0n3,[B,n],4,1:1,1/8,1/16,0.5000,0.7500,[v1,staff1])-note(n3,71,232,298,54,0,0).
+snote(p0n4,[C,n],5,1:1,3/16,1/16,0.7500,1.0000,[v1,staff1])-note(n4,72,327,416,48,0,0).
+snote(p0n5,[B,n],4,1:2,0,1/16,1.0000,1.2500,[v1,staff1])-note(n6,71,446,492,61,0,0).
+snote(p0n6,[C,n],4,1:2,0,1/4,1.0000,2.0000,[v5,staff2])-note(n5,60,440,478,67,0,0).
+snote(p0n7,[C,n],5,1:2,1/16,1/16,1.2500,1.5000,[v1,staff1])-note(n7,72,551,602,44,0,0).
+snote(p0n8,[B,n],4,1:2,1/8,1/16,1.5000,1.7500,[v1,staff1])-note(n8,71,634,728,65,0,0).
+snote(p0n9,[C,n],5,1:2,3/16,1/16,1.7500,2.0000,[v1,staff1])-note(n9,72,738,808,61,0,0).
+snote(p0n10,[A,n],5,2:1,0,1/16,2.0000,2.2500,[v1,staff1])-note(n11,81,874,955,55,0,0).
+snote(p0n11,[E,n],4,2:1,0,1/4,2.0000,3.0000,[v5,staff2])-note(n10,64,859,932,75,0,0).
+snote(p0n12,[G,n],5,2:1,1/16,1/16,2.2500,2.5000,[v1,staff1])-note(n12,79,1001,1070,62,0,0).
+snote(p0n13,[F,#],5,2:1,1/8,1/16,2.5000,2.7500,[v1,staff1])-note(n13,78,1103,1149,52,0,0).
+snote(p0n14,[G,n],5,2:1,3/16,1/16,2.7500,3.0000,[v1,staff1])-note(n14,79,1211,1267,77,0,0).
+snote(p0n15,[F,#],5,2:2,0,1/16,3.0000,3.2500,[v1,staff1])-note(n15,78,1302,1359,60,0,0).
+snote(p0n16,[C,n],4,2:2,0,1/4,3.0000,4.0000,[v5,staff2])-note(n16,60,1320,1361,49,0,0).
+snote(p0n17,[G,n],5,2:2,1/16,1/16,3.2500,3.5000,[v1,staff1])-note(n17,79,1418,1448,52,0,0).
+snote(p0n18,[F,#],5,2:2,1/8,1/16,3.5000,3.7500,[v1,staff1])-note(n18,78,1498,1553,64,0,0).
+snote(p0n19,[G,n],5,2:2,3/16,1/16,3.7500,4.0000,[v1,staff1])-note(n19,79,1593,1635,54,0,0).
+snote(p0n20,[G,#],5,3:1,0,1/16,4.0000,4.2500,[v1,staff1])-note(n20,80,1710,1772,61,0,0).
+snote(p0n21,[F,n],4,3:1,0,1/4,4.0000,5.0000,[v5,staff2])-note(n21,65,1734,1775,61,0,0).
+snote(p0n22,[A,n],5,3:1,1/16,1/16,4.2500,4.5000,[v1,staff1])-note(n22,81,1813,1918,61,0,0).
+snote(p0n23,[C,n],6,3:1,1/8,1/16,4.5000,4.7500,[v1,staff1])-note(n23,84,1929,2040,62,0,0).
+snote(p0n24,[B,n],5,3:1,3/16,1/16,4.7500,5.0000,[v1,staff1])-note(n24,83,2040,2114,51,0,0).
+snote(p0n25,[D,n],6,3:2,0,1/16,5.0000,5.2500,[v1,staff1])-note(n25,86,2125,2257,61,0,0).
+snote(p0n26,[C,n],4,3:2,0,1/4,5.0000,6.0000,[v5,staff2])-note(n26,60,2154,2208,45,0,0).
+snote(p0n27,[C,n],6,3:2,1/16,1/16,5.2500,5.5000,[v1,staff1])-note(n27,84,2257,2342,55,0,0).
+snote(p0n28,[B,n],5,3:2,1/8,1/16,5.5000,5.7500,[v1,staff1])-note(n28,83,2351,2411,64,0,0).
+snote(p0n29,[A,n],5,3:2,3/16,1/16,5.7500,6.0000,[v1,staff1])-note(n29,81,2456,2480,52,0,0).
+snote(p0n30,[A,n],5,4:1,0,1/16,6.0000,6.2500,[v1,staff1])-note(n31,81,2598,2682,68,0,0).
+snote(p0n31,[C,n],4,4:1,0,1/4,6.0000,7.0000,[v5,staff2])-note(n30,60,2593,2856,42,0,0).
+snote(p0n32,[E,n],4,4:1,0,1/4,6.0000,7.0000,[v5,staff2])-note(n32,64,2609,2844,59,0,0).
+snote(p0n33,[G,n],5,4:1,1/16,1/16,6.2500,6.5000,[v1,staff1])-note(n33,79,2731,2817,62,0,0).
+snote(p0n34,[E,n],6,4:1,1/8,1/16,6.5000,6.7500,[v1,staff1])-note(n34,88,2849,2975,69,0,0).
+snote(p0n35,[D,n],6,4:1,3/16,1/16,6.7500,7.0000,[v1,staff1])-note(n35,86,2957,3080,74,0,0).
+snote(p0n36,[C,n],6,4:2,0,1/16,7.0000,7.2500,[v1,staff1])-note(n36,84,3076,3177,62,0,0).
+snote(p0n38,[B,n],5,4:2,1/16,1/16,7.2500,7.5000,[v1,staff1])-note(n37,83,3163,3230,64,0,0).
+snote(p0n39,[A,n],5,4:2,1/8,1/16,7.5000,7.7500,[v1,staff1])-note(n38,81,3251,3294,59,0,0).
+snote(p0n40,[G,n],5,4:2,3/16,1/16,7.7500,8.0000,[v1,staff1])-note(n40,79,3376,3387,58,0,0).
+snote(p0n41,[C,#],4,4:2,3/16,1/16,7.7500,8.0000,[v5,staff2])-note(n39,61,3368,3412,60,0,0).
+snote(p0n42,[G,n],5,5:1,0,1/16,8.0000,8.2500,[v1,staff1])-note(n41,79,3505,3580,63,0,0).
+snote(p0n43,[D,n],4,5:1,0,1/4,8.0000,9.0000,[v5,staff2])-note(n42,62,3521,3881,79,0,0).
+snote(p0n44,[F,n],5,5:1,1/16,1/16,8.2500,8.5000,[v1,staff1])-note(n43,77,3607,3699,87,0,0).
+snote(p0n45,[D,n],6,5:1,1/8,1/16,8.5000,8.7500,[v1,staff1])-note(n44,86,3728,3866,80,0,0).
+snote(p0n46,[C,n],6,5:1,3/16,1/16,8.7500,9.0000,[v1,staff1])-note(n45,84,3849,3997,70,0,0).
+snote(p0n47,[B,n],5,5:2,0,1/16,9.0000,9.2500,[v1,staff1])-note(n46,83,3955,4054,67,0,0).
+snote(p0n49,[A,n],5,5:2,1/16,1/16,9.2500,9.5000,[v1,staff1])-note(n47,81,4048,4128,72,0,0).
+snote(p0n50,[G,n],5,5:2,1/8,1/16,9.5000,9.7500,[v1,staff1])-note(n48,79,4156,4194,61,0,0).
+snote(p0n51,[F,n],5,5:2,3/16,1/16,9.7500,10.0000,[v1,staff1])-note(n49,77,4257,4279,68,0,0).
+snote(p0n52,[B,n],3,5:2,3/16,1/16,9.7500,10.0000,[v5,staff2])-note(n50,59,4262,4299,51,0,0).
+snote(p0n53,[F,n],5,6:1,0,1/16,10.0000,10.2500,[v1,staff1])-note(n51,77,4380,4462,79,0,0).
+snote(p0n54,[C,n],4,6:1,0,1/4,10.0000,11.0000,[v5,staff2])-note(n52,60,4417,4819,64,0,0).
+snote(p0n55,[E,n],5,6:1,1/16,1/16,10.2500,10.5000,[v1,staff1])-note(n53,76,4494,4578,72,0,0).
+snote(p0n56,[C,n],6,6:1,1/8,1/16,10.5000,10.7500,[v1,staff1])-note(n54,84,4621,4754,69,0,0).
+snote(p0n57,[B,n],5,6:1,3/16,1/16,10.7500,11.0000,[v1,staff1])-note(n55,83,4725,4870,68,0,0).
+snote(p0n58,[A,n],5,6:2,0,1/16,11.0000,11.2500,[v1,staff1])-note(n56,81,4827,4929,61,0,0).
+snote(p0n60,[G,n],5,6:2,1/16,1/16,11.2500,11.5000,[v1,staff1])-note(n57,79,4914,4995,70,0,0).
+snote(p0n61,[F,n],5,6:2,1/8,1/16,11.5000,11.7500,[v1,staff1])-note(n58,77,5002,5071,82,0,0).
+snote(p0n62,[E,n],5,6:2,3/16,1/16,11.7500,12.0000,[v1,staff1])-note(n60,76,5127,5200,61,0,0).
+snote(p0n63,[A,n],3,6:2,3/16,1/16,11.7500,12.0000,[v5,staff2])-note(n59,57,5111,5172,65,0,0).
+snote(p0n64,[D,n],5,7:1,0,1/8,12.0000,12.5000,[v1,staff1])-note(n61,74,5240,5494,75,0,0).
+snote(p0n65,[F,n],3,7:1,0,1/4,12.0000,13.0000,[v5,staff2])-note(n62,53,5296,5537,63,0,0).
+snote(p0n66,[A,n],5,7:1,1/8,1/8,12.5000,13.0000,[v1,staff1])-note(n63,81,5515,5772,70,0,0).
+snote(p0n67,[G,n],5,7:2,0,1/8,13.0000,13.5000,[v1,staff1])-note(n65,79,5738,5932,77,0,0).
+snote(p0n68,[G,n],3,7:2,0,1/4,13.0000,14.0000,[v5,staff2])-note(n64,55,5734,5928,60,0,0).
+snote(p0n69,[B,n],4,7:2,1/8,1/8,13.5000,14.0000,[v1,staff1])-note(n66,71,5961,6168,69,0,0).
+snote(p0n70,[C,n],5,8:1,0,1/4,14.0000,15.0000,[v1,staff1])-note(n67,72,6216,6805,51,0,0).
+snote(p0n71,[C,n],4,8:1,0,1/4,14.0000,15.0000,[v5,staff2])-note(n68,60,6229,6346,49,0,0).
+snote(p0n73,[C,n],3,8:2,0,1/4,15.0000,16.0000,[v5,staff2])-note(n69,48,6752,6802,42,0,0).
+sustain(0,0).
+sustain(2634,67).
+sustain(2664,127).
+sustain(3382,71).
+sustain(3412,45).
+sustain(3441,0).
+sustain(3702,60).
+sustain(3730,127).
+sustain(4247,73).
+sustain(4276,55).
+sustain(4305,41).
+sustain(4333,0).
+sustain(4564,58).
+sustain(4594,127).
+sustain(5024,60).
+sustain(5053,48).
+sustain(5081,0).
+sustain(6754,69).
+sustain(6782,127).
diff --git a/matchmaker/assets/simple_mozart_k265_var1.mei b/matchmaker/assets/simple_mozart_k265_var1.mei
new file mode 100644
index 0000000..8c75377
--- /dev/null
+++ b/matchmaker/assets/simple_mozart_k265_var1.mei
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
+ Variations on "Ah, vous dirai-je Maman" K 265
+
+ W. A. Mozart
+
+
+
+
+ Public Domain
+
+
+
+
+
+
+
+
+
+
+ Variations on "Ah, vous dirai-je Maman" K 265
+
+ Variation I
+
+
+ W. A. Mozart
+
+
+
+
+
+ Pno.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/matchmaker/assets/simple_performance.mid b/matchmaker/assets/simple_mozart_k265_var1.mid
similarity index 100%
rename from matchmaker/assets/simple_performance.mid
rename to matchmaker/assets/simple_mozart_k265_var1.mid
diff --git a/matchmaker/assets/simple_performance.mp3 b/matchmaker/assets/simple_mozart_k265_var1.mp3
similarity index 100%
rename from matchmaker/assets/simple_performance.mp3
rename to matchmaker/assets/simple_mozart_k265_var1.mp3
diff --git a/matchmaker/assets/simple_score.musicxml b/matchmaker/assets/simple_mozart_k265_var1.musicxml
similarity index 100%
rename from matchmaker/assets/simple_score.musicxml
rename to matchmaker/assets/simple_mozart_k265_var1.musicxml
diff --git a/matchmaker/assets/simple_perf_annotations.txt b/matchmaker/assets/simple_mozart_k265_var1_annotations.txt
similarity index 100%
rename from matchmaker/assets/simple_perf_annotations.txt
rename to matchmaker/assets/simple_mozart_k265_var1_annotations.txt
diff --git a/matchmaker/assets/simple_mozart_k265_var1_beat_annotations.txt b/matchmaker/assets/simple_mozart_k265_var1_beat_annotations.txt
new file mode 100644
index 0000000..040822c
--- /dev/null
+++ b/matchmaker/assets/simple_mozart_k265_var1_beat_annotations.txt
@@ -0,0 +1,16 @@
+0.005729 0.005729
+0.461458 0.461458
+0.902604 0.902604
+1.365625 1.365625
+1.793750 1.793750
+2.228646 2.228646
+2.708333 2.708333
+3.204167 3.204167
+3.659375 3.659375
+4.119792 4.119792
+4.581771 4.581771
+5.028125 5.028125
+5.487500 5.487500
+5.975000 5.975000
+6.481771 6.481771
+7.033333 7.033333
diff --git a/matchmaker/assets/simple_mozart_k265_var1_note_annotations.txt b/matchmaker/assets/simple_mozart_k265_var1_note_annotations.txt
new file mode 100644
index 0000000..82ad04e
--- /dev/null
+++ b/matchmaker/assets/simple_mozart_k265_var1_note_annotations.txt
@@ -0,0 +1,54 @@
+0.005729 0.005729
+0.142708 0.142708
+0.241667 0.241667
+0.340625 0.340625
+0.461458 0.461458
+0.573958 0.573958
+0.660417 0.660417
+0.768750 0.768750
+0.902604 0.902604
+1.042708 1.042708
+1.148958 1.148958
+1.261458 1.261458
+1.365625 1.365625
+1.477083 1.477083
+1.560417 1.560417
+1.659375 1.659375
+1.793750 1.793750
+1.888542 1.888542
+2.009375 2.009375
+2.125000 2.125000
+2.228646 2.228646
+2.351042 2.351042
+2.448958 2.448958
+2.558333 2.558333
+2.708333 2.708333
+2.844792 2.844792
+2.967708 2.967708
+3.080208 3.080208
+3.204167 3.204167
+3.294792 3.294792
+3.386458 3.386458
+3.512500 3.512500
+3.659375 3.659375
+3.757292 3.757292
+3.883333 3.883333
+4.009375 4.009375
+4.119792 4.119792
+4.216667 4.216667
+4.329167 4.329167
+4.436979 4.436979
+4.581771 4.581771
+4.681250 4.681250
+4.813542 4.813542
+4.921875 4.921875
+5.028125 5.028125
+5.118750 5.118750
+5.210417 5.210417
+5.332292 5.332292
+5.487500 5.487500
+5.744792 5.744792
+5.975000 5.975000
+6.209375 6.209375
+6.481771 6.481771
+7.033333 7.033333
diff --git a/matchmaker/features/audio.py b/matchmaker/features/audio.py
index 0089fdb..3a9c27b 100644
--- a/matchmaker/features/audio.py
+++ b/matchmaker/features/audio.py
@@ -20,7 +20,7 @@
DCT_TYPE = 2
NORM = np.inf
FEATURES = "chroma"
-QUEUE_TIMEOUT = 10
+QUEUE_TIMEOUT = 1
# Type hint for Input Audio frame.
InputAudioSeries = np.ndarray
@@ -159,10 +159,69 @@ def __call__(
hop_length=self.hop_length,
norm=self.norm,
dtype=np.float32,
+ fmin=librosa.note_to_hz("A0"),
+ n_bins=88,
)
return np.abs(cqt).T[1:-1]
+class CQTSpectralFluxProcessor(Processor):
+ """
+ CQT spectrum (88 bins, A0-C8) with optional half-wave rectified spectral flux.
+ Output shape: (n_frames, 88) or (n_frames, 89) if include_spectral_flux=True.
+ """
+
+ def __init__(
+ self,
+ sample_rate: int = SAMPLE_RATE,
+ hop_length: int = HOP_LENGTH,
+ norm: Optional[Union[float, str]] = NORM,
+ fmin: Optional[float] = None,
+ n_bins: int = 88,
+ bins_per_octave: int = 12,
+ include_spectral_flux: bool = True,
+ ):
+ super().__init__()
+ self.sample_rate = sample_rate
+ self.hop_length = hop_length
+ self.norm = norm
+ self.fmin = fmin if fmin is not None else librosa.note_to_hz("A0")
+ self.n_bins = n_bins
+ self.bins_per_octave = bins_per_octave
+ self.include_spectral_flux = include_spectral_flux
+ self.prev_magnitude = None
+
+ def __call__(
+ self,
+ y: InputAudioSeries,
+ ) -> Tuple[Optional[np.ndarray], Dict]:
+ cqt = librosa.cqt(
+ y=y,
+ sr=self.sample_rate,
+ hop_length=self.hop_length,
+ fmin=self.fmin,
+ n_bins=self.n_bins,
+ bins_per_octave=self.bins_per_octave,
+ norm=self.norm,
+ dtype=np.float32,
+ )
+ cqt_features = np.abs(cqt).T
+
+ if self.include_spectral_flux:
+ if self.prev_magnitude is None:
+ spectral_flux = np.zeros((cqt_features.shape[0], 1), dtype=np.float32)
+ else:
+ diff = np.maximum(cqt_features - self.prev_magnitude, 0)
+ spectral_flux = np.sum(diff, axis=1, keepdims=True)
+
+ self.prev_magnitude = cqt_features.copy()
+ features = np.hstack([cqt_features, spectral_flux])
+ else:
+ features = cqt_features
+
+ return features[1:-1]
+
+
class MelSpectrogramProcessor(Processor):
def __init__(
self,
@@ -318,6 +377,8 @@ def compute_features_from_audio(
"mel": MelSpectrogramProcessor,
"mfcc": MFCCProcessor,
"log_spectral": LogSpectralEnergyProcessor,
+ "cqt": CQTProcessor,
+ "cqt_spectral_flux": CQTSpectralFluxProcessor,
}
feature_processor = processor_mapping[processor_name](
diff --git a/matchmaker/io/audio.py b/matchmaker/io/audio.py
index 26985f2..043ecf9 100644
--- a/matchmaker/io/audio.py
+++ b/matchmaker/io/audio.py
@@ -243,19 +243,18 @@ def run_offline(self) -> None:
audio_y, sr = librosa.load(self.file_path, sr=None)
if sr != self.target_sr:
audio_y = librosa.resample(y=audio_y, orig_sr=sr, target_sr=self.target_sr)
-
- duration = int(librosa.get_duration(path=self.file_path))
- time_interval = self.hop_length / self.sample_rate
- padded_audio = np.concatenate( # zero padding at the end
- (
- audio_y,
- np.zeros(int(duration * 0.1 * self.sample_rate), dtype=np.float32),
+ sr = self.target_sr
+
+ time_interval = self.hop_length / float(sr)
+ # Pad to next hop_length boundary so no trailing samples are lost
+ remainder = len(audio_y) % self.hop_length
+ if remainder > 0:
+ audio_y = np.concatenate(
+ (audio_y, np.zeros(self.hop_length - remainder, dtype=np.float32))
)
- )
- trimmed_audio = padded_audio[ # trim to multiple of chunk_size
- : len(padded_audio) - (len(padded_audio) % self.hop_length)
- ]
- while trimmed_audio.any():
+ trimmed_audio = audio_y
+ # Do not stop early on digital silence (all-zeros tails).
+ while trimmed_audio.size > 0:
self.input_index += 1
self.last_data_received = time.time()
target_audio = trimmed_audio[: self.hop_length]
diff --git a/matchmaker/matchmaker.py b/matchmaker/matchmaker.py
index d4779b2..1bd66a1 100644
--- a/matchmaker/matchmaker.py
+++ b/matchmaker/matchmaker.py
@@ -1,11 +1,12 @@
import os
import sys
+from pathlib import Path
from typing import Optional, Union
import numpy as np
-
import partitura
from partitura.io.exportmidi import get_ppq
+from partitura.score import Part, merge_parts
from matchmaker.dp import OnlineTimeWarpingArzt, OnlineTimeWarpingDixon
from matchmaker.features.audio import (
@@ -13,6 +14,7 @@
SAMPLE_RATE,
ChromagramProcessor,
CQTProcessor,
+ CQTSpectralFluxProcessor,
LogSpectralEnergyProcessor,
MelSpectrogramProcessor,
MFCCProcessor,
@@ -29,9 +31,9 @@
GaussianAudioPitchTempoHMM,
PitchHMM,
PitchIOIHMM,
- PitchHMM,
)
from matchmaker.prob.outer_product_hmm import OuterProductHMM
+from matchmaker.prob.outer_product_hmm_audio import AudioOuterProductHMM
from matchmaker.utils.eval import (
TOLERANCES_IN_BEATS,
TOLERANCES_IN_MILLISECONDS,
@@ -48,18 +50,19 @@
save_debug_results,
)
from matchmaker.utils.tempo_models import KalmanTempoModel
-from partitura.io.exportmidi import get_ppq
-from partitura.score import Part
sys.setrecursionlimit(10_000)
PathLike = Union[str, bytes, os.PathLike]
DEFAULT_TEMPO = 120
+
+
DEFAULT_DISTANCE_FUNCS = {
"arzt": OnlineTimeWarpingArzt.DEFAULT_DISTANCE_FUNC,
"dixon": OnlineTimeWarpingDixon.DEFAULT_DISTANCE_FUNC,
"hmm": None,
"outerhmm": None,
+ "audio_outerhmm": None,
"pthmm": None,
}
@@ -68,14 +71,17 @@
"midi": "outerhmm",
}
-AVAILABLE_METHODS = ["arzt", "dixon", "hmm", "pthmm", "outerhmm"]
-
+AVAILABLE_METHODS = ["arzt", "dixon", "hmm", "pthmm", "outerhmm", "audio_outerhmm"]
KWARGS = {
"audio": {
"dixon": {
"window_size": 10,
},
"arzt": {},
+ "audio_outerhmm": {
+ "sample_rate": 16000,
+ "frame_rate": 50,
+ },
},
"midi": {
"arzt": {
@@ -147,9 +153,9 @@ def __init__(
sample_rate: int = SAMPLE_RATE,
frame_rate: int = FRAME_RATE,
tempo: Optional[float] = None,
- adjust_tempo: bool = False,
- kwargs = KWARGS,
- unfold_score = True,
+ kwargs=KWARGS,
+ unfold_score=True,
+ auto_adjust_tempo: bool = False,
):
self.score_file = str(score_file)
self.performance_file = (
@@ -161,6 +167,8 @@ def __init__(
self.input_type = input_type
self.feature_type = feature_type
self.frame_rate = frame_rate
+ self.sample_rate = sample_rate
+ self.hop_length = sample_rate // self.frame_rate
self.score_part: Optional[Part] = None
self.distance_func = distance_func
self.device_name_or_index = device_name_or_index
@@ -178,74 +186,85 @@ def __init__(
self.method = method
self.config = kwargs[input_type][self.method]
- self.adjust_tempo = adjust_tempo
- self.config = kwargs[input_type][method]
+ self.auto_adjust_tempo = auto_adjust_tempo
- # setup score file
- if score_file is None:
- raise ValueError("Score file is required")
+ # Apply method-specific defaults from config (only if not explicitly provided by caller)
+ if sample_rate == SAMPLE_RATE and "sample_rate" in self.config:
+ self.sample_rate = self.config["sample_rate"]
+ if frame_rate == FRAME_RATE and "frame_rate" in self.config:
+ self.frame_rate = self.config["frame_rate"]
+ self.hop_length = self.sample_rate // self.frame_rate
+ # setup score file
try:
- # TODO: find a better solution:
- if self.score_file.endswith("musicxml"):
- self.score_part = partitura.load_musicxml(
+ ext = Path(self.score_file).suffix.lower()
+ if ext in (".musicxml", ".xml", ".mxl"):
+ score = partitura.load_musicxml(
self.score_file, ignore_invisible_objects=True
)
- if unfold_score:
- self.score_part = partitura.score.unfold_part_maximal(
- self.score_part, ignore_leaps=False
- ).parts[0]
- else:
- self.score_part = self.score_part.parts[0]
+ else:
+ score = partitura.load_score(self.score_file)
+
+ if unfold_score:
+ score = partitura.score.unfold_part_maximal(score, ignore_leaps=False)
+ self.score_part = merge_parts(score.parts)
except Exception as e:
raise ValueError(f"Invalid score file: {e}")
- # Set tempo: user-provided > score marking > default (120 BPM)
- # _user_specified_tempo: if True, use uniform tempo; if False, use score tempo map
+ # Set tempo: user-provided > adjust_tempo (always 120) > score marking > default (120 BPM)
if tempo is not None:
self.tempo = float(tempo)
- self._user_specified_tempo = True
+ elif auto_adjust_tempo:
+ self.tempo = DEFAULT_TEMPO
else:
- self._user_specified_tempo = False
score_tempo = get_tempo_from_score(self.score_part, self.score_file)
self.tempo = score_tempo if score_tempo is not None else DEFAULT_TEMPO
# setup feature processor
if self.feature_type is None:
- self.feature_type = "chroma" if input_type == "audio" else "pitch_ioi"
+ if input_type == "audio":
+ self.feature_type = (
+ "cqt_spectral_flux" if method == "audio_outerhmm" else "chroma"
+ )
+ else:
+ self.feature_type = "pitch_ioi"
if self.feature_type == "chroma":
self.processor = ChromagramProcessor(
- sample_rate=sample_rate,
+ sample_rate=self.sample_rate,
+ hop_length=self.hop_length,
)
elif self.feature_type == "mfcc":
self.processor = MFCCProcessor(
- sample_rate=sample_rate,
+ sample_rate=self.sample_rate,
)
elif self.feature_type == "cqt":
self.processor = CQTProcessor(
- sample_rate=sample_rate,
+ sample_rate=self.sample_rate,
)
elif self.feature_type == "mel":
self.processor = MelSpectrogramProcessor(
- sample_rate=sample_rate,
+ sample_rate=self.sample_rate,
)
elif self.feature_type == "lse":
self.processor = LogSpectralEnergyProcessor(
- sample_rate=sample_rate,
+ sample_rate=self.sample_rate,
)
elif self.feature_type == "pitch_ioi":
self.processor = PitchIOIProcessor(piano_range=self.config["piano_range"])
- elif self.feature_type == "pitchclass":
+ elif self.feature_type == "pitchclass":
self.processor = PitchClassPianoRollProcessor()
elif self.feature_type == "pianoroll":
self.processor = PianoRollProcessor(piano_range=self.config["piano_range"])
+ elif self.feature_type == "cqt_spectral_flux":
+ self.processor = CQTSpectralFluxProcessor(
+ sample_rate=self.sample_rate,
+ hop_length=self.hop_length,
+ )
else:
raise ValueError(f"Invalid feature type `{self.feature_type}`")
- # validate performance file and input_type
if self.performance_file is not None:
- # check performance file type matches input type
if self.input_type == "audio" and not is_audio_file(self.performance_file):
raise ValueError(
f"Invalid performance file. Expected audio file, but got {self.performance_file}"
@@ -254,45 +273,38 @@ def __init__(
raise ValueError(
f"Invalid performance file. Expected MIDI file, but got {self.performance_file}"
)
-
- # validate method first
- if method is None:
- method = DEFAULT_METHODS[self.input_type]
- elif method not in AVAILABLE_METHODS:
- raise ValueError(f"Invalid method. Available methods: {AVAILABLE_METHODS}")
# setup distance function
if distance_func is None:
distance_func = DEFAULT_DISTANCE_FUNCS[method]
# setup stream device
+
if self.input_type == "audio":
self.stream = AudioStream(
processor=self.processor,
device_name_or_index=self.device_name_or_index,
file_path=self.performance_file,
wait=wait,
- target_sr=SAMPLE_RATE,
+ target_sr=self.sample_rate,
+ sample_rate=self.sample_rate,
+ hop_length=self.hop_length,
)
- elif self.input_type == "midi" and method == "outerhmm":
- self.stream = MidiStream(
- processor=self.processor,
- port=self.device_name_or_index,
- file_path=self.performance_file,
- polling_period=None,
- )
- elif self.input_type == "midi" and method != "outerhmm":
+ elif self.input_type == "midi":
self.stream = MidiStream(
processor=self.processor,
port=self.device_name_or_index,
file_path=self.performance_file,
+ **({"polling_period": None} if method == "outerhmm" else {}),
)
else:
raise ValueError(f"Invalid input type {self.input_type}")
- # preprocess score (setting reference features, tempo)
- self.preprocess_score()
+ use_score_audio = self.input_type == "audio" and method in {"dixon", "arzt"}
+ self.reference_features = self.preprocess_score(use_score_audio)
+
+ if distance_func is None:
+ distance_func = DEFAULT_DISTANCE_FUNCS[method]
- # setup score follower
if method == "arzt":
self.score_follower = OnlineTimeWarpingArzt(
reference_features=self.reference_features,
@@ -315,22 +327,23 @@ def __init__(
has_insertions=True,
piano_range=self.config["piano_range"],
)
- elif method == "hmm" and self.input_type == "audio":
- # state_space = self._convert_frame_to_beat(np.arange(len(self.reference_features)))
- self.score_follower = GaussianAudioPitchHMM(
+ elif method == "outerhmm" and self.input_type == "midi":
+ self.score_follower = OuterProductHMM(
reference_features=self.reference_features,
queue=self.stream.queue,
- # state_space=state_space,
- # patience=50,
)
elif method == "pthmm" and self.input_type == "audio":
self.score_follower = GaussianAudioPitchTempoHMM(
reference_features=self.reference_features,
- # observation_model=obs_model,
queue=self.stream.queue,
- # pitch_precision=0.5,
- # ioi_precision=2,
- transition_scale=0.05,
+ )
+ elif method == "audio_outerhmm" and self.input_type == "audio":
+ self.score_follower = AudioOuterProductHMM(
+ reference_features=self.reference_features,
+ queue=self.stream.queue,
+ tempo=self.tempo,
+ sample_rate=self.sample_rate,
+ hop_length=self.hop_length,
)
elif method == "pthmm" and self.input_type == "midi":
self.score_follower = PitchHMM(
@@ -348,24 +361,22 @@ def __init__(
else:
raise ValueError("Invalid method")
- def preprocess_score(self):
- if self.input_type == "audio":
- # Adjust tempo based on performance audio if requested
- if self.adjust_tempo and self.performance_file is not None:
- self.tempo = adjust_tempo_for_performance_audio(
- self.score_part, self.performance_file, self.tempo
- )
+ def preprocess_score(self, use_score_audio: bool = False):
+ """Preprocess score to extract reference features."""
+ if self.auto_adjust_tempo and self.performance_file is not None:
+ self.tempo = adjust_tempo_for_performance_audio(
+ self.score_part, self.performance_file, self.tempo
+ )
- # generate score audio
+ if use_score_audio:
self.score_audio = generate_score_audio(
- self.score_part, self.tempo, SAMPLE_RATE
+ self.score_part, self.tempo, self.sample_rate
).astype(np.float32)
-
reference_features = self.processor(self.score_audio)
- self.reference_features = reference_features
self.processor.reset()
+ return reference_features
else:
- self.reference_features = self.score_part.note_array()
+ return self.score_part.note_array()
def _convert_frame_to_beat(self, current_frame: int) -> float:
"""
@@ -386,26 +397,58 @@ def _convert_frame_to_beat(self, current_frame: int) -> float:
)
return beat_position
- def build_score_annotations(self, level="beat", musical_beat: bool = False):
+ def build_score_annotations(
+ self,
+ level="beat",
+ musical_beat: bool = False,
+ return_type: str = "beats", # "beat" or "seconds"
+ ):
+ """
+ Build score annotations in beat or second unit.
+
+ Parameters
+ ----------
+ level : str
+ Level of annotations to use: beat or note (chord onset level)
+ musical_beat : bool
+ Whether to use musical beat
+ return_type : {"beat", "seconds"}
+ Type of annotations to return: beat or seconds (time unit)
+
+ Returns
+ -------
+ score_annots : np.ndarray
+ Array of score annotations in beat or second unit
+ """
score_annots = []
- if level == "beat": # TODO: add bar-level, note-level
+ if level == "beat":
if musical_beat:
self.score_part.use_musical_beat() # for asap dataset
note_array = np.unique(self.score_part.note_array()["onset_beat"])
start_beat = np.ceil(note_array.min())
end_beat = np.floor(note_array.max())
- self.beats = np.arange(start_beat, end_beat + 1)
+ score_annots_in_beat = np.arange(start_beat, end_beat + 1)
+ elif level == "note":
+ snote_array = self.score_part.note_array()
+ score_annots_in_beat = np.unique(snote_array["onset_beat"])
+ else:
+ raise ValueError(f"Invalid score annotation level: {level}")
- beat_timestamp = [
+ if return_type == "beats":
+ return score_annots_in_beat
+ elif return_type == "seconds":
+ score_annots_in_seconds = [
self.score_part.inv_beat_map(beat)
/ self.score_part.quarter_duration_map(
self.score_part.inv_beat_map(beat)
)
* (60 / self.tempo)
- for beat in self.beats
+ for beat in score_annots_in_beat
]
+ return np.array(score_annots_in_seconds)
+ else:
+ raise ValueError(f"Invalid return type: {return_type}")
- score_annots = np.array(beat_timestamp)
return score_annots
def convert_timestamps_to_beats(self, timestamps):
@@ -456,13 +499,13 @@ def get_latency_stats(self):
def run_evaluation(
self,
perf_annotations: Union[PathLike, np.ndarray],
- level: str = "beat",
+ level: str = "note",
tolerances: list = TOLERANCES_IN_MILLISECONDS,
musical_beat: bool = False, # beat annots are difference in some dataset
debug: bool = False,
save_dir: PathLike = None,
run_name: str = None,
- in_seconds: bool = True, # 'True' for performance-based, 'False' for score-based
+ domain: str = "performance", # "score" or "performance"
) -> dict:
"""
Evaluate the score following process
@@ -478,8 +521,9 @@ def run_evaluation(
Tolerances to use for evaluation (in milliseconds)
debug : bool
Whether to save the score and performance audio with beat annotations
- axis : str
- Evaluation axis, either 'score' or 'performance'
+ domain : str
+ Evaluation domain, either "score" or "performance".
+ "score" domain evaluates in beat unit, "performance" domain evaluates in second unit. (Default: "performance")
Returns
-------
@@ -494,66 +538,83 @@ def run_evaluation(
perf_annots = perf_annotations
else:
perf_annots = np.loadtxt(fname=perf_annotations, delimiter="\t", usecols=0)
- score_annots = self.build_score_annotations(level, musical_beat)
- original_perf_annots_length = len(perf_annots)
+
+ return_type = "seconds" if domain == "performance" else "beats"
+ score_annots = self.build_score_annotations(level, musical_beat, return_type)
+
+ original_perf_annots_counts = len(perf_annots)
min_length = min(len(score_annots), len(perf_annots))
score_annots = score_annots[:min_length]
perf_annots = perf_annots[:min_length]
+ mode = (
+ "state"
+ if (self.input_type == "midi" or self.method == "audio_outerhmm")
+ else "frame"
+ )
perf_annots_predicted = transfer_from_score_to_predicted_perf(
- self.score_follower.warping_path, score_annots, frame_rate=self.frame_rate
+ self.score_follower.warping_path,
+ score_annots,
+ frame_rate=self.frame_rate,
+ mode=mode,
)
score_annots_predicted = transfer_from_perf_to_predicted_score(
- self.score_follower.warping_path, perf_annots, frame_rate=self.frame_rate
+ self.score_follower.warping_path,
+ perf_annots,
+ frame_rate=self.frame_rate,
+ mode=mode,
)
score_annots = score_annots[: len(score_annots_predicted)]
- if original_perf_annots_length != len(perf_annots_predicted):
+ if original_perf_annots_counts != len(perf_annots_predicted):
print(
- f"Length of the annotation changed: {original_perf_annots_length} -> {len(perf_annots_predicted)}"
+ f"Length of the annotation changed: {original_perf_annots_counts} -> {len(perf_annots_predicted)}"
)
- if self.input_type == "audio":
- if debug:
- save_debug_results(
- self.score_file,
- self.score_audio if self.input_type == "audio" else None,
- score_annots,
- score_annots_predicted,
- self.performance_file,
- perf_annots,
- perf_annots_predicted,
- self.score_follower,
- self.frame_rate,
- save_dir,
- run_name,
- )
- if in_seconds:
+ # Evaluation metrics
+ if domain == "performance":
eval_results = get_evaluation_results(
perf_annots,
perf_annots_predicted,
- total_length=original_perf_annots_length,
+ total_counts=original_perf_annots_counts,
tolerances=tolerances,
)
else:
- score_annots = self.beats
score_annots_predicted = self.convert_timestamps_to_beats(
score_annots_predicted
)
if tolerances == TOLERANCES_IN_MILLISECONDS:
- tolerances = TOLERANCES_IN_BEATS # switch to beats
+ tolerances = TOLERANCES_IN_BEATS
eval_results = get_evaluation_results(
score_annots,
score_annots_predicted,
- total_length=original_perf_annots_length,
+ total_counts=original_perf_annots_counts,
tolerances=tolerances,
in_seconds=False,
)
if self.input_type == "audio":
latency_results = self.get_latency_stats()
eval_results.update(latency_results)
+
+ # Debug: save warping path TSV, results JSON, and plots
+ if debug and save_dir is not None:
+ save_debug_results(
+ warping_path=self.score_follower.warping_path,
+ score_annots=score_annots,
+ perf_annots=perf_annots,
+ perf_annots_predicted=perf_annots_predicted,
+ eval_results=eval_results,
+ frame_rate=self.frame_rate,
+ save_dir=save_dir,
+ run_name=run_name or "results",
+ state_space=getattr(self.score_follower, "state_space", None),
+ ref_features=getattr(self.score_follower, "reference_features", None),
+ input_features=getattr(self.score_follower, "input_features", None),
+ distance_func=getattr(self.score_follower, "distance_func", None),
+ )
+
return eval_results
def run(self, verbose: bool = True, wait: bool = True):
@@ -571,12 +632,12 @@ def run(self, verbose: bool = True, wait: bool = True):
Alignment results with warping path
"""
with self.stream:
- for current_frame in self.score_follower.run(verbose=verbose):
- if self.input_type == "audio":
- position_in_beat = self._convert_frame_to_beat(current_frame)
+ for current_position in self.score_follower.run(verbose=verbose):
+ if self.input_type == "audio" and self.method != "audio_outerhmm":
+ position_in_beat = self._convert_frame_to_beat(current_position)
yield position_in_beat
else:
- yield float(self.score_follower.state_space[current_frame])
+ yield float(self.score_follower.state_space[current_position])
self._has_run = True
return self.score_follower.warping_path
diff --git a/matchmaker/prob/outer_product_hmm_audio.py b/matchmaker/prob/outer_product_hmm_audio.py
new file mode 100644
index 0000000..e6dc3b9
--- /dev/null
+++ b/matchmaker/prob/outer_product_hmm_audio.py
@@ -0,0 +1,485 @@
+import time
+from queue import Empty
+from typing import List, Optional
+
+import numpy as np
+import progressbar
+from numpy.typing import NDArray
+from partitura.score import Part, Score, ScoreLike
+
+from matchmaker.base import OnlineAlignment
+from matchmaker.features.audio import QUEUE_TIMEOUT
+from matchmaker.utils.misc import RECVQueue, set_latency_stats
+
+NDArrayFloat = NDArray[np.float32]
+NDArrayInt = NDArray[np.int32]
+
+DEFAULT_PITCH_ERROR_PROBS = {
+ "correct_pitch_prob": 0.9497,
+ "semi_tone_error_prob": 0.0145 / 2.0,
+ "whole_tone_error_prob": 0.0224 / 2.0,
+ "octave_error_prob": 0.0047 / 2.0,
+ "within_one_octave_error_prob": 0.0086 / 9.0 / 2.0,
+}
+
+# DEFAULT_TRANSITIONS = [
+# (1, 1.0), # normal (i→i+1)
+# (2, 1e-50), # deletion (i→i+2), HHMMState_simple.hpp: log10(-50)
+# ]
+DEFAULT_TRANSITIONS = [
+ (-3, 0.001),
+ (-2, 0.001),
+ (-1, 0.002),
+ (0, 0.01342),
+ (1, 0.96),
+ (2, 0.01),
+ (3, 0.002),
+]
+
+DEFAULT_D1 = 3
+DEFAULT_D2 = 3
+
+IOI_THRESHOLD = 0.035 # seconds
+
+_FLUX_EXIT_BOOST: float = 1.0
+_OTHER_PROB: float = 1e-6
+_PAUSE_ENTRY_PROB: float = 0.01 # probability of entering pause state from sound
+_PAUSE_DURATION_SEC: float = 0.5
+_PAUSE_EMISSION_MAX: float = 1e-3
+
+
+def _preprocess_obs(obs: np.ndarray) -> np.ndarray:
+ """Flatten observation to 1D array, taking last frame if 2D."""
+ obs = np.asarray(obs, dtype=float)
+ if obs.ndim == 2:
+ obs = obs[-1]
+ return obs.reshape(-1)
+
+
+def get_chords_from_score(
+ score: ScoreLike,
+ return_unique_onsets: bool = False,
+) -> List[set]:
+ if isinstance(score, (Score, Part)):
+ note_array = score.note_array()
+ if isinstance(score, np.ndarray):
+ note_array = score
+ if "onset_beat" not in note_array.dtype.names:
+ raise ValueError("`score` is not a valid note array")
+
+ unique_onsets = np.unique(note_array["onset_beat"])
+ unique_onset_idxs = [
+ np.where(note_array["onset_beat"] == uo)[0] for uo in unique_onsets
+ ]
+ chords = [set(note_array["pitch"][ui]) for ui in unique_onset_idxs]
+
+ if return_unique_onsets:
+ return chords, unique_onsets
+ else:
+ return chords
+
+
+def compute_transition_matrix(
+ N: int,
+ transitions: list[tuple[int, float]] = None,
+ D1: int = DEFAULT_D1,
+ D2: int = DEFAULT_D2,
+) -> tuple[NDArrayFloat, int, int]:
+ """
+ Construct banded transition matrix (α) from transition deltas and probabilities.
+ Supports negative deltas for backward transitions (repeat).
+
+ Parameters
+ ----------
+ N : int
+ Number of score states (chords)
+ transitions : list of (delta, prob) or None
+ If None, uses DEFAULT_TRANSITIONS.
+ D1, D2 : int
+ Fixed neighbourhood sizes (default 3)
+
+ Returns
+ -------
+ alpha : ndarray (N x N)
+ α[i,j] = probability of transitioning from state i -> j (banded structure)
+ D1, D2 : int
+ Fixed neighbourhood sizes
+ """
+ if transitions is None:
+ transitions = DEFAULT_TRANSITIONS
+
+ # Initialize transition matrix with epsilons
+ alpha = np.full((N, N), 1e-6, dtype=float)
+ for delta, prob in transitions:
+ for i in range(N):
+ j = i + delta
+ if 0 <= j < N:
+ alpha[i, j] = prob
+
+ alpha += np.finfo(float).eps
+ alpha /= alpha.sum(axis=1, keepdims=True)
+ return alpha, D1, D2
+
+
+class AudioOuterProductHMM:
+ def __init__(
+ self,
+ reference_features: np.ndarray,
+ queue: Optional[RECVQueue] = None,
+ transitions: Optional[List[tuple[int, float]]] = None,
+ pitch_error_probs: Optional[dict[str, float]] = None,
+ patience: int = 0,
+ tempo: float = 120.0,
+ sample_rate: int = 16000,
+ hop_length: int = 320,
+ ) -> None:
+ self.reference_features = reference_features
+ OnlineAlignment.__init__(
+ self,
+ reference_features=reference_features,
+ )
+
+ self.queue = queue
+ chords, unique_onsets = get_chords_from_score(
+ self.reference_features, return_unique_onsets=True
+ )
+ self.n_states = len(chords)
+ self.state_space = unique_onsets
+ # Harmonic mask includes fundamental + harmonics (II-C)
+ self.chord_harmonic_mask = np.zeros((self.n_states, 88), dtype=float)
+ for i, chord in enumerate(chords):
+ # build harmonic mask for this chord (in 0..87 pitch-index domain)
+ # offsets are approximate: octave=+12, 12th≈+19, 2oct=+24, etc.
+ harm = [
+ (0, 1.0),
+ (12, 0.7),
+ (19, 0.5),
+ (24, 0.4),
+ (28, 0.3),
+ (31, 0.25),
+ (34, 0.2),
+ ]
+ for p in chord:
+ if not (21 <= p <= 108):
+ continue
+ base = int(p - 21)
+ for off, w in harm:
+ idx = base + int(off)
+ if 0 <= idx < 88:
+ self.chord_harmonic_mask[i, idx] += float(w)
+ s = float(np.sum(self.chord_harmonic_mask[i]))
+ if s > 0:
+ self.chord_harmonic_mask[i] /= s
+ self.transitions = (
+ transitions if transitions is not None else DEFAULT_TRANSITIONS
+ )
+ self.pitch_error_probs = (
+ pitch_error_probs
+ if pitch_error_probs is not None
+ else DEFAULT_PITCH_ERROR_PROBS
+ )
+ self.other_prob = _OTHER_PROB
+ self.sample_rate = int(sample_rate)
+ self.hop_length = int(hop_length)
+ self.pause_entry_prob = _PAUSE_ENTRY_PROB
+ self.pause_duration_sec = _PAUSE_DURATION_SEC
+ self.pause_emission_max = _PAUSE_EMISSION_MAX
+
+ # Transition setup with banded structure
+ self.alpha, self.D1, self.D2 = compute_transition_matrix(
+ self.n_states, self.transitions
+ )
+
+ # Remove top-level self-transitions (handled by bottom layer a00)
+ if self.n_states > 1:
+ np.fill_diagonal(self.alpha, 0.0)
+ row_sums = self.alpha.sum(axis=1, keepdims=True)
+ bad = row_sums.squeeze(-1) <= 0
+ if np.any(bad):
+ for j in np.where(bad)[0]:
+ self.alpha[j] = 1.0 / (self.n_states - 1)
+ self.alpha[j, j] = 0.0
+ row_sums = self.alpha.sum(axis=1, keepdims=True)
+ self.alpha = self.alpha / row_sums
+
+ self.current_state = 0
+ self._warping_path = []
+ self._current_chord = np.zeros(88, dtype=int)
+ self.patience = int(patience)
+ self.state_probabilities = np.zeros(self.n_states * 2, dtype=float)
+ self.state_probabilities[0] = 1.0
+ self.is_first_observation = True
+ self.input_index = 0
+ self.latency_stats = {
+ "total_latency": 0,
+ "total_frames": 0,
+ "max_latency": 0,
+ "min_latency": float("inf"),
+ }
+ # Bottom transitions a_{l',l}^{(i)} and exit probs e_l^{(i)} (Eq.(5))
+ frame_rate = float(self.sample_rate) / float(self.hop_length)
+ self.a00 = self._compute_chord_self_transition_probs(
+ unique_onsets=unique_onsets,
+ tempo=tempo,
+ frame_rate=frame_rate,
+ )
+ self.a11 = float(
+ np.clip(
+ self._pause_self_transition_prob(self.pause_duration_sec, frame_rate),
+ 0.0,
+ 1.0,
+ )
+ )
+ # Pause entry prob a01 (II-E)
+ move_prob = 1.0 - self.a00
+ p_pause = float(np.clip(self.pause_entry_prob, 0.0, 1.0))
+ self.a01 = move_prob * p_pause
+ # a10^(i)=0 per II-E
+ self.a10 = np.zeros(self.n_states, dtype=float)
+
+ # exit probabilities from top state:
+ # e0^(i) = 1 - a00^(i) - a01^(i)
+ # e1^(i) = 1 - a11
+ self.e0 = np.clip(1.0 - self.a00 - self.a01, 1e-10, 1.0)
+ self.e1 = float(np.clip(1.0 - self.a11, 1e-10, 1.0))
+
+ @property
+ def warping_path(self) -> NDArrayInt:
+ return (np.array(self._warping_path).T).astype(np.int32)
+
+ @staticmethod
+ def _pause_self_transition_prob(
+ pause_duration_sec: float, frame_rate: float
+ ) -> float:
+ if pause_duration_sec <= 0:
+ return 0.0
+ frame_time = 1.0 / max(frame_rate, 1e-6)
+ exit_prob = frame_time / max(pause_duration_sec, frame_time)
+ exit_prob = float(np.clip(exit_prob, 1e-6, 1.0))
+ return float(1.0 - exit_prob)
+
+ @staticmethod
+ def _compute_chord_self_transition_probs(
+ unique_onsets: np.ndarray,
+ tempo: float,
+ frame_rate: float,
+ ) -> np.ndarray:
+ """
+ Compute self-transition probabilities from chord durations (Eq.5).
+
+ a_i = 1 - 1/d_i, where d_i = duration_sec / frame_time.
+ """
+ N = len(unique_onsets)
+ frame_time = 1.0 / max(frame_rate, 1e-6)
+
+ # Convert onset beats to seconds, then compute inter-onset durations
+ onset_sec = unique_onsets * (60.0 / tempo)
+ dur_sec = np.zeros(N, dtype=float)
+ if N >= 2:
+ dur_sec[:-1] = np.diff(onset_sec)
+ dur_sec[-1] = dur_sec[-2]
+ else:
+ dur_sec[:] = 0.2
+
+ dur_sec = np.maximum(dur_sec, 0.05) # at least 50ms
+ d_i = np.maximum(1.0, dur_sec / frame_time)
+ return np.clip(1.0 - 1.0 / d_i, 1e-6, 1.0 - 1e-6)
+
+ def is_still_following(self) -> bool:
+ if self.current_state is not None:
+ return self.current_state <= self.n_states - 1
+ return False
+
+ def __call__(self, input, *args, **kwargs) -> Optional[int]:
+ """
+ Frame-based audio HMM update.
+
+ Parameters
+ ----------
+ input : np.ndarray or tuple
+ Current frame observation y_t (CQT magnitude 88-bin vector).
+ If tuple, uses first element for backward compatibility.
+
+ Returns
+ -------
+ current_state : int or None
+ Current estimated score state index.
+ """
+ if isinstance(input, tuple):
+ observation = np.asarray(input[0], dtype=float)
+ else:
+ observation = np.asarray(input, dtype=float)
+
+ if observation.ndim == 2:
+ observation = observation[-1]
+
+ self.state_probabilities = self.forward_step(
+ self.state_probabilities, observation
+ )
+
+ probs = self.state_probabilities
+ top_scores = probs[0::2] + probs[1::2]
+ new_top = int(np.argmax(top_scores))
+
+ self.current_state = new_top
+ self._warping_path.append((self.current_state, self.input_index))
+ self.input_index += 1
+ return self.current_state
+
+ def compute_obs_likelihood(
+ self,
+ observation: np.ndarray,
+ ) -> NDArrayFloat:
+ """Compute per-top-state sound emission b_0^{(i)}(y_t) for current frame."""
+ obs = _preprocess_obs(observation)
+
+ # CQT-based emission: chord_harmonic_mask @ normalized_cqt
+ cqt = np.maximum(obs[:88] if obs.size >= 88 else obs, 0.0)
+ s = cqt.sum()
+ if s <= 0:
+ return np.full(self.n_states, 1e-300, dtype=float)
+ cqt = cqt / s
+
+ em = self.chord_harmonic_mask @ cqt
+ return np.maximum(np.nan_to_num(em, nan=1e-12), 1e-12)
+
+ def _compute_pause_emission(self, observation: np.ndarray) -> float:
+ """Compute pause emission probability based on spectral flatness.
+
+ Silence/noise has a flat spectrum (low variance), pitched sound has peaks (high variance).
+ """
+ obs = _preprocess_obs(observation)
+ cqt = np.maximum(obs[:88] if obs.size >= 88 else obs, 0.0)
+ s = cqt.sum()
+
+ if s <= 0:
+ emit = 1.0
+ else:
+ var = float(np.var(cqt / s))
+ emit = 1.0 / (1.0 + 200.0 * var)
+
+ emit = max(emit, 1e-300)
+ return min(emit, self.pause_emission_max)
+
+ def forward_step(
+ self,
+ prev_probs: NDArrayFloat,
+ observation: NDArrayFloat,
+ ) -> NDArrayFloat:
+ """
+ Forward(filtering) update for hierarchical HMM (L=2) with repeat/skip factorization.
+
+ Mapping to paper:
+ - II-F Eq.(9): α_{t,(i,l)} recursion on flattened standard HMM.
+ - II-F Eq.(6): transition definition from (j,l') -> (i,l)
+ - III-B Eq.(11): top transition factorization a_{j,i} = a^{(nbh)}_{j,i} + s_j r_i
+ - Appendix B Eq.(19)(20): O(LN) update using global term
+
+ Implementation summary (L=2, π_1^(i)=0):
+ - prev_probs is length 2N: [sound0, pause0, sound1, pause1, ...]
+ - exit_mass[j] = Σ_{l'} prev(j,l') * e_{l'}^{(j)}
+ - neigh_sum_i = Σ_{j∈nbh(i)} exit_mass[j] * α_{j,i}
+ - new_sound(i) = b_sound(i,y) * [ prev_sound(i)*a00(i) + neigh_sum_i ]
+ - new_pause(i) = b_pause(y) * [ prev_sound(i)*a01(i) + prev_pause(i)*a11 ]
+ """
+ N = self.n_states
+ if prev_probs.shape[0] != 2 * N:
+ raise ValueError(
+ f"Expected prev_probs shape {(2*N,)} but got {prev_probs.shape}"
+ )
+ prev_sound = np.asarray(prev_probs[0::2], dtype=float)
+ prev_pause = np.asarray(prev_probs[1::2], dtype=float)
+
+ # Emission
+ emit_sound = self.compute_obs_likelihood(observation)
+ emit_pause_scalar = self._compute_pause_emission(observation)
+ emit_pause = np.full(N, emit_pause_scalar, dtype=float)
+
+ # Spectral-flux-driven exit boost
+ obs_flat = _preprocess_obs(observation)
+ flux = float(obs_flat[88]) if obs_flat.size > 88 else 0.0
+ f = flux / (flux + 1.0) # [0,1)
+ boost = 1.0 + _FLUX_EXIT_BOOST * f
+ e0 = np.clip(self.e0 * boost, 1e-10, 1.0 - self.a01 - 1e-10)
+ a00 = np.clip(1.0 - self.a01 - e0, 1e-10, 1.0 - 1e-10)
+
+ # Exit masses from each top state j (Eq.(6))
+ exit_mass = prev_sound * e0 + prev_pause * self.e1 # (N,)
+
+ # Compute neigh_sum_i for each i (banded, Eq.(9))
+ neigh_sum = np.zeros(N, dtype=float)
+ for i in range(N):
+ j_start = max(0, i - self.D2)
+ j_end = min(N, i + self.D1 + 1)
+ ssum = 0.0
+ for j in range(j_start, j_end):
+ a = float(self.alpha[j, i])
+ if a <= 0:
+ continue
+ ssum += exit_mass[j] * a
+ neigh_sum[i] = ssum
+
+ # Within-top bottom transitions
+ within_sound = prev_sound * a00
+ within_pause = prev_sound * self.a01 + prev_pause * self.a11
+
+ # Entering a top state resets bottom to sound (π_0=1, π_1=0)
+ new_sound = emit_sound * (within_sound + neigh_sum)
+ new_pause = emit_pause * within_pause
+
+ new_probs = np.empty(2 * N, dtype=float)
+ new_probs[0::2] = new_sound
+ new_probs[1::2] = new_pause
+
+ new_probs = np.nan_to_num(new_probs, nan=1e-300, posinf=1.0, neginf=1e-300)
+ new_probs = np.maximum(new_probs, 1e-300)
+ z = float(new_probs.sum())
+ if z > 0:
+ new_probs /= z
+ else:
+ new_probs[:] = 0.0
+ new_probs[0] = 1.0
+ return new_probs
+
+ def run(
+ self,
+ verbose: bool = True,
+ ) -> NDArrayInt:
+ same_state_counter = 0
+ empty_counter = 0
+ if verbose:
+ pbar = progressbar.ProgressBar(maxval=self.n_states)
+ pbar.start()
+
+ while self.is_still_following():
+ prev_state = self.current_state
+
+ try:
+ queue_input = self.queue.get(timeout=QUEUE_TIMEOUT)
+ except Empty:
+ break
+ self.last_queue_update = time.time()
+ if queue_input is not None:
+ current_state = self(queue_input)
+ empty_counter = 0
+ if current_state == prev_state:
+ if self.patience > 0:
+ if same_state_counter < self.patience:
+ same_state_counter += 1
+ else:
+ break
+ else:
+ same_state_counter = 0
+
+ if verbose:
+ if current_state is not None:
+ pbar.update(int(current_state) + 1) # states starts with 0
+ latency = time.time() - self.last_queue_update
+ self.latency_stats = set_latency_stats(
+ latency, self.latency_stats, self.input_index
+ )
+ yield current_state
+
+ if verbose:
+ pbar.finish()
+ return self.warping_path
diff --git a/matchmaker/utils/eval.py b/matchmaker/utils/eval.py
index b7009ed..20e5192 100644
--- a/matchmaker/utils/eval.py
+++ b/matchmaker/utils/eval.py
@@ -1,4 +1,4 @@
-from typing import TypedDict
+from typing import TypedDict, Union
import numpy as np
import scipy
@@ -7,65 +7,171 @@
TOLERANCES_IN_BEATS = [0.05, 0.1, 0.3, 0.5, 1, 2]
-def transfer_positions(wp, ref_anns, frame_rate, reverse=False):
+def transfer_positions(
+ wp,
+ ref_anns,
+ frame_rate,
+ reverse=False,
+ *,
+ mode: str = "auto",
+ reducer: str = "min",
+ state_offset: Union[int, str] = "auto",
+ output: str = "seconds",
+):
"""
Transfer the positions of the reference annotations to the target annotations using the warping path.
+
+ This function supports two common warping-path conventions:
+
+ - **frame mode** (classic DTW-style): wp[0] and wp[1] are frame indices for reference/target features.
+ - **state mode** (HMM/score-state): wp[0] contains *reference state indices* and wp[1] contains *target frame indices*.
+
Parameters
----------
wp : np.array with shape (2, T)
array of warping path.
warping_path[0] is the index of the reference (score) feature and warping_path[1] is the index of the target(input) feature.
ref_ann : List[float]
- reference annotations in seconds.
+ In **frame mode**, reference annotations in seconds.
+ In **state mode**, a sequence whose length equals the number of reference states (e.g., score unique_onsets);
+ the values are not used except for determining the number of states.
frame_rate : int
frame rate of the audio.
+ reverse : bool
+ If True, swap the direction (target -> reference).
+ mode : {"auto", "frame", "state"}
+ Warping-path convention. "auto" picks "state" when wp[0] looks like small discrete state indices.
+ reducer : {"min", "max", "median", "mean"}
+ In **state mode**, how to select a single representative target frame for each state when multiple wp entries
+ map to the same state.
+ state_offset : {"auto"} or int
+ In **state mode**, wp[0] may start at 0 or 1 (or have a leading start-state). "auto" chooses the offset that
+ best matches the expected number of states.
+ output : {"seconds", "frames"}
+ Return unit. "seconds" divides frames by frame_rate; "frames" returns frame indices.
Returns
-------
predicted_targets : np.array with shape (T,)
- predicted target positions in seconds.
+ Predicted target positions (seconds or frames depending on output).
"""
- # Causal nearest neighbor interpolation
+ if output not in {"seconds", "frames"}:
+ raise ValueError(f"Invalid output={output!r}. Use 'seconds' or 'frames'.")
+
if reverse:
x, y = wp[1], wp[0]
else:
x, y = wp[0], wp[1]
- ref_anns_frame = np.round(ref_anns * frame_rate)
- predicted_targets = np.ones(len(ref_anns)) * np.nan
-
- for i, r in enumerate(ref_anns_frame):
- # 1) Scan all x values less than or equal to r and find the largest x value
- past_indices = np.where(x <= r)[0]
- if past_indices.size > 0:
- # Find indices corresponding to the largest x value
- max_x_val = x[past_indices[-1]]
- max_x_indices = np.where(x == max_x_val)[0]
-
- # 2) Among all y values mapped to this x value, select the minimum y value
- corresponding_y_values = y[max_x_indices]
- min_y_val = np.min(corresponding_y_values)
-
- # predicted_targets.append(min_y_val)
- predicted_targets[i] = min_y_val
- return np.array(predicted_targets) / frame_rate
-
-
-def transfer_from_score_to_predicted_perf(wp, score_annots, frame_rate):
- predicted_perf_idx = transfer_positions(wp, score_annots, frame_rate)
+ if mode not in {"auto", "frame", "state"}:
+ raise ValueError(f"Invalid mode={mode!r}. Use 'auto', 'frame', or 'state'.")
+
+ # Heuristic: state paths have small discrete indices (often << target frames),
+ # while frame paths typically cover most reference frames (unique count is large).
+ if mode == "auto":
+ x_unique = np.unique(x)
+ n_ref = len(ref_anns)
+ looks_like_state = (x_unique.size <= max(4, 2 * n_ref)) and (
+ int(np.max(x)) <= max(10, 5 * n_ref)
+ )
+ mode = "state" if looks_like_state else "frame"
+
+ if mode == "frame":
+ # Causal nearest neighbor interpolation (reference seconds -> reference frames -> target frames)
+ ref_anns_frame = np.round(np.asarray(ref_anns) * frame_rate)
+ predicted_targets = np.ones(len(ref_anns_frame), dtype=float) * np.nan
+
+ for i, r in enumerate(ref_anns_frame):
+ # 1) Scan all x values less than or equal to r and find the largest x value
+ past_indices = np.where(x <= r)[0]
+ if past_indices.size > 0:
+ # Find indices corresponding to the largest x value
+ max_x_val = x[past_indices[-1]]
+ max_x_indices = np.where(x == max_x_val)[0]
+
+ # 2) Among all y values mapped to this x value, select the minimum y value
+ corresponding_y_values = y[max_x_indices]
+ predicted_targets[i] = float(np.min(corresponding_y_values))
+
+ if output == "frames":
+ return predicted_targets
+ return np.asarray(predicted_targets) / frame_rate
+
+ # mode == "state"
+ # Goal: for each reference state index, select representative target frame from wp.
+ num_states = len(ref_anns)
+ predicted_frames = np.ones(num_states, dtype=float) * np.nan
+
+ x_int = np.asarray(x, dtype=int)
+ y_int = np.asarray(y, dtype=int)
+
+ if reducer not in {"min", "max", "median", "mean"}:
+ raise ValueError(
+ f"Invalid reducer={reducer!r}. Use 'min', 'max', 'median', or 'mean'."
+ )
+
+ if state_offset == "auto":
+ # Choose offset that maximizes overlap between expected states and observed wp state indices.
+ observed = np.unique(x_int)
+ candidates = []
+ for off in (0, 1, int(np.min(x_int))):
+ if off not in candidates:
+ candidates.append(off)
+ best_off = candidates[0]
+ best_overlap = -1
+ for off in candidates:
+ expected = np.arange(off, off + num_states, dtype=int)
+ overlap = np.intersect1d(observed, expected).size
+ if overlap > best_overlap:
+ best_overlap = overlap
+ best_off = off
+ offset = best_off
+ else:
+ offset = int(state_offset)
+
+ for s in range(num_states):
+ wp_state = s + offset
+ idx = np.where(x_int == wp_state)[0]
+ if idx.size == 0:
+ continue
+ vals = y_int[idx].astype(float)
+ if reducer == "min":
+ predicted_frames[s] = float(np.min(vals))
+ elif reducer == "max":
+ predicted_frames[s] = float(np.max(vals))
+ elif reducer == "median":
+ predicted_frames[s] = float(np.median(vals))
+ else: # mean
+ predicted_frames[s] = float(np.mean(vals))
+
+ if output == "frames":
+ return predicted_frames
+ return predicted_frames / frame_rate
+
+
+def transfer_from_score_to_predicted_perf(wp, score_annots, frame_rate, mode="auto"):
+ predicted_perf_idx = transfer_positions(
+ wp,
+ score_annots,
+ frame_rate,
+ mode=mode,
+ )
return predicted_perf_idx
-def transfer_from_perf_to_predicted_score(wp, perf_annots, frame_rate):
- predicted_score_idx = transfer_positions(wp, perf_annots, frame_rate, reverse=True)
+def transfer_from_perf_to_predicted_score(wp, perf_annots, frame_rate, mode="auto"):
+ predicted_score_idx = transfer_positions(
+ wp, perf_annots, frame_rate, reverse=True, mode=mode
+ )
return predicted_score_idx
def get_evaluation_results(
gt_annots,
predicted_annots,
- total_length,
+ total_counts,
tolerances=TOLERANCES_IN_MILLISECONDS,
+ pcr_threshold=2_000, # 2 seconds
in_seconds=True,
):
if in_seconds:
@@ -73,9 +179,7 @@ def get_evaluation_results(
else:
errors_in_delay = gt_annots - predicted_annots
- filtered_errors_in_delay = errors_in_delay[
- np.abs(errors_in_delay) <= tolerances[-1]
- ]
+ filtered_errors_in_delay = errors_in_delay[np.abs(errors_in_delay) <= pcr_threshold]
filtered_abs_errors_in_delay = np.abs(filtered_errors_in_delay)
results = {
@@ -85,16 +189,18 @@ def get_evaluation_results(
"skewness": float(f"{scipy.stats.skew(filtered_errors_in_delay):.4f}"),
"kurtosis": float(f"{scipy.stats.kurtosis(filtered_errors_in_delay):.4f}"),
}
- for tau in tolerances:
- if in_seconds:
+
+ if in_seconds:
+ for tau in tolerances:
results[f"{tau}ms"] = float(
- f"{np.sum(np.abs(errors_in_delay) <= tau) / total_length:.4f}"
+ f"{np.sum(np.abs(errors_in_delay) <= tau) / total_counts:.4f}"
)
- else:
+ else:
+ for tau in tolerances:
results[f"{tau}b"] = float(
- f"{np.sum(np.abs(errors_in_delay) <= tau) / total_length:.4f}"
+ f"{np.sum(np.abs(errors_in_delay) <= tau) / total_counts:.4f}"
)
+
+ results["pcr"] = float(f"{len(filtered_errors_in_delay) / total_counts:.4f}")
results["count"] = len(filtered_abs_errors_in_delay)
- pcr_threshold = f"{tolerances[-1]}ms" if in_seconds else f"{tolerances[-1]}b"
- results["pcr"] = results[f"{pcr_threshold}"]
return results
diff --git a/matchmaker/utils/misc.py b/matchmaker/utils/misc.py
index c845af5..b8be392 100644
--- a/matchmaker/utils/misc.py
+++ b/matchmaker/utils/misc.py
@@ -6,7 +6,6 @@
import csv
import numbers
-import os
import re
import xml.etree.ElementTree as ET
from pathlib import Path
@@ -17,13 +16,10 @@
import numpy as np
import partitura
import scipy
-import soundfile as sf
from matplotlib import pyplot as plt
from numpy.typing import NDArray
from partitura.score import ScoreLike
-from matchmaker.features.audio import SAMPLE_RATE
-
# Tempo marking to BPM mapping
# Reference: https://en.wikipedia.org/wiki/Tempo#Basic_tempo_markings
TEMPO_MARKING_TO_BPM = {
@@ -324,6 +320,7 @@ def get_tempo_from_score(
Tries multiple sources in order:
1. Partitura Tempo objects (explicit BPM)
2. MusicXML element (if score_file provided)
+ 3. Text tempo marking (e.g., "Allegro", "Andante") converted to approximate BPM
Parameters
----------
@@ -362,6 +359,12 @@ def get_tempo_from_score(
except Exception:
pass
+ # Fallback: extract from text tempo marking (e.g., "Allegro", "Andante")
+ if score_file is not None:
+ text_tempo = extract_tempo_marking_from_musicxml(score_file)
+ if text_tempo is not None:
+ return text_tempo
+
return None
@@ -514,161 +517,181 @@ def save_nparray_to_csv(array: NDArray, save_path: str):
writer.writerows(array)
-def save_mixed_audio(
- audio: Union[np.ndarray, str, os.PathLike],
- annots: np.ndarray,
- save_path: Union[str, os.PathLike],
- sr: int = SAMPLE_RATE,
-):
- if not isinstance(audio, np.ndarray):
- audio, _ = librosa.load(audio, sr=sr)
-
- annots_audio = librosa.clicks(
- times=annots,
- sr=sr,
- click_freq=1000,
- length=len(audio),
- )
- audio_mixed = audio + annots_audio
- sf.write(str(save_path), audio_mixed, sr, subtype="PCM_24")
-
-
-def plot_and_save_score_following_result(
- wp,
- ref_features,
- input_features,
- distance_func,
- save_dir,
- score_annots,
- perf_annots,
- frame_rate,
- name=None,
+def plot_alignment(
+ warping_path: np.ndarray,
+ perf_annots: np.ndarray,
+ perf_annots_predicted: np.ndarray,
+ save_dir: Path,
+ name: str,
+ score_y: Optional[np.ndarray] = None,
+ frame_rate: float = 1.0,
+ state_space: Optional[np.ndarray] = None,
+ ref_features: Optional[np.ndarray] = None,
+ input_features: Optional[np.ndarray] = None,
+ distance_func=None,
):
- xmin = 0 # performance range
- xmax = None
- ymin = 0 # score range
- ymax = None
-
- xmax = xmax if xmax is not None else input_features.shape[0] - 1
- ymax = ymax if ymax is not None else ref_features.shape[0] - 1
- x_indices = range(xmin, xmax + 1)
- y_indices = range(ymin, ymax + 1)
-
- run_name = name or "results"
- save_path = save_dir / f"wp_{run_name}.tsv"
- save_nparray_to_csv(wp.T, save_path.as_posix())
-
- dist = scipy.spatial.distance.cdist(
- ref_features[y_indices, :],
- input_features[x_indices, :],
- metric=distance_func,
- ) # [d, wy]
- plt.figure(figsize=(10, 10))
- plt.imshow(
- dist,
- aspect="auto",
- origin="lower",
- interpolation="nearest",
- extent=(xmin, xmax, ymin, ymax),
+ """Plot warping path, GT annotations, and predicted points in one figure.
+
+ Layers (back to front): distance matrix → warping path → predicted → GT.
+ """
+ save_dir.mkdir(parents=True, exist_ok=True)
+ gt = np.asarray(perf_annots, dtype=float)
+ pred = np.asarray(perf_annots_predicted, dtype=float)
+ n = min(len(gt), len(pred))
+ gt, pred = gt[:n], pred[:n]
+
+ has_dist_matrix = (
+ ref_features is not None
+ and input_features is not None
+ and distance_func is not None
)
- mask_perf = (xmin <= perf_annots * frame_rate) & (perf_annots * frame_rate <= xmax)
- mask_score = (ymin <= score_annots * frame_rate) & (
- score_annots * frame_rate <= ymax
+
+ fig, ax = plt.subplots(figsize=(30, 30))
+
+ if has_dist_matrix:
+ # DTW mode: everything in frame space
+ dist = scipy.spatial.distance.cdist(
+ ref_features,
+ input_features,
+ metric=distance_func,
+ )
+ ax.imshow(
+ dist,
+ aspect="auto",
+ origin="lower",
+ interpolation="nearest",
+ extent=(0, input_features.shape[0] - 1, 0, ref_features.shape[0] - 1),
+ )
+ x_gt = gt * float(frame_rate)
+ x_pred = pred * float(frame_rate)
+ if score_y is not None:
+ y = np.asarray(score_y, dtype=float)[:n] * float(frame_rate)
+ else:
+ y = np.arange(n)
+ ylabel = "score (frames)"
+ wp_x = warping_path[1]
+ wp_y = warping_path[0]
+ else:
+ # HMM mode: x in frames, y in beats via state_space
+ x_gt = gt * float(frame_rate)
+ x_pred = pred * float(frame_rate)
+ if score_y is None:
+ y = np.arange(n)
+ ylabel = "annotation index"
+ else:
+ y = np.asarray(score_y, dtype=float)[:n]
+ ylabel = "score position (beats)"
+ wp_x = warping_path[1]
+ if state_space is not None:
+ wp_y = state_space[warping_path[0]]
+ else:
+ wp_y = warping_path[0]
+
+ # 1. Warping path
+ if has_dist_matrix:
+ ax.plot(
+ wp_x,
+ wp_y,
+ ".",
+ color="white",
+ alpha=0.7,
+ markersize=15,
+ label="warping path",
+ zorder=2,
+ )
+ else:
+ ax.plot(
+ wp_x,
+ wp_y,
+ ".",
+ color="lime",
+ alpha=0.5,
+ markersize=15,
+ label="warping path",
+ zorder=2,
+ )
+
+ # 2. Predicted points
+ ax.scatter(
+ x_pred,
+ y,
+ label="predicted",
+ s=80,
+ alpha=0.9,
+ marker="o",
+ color="blue",
+ linewidths=0,
+ zorder=3,
)
- plt.title(
- f"[{save_dir.name}/{run_name}] \n Matchmaker alignment path with ground-truth labels",
- fontsize=15,
+
+ # 3. GT annotations (front)
+ ax.scatter(
+ x_gt,
+ y,
+ label="ground truth",
+ s=120,
+ alpha=0.9,
+ marker="x",
+ color="red",
+ linewidths=3,
+ zorder=4,
)
- plt.xlabel("Performance Features", fontsize=15)
- plt.ylabel("Score Features", fontsize=15)
-
- # plot online DTW path
- cropped_history = [
- (ref, target)
- for (ref, target) in wp.T
- if xmin <= target <= xmax and ymin <= ref <= ymax
- ]
- for ref, target in cropped_history:
- plt.plot(target, ref, ".", color="cyan", alpha=0.5, markersize=3)
-
- # plot ground-truth labels
- for ref, target in zip(score_annots, perf_annots):
- if (xmin <= target * frame_rate <= xmax) and (ymin <= ref * frame_rate <= ymax):
- plt.plot(
- target * frame_rate,
- ref * frame_rate,
- "x",
- color="r",
- alpha=1,
- markersize=3,
- markeredgewidth=3,
- )
- plt.savefig(save_dir / f"{run_name}.png")
+
+ ax.set_xlabel("performance frame")
+ ax.set_ylabel(ylabel)
+ ax.set_title(f"[{save_dir.name}] alignment ({name})")
+ ax.grid(True, alpha=0.2)
+ ax.legend(loc="best")
+ fig.tight_layout()
+ fig.savefig(save_dir / f"{name}.png", dpi=150)
+ plt.close(fig)
def save_debug_results(
- score_file,
- score_audio,
- score_annots,
- score_annots_predicted,
- perf_file,
- perf_annots,
- perf_annots_predicted,
- model,
- frame_rate,
- save_dir=None,
- run_name=None,
+ warping_path: np.ndarray,
+ score_annots: np.ndarray,
+ perf_annots: np.ndarray,
+ perf_annots_predicted: np.ndarray,
+ eval_results: dict,
+ frame_rate: float,
+ save_dir: Path,
+ run_name: str = "results",
+ state_space: Optional[np.ndarray] = None,
+ ref_features: Optional[np.ndarray] = None,
+ input_features: Optional[np.ndarray] = None,
+ distance_func=None,
):
- # save score audio with beat annotations
- score_audio_dir = Path("./score_audio")
- score_audio_dir.mkdir(parents=True, exist_ok=True)
- run_name_suffix = (
- f"{Path(perf_file).stem}_{run_name}" if run_name else f"{Path(perf_file).stem}"
- )
- save_mixed_audio(
- score_audio,
- score_annots,
- save_path=score_audio_dir
- / f"score_audio_{Path(score_file).parent.parent.name}_{Path(score_file).stem}_{run_name_suffix}.wav",
- )
- # save performance audio with beat annotations
- perf_audio_dir = Path("./performance_audio")
- perf_audio_dir.mkdir(parents=True, exist_ok=True)
- save_mixed_audio(
- perf_file,
+ """Save debug outputs: warping path TSV, results JSON, and alignment plot."""
+ save_dir = Path(save_dir)
+ save_dir.mkdir(parents=True, exist_ok=True)
+
+ # 1. Warping path TSV + results JSON
+ save_nparray_to_csv(warping_path.T, (save_dir / f"wp_{run_name}.tsv").as_posix())
+ import json
+
+ with open(save_dir / f"{run_name}.json", "w") as f:
+ json.dump(eval_results, f, indent=4)
+
+ # 2. Alignment plot
+ if state_space is not None:
+ score_y = state_space
+ else:
+ sx = np.asarray(score_annots, dtype=float)
+ score_y = (
+ sx
+ if sx.ndim == 1 and len(sx) == len(perf_annots) and np.all(np.diff(sx) >= 0)
+ else None
+ )
+ plot_alignment(
+ warping_path,
perf_annots,
- save_path=perf_audio_dir
- / f"perf_audio_{Path(perf_file).parent.parent.name}_{Path(perf_file).parent.name}_{run_name_suffix}.wav",
- )
- # save score audio with predicted beat annotations
- score_predicted_audio_dir = Path("./score_audio_predicted")
- score_predicted_audio_dir.mkdir(parents=True, exist_ok=True)
- save_mixed_audio(
- score_audio,
- score_annots_predicted,
- save_path=score_predicted_audio_dir
- / f"score_audio_{Path(score_file).parent.parent.name}_{Path(score_file).parent.name}_{run_name_suffix}.wav",
- )
- # save performance audio with predicted beat annotations
- perf_predicted_audio_dir = Path("./performance_audio_predicted")
- perf_predicted_audio_dir.mkdir(parents=True, exist_ok=True)
- save_mixed_audio(
- perf_file,
perf_annots_predicted,
- save_path=perf_predicted_audio_dir
- / f"perf_audio_{Path(perf_file).parent.parent.name}_{Path(perf_file).parent.name}_{run_name_suffix}.wav",
- )
- # save score following plot result
- save_dir = save_dir or Path("./tests/results")
- save_dir.mkdir(parents=True, exist_ok=True)
- plot_and_save_score_following_result(
- model.warping_path,
- model.reference_features,
- model.input_features,
- model.distance_func,
save_dir,
- score_annots,
- perf_annots,
- frame_rate,
- name=run_name,
+ run_name,
+ score_y=score_y,
+ frame_rate=frame_rate,
+ state_space=state_space,
+ ref_features=ref_features,
+ input_features=input_features,
+ distance_func=distance_func,
)
diff --git a/run_examples.py b/run_examples.py
index 9402613..4b13c59 100644
--- a/run_examples.py
+++ b/run_examples.py
@@ -1,15 +1,18 @@
import argparse
import datetime
import json
+from _queue import Empty
from pathlib import Path
from matchmaker import Matchmaker
ROOT_DIR = Path(__file__).parent
-SCORE_FILE = ROOT_DIR / "matchmaker/assets/simple_score.musicxml"
-PERFORMANCE_AUDIO_FILE = ROOT_DIR / "matchmaker/assets/simple_performance.mp3"
-PERFORMANCE_MIDI_FILE = ROOT_DIR / "matchmaker/assets/simple_performance.mid"
-ANNOTATION_FILE = ROOT_DIR / "matchmaker/assets/simple_perf_annotations.txt"
+SCORE_FILE = ROOT_DIR / "matchmaker/assets/simple_mozart_k265_var1.musicxml"
+PERFORMANCE_AUDIO_FILE = ROOT_DIR / "matchmaker/assets/simple_mozart_k265_var1.mp3"
+PERFORMANCE_MIDI_FILE = ROOT_DIR / "matchmaker/assets/simple_mozart_k265_var1.mid"
+ANNOTATION_FILE = (
+ ROOT_DIR / "matchmaker/assets/simple_mozart_k265_var1_note_annotations.txt"
+)
def select_performance_file(input_mode):
@@ -36,17 +39,24 @@ def main():
print(f"Running matchmaker with the score file ({SCORE_FILE.name})...")
print("-" * 50)
+ method = "outerhmm" if input_mode == "midi" else "arzt"
+
# Initialize matchmaker (simulation mode)
- mm = Matchmaker(
- score_file=SCORE_FILE,
- performance_file=performance_file,
- input_type=input_mode,
- )
+ try:
+ mm = Matchmaker(
+ score_file=SCORE_FILE,
+ performance_file=performance_file,
+ input_type=input_mode,
+ method=method,
+ )
+ except Empty as e:
+ print(f"Error initializing Matchmaker: {e}")
+ return
# Run real-time score following
for current_position in mm.run(wait=True):
timestamp = datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]
- print(f"[{timestamp}] Current position: {current_position}")
+ print(f"[{timestamp}] Current beat position: {current_position}")
# Run evaluation
print("-" * 50)
@@ -57,9 +67,8 @@ def main():
debug=True,
save_dir=ROOT_DIR / "results",
run_name="simple_example",
+ level="note",
)
- with open(ROOT_DIR / "results" / "simple_example.json", "w") as f:
- json.dump(results, f, indent=4)
print(f"Evaluation Result: {json.dumps(results, indent=4)}")
print(f"Detailed evaluation results saved in {ROOT_DIR / 'results'}")
diff --git a/setup.py b/setup.py
index 6962ccf..42b0c0e 100644
--- a/setup.py
+++ b/setup.py
@@ -28,7 +28,7 @@
include_dirs=[np.get_include()],
define_macros=[("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")],
language="c",
- )
+ ),
]
setup(ext_modules=extensions)
diff --git a/tests/resources/Bach-fugue_bwv_858.match b/tests/resources/Bach-fugue_bwv_858.match
new file mode 100644
index 0000000..13883d5
--- /dev/null
+++ b/tests/resources/Bach-fugue_bwv_858.match
@@ -0,0 +1,1595 @@
+info(matchFileVersion,1.0.0).
+info(piece,-).
+info(scoreFileName,-).
+info(midiFileName,-).
+info(composer,-).
+info(performer,-).
+info(midiClockUnits,480).
+info(midiClockRate,500000).
+scoreprop(keySignature,F#,1:1,0,0.0000).
+scoreprop(timeSignature,4/4,1:1,0,0.0000).
+snote(n10-1,[C,#],5,1:1,1/8,1/8,0.5000,1.0000,[v3,staff1])-note(n0,73,480,1023,43,0,0).
+snote(n11-1,[F,#],5,1:2,0,1/8,1.0000,1.5000,[v3,staff1])-note(n1,78,996,1556,51,0,0).
+snote(n12-1,[E,#],5,1:2,1/8,1/8,1.5000,2.0000,[v3,staff1])-note(n2,77,1536,2100,56,0,0).
+snote(n13-1,[F,#],5,1:3,0,1/8,2.0000,2.5000,[v3,staff1])-note(n3,78,2077,2681,55,0,0).
+snote(n14-1,[E,#],5,1:3,1/8,1/16,2.5000,2.7500,[v3,staff1])-note(n4,77,2590,2837,56,0,0).
+snote(n15-1,[D,#],5,1:3,3/16,1/16,2.7500,3.0000,[v3,staff1])-note(n5,75,2846,3089,55,0,0).
+snote(n1-1,[D,#],5,1:4,0,3/128,3.0000,3.0938,[v2,staff1])-deletion.
+snote(n16-1,[C,#],5,1:4,0,3/16,3.0000,3.7500,[v3,staff1,inverted-mordent])-note(n6,73,3089,3322,58,0,0).
+snote(n2-1,[C,#],5,1:4,3/128,3/128,3.0938,3.1875,[v2,staff1])-deletion.
+snote(n3-1,[D,#],5,1:4,3/64,3/128,3.1875,3.2812,[v2,staff1])-note(n7,75,3345,3458,58,0,0).
+snote(n4-1,[C,#],5,1:4,9/128,3/128,3.2812,3.3750,[v2,staff1])-note(n8,73,3476,3559,61,0,0).
+snote(n5-1,[D,#],5,1:4,3/32,3/128,3.3750,3.4688,[v2,staff1])-deletion.
+snote(n6-1,[C,#],5,1:4,15/128,3/128,3.4688,3.5625,[v2,staff1])-deletion.
+snote(n7-1,[D,#],5,1:4,9/64,3/128,3.5625,3.6562,[v2,staff1])-note(n9,75,3594,3708,54,0,0).
+snote(n8-1,[C,#],5,1:4,21/128,3/128,3.6562,3.7500,[v2,staff1])-note(n10,73,3714,3798,63,0,0).
+snote(n17-1,[B,n],4,1:4,3/16,1/32,3.7500,3.8750,[v3,staff1])-note(n11,71,3830,3915,55,0,0).
+snote(n18-1,[C,#],5,1:4,7/32,1/32,3.8750,4.0000,[v3,staff1])-note(n12,73,3945,4096,57,0,0).
+snote(n20-1,[D,#],5,2:1,0,1/4,4.0000,5.0000,[v3,staff1])-note(n13,75,4125,5181,55,0,0).
+snote(n21-1,[C,#],5,2:2,1/8,1/8,5.5000,6.0000,[v3,staff1])-note(n14,73,5696,6271,61,0,0).
+snote(n22-1,[B,n],4,2:3,0,1/8,6.0000,6.5000,[v3,staff1])-note(n15,71,6232,6809,63,0,0).
+snote(n23-1,[A,#],4,2:3,1/8,1/8,6.5000,7.0000,[v3,staff1])-note(n16,70,6783,7377,63,0,0).
+snote(n24-1,[G,#],4,2:4,0,1/8,7.0000,7.5000,[v3,staff1])-note(n17,68,7325,7910,59,0,0).
+snote(n25-1,[C,#],5,2:4,1/8,1/8,7.5000,8.0000,[v3,staff1])-note(n18,73,7884,8534,50,0,0).
+snote(n27-1,[A,#],4,3:1,0,1/8,8.0000,8.5000,[v1,staff1])-note(n19,70,8440,8931,41,0,0).
+snote(n28-1,[F,#],4,3:1,1/8,1/16,8.5000,8.7500,[v1,staff1])-deletion.
+snote(n42-1,[F,#],4,3:1,1/8,1/8,8.5000,9.0000,[v2,staff1])-note(n20,66,8962,9470,53,0,0).
+snote(n29-1,[F,#],5,3:1,3/16,1/16,8.7500,9.0000,[v1,staff1])-note(n21,78,9198,9474,48,0,0).
+snote(n30-1,[E,#],5,3:2,0,1/16,9.0000,9.2500,[v1,staff1])-note(n23,77,9458,9685,54,0,0).
+snote(n43-1,[C,#],5,3:2,0,1/8,9.0000,9.5000,[v2,staff1])-note(n22,73,9443,9978,58,0,0).
+snote(n31-1,[F,#],5,3:2,1/16,1/16,9.2500,9.5000,[v1,staff1])-note(n24,78,9681,9938,58,0,0).
+snote(n32-1,[G,#],5,3:2,1/8,1/16,9.5000,9.7500,[v1,staff1])-note(n25,80,9940,10266,46,0,0).
+snote(n44-1,[B,#],4,3:2,1/8,1/8,9.5000,10.0000,[v2,staff1])-note(n26,72,9941,10455,60,0,0).
+snote(n33-1,[D,#],5,3:2,3/16,1/16,9.7500,10.0000,[v1,staff1])-note(n27,75,10178,10420,50,0,0).
+snote(n34-1,[E,#],5,3:3,0,1/16,10.0000,10.2500,[v1,staff1])-note(n29,77,10437,10656,56,0,0).
+snote(n45-1,[C,#],5,3:3,0,1/8,10.0000,10.5000,[v2,staff1])-note(n28,73,10433,10940,54,0,0).
+snote(n35-1,[F,#],5,3:3,1/16,1/16,10.2500,10.5000,[v1,staff1])-note(n30,78,10670,10949,58,0,0).
+snote(n36-1,[G,#],5,3:3,1/8,3/16,10.5000,11.2500,[v1,staff1])-note(n32,80,10940,12013,47,0,0).
+snote(n46-1,[B,#],4,3:3,1/8,1/16,10.5000,10.7500,[v2,staff1])-note(n31,72,10918,11157,54,0,0).
+snote(n47-1,[A,#],4,3:3,3/16,1/16,10.7500,11.0000,[v2,staff1])-note(n33,70,11157,11424,58,0,0).
+snote(n48-1,[G,#],4,3:4,0,3/16,11.0000,11.7500,[v2,staff1,inverted-mordent])-note(n34,68,11394,11632,60,0,0).
+snote(n51-1,[A,#],4,3:4,0,3/128,11.0000,11.0938,[v4,staff1])-deletion.
+snote(n52-1,[G,#],4,3:4,3/128,3/128,11.0938,11.1875,[v4,staff1])-deletion.
+snote(n53-1,[A,#],4,3:4,3/64,3/128,11.1875,11.2812,[v4,staff1])-note(n35,70,11651,11763,49,0,0).
+snote(n38-1,[F,#],5,3:4,1/16,1/16,11.2500,11.5000,[v1,staff1])-note(n36,78,11656,11868,55,0,0).
+snote(n54-1,[G,#],4,3:4,9/128,3/128,11.2812,11.3750,[v4,staff1])-deletion.
+snote(n55-1,[A,#],4,3:4,3/32,3/128,11.3750,11.4688,[v4,staff1])-deletion.
+snote(n56-1,[G,#],4,3:4,15/128,3/128,11.4688,11.5625,[v4,staff1])-note(n37,68,11783,11846,65,0,0).
+snote(n39-1,[E,#],5,3:4,1/8,1/16,11.5000,11.7500,[v1,staff1])-note(n38,77,11890,12100,58,0,0).
+snote(n57-1,[A,#],4,3:4,9/64,3/128,11.5625,11.6562,[v4,staff1])-note(n39,70,11907,11960,58,0,0).
+snote(n58-1,[G,#],4,3:4,21/128,3/128,11.6562,11.7500,[v4,staff1])-note(n40,68,11993,12061,62,0,0).
+snote(n40-1,[D,#],5,3:4,3/16,1/16,11.7500,12.0000,[v1,staff1])-note(n42,75,12127,12351,56,0,0).
+snote(n49-1,[F,#],4,3:4,3/16,1/32,11.7500,11.8750,[v2,staff1])-note(n41,66,12118,12255,54,0,0).
+snote(n50-1,[G,#],4,3:4,7/32,1/32,11.8750,12.0000,[v2,staff1])-note(n43,68,12238,12328,48,0,0).
+snote(n60-1,[C,#],5,4:1,0,1/16,12.0000,12.2500,[v1,staff1])-note(n45,73,12366,12631,59,0,0).
+snote(n72-1,[A,#],4,4:1,0,1/4,12.0000,13.0000,[v2,staff1])-note(n44,70,12366,13195,50,0,0).
+snote(n61-1,[D,#],5,4:1,1/16,1/16,12.2500,12.5000,[v1,staff1])-note(n46,75,12625,12846,56,0,0).
+snote(n62-1,[E,#],5,4:1,1/8,1/16,12.5000,12.7500,[v1,staff1])-note(n47,77,12860,13077,61,0,0).
+snote(n63-1,[B,#],4,4:1,3/16,1/16,12.7500,13.0000,[v1,staff1])-note(n48,72,13084,13336,61,0,0).
+snote(n64-1,[C,#],5,4:2,0,1/16,13.0000,13.2500,[v1,staff1])-note(n49,73,13339,13561,61,0,0).
+snote(n65-1,[D,#],5,4:2,1/16,1/16,13.2500,13.5000,[v1,staff1])-note(n50,75,13573,13791,61,0,0).
+snote(n66-1,[E,#],5,4:2,1/8,1/16,13.5000,13.7500,[v1,staff1])-note(n52,77,13815,14117,53,0,0).
+snote(n74-1,[G,#],4,4:2,1/8,1/8,13.5000,14.0000,[v2,staff1])-note(n51,68,13787,14350,67,0,0).
+snote(n67-1,[C,#],5,4:2,3/16,1/16,13.7500,14.0000,[v1,staff1])-note(n53,73,14037,14292,62,0,0).
+snote(n68-1,[A,#],4,4:3,0,1/16,14.0000,14.2500,[v1,staff1])-note(n54,70,14317,14539,59,0,0).
+snote(n75-1,[F,#],4,4:3,0,1/8,14.0000,14.5000,[v2,staff1])-note(n55,66,14320,14829,58,0,0).
+snote(n69-1,[B,#],4,4:3,1/16,1/16,14.2500,14.5000,[v1,staff1])-note(n56,72,14550,14820,63,0,0).
+snote(n70-1,[C,#],5,4:3,1/8,1/4,14.5000,15.5000,[v1,staff1])-note(n57,73,14833,15906,54,0,0).
+snote(n76-1,[E,#],4,4:3,1/8,1/8,14.5000,15.0000,[v2,staff1])-note(n58,65,14837,15333,50,0,0).
+snote(n77-1,[D,#],4,4:4,0,1/8,15.0000,15.5000,[v2,staff1])-note(n59,63,15356,15969,49,0,0).
+snote(n71-1,[B,#],4,4:4,1/8,1/8,15.5000,16.0000,[v1,staff1])-note(n60,72,15892,16420,51,0,0).
+snote(n78-1,[G,#],4,4:4,1/8,1/8,15.5000,16.0000,[v2,staff1])-note(n61,68,15900,16468,50,0,0).
+snote(n80-1,[C,#],5,5:1,0,5/8,16.0000,18.5000,[v1,staff1])-note(n63,73,16473,17680,36,0,0).
+snote(n85-1,[E,#],4,5:1,0,1/8,16.0000,16.5000,[v2,staff1])-note(n62,65,16441,16612,38,0,0).
+snote(n86-1,[C,#],4,5:1,1/8,1/16,16.5000,16.7500,[v2,staff1])-note(n65,61,16942,17219,47,0,0).
+snote(n100-1,[C,#],3,5:1,1/8,1/8,16.5000,17.0000,[v5,staff2])-note(n64,49,16921,17484,57,0,0).
+snote(n87-1,[B,n],4,5:1,3/16,1/16,16.7500,17.0000,[v2,staff1])-note(n66,71,17170,17425,56,0,0).
+snote(n88-1,[A,#],4,5:2,0,1/16,17.0000,17.2500,[v2,staff1])-note(n68,70,17441,17680,56,0,0).
+snote(n101-1,[F,#],3,5:2,0,1/8,17.0000,17.5000,[v5,staff2])-note(n67,54,17418,17954,62,0,0).
+snote(n89-1,[B,n],4,5:2,1/16,1/16,17.2500,17.5000,[v2,staff1])-note(n69,71,17658,17976,60,0,0).
+snote(n90-1,[C,#],5,5:2,1/8,1/16,17.5000,17.7500,[v2,staff1])-note(n71,73,17936,18672,61,0,0).
+snote(n102-1,[E,#],3,5:2,1/8,1/8,17.5000,18.0000,[v5,staff2])-note(n70,53,17924,18446,67,0,0).
+snote(n91-1,[G,#],4,5:2,3/16,1/16,17.7500,18.0000,[v2,staff1])-deletion.
+snote(n92-1,[A,#],4,5:3,0,1/16,18.0000,18.2500,[v2,staff1])-note(n73,70,18426,18630,55,0,0).
+snote(n103-1,[F,#],3,5:3,0,1/8,18.0000,18.5000,[v5,staff2])-note(n72,54,18419,18996,61,0,0).
+snote(n93-1,[B,n],4,5:3,1/16,1/16,18.2500,18.5000,[v2,staff1])-note(n74,71,18666,18945,65,0,0).
+snote(n82-1,[C,#],5,5:3,1/8,1/16,18.5000,18.7500,[v1,staff1])-note(n76,73,18921,19410,64,0,0).
+snote(n94-1,[C,#],5,5:3,1/8,3/16,18.5000,19.2500,[v2,staff1])-deletion.
+snote(n104-1,[E,#],3,5:3,1/8,1/16,18.5000,18.7500,[v5,staff2])-note(n75,53,18916,19164,58,0,0).
+snote(n83-1,[D,#],5,5:3,3/16,1/16,18.7500,19.0000,[v1,staff1])-note(n77,75,19149,19419,65,0,0).
+snote(n105-1,[D,#],3,5:3,3/16,1/16,18.7500,19.0000,[v5,staff2])-note(n78,51,19160,19410,64,0,0).
+snote(n84-1,[E,#],5,5:4,0,1/4,19.0000,20.0000,[v1,staff1])-note(n79,77,19395,19934,71,0,0).
+snote(n106-1,[C,#],3,5:4,0,3/16,19.0000,19.7500,[v5,staff2,inverted-mordent])-note(n80,49,19400,19643,58,0,0).
+snote(n109-1,[D,#],3,5:4,0,3/128,19.0000,19.0938,[v6,staff2])-deletion.
+snote(n110-1,[C,#],3,5:4,3/128,3/128,19.0938,19.1875,[v6,staff2])-deletion.
+snote(n111-1,[D,#],3,5:4,3/64,3/128,19.1875,19.2812,[v6,staff2])-note(n82,51,19664,19776,59,0,0).
+snote(n96-1,[B,n],4,5:4,1/16,1/16,19.2500,19.5000,[v2,staff1])-note(n81,71,19650,19861,66,0,0).
+snote(n112-1,[C,#],3,5:4,9/128,3/128,19.2812,19.3750,[v6,staff2])-deletion.
+snote(n113-1,[D,#],3,5:4,3/32,3/128,19.3750,19.4688,[v6,staff2])-deletion.
+snote(n114-1,[C,#],3,5:4,15/128,3/128,19.4688,19.5625,[v6,staff2])-note(n83,49,19791,19849,63,0,0).
+snote(n97-1,[A,#],4,5:4,1/8,1/16,19.5000,19.7500,[v2,staff1])-note(n84,70,19869,20102,67,0,0).
+snote(n115-1,[D,#],3,5:4,9/64,3/128,19.5625,19.6562,[v6,staff2])-note(n85,51,19914,19963,56,0,0).
+snote(n116-1,[C,#],3,5:4,21/128,3/128,19.6562,19.7500,[v6,staff2])-note(n86,49,19997,20053,59,0,0).
+snote(n98-1,[G,#],4,5:4,3/16,1/16,19.7500,20.0000,[v2,staff1])-note(n87,68,20111,20352,60,0,0).
+snote(n107-1,[B,n],2,5:4,3/16,1/32,19.7500,19.8750,[v5,staff2])-note(n88,47,20118,20250,58,0,0).
+snote(n108-1,[C,#],3,5:4,7/32,1/32,19.8750,20.0000,[v5,staff2])-note(n89,49,20246,20357,54,0,0).
+snote(n117-1,[F,#],5,6:1,0,1/4,20.0000,21.0000,[v1,staff1])-note(n91,78,20364,20877,66,0,0).
+snote(n125-1,[F,#],4,6:1,0,1/16,20.0000,20.2500,[v2,staff1])-note(n92,66,20370,20585,57,0,0).
+snote(n137-1,[D,#],3,6:1,0,1/4,20.0000,21.0000,[v5,staff2])-note(n90,51,20359,21393,63,0,0).
+snote(n126-1,[G,#],4,6:1,1/16,1/16,20.2500,20.5000,[v2,staff1])-note(n93,68,20600,21055,64,0,0).
+snote(n127-1,[A,#],4,6:1,1/8,1/16,20.5000,20.7500,[v2,staff1])-note(n94,70,20852,21040,64,0,0).
+snote(n128-1,[E,#],4,6:1,3/16,1/16,20.7500,21.0000,[v2,staff1])-note(n95,65,21087,21353,59,0,0).
+snote(n129-1,[F,#],4,6:2,0,1/16,21.0000,21.2500,[v2,staff1])-note(n96,66,21342,21583,60,0,0).
+snote(n130-1,[G,#],4,6:2,1/16,1/16,21.2500,21.5000,[v2,staff1])-note(n97,68,21567,21825,64,0,0).
+snote(n119-1,[A,#],4,6:2,1/8,1/8,21.5000,22.0000,[v1,staff1])-deletion.
+snote(n131-1,[A,#],4,6:2,1/8,1/16,21.5000,21.7500,[v2,staff1])-note(n99,70,21832,22185,68,0,0).
+snote(n139-1,[C,#],3,6:2,1/8,1/8,21.5000,22.0000,[v5,staff2])-note(n98,49,21823,22378,62,0,0).
+snote(n132-1,[F,#],4,6:2,3/16,1/16,21.7500,22.0000,[v2,staff1])-note(n100,66,22059,22323,63,0,0).
+snote(n120-1,[G,#],4,6:3,0,1/8,22.0000,22.5000,[v1,staff1])-note(n101,68,22316,22726,70,0,0).
+snote(n133-1,[D,#],4,6:3,0,1/16,22.0000,22.2500,[v2,staff1])-note(n103,63,22340,22512,51,0,0).
+snote(n140-1,[B,n],2,6:3,0,1/8,22.0000,22.5000,[v5,staff2])-note(n102,47,22331,22903,55,0,0).
+snote(n134-1,[E,#],4,6:3,1/16,1/16,22.2500,22.5000,[v2,staff1])-note(n104,65,22559,22783,56,0,0).
+snote(n121-1,[A,#],4,6:3,1/8,1/8,22.5000,23.0000,[v1,staff1])-note(n105,70,22833,23423,58,0,0).
+snote(n135-1,[F,#],4,6:3,1/8,1/4,22.5000,23.5000,[v2,staff1])-note(n107,66,22849,23405,46,0,0).
+snote(n141-1,[A,#],2,6:3,1/8,1/8,22.5000,23.0000,[v5,staff2])-note(n106,46,22840,23325,50,0,0).
+snote(n122-1,[B,n],4,6:4,0,1/8,23.0000,23.5000,[v1,staff1])-note(n109,71,23370,23913,51,0,0).
+snote(n142-1,[G,#],2,6:4,0,1/8,23.0000,23.5000,[v5,staff2])-note(n108,44,23364,23896,43,0,0).
+snote(n123-1,[A,#],4,6:4,1/8,1/16,23.5000,23.7500,[v1,staff1])-note(n110,70,23881,24118,49,0,0).
+snote(n136-1,[E,#],4,6:4,1/8,1/8,23.5000,24.0000,[v2,staff1])-note(n112,65,23905,24042,33,0,0).
+snote(n143-1,[C,#],3,6:4,1/8,1/8,23.5000,24.0000,[v5,staff2])-note(n111,49,23892,24352,39,0,0).
+snote(n124-1,[G,#],4,6:4,3/16,1/16,23.7500,24.0000,[v1,staff1])-note(n113,68,24123,24354,49,0,0).
+snote(n144-1,[A,#],4,7:1,0,1/16,24.0000,24.2500,[v1,staff1])-note(n116,70,24383,24625,51,0,0).
+snote(n155-1,[F,#],4,7:1,0,1/4,24.0000,25.0000,[v2,staff1])-note(n115,66,24381,25146,43,0,0).
+snote(n160-1,[F,#],2,7:1,0,1/8,24.0000,24.5000,[v5,staff2])-note(n114,42,24381,24728,32,0,0).
+snote(n145-1,[C,#],5,7:1,1/16,1/16,24.2500,24.5000,[v1,staff1])-note(n117,73,24600,24642,54,0,0).
+snote(n146-1,[C,#],5,7:1,1/8,1/16,24.5000,24.7500,[v1,staff1])-note(n119,73,24881,25150,63,0,0).
+snote(n161-1,[F,#],3,7:1,1/8,1/8,24.5000,25.0000,[v5,staff2])-note(n118,54,24876,25155,42,0,0).
+snote(n147-1,[A,#],4,7:1,3/16,1/16,24.7500,25.0000,[v1,staff1])-note(n120,70,25106,25162,53,0,0).
+snote(n148-1,[G,#],4,7:2,0,1/16,25.0000,25.2500,[v1,staff1])-note(n122,68,25377,25607,59,0,0).
+snote(n162-1,[E,#],3,7:2,0,1/8,25.0000,25.5000,[v5,staff2])-note(n121,53,25354,25670,47,0,0).
+snote(n149-1,[C,#],5,7:2,1/16,1/16,25.2500,25.5000,[v1,staff1])-note(n123,73,25591,25642,59,0,0).
+snote(n150-1,[C,#],5,7:2,1/8,1/16,25.5000,25.7500,[v1,staff1])-note(n124,73,25847,26085,61,0,0).
+snote(n156-1,[E,#],4,7:2,1/8,1/8,25.5000,26.0000,[v2,staff1])-note(n126,65,25883,26071,34,0,0).
+snote(n163-1,[C,#],3,7:2,1/8,1/8,25.5000,26.0000,[v5,staff2])-note(n125,49,25859,26163,36,0,0).
+snote(n151-1,[G,#],4,7:2,3/16,1/16,25.7500,26.0000,[v1,staff1])-note(n127,68,26071,26114,55,0,0).
+snote(n152-1,[A,#],4,7:3,0,1/8,26.0000,26.5000,[v1,staff1])-note(n128,70,26326,26909,60,0,0).
+snote(n157-1,[F,#],4,7:3,0,1/4,26.0000,27.0000,[v2,staff1])-note(n129,66,26339,27658,49,0,0).
+snote(n164-1,[F,#],3,7:3,0,1/16,26.0000,26.2500,[v5,staff2])-note(n130,54,26346,26586,43,0,0).
+snote(n165-1,[A,#],3,7:3,1/16,1/16,26.2500,26.5000,[v5,staff2])-note(n131,58,26577,26632,46,0,0).
+snote(n153-1,[C,#],5,7:3,1/8,1/8,26.5000,27.0000,[v1,staff1])-note(n133,73,26808,27795,76,0,0).
+snote(n166-1,[A,#],3,7:3,1/8,1/16,26.5000,26.7500,[v5,staff2])-note(n132,58,26808,27040,44,0,0).
+snote(n167-1,[F,#],3,7:3,3/16,1/16,26.7500,27.0000,[v5,staff2])-note(n134,54,27038,27123,53,0,0).
+snote(n154-1,[F,#],5,7:4,0,3/8,27.0000,28.5000,[v1,staff1])-note(n135,78,27288,28424,80,0,0).
+snote(n168-1,[D,#],3,7:4,0,1/16,27.0000,27.2500,[v5,staff2])-note(n136,51,27297,27605,55,0,0).
+snote(n169-1,[F,#],3,7:4,1/16,1/16,27.2500,27.5000,[v5,staff2])-note(n137,54,27516,27589,52,0,0).
+snote(n159-1,[A,#],4,7:4,1/8,1/8,27.5000,28.0000,[v2,staff1])-note(n139,70,27786,27990,57,0,0).
+snote(n170-1,[F,#],3,7:4,1/8,1/16,27.5000,27.7500,[v5,staff2])-note(n138,54,27759,28046,47,0,0).
+snote(n171-1,[D,#],3,7:4,3/16,1/16,27.7500,28.0000,[v5,staff2])-note(n140,51,27999,28156,54,0,0).
+snote(n179-1,[D,#],5,8:1,0,1/16,28.0000,28.2500,[v2,staff1])-note(n141,75,28232,28521,60,0,0).
+snote(n190-1,[B,#],2,8:1,0,1/8,28.0000,28.5000,[v5,staff2])-note(n142,48,28238,28739,42,0,0).
+snote(n180-1,[G,#],4,8:1,1/16,1/16,28.2500,28.5000,[v2,staff1])-note(n143,68,28448,28490,58,0,0).
+snote(n173-1,[E,#],5,8:1,1/8,1/4,28.5000,29.5000,[v1,staff1])-note(n144,77,28699,29433,72,0,0).
+snote(n181-1,[G,#],4,8:1,1/8,1/16,28.5000,28.7500,[v2,staff1])-note(n146,68,28728,28924,46,0,0).
+snote(n191-1,[C,#],3,8:1,1/8,1/8,28.5000,29.0000,[v5,staff2])-note(n145,49,28722,29387,43,0,0).
+snote(n182-1,[C,#],5,8:1,3/16,1/16,28.7500,29.0000,[v2,staff1])-note(n147,73,28913,28961,61,0,0).
+snote(n183-1,[A,#],4,8:2,0,1/16,29.0000,29.2500,[v2,staff1])-note(n149,70,29195,29463,59,0,0).
+snote(n192-1,[F,#],3,8:2,0,5/16,29.0000,30.2500,[v5,staff2])-note(n148,54,29195,30315,46,0,0).
+snote(n184-1,[F,#],4,8:2,1/16,1/16,29.2500,29.5000,[v2,staff1])-note(n150,66,29424,29463,54,0,0).
+snote(n174-1,[D,#],5,8:2,1/8,1/16,29.5000,29.7500,[v1,staff1])-note(n151,75,29675,30007,64,0,0).
+snote(n185-1,[F,#],4,8:2,1/8,1/16,29.5000,29.7500,[v2,staff1])-note(n152,66,29691,29910,57,0,0).
+snote(n175-1,[C,#],5,8:2,3/16,1/16,29.7500,30.0000,[v1,staff1])-note(n153,73,29901,30165,71,0,0).
+snote(n186-1,[A,#],4,8:2,3/16,1/16,29.7500,30.0000,[v2,staff1])-note(n154,70,29943,30007,45,0,0).
+snote(n176-1,[B,#],4,8:3,0,1/8,30.0000,30.5000,[v1,staff1])-note(n155,72,30161,30650,68,0,0).
+snote(n187-1,[G,#],4,8:3,0,1/4,30.0000,31.0000,[v2,staff1])-note(n156,68,30191,31688,53,0,0).
+snote(n194-1,[G,#],3,8:3,1/16,1/16,30.2500,30.5000,[v5,staff2])-note(n157,56,30386,30445,56,0,0).
+snote(n177-1,[D,#],5,8:3,1/8,1/8,30.5000,31.0000,[v1,staff1])-note(n158,75,30620,31127,74,0,0).
+snote(n195-1,[B,#],3,8:3,1/8,1/16,30.5000,30.7500,[v5,staff2])-note(n159,60,30646,30888,55,0,0).
+snote(n196-1,[G,#],3,8:3,3/16,1/16,30.7500,31.0000,[v5,staff2])-note(n160,56,30868,30913,57,0,0).
+snote(n178-1,[G,#],5,8:4,0,3/8,31.0000,32.5000,[v1,staff1])-note(n161,80,31098,32764,81,0,0).
+snote(n197-1,[E,#],3,8:4,0,1/16,31.0000,31.2500,[v5,staff2])-note(n162,53,31127,31403,52,0,0).
+snote(n198-1,[G,#],3,8:4,1/16,1/16,31.2500,31.5000,[v5,staff2])-note(n163,56,31358,31413,50,0,0).
+snote(n189-1,[B,#],4,8:4,1/8,1/8,31.5000,32.0000,[v2,staff1])-note(n164,72,31585,31888,75,0,0).
+snote(n199-1,[G,#],3,8:4,1/8,1/16,31.5000,31.7500,[v5,staff2])-note(n165,56,31607,31817,49,0,0).
+snote(n200-1,[E,#],3,8:4,3/16,1/16,31.7500,32.0000,[v5,staff2])-note(n166,53,31824,31879,57,0,0).
+snote(n209-1,[A,#],4,9:1,0,1/4,32.0000,33.0000,[v2,staff1])-note(n168,70,32075,32979,63,0,0).
+snote(n215-1,[C,x],3,9:1,0,1/16,32.0000,32.2500,[v5,staff2])-note(n167,50,32073,32385,48,0,0).
+snote(n216-1,[A,#],3,9:1,1/16,1/16,32.2500,32.5000,[v5,staff2])-note(n169,58,32310,32379,52,0,0).
+snote(n202-1,[F,#],5,9:1,1/8,1/16,32.5000,32.7500,[v1,staff1])-note(n171,78,32568,32764,69,0,0).
+snote(n217-1,[A,#],3,9:1,1/8,1/16,32.5000,32.7500,[v5,staff2])-note(n170,58,32563,32808,45,0,0).
+snote(n203-1,[E,#],5,9:1,3/16,1/16,32.7500,33.0000,[v1,staff1])-note(n172,77,32775,33064,73,0,0).
+snote(n218-1,[F,#],3,9:1,3/16,1/16,32.7500,33.0000,[v5,staff2])-note(n173,54,32808,32974,49,0,0).
+snote(n204-1,[F,#],5,9:2,0,3/8,33.0000,34.5000,[v1,staff1])-note(n175,78,33046,34488,72,0,0).
+snote(n219-1,[D,#],3,9:2,0,1/16,33.0000,33.2500,[v5,staff2])-note(n174,51,33041,33342,53,0,0).
+snote(n220-1,[F,#],3,9:2,1/16,1/16,33.2500,33.5000,[v5,staff2])-note(n176,54,33282,33333,53,0,0).
+snote(n211-1,[A,#],4,9:2,1/8,1/8,33.5000,34.0000,[v2,staff1])-note(n178,70,33533,33857,61,0,0).
+snote(n221-1,[F,#],3,9:2,1/8,1/16,33.5000,33.7500,[v5,staff2])-note(n177,54,33524,33775,44,0,0).
+snote(n222-1,[D,#],3,9:2,3/16,1/16,33.7500,34.0000,[v5,staff2])-note(n179,51,33747,33802,62,0,0).
+snote(n212-1,[G,#],4,9:3,0,1/4,34.0000,35.0000,[v2,staff1])-note(n181,68,34001,34850,61,0,0).
+snote(n223-1,[B,#],2,9:3,0,1/16,34.0000,34.2500,[v5,staff2])-note(n180,48,33989,34293,47,0,0).
+snote(n224-1,[G,#],3,9:3,1/16,1/16,34.2500,34.5000,[v5,staff2])-note(n182,56,34216,34290,52,0,0).
+snote(n206-1,[E,#],5,9:3,1/8,1/16,34.5000,34.7500,[v1,staff1])-note(n184,77,34469,34670,70,0,0).
+snote(n225-1,[G,#],3,9:3,1/8,1/16,34.5000,34.7500,[v5,staff2])-note(n183,56,34463,34655,53,0,0).
+snote(n207-1,[D,#],5,9:3,3/16,1/16,34.7500,35.0000,[v1,staff1])-note(n185,75,34684,34970,61,0,0).
+snote(n226-1,[E,#],3,9:3,3/16,1/16,34.7500,35.0000,[v5,staff2])-note(n186,53,34694,34826,52,0,0).
+snote(n208-1,[E,#],5,9:4,0,3/8,35.0000,36.5000,[v1,staff1])-note(n188,77,34943,35760,68,0,0).
+snote(n227-1,[C,#],3,9:4,0,1/16,35.0000,35.2500,[v5,staff2])-note(n187,49,34934,35222,46,0,0).
+snote(n228-1,[E,#],3,9:4,1/16,1/16,35.2500,35.5000,[v5,staff2])-note(n189,53,35157,35217,58,0,0).
+snote(n214-1,[G,#],4,9:4,1/8,1/8,35.5000,36.0000,[v2,staff1])-note(n191,68,35415,35810,64,0,0).
+snote(n229-1,[E,#],3,9:4,1/8,1/16,35.5000,35.7500,[v5,staff2])-note(n190,53,35402,35642,45,0,0).
+snote(n230-1,[C,#],3,9:4,3/16,1/16,35.7500,36.0000,[v5,staff2])-note(n192,49,35623,35693,55,0,0).
+snote(n238-1,[F,#],4,10:1,0,5/16,36.0000,37.2500,[v2,staff1])-note(n193,66,35874,36834,64,0,0).
+snote(n246-1,[A,#],2,10:1,0,1/16,36.0000,36.2500,[v5,staff2])-note(n194,46,35879,36137,42,0,0).
+snote(n247-1,[C,#],3,10:1,1/16,1/16,36.2500,36.5000,[v5,staff2])-note(n195,49,36089,36160,51,0,0).
+snote(n232-1,[E,#],5,10:1,1/8,1/8,36.5000,37.0000,[v1,staff1])-note(n196,77,36327,37035,76,0,0).
+snote(n248-1,[C,#],3,10:1,1/8,1/16,36.5000,36.7500,[v5,staff2])-note(n197,49,36334,36500,51,0,0).
+snote(n249-1,[A,#],2,10:1,3/16,1/16,36.7500,37.0000,[v5,staff2])-note(n198,46,36563,36634,51,0,0).
+snote(n233-1,[D,#],5,10:2,0,1/8,37.0000,37.5000,[v1,staff1])-note(n200,75,36841,37059,67,0,0).
+snote(n250-1,[F,#],2,10:2,0,1/8,37.0000,37.5000,[v5,staff2])-note(n199,42,36828,37054,50,0,0).
+snote(n240-1,[G,#],4,10:2,1/16,1/16,37.2500,37.5000,[v2,staff1])-note(n201,68,37068,37285,62,0,0).
+snote(n234-1,[C,#],5,10:2,1/8,1/8,37.5000,38.0000,[v1,staff1])-note(n203,73,37311,37915,67,0,0).
+snote(n241-1,[A,#],4,10:2,1/8,1/16,37.5000,37.7500,[v2,staff1])-note(n204,70,37333,37531,46,0,0).
+snote(n251-1,[F,#],3,10:2,1/8,3/16,37.5000,38.2500,[v5,staff2])-note(n202,54,37298,37897,57,0,0).
+snote(n242-1,[F,#],4,10:2,3/16,1/16,37.7500,38.0000,[v2,staff1])-note(n205,66,37531,37801,54,0,0).
+snote(n235-1,[B,#],4,10:3,0,1/8,38.0000,38.5000,[v1,staff1])-note(n206,72,37784,38340,67,0,0).
+snote(n243-1,[D,#],4,10:3,0,1/4,38.0000,39.0000,[v2,staff1])-note(n207,63,37801,39741,51,0,0).
+snote(n253-1,[F,#],3,10:3,1/16,1/16,38.2500,38.5000,[v5,staff2])-note(n208,54,38026,38250,52,0,0).
+snote(n236-1,[G,#],4,10:3,1/8,1/8,38.5000,39.0000,[v1,staff1])-note(n209,68,38286,38817,64,0,0).
+snote(n254-1,[E,#],3,10:3,1/8,1/16,38.5000,38.7500,[v5,staff2])-note(n210,53,38289,38492,54,0,0).
+snote(n255-1,[D,#],3,10:3,3/16,1/16,38.7500,39.0000,[v5,staff2])-note(n211,51,38509,38741,50,0,0).
+snote(n237-1,[C,#],5,10:4,0,9/16,39.0000,41.2500,[v1,staff1])-note(n212,73,38754,40661,61,0,0).
+snote(n256-1,[C,#],3,10:4,0,1/16,39.0000,39.2500,[v5,staff2])-note(n213,49,38761,39026,39,0,0).
+snote(n257-1,[D,#],3,10:4,1/16,1/16,39.2500,39.5000,[v5,staff2])-note(n214,51,38997,39181,44,0,0).
+snote(n245-1,[G,#],4,10:4,1/8,1/8,39.5000,40.0000,[v2,staff1])-note(n215,68,39228,39738,58,0,0).
+snote(n258-1,[E,#],3,10:4,1/8,1/16,39.5000,39.7500,[v5,staff2])-note(n216,53,39242,39466,48,0,0).
+snote(n259-1,[C,#],3,10:4,3/16,1/16,39.7500,40.0000,[v5,staff2])-note(n217,49,39451,39662,51,0,0).
+snote(n268-1,[F,#],4,11:1,0,1/8,40.0000,40.5000,[v2,staff1])-note(n219,66,39708,40137,51,0,0).
+snote(n280-1,[A,#],2,11:1,0,1/16,40.0000,40.2500,[v5,staff2])-note(n218,46,39695,39937,39,0,0).
+snote(n281-1,[B,#],2,11:1,1/16,1/16,40.2500,40.5000,[v5,staff2])-note(n220,48,39925,40088,46,0,0).
+snote(n269-1,[E,#],4,11:1,1/8,1/8,40.5000,41.0000,[v2,staff1])-note(n222,65,40161,40629,53,0,0).
+snote(n282-1,[C,#],3,11:1,1/8,1/16,40.5000,40.7500,[v5,staff2])-note(n221,49,40161,40397,41,0,0).
+snote(n283-1,[A,#],2,11:1,3/16,1/16,40.7500,41.0000,[v5,staff2])-note(n223,46,40375,40610,45,0,0).
+snote(n270-1,[D,#],4,11:2,0,1/8,41.0000,41.5000,[v2,staff1])-note(n225,63,40650,40887,51,0,0).
+snote(n284-1,[F,#],2,11:2,0,1/8,41.0000,41.5000,[v5,staff2])-note(n224,42,40638,41131,38,0,0).
+snote(n262-1,[C,#],5,11:2,1/16,1/8,41.2500,41.7500,[v1,staff1])-note(n226,73,40887,41287,55,0,0).
+snote(n271-1,[D,#],4,11:2,1/8,1/8,41.5000,42.0000,[v2,staff1])-note(n228,63,41141,41382,46,0,0).
+snote(n285-1,[G,#],2,11:2,1/8,1/8,41.5000,42.0000,[v5,staff2])-note(n227,44,41139,41669,42,0,0).
+snote(n263-1,[B,#],4,11:2,3/16,1/16,41.7500,42.0000,[v1,staff1])-note(n229,72,41360,41627,52,0,0).
+snote(n264-1,[C,#],5,11:3,0,1/8,42.0000,42.5000,[v1,staff1])-note(n230,73,41639,41906,54,0,0).
+snote(n272-1,[E,#],4,11:3,0,1/16,42.0000,42.2500,[v2,staff1])-note(n232,65,41683,41955,34,0,0).
+snote(n286-1,[C,#],2,11:3,0,1/4,42.0000,43.0000,[v5,staff2])-note(n231,37,41658,42097,29,0,0).
+snote(n273-1,[G,#],4,11:3,1/16,1/16,42.2500,42.5000,[v2,staff1])-note(n233,68,41901,42164,47,0,0).
+snote(n265-1,[C,#],5,11:3,1/8,1/8,42.5000,43.0000,[v1,staff1])-note(n234,73,42129,42618,65,0,0).
+snote(n274-1,[C,#],5,11:3,1/8,1/16,42.5000,42.7500,[v2,staff1])-deletion.
+snote(n275-1,[B,n],4,11:3,3/16,1/16,42.7500,43.0000,[v2,staff1])-note(n235,71,42371,42610,55,0,0).
+snote(n266-1,[F,#],5,11:4,0,1/8,43.0000,43.5000,[v1,staff1])-note(n236,78,42610,42978,65,0,0).
+snote(n276-1,[A,#],4,11:4,0,1/16,43.0000,43.2500,[v2,staff1])-note(n237,70,42641,42777,50,0,0).
+snote(n277-1,[B,n],4,11:4,1/16,1/16,43.2500,43.5000,[v2,staff1])-note(n238,71,42856,43002,48,0,0).
+snote(n267-1,[E,#],5,11:4,1/8,1/8,43.5000,44.0000,[v1,staff1])-note(n239,77,43102,43493,61,0,0).
+snote(n278-1,[C,#],5,11:4,1/8,1/16,43.5000,43.7500,[v2,staff1])-note(n240,73,43111,43294,48,0,0).
+snote(n279-1,[G,#],4,11:4,3/16,1/16,43.7500,44.0000,[v2,staff1])-note(n241,68,43343,43595,54,0,0).
+snote(n288-1,[F,#],5,12:1,0,1/8,44.0000,44.5000,[v1,staff1])-note(n242,78,43582,43868,59,0,0).
+snote(n295-1,[A,#],4,12:1,0,1/16,44.0000,44.2500,[v2,staff1])-note(n243,70,43614,43750,48,0,0).
+snote(n296-1,[B,n],4,12:1,1/16,1/16,44.2500,44.5000,[v2,staff1])-note(n244,71,43834,43939,45,0,0).
+snote(n289-1,[E,#],5,12:1,1/8,1/16,44.5000,44.7500,[v1,staff1])-note(n245,77,44054,44329,66,0,0).
+snote(n297-1,[C,#],5,12:1,1/8,3/16,44.5000,45.2500,[v2,staff1])-note(n247,73,44092,44321,46,0,0).
+snote(n311-1,[F,#],3,12:1,1/8,1/16,44.5000,44.7500,[v5,staff2])-note(n246,54,44067,44329,39,0,0).
+snote(n290-1,[D,#],5,12:1,3/16,1/16,44.7500,45.0000,[v1,staff1])-note(n248,75,44288,44545,63,0,0).
+snote(n312-1,[G,#],3,12:1,3/16,1/16,44.7500,45.0000,[v5,staff2])-note(n249,56,44296,44370,46,0,0).
+snote(n291-1,[C,#],5,12:2,0,1/4,45.0000,46.0000,[v1,staff1])-note(n250,73,44550,45275,68,0,0).
+snote(n313-1,[A,#],3,12:2,0,1/16,45.0000,45.2500,[v5,staff2])-note(n251,58,44567,44753,49,0,0).
+snote(n299-1,[B,n],4,12:2,1/16,1/16,45.2500,45.5000,[v2,staff1])-note(n253,71,44784,44984,52,0,0).
+snote(n314-1,[F,#],3,12:2,1/16,1/16,45.2500,45.5000,[v5,staff2])-note(n252,54,44774,44830,55,0,0).
+snote(n300-1,[A,#],4,12:2,1/8,1/16,45.5000,45.7500,[v2,staff1])-note(n255,70,45039,45330,49,0,0).
+snote(n315-1,[F,#],3,12:2,1/8,1/16,45.5000,45.7500,[v5,staff2])-note(n254,54,45039,45265,46,0,0).
+snote(n301-1,[G,#],4,12:2,3/16,1/16,45.7500,46.0000,[v2,staff1])-note(n256,68,45254,45507,53,0,0).
+snote(n316-1,[A,#],3,12:2,3/16,1/16,45.7500,46.0000,[v5,staff2])-note(n257,58,45259,45308,48,0,0).
+snote(n292-1,[D,#],5,12:3,0,1/4,46.0000,47.0000,[v1,staff1])-note(n258,75,45507,46406,60,0,0).
+snote(n302-1,[F,#],4,12:3,0,1/16,46.0000,46.2500,[v2,staff1])-note(n259,66,45528,45728,51,0,0).
+snote(n317-1,[B,n],3,12:3,0,1/16,46.0000,46.2500,[v5,staff2])-note(n260,59,45535,45759,50,0,0).
+snote(n303-1,[G,#],4,12:3,1/16,1/16,46.2500,46.5000,[v2,staff1])-note(n262,68,45755,46086,57,0,0).
+snote(n318-1,[F,#],3,12:3,1/16,1/16,46.2500,46.5000,[v5,staff2])-note(n261,54,45748,45797,47,0,0).
+snote(n304-1,[A,#],4,12:3,1/8,1/16,46.5000,46.7500,[v2,staff1])-note(n263,70,45991,46512,53,0,0).
+snote(n319-1,[F,#],3,12:3,1/8,1/16,46.5000,46.7500,[v5,staff2])-note(n264,54,46010,46260,46,0,0).
+snote(n305-1,[E,#],4,12:3,3/16,1/16,46.7500,47.0000,[v2,staff1])-note(n266,65,46230,46659,51,0,0).
+snote(n320-1,[B,n],3,12:3,3/16,1/16,46.7500,47.0000,[v5,staff2])-note(n265,59,46217,46291,55,0,0).
+snote(n306-1,[F,#],4,12:4,0,1/16,47.0000,47.2500,[v2,staff1])-note(n267,66,46478,46830,58,0,0).
+snote(n321-1,[C,#],4,12:4,0,1/16,47.0000,47.2500,[v5,staff2])-note(n268,61,46486,46743,54,0,0).
+snote(n307-1,[G,#],4,12:4,1/16,1/16,47.2500,47.5000,[v2,staff1])-note(n270,68,46716,46809,59,0,0).
+snote(n322-1,[F,#],3,12:4,1/16,1/16,47.2500,47.5000,[v5,staff2])-note(n269,54,46697,46753,49,0,0).
+snote(n294-1,[C,#],5,12:4,1/8,1/8,47.5000,48.0000,[v1,staff1])-note(n271,73,46943,47285,69,0,0).
+snote(n308-1,[A,#],4,12:4,1/8,1/16,47.5000,47.7500,[v2,staff1])-note(n272,70,46962,47345,57,0,0).
+snote(n323-1,[F,#],3,12:4,1/8,1/16,47.5000,47.7500,[v5,staff2])-note(n273,54,46971,47281,52,0,0).
+snote(n309-1,[E,#],4,12:4,3/16,1/16,47.7500,48.0000,[v2,staff1])-note(n275,65,47195,47386,48,0,0).
+snote(n324-1,[C,#],4,12:4,3/16,1/16,47.7500,48.0000,[v5,staff2])-note(n274,61,47195,47333,47,0,0).
+snote(n325-1,[B,n],4,13:1,0,1/8,48.0000,48.5000,[v1,staff1])-note(n276,71,47438,48083,73,0,0).
+snote(n333-1,[F,#],4,13:1,0,1/4,48.0000,49.0000,[v2,staff1])-note(n278,66,47469,48281,50,0,0).
+snote(n338-1,[D,#],4,13:1,0,1/16,48.0000,48.2500,[v5,staff2])-note(n277,63,47465,47631,53,0,0).
+snote(n339-1,[F,#],3,13:1,1/16,1/16,48.2500,48.5000,[v5,staff2])-note(n279,54,47672,47732,52,0,0).
+snote(n326-1,[A,#],4,13:1,1/8,1/8,48.5000,49.0000,[v1,staff1])-note(n280,70,47932,48508,65,0,0).
+snote(n340-1,[F,#],3,13:1,1/8,1/16,48.5000,48.7500,[v5,staff2])-note(n281,54,47947,48205,55,0,0).
+snote(n341-1,[D,#],4,13:1,3/16,1/16,48.7500,49.0000,[v5,staff2])-note(n282,63,48162,48218,56,0,0).
+snote(n327-1,[G,#],4,13:2,0,1/8,49.0000,49.5000,[v1,staff1])-note(n284,68,48418,49373,63,0,0).
+snote(n334-1,[G,#],4,13:2,0,3/8,49.0000,50.5000,[v2,staff1])-deletion.
+snote(n342-1,[E,#],4,13:2,0,1/16,49.0000,49.2500,[v5,staff2])-note(n283,65,48418,48631,49,0,0).
+snote(n343-1,[F,#],3,13:2,1/16,1/16,49.2500,49.5000,[v5,staff2])-note(n285,54,48651,48711,53,0,0).
+snote(n328-1,[C,#],5,13:2,1/8,1/8,49.5000,50.0000,[v1,staff1])-note(n287,73,48913,49176,57,0,0).
+snote(n344-1,[F,#],3,13:2,1/8,1/16,49.5000,49.7500,[v5,staff2])-note(n286,54,48888,49086,49,0,0).
+snote(n345-1,[E,#],4,13:2,3/16,1/16,49.7500,50.0000,[v5,staff2])-note(n288,65,49148,49373,44,0,0).
+snote(n329-1,[A,#],4,13:3,0,1/8,50.0000,50.5000,[v1,staff1])-note(n289,70,49395,49727,52,0,0).
+snote(n346-1,[F,#],4,13:3,0,1/16,50.0000,50.2500,[v5,staff2])-note(n290,66,49399,49562,43,0,0).
+snote(n347-1,[E,#],4,13:3,1/16,1/16,50.2500,50.5000,[v5,staff2])-note(n291,65,49633,49842,42,0,0).
+snote(n330-1,[A,#],4,13:3,1/8,1/8,50.5000,51.0000,[v1,staff1])-note(n292,70,49880,50396,53,0,0).
+snote(n336-1,[F,#],4,13:3,1/8,1/8,50.5000,51.0000,[v2,staff1])-note(n294,66,49905,50376,40,0,0).
+snote(n348-1,[D,#],4,13:3,1/8,1/16,50.5000,50.7500,[v5,staff2])-note(n293,63,49882,50091,47,0,0).
+snote(n349-1,[C,#],4,13:3,3/16,1/16,50.7500,51.0000,[v5,staff2])-note(n295,61,50122,50310,41,0,0).
+snote(n331-1,[D,#],5,13:4,0,1/8,51.0000,51.5000,[v1,staff1])-note(n296,75,50371,50873,52,0,0).
+snote(n350-1,[B,n],3,13:4,0,1/16,51.0000,51.2500,[v5,staff2])-note(n297,59,50387,50695,44,0,0).
+snote(n351-1,[G,#],4,13:4,1/16,1/16,51.2500,51.5000,[v5,staff2])-note(n298,68,50608,50673,57,0,0).
+snote(n332-1,[C,x],5,13:4,1/8,1/8,51.5000,52.0000,[v1,staff1])-note(n300,74,50875,51354,62,0,0).
+snote(n352-1,[G,#],4,13:4,1/8,1/16,51.5000,51.7500,[v5,staff2])-note(n299,68,50865,51102,53,0,0).
+snote(n353-1,[B,n],3,13:4,3/16,1/16,51.7500,52.0000,[v5,staff2])-note(n301,59,51091,51173,56,0,0).
+snote(n354-1,[D,#],5,14:1,0,1/4,52.0000,53.0000,[v1,staff1])-note(n302,75,51344,51932,60,0,0).
+snote(n368-1,[A,#],3,14:1,0,1/16,52.0000,52.2500,[v5,staff2])-note(n303,58,51348,51615,48,0,0).
+snote(n369-1,[F,#],4,14:1,1/16,1/16,52.2500,52.5000,[v5,staff2])-note(n304,66,51577,51628,53,0,0).
+snote(n361-1,[A,#],4,14:1,1/8,1/8,52.5000,53.0000,[v2,staff1])-note(n306,70,51837,52362,61,0,0).
+snote(n370-1,[F,#],4,14:1,1/8,1/16,52.5000,52.7500,[v5,staff2])-note(n305,66,51837,52065,55,0,0).
+snote(n371-1,[A,#],3,14:1,3/16,1/16,52.7500,53.0000,[v5,staff2])-note(n307,58,52054,52103,54,0,0).
+snote(n362-1,[D,#],5,14:2,0,1/8,53.0000,53.5000,[v2,staff1])-note(n309,75,52316,52922,60,0,0).
+snote(n372-1,[G,#],3,14:2,0,1/16,53.0000,53.2500,[v5,staff2])-note(n308,56,52305,52569,52,0,0).
+snote(n373-1,[E,#],4,14:2,1/16,1/16,53.2500,53.5000,[v5,staff2])-note(n310,65,52546,52596,56,0,0).
+snote(n355-1,[E,#],5,14:2,1/8,1/8,53.5000,54.0000,[v1,staff1])-note(n311,77,52776,53103,71,0,0).
+snote(n363-1,[C,x],5,14:2,1/8,1/8,53.5000,54.0000,[v2,staff1])-note(n313,74,52807,53200,52,0,0).
+snote(n374-1,[E,#],4,14:2,1/8,1/16,53.5000,53.7500,[v5,staff2])-note(n312,65,52789,52966,56,0,0).
+snote(n375-1,[G,#],3,14:2,3/16,1/16,53.7500,54.0000,[v5,staff2])-note(n314,56,53018,53278,56,0,0).
+snote(n356-1,[F,#],5,14:3,0,1/8,54.0000,54.5000,[v1,staff1])-note(n315,78,53256,53810,69,0,0).
+snote(n364-1,[D,#],5,14:3,0,1/8,54.0000,54.5000,[v2,staff1])-note(n316,75,53273,53514,53,0,0).
+snote(n376-1,[F,#],3,14:3,0,1/16,54.0000,54.2500,[v5,staff2])-note(n317,54,53278,53465,52,0,0).
+snote(n377-1,[G,#],3,14:3,1/16,1/16,54.2500,54.5000,[v5,staff2])-note(n318,56,53491,53772,51,0,0).
+snote(n357-1,[G,#],5,14:3,1/8,1/8,54.5000,55.0000,[v1,staff1])-note(n319,80,53736,54077,68,0,0).
+snote(n365-1,[E,#],5,14:3,1/8,1/8,54.5000,55.0000,[v2,staff1])-note(n321,77,53763,54112,61,0,0).
+snote(n378-1,[F,#],3,14:3,1/8,1/16,54.5000,54.7500,[v5,staff2])-note(n320,54,53763,54001,53,0,0).
+snote(n379-1,[E,#],3,14:3,3/16,1/16,54.7500,55.0000,[v5,staff2])-note(n322,53,53990,54233,58,0,0).
+snote(n358-1,[A,#],5,14:4,0,1/8,55.0000,55.5000,[v1,staff1])-note(n323,82,54220,54821,73,0,0).
+snote(n366-1,[F,#],5,14:4,0,1/8,55.0000,55.5000,[v2,staff1])-note(n324,78,54237,54494,63,0,0).
+snote(n380-1,[D,#],3,14:4,0,1/16,55.0000,55.2500,[v5,staff2])-note(n325,51,54247,54464,60,0,0).
+snote(n381-1,[E,#],3,14:4,1/16,1/16,55.2500,55.5000,[v5,staff2])-note(n326,53,54473,54690,59,0,0).
+snote(n359-1,[F,#],5,14:4,1/8,1/8,55.5000,56.0000,[v1,staff1])-note(n327,78,54690,54912,75,0,0).
+snote(n367-1,[D,#],5,14:4,1/8,1/8,55.5000,56.0000,[v2,staff1])-note(n329,75,54723,54875,62,0,0).
+snote(n382-1,[F,#],3,14:4,1/8,1/16,55.5000,55.7500,[v5,staff2])-note(n328,54,54713,54887,54,0,0).
+snote(n383-1,[D,#],3,14:4,3/16,1/16,55.7500,56.0000,[v5,staff2])-note(n330,51,54930,55395,58,0,0).
+snote(n384-1,[D,#],5,15:1,0,1/4,56.0000,57.0000,[v1,staff1])-note(n331,75,55206,55800,64,0,0).
+snote(n390-1,[B,#],4,15:1,0,1/8,56.0000,56.5000,[v2,staff1])-note(n333,72,55248,55472,46,0,0).
+snote(n408-1,[G,#],3,15:1,0,1/16,56.0000,56.2500,[v5,staff2])-note(n332,56,55237,55431,45,0,0).
+snote(n409-1,[A,#],3,15:1,1/16,1/16,56.2500,56.5000,[v5,staff2])-note(n334,58,55447,55700,55,0,0).
+insertion-note(n335,68,55681,55988,78,0,0).
+snote(n391-1,[F,#],4,15:1,1/8,1/8,56.5000,57.0000,[v2,staff1])-deletion.
+snote(n410-1,[G,#],3,15:1,1/8,1/16,56.5000,56.7500,[v5,staff2])-note(n336,56,55716,55947,54,0,0).
+snote(n411-1,[F,#],3,15:1,3/16,1/16,56.7500,57.0000,[v5,staff2])-note(n337,54,55938,56131,62,0,0).
+snote(n392-1,[C,#],5,15:2,0,1/8,57.0000,57.5000,[v2,staff1])-note(n338,73,56180,56543,82,0,0).
+snote(n412-1,[E,#],3,15:2,0,1/16,57.0000,57.2500,[v5,staff2])-note(n339,53,56182,56382,51,0,0).
+snote(n413-1,[F,#],3,15:2,1/16,1/16,57.2500,57.5000,[v5,staff2])-note(n340,54,56413,56698,59,0,0).
+snote(n386-1,[G,#],5,15:2,1/8,1/8,57.5000,58.0000,[v1,staff1])-note(n343,80,56703,56853,59,0,0).
+snote(n393-1,[B,#],4,15:2,1/8,1/8,57.5000,58.0000,[v2,staff1])-note(n341,72,56668,56982,82,0,0).
+snote(n414-1,[G,#],3,15:2,1/8,1/16,57.5000,57.7500,[v5,staff2])-note(n342,56,56687,56833,52,0,0).
+snote(n415-1,[E,#],3,15:2,3/16,1/16,57.7500,58.0000,[v5,staff2])-note(n344,53,56907,57141,54,0,0).
+snote(n387-1,[E,#],5,15:3,0,1/4,58.0000,59.0000,[v1,staff1])-note(n347,77,57219,58199,64,0,0).
+snote(n394-1,[C,#],5,15:3,0,1/8,58.0000,58.5000,[v2,staff1])-note(n345,73,57160,57647,76,0,0).
+snote(n416-1,[A,#],3,15:3,0,1/16,58.0000,58.2500,[v5,staff2])-note(n346,58,57173,57400,50,0,0).
+snote(n417-1,[B,#],3,15:3,1/16,1/16,58.2500,58.5000,[v5,staff2])-note(n348,60,57406,57644,53,0,0).
+snote(n395-1,[B,#],4,15:3,1/8,1/16,58.5000,58.7500,[v2,staff1])-note(n349,72,57648,57919,69,0,0).
+snote(n418-1,[C,#],4,15:3,1/8,3/16,58.5000,59.2500,[v5,staff2])-note(n350,61,57657,58323,49,0,0).
+snote(n396-1,[A,#],4,15:3,3/16,1/16,58.7500,59.0000,[v2,staff1])-note(n351,70,57886,58150,65,0,0).
+snote(n397-1,[G,#],4,15:4,0,3/16,59.0000,59.7500,[v2,staff1,inverted-mordent])-note(n352,68,58127,58762,66,0,0).
+snote(n400-1,[A,#],4,15:4,0,3/128,59.0000,59.0938,[v4,staff1])-deletion.
+snote(n401-1,[G,#],4,15:4,3/128,3/128,59.0938,59.1875,[v4,staff1])-deletion.
+snote(n402-1,[A,#],4,15:4,3/64,3/128,59.1875,59.2812,[v4,staff1])-deletion.
+snote(n420-1,[B,#],3,15:4,1/16,1/16,59.2500,59.5000,[v5,staff2])-note(n353,60,58347,58547,54,0,0).
+snote(n403-1,[G,#],4,15:4,9/128,3/128,59.2812,59.3750,[v4,staff1])-deletion.
+snote(n404-1,[A,#],4,15:4,3/32,3/128,59.3750,59.4688,[v4,staff1])-deletion.
+snote(n405-1,[G,#],4,15:4,15/128,3/128,59.4688,59.5625,[v4,staff1])-deletion.
+snote(n389-1,[E,#],5,15:4,1/8,1/8,59.5000,60.0000,[v1,staff1])-note(n355,77,58574,58694,66,0,0).
+snote(n421-1,[A,#],3,15:4,1/8,1/16,59.5000,59.7500,[v5,staff2])-note(n354,58,58574,58800,52,0,0).
+snote(n406-1,[A,#],4,15:4,9/64,3/128,59.5625,59.6562,[v4,staff1])-deletion.
+snote(n407-1,[G,#],4,15:4,21/128,3/128,59.6562,59.7500,[v4,staff1])-deletion.
+snote(n398-1,[F,#],4,15:4,3/16,1/32,59.7500,59.8750,[v2,staff1])-note(n357,66,58805,58894,67,0,0).
+snote(n422-1,[G,#],3,15:4,3/16,1/16,59.7500,60.0000,[v5,staff2])-note(n356,56,58800,59013,51,0,0).
+snote(n399-1,[G,#],4,15:4,7/32,1/32,59.8750,60.0000,[v2,staff1])-note(n358,68,58880,58928,68,0,0).
+snote(n423-1,[D,#],5,16:1,0,1/16,60.0000,60.2500,[v1,staff1])-note(n360,75,59038,59242,60,0,0).
+snote(n434-1,[A,#],4,16:1,0,1/4,60.0000,61.0000,[v2,staff1])-note(n359,70,59032,60131,68,0,0).
+snote(n441-1,[F,#],3,16:1,0,1/16,60.0000,60.2500,[v5,staff2])-note(n361,54,59042,59268,48,0,0).
+snote(n424-1,[B,#],4,16:1,1/16,1/16,60.2500,60.5000,[v1,staff1])-note(n362,72,59272,59516,64,0,0).
+snote(n442-1,[G,#],3,16:1,1/16,1/16,60.2500,60.5000,[v5,staff2])-note(n363,56,59289,59507,47,0,0).
+snote(n425-1,[C,#],5,16:1,1/8,1/16,60.5000,60.7500,[v1,staff1])-note(n364,73,59510,59726,58,0,0).
+snote(n443-1,[A,#],3,16:1,1/8,1/16,60.5000,60.7500,[v5,staff2])-note(n365,58,59525,59717,50,0,0).
+snote(n426-1,[E,#],5,16:1,3/16,1/16,60.7500,61.0000,[v1,staff1])-note(n366,77,59738,59962,54,0,0).
+snote(n444-1,[E,#],3,16:1,3/16,1/16,60.7500,61.0000,[v5,staff2])-note(n367,53,59763,59967,49,0,0).
+snote(n427-1,[D,#],5,16:2,0,1/16,61.0000,61.2500,[v1,staff1])-note(n368,75,59973,60256,49,0,0).
+snote(n445-1,[F,#],3,16:2,0,1/16,61.0000,61.2500,[v5,staff2])-note(n369,54,59982,60189,45,0,0).
+snote(n428-1,[B,#],4,16:2,1/16,1/16,61.2500,61.5000,[v1,staff1])-note(n371,72,60209,60436,55,0,0).
+snote(n446-1,[G,#],3,16:2,1/16,1/16,61.2500,61.5000,[v5,staff2])-note(n370,56,60205,60416,49,0,0).
+snote(n429-1,[C,#],5,16:2,1/8,3/16,61.5000,62.2500,[v1,staff1])-note(n373,73,60449,61058,61,0,0).
+snote(n436-1,[G,#],4,16:2,1/8,1/8,61.5000,62.0000,[v2,staff1])-note(n372,68,60445,61009,65,0,0).
+snote(n447-1,[A,#],3,16:2,1/8,1/16,61.5000,61.7500,[v5,staff2])-note(n374,58,60461,60688,44,0,0).
+snote(n448-1,[F,#],3,16:2,3/16,1/16,61.7500,62.0000,[v5,staff2])-note(n375,54,60688,60889,47,0,0).
+snote(n437-1,[F,#],4,16:3,0,1/8,62.0000,62.5000,[v2,staff1])-note(n377,66,60926,61423,69,0,0).
+snote(n449-1,[D,#],3,16:3,0,1/8,62.0000,62.5000,[v5,staff2])-note(n376,51,60922,61473,44,0,0).
+snote(n431-1,[B,#],4,16:3,1/16,1/16,62.2500,62.5000,[v1,staff1])-note(n378,72,61155,61428,58,0,0).
+snote(n432-1,[C,#],5,16:3,1/8,1/4,62.5000,63.5000,[v1,staff1])-note(n379,73,61412,62065,64,0,0).
+snote(n438-1,[E,#],4,16:3,1/8,1/8,62.5000,63.0000,[v2,staff1])-note(n381,65,61428,61999,59,0,0).
+snote(n450-1,[E,#],3,16:3,1/8,1/16,62.5000,62.7500,[v5,staff2])-note(n380,53,61416,61600,45,0,0).
+snote(n451-1,[F,#],3,16:3,3/16,1/16,62.7500,63.0000,[v5,staff2])-note(n382,54,61643,61884,45,0,0).
+snote(n439-1,[D,#],4,16:4,0,1/8,63.0000,63.5000,[v2,staff1])-note(n383,63,61947,62176,56,0,0).
+snote(n452-1,[G,#],3,16:4,0,1/8,63.0000,63.5000,[v5,staff2])-note(n384,56,61952,62416,36,0,0).
+snote(n433-1,[B,#],4,16:4,1/8,1/8,63.5000,64.0000,[v1,staff1])-note(n385,72,62446,62720,55,0,0).
+snote(n440-1,[G,#],4,16:4,1/8,1/8,63.5000,64.0000,[v2,staff1])-note(n386,68,62450,62726,53,0,0).
+snote(n453-1,[G,#],2,16:4,1/8,1/8,63.5000,64.0000,[v5,staff2])-note(n387,44,62459,62999,33,0,0).
+snote(n454-1,[C,#],5,17:1,0,1/4,64.0000,65.0000,[v1,staff1])-note(n389,73,62976,63306,51,0,0).
+snote(n464-1,[E,#],4,17:1,0,1/16,64.0000,64.2500,[v2,staff1])-note(n390,65,62999,63252,44,0,0).
+snote(n475-1,[C,#],3,17:1,0,1/8,64.0000,64.5000,[v5,staff2])-note(n388,49,62972,63206,37,0,0).
+snote(n465-1,[G,#],4,17:1,1/16,1/16,64.2500,64.5000,[v2,staff1])-note(n391,68,63206,63252,57,0,0).
+snote(n466-1,[G,#],4,17:1,1/8,1/16,64.5000,64.7500,[v2,staff1])-note(n393,68,63465,63723,63,0,0).
+snote(n476-1,[C,#],4,17:1,1/8,1/8,64.5000,65.0000,[v5,staff2])-note(n392,61,63456,63793,55,0,0).
+snote(n467-1,[E,#],4,17:1,3/16,1/16,64.7500,65.0000,[v2,staff1])-note(n394,65,63686,63736,53,0,0).
+snote(n468-1,[D,#],4,17:2,0,1/16,65.0000,65.2500,[v2,staff1])-note(n396,63,63956,64136,62,0,0).
+snote(n477-1,[B,#],3,17:2,0,1/8,65.0000,65.5000,[v5,staff2])-note(n395,60,63956,64293,49,0,0).
+snote(n469-1,[G,#],4,17:2,1/16,1/16,65.2500,65.5000,[v2,staff1])-note(n397,68,64165,64218,61,0,0).
+snote(n455-1,[B,#],4,17:2,1/8,1/8,65.5000,66.0000,[v1,staff1])-note(n399,72,64423,64642,64,0,0).
+snote(n470-1,[G,#],4,17:2,1/8,1/16,65.5000,65.7500,[v2,staff1])-note(n398,68,64423,64642,58,0,0).
+snote(n478-1,[G,#],3,17:2,1/8,1/8,65.5000,66.0000,[v5,staff2])-note(n400,56,64427,64703,49,0,0).
+snote(n471-1,[D,#],4,17:2,3/16,1/16,65.7500,66.0000,[v2,staff1])-note(n401,63,64638,64689,57,0,0).
+snote(n456-1,[C,#],5,17:3,0,1/16,66.0000,66.2500,[v1,staff1])-note(n403,73,64890,65124,60,0,0).
+snote(n472-1,[E,#],4,17:3,0,1/4,66.0000,67.0000,[v2,staff1])-note(n404,65,64908,65655,50,0,0).
+snote(n479-1,[C,#],4,17:3,0,1/8,66.0000,66.5000,[v5,staff2])-note(n402,61,64887,65220,50,0,0).
+snote(n457-1,[E,#],5,17:3,1/16,1/16,66.2500,66.5000,[v1,staff1])-note(n405,77,65115,65158,61,0,0).
+snote(n458-1,[E,#],5,17:3,1/8,1/16,66.5000,66.7500,[v1,staff1])-note(n406,77,65376,65648,71,0,0).
+snote(n480-1,[A,#],3,17:3,1/8,1/8,66.5000,67.0000,[v5,staff2])-note(n407,58,65385,65705,52,0,0).
+snote(n459-1,[C,#],5,17:3,3/16,1/16,66.7500,67.0000,[v1,staff1])-note(n408,73,65596,65639,67,0,0).
+snote(n460-1,[B,#],4,17:4,0,1/16,67.0000,67.2500,[v1,staff1])-note(n409,72,65842,66106,72,0,0).
+snote(n481-1,[G,x],3,17:4,0,1/8,67.0000,67.5000,[v5,staff2])-note(n410,57,65847,66166,57,0,0).
+snote(n461-1,[E,#],5,17:4,1/16,1/16,67.2500,67.5000,[v1,staff1])-note(n411,77,66069,66134,71,0,0).
+snote(n462-1,[E,#],5,17:4,1/8,1/16,67.5000,67.7500,[v1,staff1])-note(n412,77,66312,66560,72,0,0).
+snote(n474-1,[G,x],4,17:4,1/8,1/8,67.5000,68.0000,[v2,staff1])-note(n413,69,66321,66569,66,0,0).
+snote(n482-1,[E,#],3,17:4,1/8,1/8,67.5000,68.0000,[v5,staff2])-note(n414,53,66323,66869,52,0,0).
+snote(n463-1,[B,#],4,17:4,3/16,1/16,67.7500,68.0000,[v1,staff1])-note(n415,72,66538,66585,69,0,0).
+snote(n483-1,[C,#],5,18:1,0,1/8,68.0000,68.5000,[v1,staff1])-note(n416,73,66792,67359,73,0,0).
+snote(n490-1,[A,#],4,18:1,0,1/4,68.0000,69.0000,[v2,staff1])-note(n417,70,66812,68141,49,0,0).
+snote(n496-1,[A,#],3,18:1,0,1/16,68.0000,68.2500,[v5,staff2])-note(n418,58,66817,67035,52,0,0).
+snote(n497-1,[C,#],4,18:1,1/16,1/16,68.2500,68.5000,[v5,staff2])-note(n419,61,67019,67065,59,0,0).
+snote(n484-1,[E,#],5,18:1,1/8,1/8,68.5000,69.0000,[v1,staff1])-note(n420,77,67266,67918,81,0,0).
+snote(n498-1,[C,#],4,18:1,1/8,1/16,68.5000,68.7500,[v5,staff2])-note(n421,61,67288,67508,51,0,0).
+snote(n499-1,[A,#],3,18:1,3/16,1/16,68.7500,69.0000,[v5,staff2])-note(n422,58,67499,67570,56,0,0).
+snote(n485-1,[A,#],5,18:2,0,3/8,69.0000,70.5000,[v1,staff1])-note(n423,82,67736,69262,79,0,0).
+snote(n500-1,[F,#],3,18:2,0,1/16,69.0000,69.2500,[v5,staff2])-note(n424,54,67750,68027,53,0,0).
+snote(n501-1,[A,#],3,18:2,1/16,1/16,69.2500,69.5000,[v5,staff2])-note(n425,58,67976,68036,51,0,0).
+snote(n492-1,[C,#],5,18:2,1/8,1/8,69.5000,70.0000,[v2,staff1])-note(n426,73,68210,68498,73,0,0).
+snote(n502-1,[A,#],3,18:2,1/8,1/16,69.5000,69.7500,[v5,staff2])-note(n427,58,68244,68494,46,0,0).
+snote(n503-1,[F,#],3,18:2,3/16,1/16,69.7500,70.0000,[v5,staff2])-note(n428,54,68447,68499,52,0,0).
+snote(n493-1,[B,n],4,18:3,0,1/4,70.0000,71.0000,[v2,staff1])-note(n430,71,68718,69658,68,0,0).
+snote(n504-1,[D,#],3,18:3,0,1/16,70.0000,70.2500,[v5,staff2])-note(n429,51,68710,68983,50,0,0).
+snote(n505-1,[B,n],3,18:3,1/16,1/16,70.2500,70.5000,[v5,staff2])-note(n431,59,68941,68995,53,0,0).
+snote(n487-1,[G,#],5,18:3,1/8,1/16,70.5000,70.7500,[v1,staff1])-note(n432,80,69191,69427,74,0,0).
+snote(n506-1,[B,n],3,18:3,1/8,1/16,70.5000,70.7500,[v5,staff2])-note(n433,59,69209,69434,46,0,0).
+snote(n488-1,[F,#],5,18:3,3/16,1/16,70.7500,71.0000,[v1,staff1])-note(n434,78,69416,69725,75,0,0).
+snote(n507-1,[G,#],3,18:3,3/16,1/16,70.7500,71.0000,[v5,staff2])-note(n435,56,69427,69523,54,0,0).
+snote(n489-1,[G,#],5,18:4,0,3/8,71.0000,72.5000,[v1,staff1])-note(n436,80,69677,71316,72,0,0).
+snote(n508-1,[E,#],3,18:4,0,1/16,71.0000,71.2500,[v5,staff2])-note(n437,53,69681,69978,51,0,0).
+snote(n509-1,[G,#],3,18:4,1/16,1/16,71.2500,71.5000,[v5,staff2])-note(n438,56,69917,69970,61,0,0).
+snote(n495-1,[B,n],4,18:4,1/8,1/8,71.5000,72.0000,[v2,staff1])-note(n439,71,70169,70485,65,0,0).
+snote(n510-1,[G,#],3,18:4,1/8,1/16,71.5000,71.7500,[v5,staff2])-note(n440,56,70178,70365,53,0,0).
+snote(n511-1,[E,#],3,18:4,3/16,1/16,71.7500,72.0000,[v5,staff2])-note(n441,53,70399,70453,56,0,0).
+snote(n520-1,[A,#],4,19:1,0,1/4,72.0000,73.0000,[v2,staff1])-note(n442,70,70642,71460,66,0,0).
+snote(n524-1,[C,x],3,19:1,0,1/16,72.0000,72.2500,[v5,staff2])-note(n443,50,70646,70909,48,0,0).
+snote(n525-1,[A,#],3,19:1,1/16,1/16,72.2500,72.5000,[v5,staff2])-note(n444,58,70861,70922,54,0,0).
+snote(n513-1,[F,#],5,19:1,1/8,1/16,72.5000,72.7500,[v1,staff1])-note(n445,78,71115,71453,75,0,0).
+snote(n526-1,[A,#],3,19:1,1/8,1/16,72.5000,72.7500,[v5,staff2])-note(n446,58,71132,71377,57,0,0).
+snote(n514-1,[E,#],5,19:1,3/16,1/16,72.7500,73.0000,[v1,staff1])-note(n447,77,71350,71619,71,0,0).
+snote(n527-1,[F,#],3,19:1,3/16,1/16,72.7500,73.0000,[v5,staff2])-note(n448,54,71359,71464,53,0,0).
+snote(n515-1,[F,#],5,19:2,0,3/8,73.0000,74.5000,[v1,staff1])-note(n449,78,71593,72816,73,0,0).
+snote(n528-1,[D,#],3,19:2,0,1/16,73.0000,73.2500,[v5,staff2])-note(n450,51,71610,71890,50,0,0).
+snote(n529-1,[F,#],3,19:2,1/16,1/16,73.2500,73.5000,[v5,staff2])-note(n451,54,71827,71906,57,0,0).
+snote(n522-1,[A,#],4,19:2,1/8,1/8,73.5000,74.0000,[v2,staff1])-note(n453,70,72087,72401,66,0,0).
+snote(n530-1,[F,#],3,19:2,1/8,1/16,73.5000,73.7500,[v5,staff2])-note(n452,54,72081,72310,56,0,0).
+snote(n531-1,[D,#],3,19:2,3/16,1/16,73.7500,74.0000,[v5,staff2])-note(n454,51,72304,72355,63,0,0).
+snote(n523-1,[G,#],4,19:3,0,9/16,74.0000,76.2500,[v2,staff1])-note(n456,68,72561,74268,73,0,0).
+snote(n532-1,[B,n],2,19:3,0,1/16,74.0000,74.2500,[v5,staff2])-note(n455,47,72561,72838,55,0,0).
+snote(n533-1,[D,#],3,19:3,1/16,1/16,74.2500,74.5000,[v5,staff2])-note(n457,51,72787,72853,69,0,0).
+snote(n517-1,[F,#],5,19:3,1/8,1/8,74.5000,75.0000,[v1,staff1])-note(n459,78,73031,73464,80,0,0).
+snote(n534-1,[D,#],3,19:3,1/8,1/16,74.5000,74.7500,[v5,staff2])-note(n458,51,73026,73218,62,0,0).
+snote(n535-1,[B,n],2,19:3,3/16,1/16,74.7500,75.0000,[v5,staff2])-note(n460,47,73259,73351,66,0,0).
+snote(n518-1,[E,#],5,19:4,0,1/8,75.0000,75.5000,[v1,staff1])-note(n462,77,73526,74110,81,0,0).
+snote(n536-1,[G,#],2,19:4,0,1/16,75.0000,75.2500,[v5,staff2])-note(n461,44,73520,73814,65,0,0).
+snote(n537-1,[B,n],2,19:4,1/16,1/16,75.2500,75.5000,[v5,staff2])-note(n463,47,73748,73828,70,0,0).
+snote(n519-1,[D,#],5,19:4,1/8,1/8,75.5000,76.0000,[v1,staff1])-note(n464,75,73998,74372,70,0,0).
+snote(n538-1,[B,n],2,19:4,1/8,1/16,75.5000,75.7500,[v5,staff2])-note(n465,47,74002,74291,67,0,0).
+snote(n539-1,[G,#],2,19:4,3/16,1/16,75.7500,76.0000,[v5,staff2])-note(n466,44,74217,74355,68,0,0).
+snote(n540-1,[C,x],5,20:1,0,1/8,76.0000,76.5000,[v1,staff1])-note(n468,74,74513,75076,70,0,0).
+snote(n562-1,[A,#],2,20:1,0,1/8,76.0000,76.5000,[v5,staff2])-note(n467,46,74501,74854,68,0,0).
+snote(n551-1,[B,n],4,20:1,1/16,1/16,76.2500,76.5000,[v2,staff1])-note(n469,71,74757,75170,56,0,0).
+snote(n552-1,[A,#],4,20:1,1/8,1/16,76.5000,76.7500,[v2,staff1])-note(n471,70,74997,75246,65,0,0).
+snote(n563-1,[A,#],2,20:1,1/8,1/8,76.5000,77.0000,[v5,staff2])-note(n470,46,74997,75550,71,0,0).
+snote(n553-1,[G,#],4,20:1,3/16,1/16,76.7500,77.0000,[v2,staff1])-note(n472,68,75216,75485,71,0,0).
+snote(n554-1,[F,#],4,20:2,0,1/16,77.0000,77.2500,[v2,staff1])-note(n474,66,75494,75710,63,0,0).
+snote(n564-1,[D,#],3,20:2,0,1/8,77.0000,77.5000,[v5,staff2])-note(n473,51,75475,75995,73,0,0).
+snote(n555-1,[G,#],4,20:2,1/16,1/16,77.2500,77.5000,[v2,staff1])-note(n475,68,75695,76143,72,0,0).
+snote(n556-1,[A,#],4,20:2,1/8,1/16,77.5000,77.7500,[v2,staff1])-note(n477,70,75976,76167,62,0,0).
+snote(n565-1,[C,x],3,20:2,1/8,1/8,77.5000,78.0000,[v5,staff2])-note(n476,50,75954,76454,74,0,0).
+snote(n557-1,[E,#],4,20:2,3/16,1/16,77.7500,78.0000,[v2,staff1])-note(n478,65,76196,76445,66,0,0).
+snote(n558-1,[F,#],4,20:3,0,1/16,78.0000,78.2500,[v2,staff1])-note(n480,66,76449,76688,68,0,0).
+snote(n566-1,[D,#],3,20:3,0,1/8,78.0000,78.5000,[v5,staff2])-note(n479,51,76449,77133,71,0,0).
+snote(n559-1,[G,#],4,20:3,1/16,1/16,78.2500,78.5000,[v2,staff1])-note(n481,68,76675,76938,69,0,0).
+snote(n544-1,[D,#],4,20:3,1/8,1/16,78.5000,78.7500,[v1,staff1])-note(n484,63,76963,77167,54,0,0).
+snote(n560-1,[A,#],4,20:3,1/8,1/8,78.5000,79.0000,[v2,staff1])-note(n483,70,76938,77699,70,0,0).
+snote(n567-1,[C,#],3,20:3,1/8,1/16,78.5000,78.7500,[v5,staff2])-note(n482,49,76929,77182,62,0,0).
+snote(n545-1,[E,#],4,20:3,3/16,1/16,78.7500,79.0000,[v1,staff1])-note(n485,65,77160,77238,62,0,0).
+snote(n568-1,[B,n],2,20:3,3/16,1/16,78.7500,79.0000,[v5,staff2])-note(n486,47,77167,77460,63,0,0).
+snote(n546-1,[F,#],4,20:4,0,1/16,79.0000,79.2500,[v1,staff1])-note(n488,66,77410,77692,59,0,0).
+snote(n569-1,[A,#],2,20:4,0,3/16,79.0000,79.7500,[v5,staff2,inverted-mordent])-note(n487,46,77398,77596,53,0,0).
+snote(n572-1,[B,n],2,20:4,0,3/128,79.0000,79.0938,[v6,staff2])-deletion.
+snote(n573-1,[A,#],2,20:4,3/128,3/128,79.0938,79.1875,[v6,staff2])-deletion.
+snote(n574-1,[B,n],2,20:4,3/64,3/128,79.1875,79.2812,[v6,staff2])-note(n489,47,77632,77743,57,0,0).
+snote(n547-1,[D,#],4,20:4,1/16,1/16,79.2500,79.5000,[v1,staff1])-note(n490,63,77639,77683,52,0,0).
+snote(n575-1,[A,#],2,20:4,9/128,3/128,79.2812,79.3750,[v6,staff2])-deletion.
+snote(n576-1,[B,n],2,20:4,3/32,3/128,79.3750,79.4688,[v6,staff2])-deletion.
+snote(n577-1,[A,#],2,20:4,15/128,3/128,79.4688,79.5625,[v6,staff2])-note(n491,46,77759,77821,60,0,0).
+snote(n548-1,[D,#],4,20:4,1/8,1/16,79.5000,79.7500,[v1,staff1])-note(n494,63,77895,78076,62,0,0).
+snote(n561-1,[D,#],5,20:4,1/8,1/8,79.5000,80.0000,[v2,staff1])-note(n493,75,77891,78123,70,0,0).
+snote(n578-1,[B,n],2,20:4,9/64,3/128,79.5625,79.6562,[v6,staff2])-note(n492,47,77863,77970,57,0,0).
+snote(n579-1,[A,#],2,20:4,21/128,3/128,79.6562,79.7500,[v6,staff2])-note(n495,46,77977,78042,61,0,0).
+snote(n549-1,[F,#],4,20:4,3/16,1/16,79.7500,80.0000,[v1,staff1])-note(n497,66,78101,78147,62,0,0).
+snote(n570-1,[G,#],2,20:4,3/16,1/32,79.7500,79.8750,[v5,staff2])-note(n496,44,78101,78258,62,0,0).
+snote(n571-1,[A,#],2,20:4,7/32,1/32,79.8750,80.0000,[v5,staff2])-note(n498,46,78209,78316,63,0,0).
+snote(n580-1,[G,#],4,21:1,0,1/16,80.0000,80.2500,[v1,staff1])-note(n499,68,78346,78608,69,0,0).
+snote(n596-1,[D,#],5,21:1,0,3/4,80.0000,83.0000,[v2,staff1])-note(n501,75,78350,80925,68,0,0).
+snote(n598-1,[B,n],2,21:1,0,1/4,80.0000,81.0000,[v5,staff2])-note(n500,47,78350,79534,64,0,0).
+snote(n581-1,[D,#],4,21:1,1/16,1/16,80.2500,80.5000,[v1,staff1])-note(n502,63,78594,78638,62,0,0).
+snote(n582-1,[D,#],4,21:1,1/8,1/16,80.5000,80.7500,[v1,staff1])-note(n503,63,78846,79058,60,0,0).
+snote(n583-1,[G,#],4,21:1,3/16,1/16,80.7500,81.0000,[v1,staff1])-note(n504,68,79042,79095,63,0,0).
+snote(n584-1,[A,#],4,21:2,0,1/16,81.0000,81.2500,[v1,staff1])-note(n505,70,79312,79614,58,0,0).
+snote(n585-1,[D,#],4,21:2,1/16,1/16,81.2500,81.5000,[v1,staff1])-note(n506,63,79541,79581,54,0,0).
+snote(n586-1,[D,#],4,21:2,1/8,1/16,81.5000,81.7500,[v1,staff1])-note(n508,63,79802,80041,56,0,0).
+snote(n600-1,[A,#],2,21:2,1/8,1/8,81.5000,82.0000,[v5,staff2])-note(n507,46,79778,80306,68,0,0).
+snote(n587-1,[A,#],4,21:2,3/16,1/16,81.7500,82.0000,[v1,staff1])-note(n509,70,79997,80063,62,0,0).
+snote(n588-1,[B,n],4,21:3,0,1/16,82.0000,82.2500,[v1,staff1])-note(n511,71,80278,80546,63,0,0).
+snote(n601-1,[G,#],2,21:3,0,1/8,82.0000,82.5000,[v5,staff2])-note(n510,44,80278,80766,69,0,0).
+snote(n589-1,[D,#],4,21:3,1/16,1/16,82.2500,82.5000,[v1,staff1])-note(n512,63,80504,80546,66,0,0).
+snote(n590-1,[D,#],4,21:3,1/8,1/16,82.5000,82.7500,[v1,staff1])-note(n514,63,80775,81008,65,0,0).
+snote(n602-1,[F,#],2,21:3,1/8,1/8,82.5000,83.0000,[v5,staff2])-note(n513,42,80766,81285,63,0,0).
+snote(n591-1,[B,n],4,21:3,3/16,1/16,82.7500,83.0000,[v1,staff1])-note(n515,71,80981,81033,61,0,0).
+snote(n592-1,[C,x],5,21:4,0,1/16,83.0000,83.2500,[v1,staff1])-note(n517,74,81236,81436,72,0,0).
+snote(n597-1,[G,#],4,21:4,0,5/16,83.0000,84.2500,[v2,staff1])-note(n518,68,81254,81999,64,0,0).
+snote(n603-1,[E,#],2,21:4,0,1/8,83.0000,83.5000,[v5,staff2])-note(n516,41,81236,81770,60,0,0).
+snote(n593-1,[D,#],4,21:4,1/16,1/16,83.2500,83.5000,[v1,staff1])-note(n519,63,81469,81526,63,0,0).
+snote(n594-1,[D,#],4,21:4,1/8,1/16,83.5000,83.7500,[v1,staff1])-note(n520,63,81724,81893,60,0,0).
+snote(n604-1,[A,#],2,21:4,1/8,1/8,83.5000,84.0000,[v5,staff2])-note(n521,46,81737,82319,58,0,0).
+snote(n595-1,[C,x],5,21:4,3/16,1/16,83.7500,84.0000,[v1,staff1])-note(n522,74,81941,82071,63,0,0).
+snote(n605-1,[D,#],5,22:1,0,1/4,84.0000,85.0000,[v1,staff1])-note(n523,75,82215,82724,63,0,0).
+snote(n631-1,[D,#],2,22:1,0,1/8,84.0000,84.5000,[v5,staff2])-note(n524,39,82219,82882,56,0,0).
+snote(n617-1,[F,#],4,22:1,1/16,1/16,84.2500,84.5000,[v2,staff1])-note(n525,66,82433,82635,67,0,0).
+snote(n618-1,[G,#],4,22:1,1/8,1/16,84.5000,84.7500,[v2,staff1])-note(n526,68,82680,82910,69,0,0).
+snote(n632-1,[F,#],2,22:1,1/8,1/8,84.5000,85.0000,[v5,staff2])-note(n527,42,82713,83286,63,0,0).
+snote(n619-1,[A,#],4,22:1,3/16,1/16,84.7500,85.0000,[v2,staff1])-note(n528,70,82905,83122,73,0,0).
+snote(n620-1,[B,n],4,22:2,0,1/4,85.0000,86.0000,[v2,staff1])-note(n529,71,83159,83830,72,0,0).
+snote(n633-1,[G,#],2,22:2,0,5/16,85.0000,86.2500,[v5,staff2])-note(n530,44,83164,83860,68,0,0).
+snote(n607-1,[E,#],5,22:2,1/16,1/16,85.2500,85.5000,[v1,staff1])-note(n531,77,83399,83619,71,0,0).
+snote(n608-1,[F,#],5,22:2,1/8,1/16,85.5000,85.7500,[v1,staff1])-note(n532,78,83625,83918,76,0,0).
+snote(n609-1,[G,#],5,22:2,3/16,1/16,85.7500,86.0000,[v1,staff1])-note(n533,80,83866,84087,78,0,0).
+snote(n610-1,[C,x],5,22:3,0,1/16,86.0000,86.2500,[v1,staff1])-note(n534,74,84092,84332,74,0,0).
+snote(n621-1,[A,#],4,22:3,0,1/8,86.0000,86.5000,[v2,staff1])-note(n535,70,84103,84247,71,0,0).
+snote(n611-1,[B,n],5,22:3,1/16,1/16,86.2500,86.5000,[v1,staff1])-note(n537,83,84327,84601,80,0,0).
+snote(n635-1,[E,#],3,22:3,1/16,1/16,86.2500,86.5000,[v5,staff2])-note(n536,53,84327,84566,58,0,0).
+snote(n612-1,[A,#],5,22:3,1/8,1/8,86.5000,87.0000,[v1,staff1])-note(n538,82,84561,84812,82,0,0).
+snote(n636-1,[F,#],3,22:3,1/8,1/16,86.5000,86.7500,[v5,staff2])-note(n539,54,84575,84800,60,0,0).
+snote(n622-1,[D,#],5,22:3,3/16,3/16,86.7500,87.5000,[v2,staff1])-note(n541,75,84800,85112,78,0,0).
+snote(n637-1,[G,#],3,22:3,3/16,1/16,86.7500,87.0000,[v5,staff2])-note(n540,56,84795,85015,59,0,0).
+snote(n613-1,[F,#],5,22:4,0,1/8,87.0000,87.5000,[v1,staff1,inverted-mordent])-deletion.
+snote(n625-1,[G,#],5,22:4,0,1/48,87.0000,87.0833,[v3,staff1])-note(n542,80,85015,85072,70,0,0).
+snote(n638-1,[A,#],3,22:4,0,1/8,87.0000,87.5000,[v5,staff2])-note(n543,58,85039,85958,52,0,0).
+snote(n626-1,[F,#],5,22:4,1/48,1/48,87.0833,87.1667,[v3,staff1])-note(n544,78,85078,85149,83,0,0).
+snote(n627-1,[G,#],5,22:4,1/24,1/48,87.1667,87.2500,[v3,staff1])-note(n545,80,85141,85224,69,0,0).
+snote(n628-1,[F,#],5,22:4,1/16,1/48,87.2500,87.3333,[v3,staff1])-note(n546,78,85206,85501,72,0,0).
+snote(n629-1,[G,#],5,22:4,1/12,1/48,87.3333,87.4167,[v3,staff1])-deletion.
+snote(n630-1,[F,#],5,22:4,5/48,1/48,87.4167,87.5000,[v3,staff1])-deletion.
+snote(n614-1,[E,#],5,22:4,1/8,1/16,87.5000,87.7500,[v1,staff1])-note(n547,77,85536,85807,69,0,0).
+snote(n624-1,[C,x],5,22:4,1/8,1/8,87.5000,88.0000,[v2,staff1])-note(n549,74,85553,85605,44,0,0).
+snote(n639-1,[A,#],2,22:4,1/8,1/8,87.5000,88.0000,[v5,staff2])-note(n548,46,85553,85903,37,0,0).
+snote(n615-1,[D,#],5,22:4,3/16,1/16,87.7500,88.0000,[v1,staff1])-note(n550,75,85768,85867,73,0,0).
+snote(n640-1,[D,#],5,23:1,0,1/8,88.0000,88.5000,[v1,staff1])-note(n551,75,86016,86644,71,0,0).
+snote(n645-1,[D,#],5,23:1,0,1/8,88.0000,88.5000,[v2,staff1])-deletion.
+snote(n652-1,[D,#],3,23:1,0,1/16,88.0000,88.2500,[v5,staff2])-note(n552,51,86033,86291,43,0,0).
+snote(n653-1,[A,#],3,23:1,1/16,1/16,88.2500,88.5000,[v5,staff2])-note(n553,58,86261,86311,56,0,0).
+snote(n641-1,[F,#],5,23:1,1/8,1/8,88.5000,89.0000,[v1,staff1])-note(n554,78,86482,87284,81,0,0).
+snote(n654-1,[A,#],3,23:1,1/8,1/16,88.5000,88.7500,[v5,staff2])-note(n555,58,86512,86751,49,0,0).
+snote(n655-1,[F,#],3,23:1,3/16,1/16,88.7500,89.0000,[v5,staff2])-note(n556,54,86740,86902,50,0,0).
+snote(n642-1,[B,n],5,23:2,0,1/8,89.0000,89.5000,[v1,staff1])-note(n557,83,86989,87609,78,0,0).
+snote(n656-1,[D,#],3,23:2,0,1/16,89.0000,89.2500,[v5,staff2])-note(n558,51,87010,87246,47,0,0).
+snote(n657-1,[F,#],3,23:2,1/16,1/16,89.2500,89.5000,[v5,staff2])-note(n559,54,87223,87275,58,0,0).
+snote(n643-1,[A,#],5,23:2,1/8,1/8,89.5000,90.0000,[v1,staff1])-note(n560,82,87471,88019,78,0,0).
+snote(n658-1,[F,#],3,23:2,1/8,1/16,89.5000,89.7500,[v5,staff2])-note(n561,54,87487,87684,50,0,0).
+snote(n659-1,[D,#],3,23:2,3/16,1/16,89.7500,90.0000,[v5,staff2])-note(n562,51,87690,87737,61,0,0).
+snote(n644-1,[B,n],5,23:3,0,5/8,90.0000,92.5000,[v1,staff1])-note(n563,83,87950,90120,77,0,0).
+snote(n660-1,[G,#],2,23:3,0,1/16,90.0000,90.2500,[v5,staff2])-note(n564,44,87962,88083,57,0,0).
+snote(n661-1,[D,#],4,23:3,1/16,1/16,90.2500,90.5000,[v5,staff2])-note(n565,63,88207,88252,59,0,0).
+snote(n649-1,[D,#],5,23:3,1/8,1/8,90.5000,91.0000,[v2,staff1])-note(n566,75,88448,88964,73,0,0).
+snote(n662-1,[D,#],4,23:3,1/8,1/16,90.5000,90.7500,[v5,staff2])-note(n567,63,88469,88608,53,0,0).
+snote(n663-1,[B,n],3,23:3,3/16,1/16,90.7500,91.0000,[v5,staff2])-note(n568,59,88658,88747,56,0,0).
+snote(n650-1,[G,#],5,23:4,0,1/8,91.0000,91.5000,[v2,staff1])-note(n569,80,88930,89562,73,0,0).
+snote(n664-1,[G,#],3,23:4,0,1/16,91.0000,91.2500,[v5,staff2])-note(n570,56,88945,89205,51,0,0).
+snote(n665-1,[B,n],3,23:4,1/16,1/16,91.2500,91.5000,[v5,staff2])-note(n571,59,89178,89227,56,0,0).
+snote(n651-1,[F,#],5,23:4,1/8,1/8,91.5000,92.0000,[v2,staff1])-note(n572,78,89420,90501,76,0,0).
+snote(n666-1,[B,n],3,23:4,1/8,1/16,91.5000,91.7500,[v5,staff2])-note(n573,59,89429,89629,46,0,0).
+snote(n667-1,[G,#],3,23:4,3/16,1/16,91.7500,92.0000,[v5,staff2])-note(n574,56,89656,89700,56,0,0).
+snote(n673-1,[G,#],5,24:1,0,5/8,92.0000,94.5000,[v2,staff1])-note(n576,80,89916,91119,72,0,0).
+snote(n678-1,[E,#],3,24:1,0,1/16,92.0000,92.2500,[v5,staff2])-note(n575,53,89916,90180,47,0,0).
+snote(n679-1,[G,#],3,24:1,1/16,1/16,92.2500,92.5000,[v5,staff2])-note(n577,56,90149,90202,54,0,0).
+snote(n669-1,[E,#],5,24:1,1/8,1/8,92.5000,93.0000,[v1,staff1])-note(n578,77,90398,91099,79,0,0).
+snote(n680-1,[G,#],3,24:1,1/8,1/16,92.5000,92.7500,[v5,staff2])-note(n579,56,90404,90538,52,0,0).
+snote(n681-1,[E,#],3,24:1,3/16,1/16,92.7500,93.0000,[v5,staff2])-note(n580,53,90616,90674,55,0,0).
+snote(n670-1,[A,#],5,24:2,0,1/8,93.0000,93.5000,[v1,staff1])-note(n582,82,90890,91635,76,0,0).
+snote(n682-1,[C,#],3,24:2,0,1/16,93.0000,93.2500,[v5,staff2])-note(n581,49,90886,91168,46,0,0).
+snote(n683-1,[E,#],3,24:2,1/16,1/16,93.2500,93.5000,[v5,staff2])-note(n583,53,91119,91175,52,0,0).
+snote(n671-1,[G,#],5,24:2,1/8,1/8,93.5000,94.0000,[v1,staff1])-note(n584,80,91351,92301,72,0,0).
+snote(n684-1,[E,#],3,24:2,1/8,1/16,93.5000,93.7500,[v5,staff2])-note(n585,53,91362,91520,52,0,0).
+snote(n685-1,[C,#],3,24:2,3/16,1/16,93.7500,94.0000,[v5,staff2])-note(n586,49,91576,91629,46,0,0).
+snote(n672-1,[A,#],5,24:3,0,5/8,94.0000,96.5000,[v1,staff1])-note(n588,82,91851,94042,67,0,0).
+snote(n686-1,[F,#],2,24:3,0,1/16,94.0000,94.2500,[v5,staff2])-note(n587,42,91851,91944,50,0,0).
+snote(n687-1,[C,#],4,24:3,1/16,1/16,94.2500,94.5000,[v5,staff2])-note(n589,61,92091,92134,53,0,0).
+snote(n675-1,[C,#],5,24:3,1/8,1/8,94.5000,95.0000,[v2,staff1])-note(n591,73,92329,92850,65,0,0).
+snote(n688-1,[C,#],4,24:3,1/8,1/16,94.5000,94.7500,[v5,staff2])-note(n590,61,92329,92561,44,0,0).
+snote(n689-1,[A,#],3,24:3,3/16,1/16,94.7500,95.0000,[v5,staff2])-note(n592,58,92554,92601,59,0,0).
+snote(n676-1,[F,#],5,24:4,0,1/8,95.0000,95.5000,[v2,staff1])-note(n594,78,92827,93305,64,0,0).
+snote(n690-1,[F,#],3,24:4,0,1/16,95.0000,95.2500,[v5,staff2])-note(n593,54,92815,93112,51,0,0).
+snote(n691-1,[A,#],3,24:4,1/16,1/16,95.2500,95.5000,[v5,staff2])-note(n595,58,93033,93085,55,0,0).
+snote(n677-1,[E,#],5,24:4,1/8,1/8,95.5000,96.0000,[v2,staff1])-note(n597,77,93296,94051,65,0,0).
+snote(n692-1,[A,#],3,24:4,1/8,1/16,95.5000,95.7500,[v5,staff2])-note(n596,58,93296,93511,49,0,0).
+snote(n693-1,[F,#],3,24:4,3/16,1/16,95.7500,96.0000,[v5,staff2])-note(n598,54,93524,93571,51,0,0).
+snote(n700-1,[F,#],5,25:1,0,1/8,96.0000,96.5000,[v2,staff1])-note(n599,78,93778,94522,66,0,0).
+snote(n711-1,[D,#],3,25:1,0,1/16,96.0000,96.2500,[v5,staff2])-note(n600,51,93787,94046,46,0,0).
+snote(n712-1,[F,#],3,25:1,1/16,1/16,96.2500,96.5000,[v5,staff2])-note(n601,54,94016,94069,44,0,0).
+snote(n695-1,[A,#],5,25:1,1/8,1/8,96.5000,97.0000,[v1,staff1])-note(n602,82,94257,95025,76,0,0).
+snote(n701-1,[C,#],5,25:1,1/8,1/8,96.5000,97.0000,[v2,staff1])-note(n604,73,94276,95283,60,0,0).
+snote(n713-1,[F,#],3,25:1,1/8,1/16,96.5000,96.7500,[v5,staff2])-note(n603,54,94262,94504,47,0,0).
+snote(n714-1,[D,#],3,25:1,3/16,1/16,96.7500,97.0000,[v5,staff2])-note(n605,51,94479,94548,56,0,0).
+snote(n696-1,[G,#],5,25:2,0,1/8,97.0000,97.5000,[v1,staff1])-note(n606,80,94722,95117,82,0,0).
+snote(n702-1,[D,#],5,25:2,0,5/16,97.0000,98.2500,[v2,staff1])-note(n608,75,94746,95966,65,0,0).
+snote(n715-1,[B,n],2,25:2,0,1/16,97.0000,97.2500,[v5,staff2])-note(n607,47,94746,95016,56,0,0).
+snote(n716-1,[D,#],3,25:2,1/16,1/16,97.2500,97.5000,[v5,staff2])-note(n609,51,94958,95038,65,0,0).
+snote(n697-1,[F,#],5,25:2,1/8,1/8,97.5000,98.0000,[v1,staff1])-note(n611,78,95216,95599,84,0,0).
+snote(n717-1,[D,#],3,25:2,1/8,1/16,97.5000,97.7500,[v5,staff2])-note(n610,51,95211,95402,62,0,0).
+snote(n718-1,[B,n],2,25:2,3/16,1/16,97.7500,98.0000,[v5,staff2])-note(n612,47,95435,95507,61,0,0).
+snote(n698-1,[E,#],5,25:3,0,1/4,98.0000,99.0000,[v1,staff1])-note(n614,77,95704,96501,75,0,0).
+snote(n719-1,[C,#],3,25:3,0,1/8,98.0000,98.5000,[v5,staff2])-note(n613,49,95700,96131,60,0,0).
+snote(n704-1,[G,#],4,25:3,1/16,1/16,98.2500,98.5000,[v2,staff1])-note(n615,68,95937,95992,65,0,0).
+snote(n705-1,[G,#],4,25:3,1/8,1/16,98.5000,98.7500,[v2,staff1])-note(n617,68,96202,96461,69,0,0).
+snote(n720-1,[C,#],2,25:3,1/8,1/8,98.5000,99.0000,[v5,staff2])-note(n616,37,96202,96672,49,0,0).
+snote(n706-1,[C,#],5,25:3,3/16,1/16,98.7500,99.0000,[v2,staff1])-note(n618,73,96410,96487,65,0,0).
+snote(n699-1,[E,n],5,25:4,0,5/16,99.0000,100.2500,[v1,staff1])-note(n619,76,96658,97600,81,0,0).
+snote(n707-1,[C,#],5,25:4,0,1/16,99.0000,99.2500,[v2,staff1])-note(n620,73,96677,97128,71,0,0).
+snote(n708-1,[G,#],4,25:4,1/16,1/16,99.2500,99.5000,[v2,staff1])-note(n621,68,96892,96956,66,0,0).
+snote(n709-1,[G,#],4,25:4,1/8,1/16,99.5000,99.7500,[v2,staff1])-note(n623,68,97162,97380,68,0,0).
+snote(n722-1,[C,#],4,25:4,1/8,1/16,99.5000,99.7500,[v5,staff2])-note(n622,61,97146,97383,63,0,0).
+snote(n710-1,[B,n],4,25:4,3/16,1/16,99.7500,100.0000,[v2,staff1])-note(n624,71,97376,97670,69,0,0).
+snote(n723-1,[B,n],3,25:4,3/16,1/16,99.7500,100.0000,[v5,staff2])-note(n625,59,97380,97685,71,0,0).
+snote(n740-1,[A,#],4,26:1,0,1/2,100.0000,102.0000,[v2,staff1])-note(n627,70,97668,99369,64,0,0).
+snote(n742-1,[C,#],4,26:1,0,1/8,100.0000,100.5000,[v5,staff2])-note(n626,61,97662,98158,66,0,0).
+snote(n725-1,[C,#],5,26:1,1/16,1/16,100.2500,100.5000,[v1,staff1])-note(n628,73,97879,97955,70,0,0).
+snote(n726-1,[C,#],5,26:1,1/8,1/16,100.5000,100.7500,[v1,staff1])-note(n630,73,98158,98379,61,0,0).
+snote(n743-1,[F,#],3,26:1,1/8,1/8,100.5000,101.0000,[v5,staff2])-note(n629,54,98136,98682,69,0,0).
+snote(n727-1,[E,n],5,26:1,3/16,1/16,100.7500,101.0000,[v1,staff1])-note(n631,76,98370,98441,69,0,0).
+snote(n728-1,[D,#],5,26:2,0,1/16,101.0000,101.2500,[v1,staff1])-note(n633,75,98636,98848,60,0,0).
+snote(n744-1,[B,n],3,26:2,0,1/8,101.0000,101.5000,[v5,staff2])-note(n632,59,98616,99094,68,0,0).
+snote(n729-1,[B,n],4,26:2,1/16,1/16,101.2500,101.5000,[v1,staff1])-note(n634,71,98837,98888,61,0,0).
+snote(n730-1,[B,n],4,26:2,1/8,1/16,101.5000,101.7500,[v1,staff1])-note(n636,71,99115,99346,57,0,0).
+snote(n745-1,[A,#],3,26:2,1/8,1/8,101.5000,102.0000,[v5,staff2])-note(n635,58,99094,99639,65,0,0).
+snote(n731-1,[D,#],5,26:2,3/16,1/16,101.7500,102.0000,[v1,staff1])-note(n637,75,99324,99373,56,0,0).
+snote(n732-1,[D,#],5,26:3,0,1/16,102.0000,102.2500,[v1,staff1])-note(n639,75,99591,99839,60,0,0).
+snote(n741-1,[G,#],4,26:3,0,1/2,102.0000,104.0000,[v2,staff1])-note(n640,68,99595,101307,59,0,0).
+snote(n746-1,[B,n],3,26:3,0,1/8,102.0000,102.5000,[v5,staff2])-note(n638,59,99582,100134,56,0,0).
+snote(n733-1,[B,n],4,26:3,1/16,1/16,102.2500,102.5000,[v1,staff1])-note(n641,71,99824,99879,54,0,0).
+snote(n734-1,[B,n],4,26:3,1/8,1/16,102.5000,102.7500,[v1,staff1])-note(n643,71,100090,100294,52,0,0).
+snote(n747-1,[E,#],3,26:3,1/8,1/8,102.5000,103.0000,[v5,staff2])-note(n642,53,100081,100565,52,0,0).
+snote(n735-1,[D,#],5,26:3,3/16,1/16,102.7500,103.0000,[v1,staff1])-note(n644,75,100287,100346,59,0,0).
+snote(n736-1,[C,#],5,26:4,0,1/16,103.0000,103.2500,[v1,staff1])-note(n646,73,100558,100783,56,0,0).
+snote(n748-1,[A,#],3,26:4,0,1/8,103.0000,103.5000,[v5,staff2])-note(n645,58,100546,101043,55,0,0).
+snote(n737-1,[A,#],4,26:4,1/16,1/16,103.2500,103.5000,[v1,staff1])-note(n647,70,100772,100811,60,0,0).
+snote(n738-1,[A,#],4,26:4,1/8,1/16,103.5000,103.7500,[v1,staff1])-note(n649,70,101043,101299,61,0,0).
+snote(n749-1,[G,#],3,26:4,1/8,1/8,103.5000,104.0000,[v5,staff2])-note(n648,56,101035,101539,56,0,0).
+snote(n739-1,[C,#],5,26:4,3/16,1/16,103.7500,104.0000,[v1,staff1])-note(n650,73,101264,101312,61,0,0).
+snote(n750-1,[C,#],5,27:1,0,1/16,104.0000,104.2500,[v1,staff1])-note(n653,73,101528,101786,62,0,0).
+snote(n766-1,[F,#],4,27:1,0,1/2,104.0000,106.0000,[v2,staff1])-note(n652,66,101528,103244,64,0,0).
+snote(n768-1,[A,#],3,27:1,0,1/8,104.0000,104.5000,[v5,staff2])-note(n651,58,101521,102123,53,0,0).
+snote(n751-1,[A,#],4,27:1,1/16,1/16,104.2500,104.5000,[v1,staff1])-note(n654,70,101777,101827,46,0,0).
+snote(n752-1,[A,#],4,27:1,1/8,1/16,104.5000,104.7500,[v1,staff1])-note(n656,70,102046,102243,53,0,0).
+snote(n769-1,[D,#],3,27:1,1/8,1/8,104.5000,105.0000,[v5,staff2])-note(n655,51,102041,102593,49,0,0).
+snote(n753-1,[C,#],5,27:1,3/16,1/16,104.7500,105.0000,[v1,staff1])-note(n657,73,102238,102286,66,0,0).
+snote(n754-1,[B,n],4,27:2,0,1/16,105.0000,105.2500,[v1,staff1])-note(n658,71,102510,102694,54,0,0).
+snote(n770-1,[G,#],3,27:2,0,1/8,105.0000,105.5000,[v5,staff2])-note(n659,56,102514,103030,49,0,0).
+snote(n755-1,[G,#],4,27:2,1/16,1/16,105.2500,105.5000,[v1,staff1])-note(n660,68,102718,102758,62,0,0).
+snote(n756-1,[G,#],4,27:2,1/8,1/16,105.5000,105.7500,[v1,staff1])-note(n662,68,102986,103186,53,0,0).
+snote(n771-1,[F,#],3,27:2,1/8,1/8,105.5000,106.0000,[v5,staff2])-note(n661,54,102975,103495,48,0,0).
+snote(n757-1,[B,n],4,27:2,3/16,1/16,105.7500,106.0000,[v1,staff1])-note(n663,71,103186,103229,56,0,0).
+snote(n758-1,[B,n],4,27:3,0,1/16,106.0000,106.2500,[v1,staff1])-note(n665,71,103455,103753,52,0,0).
+snote(n767-1,[E,#],4,27:3,0,1/4,106.0000,107.0000,[v2,staff1])-note(n666,65,103460,104799,50,0,0).
+snote(n772-1,[G,#],3,27:3,0,1/8,106.0000,106.5000,[v5,staff2])-note(n664,56,103455,103991,42,0,0).
+snote(n759-1,[G,#],4,27:3,1/16,1/16,106.2500,106.5000,[v1,staff1])-note(n667,68,103678,103723,52,0,0).
+snote(n760-1,[G,#],4,27:3,1/8,1/16,106.5000,106.7500,[v1,staff1])-note(n669,68,103949,104132,47,0,0).
+snote(n773-1,[C,#],3,27:3,1/8,1/8,106.5000,107.0000,[v5,staff2])-note(n668,49,103936,104470,36,0,0).
+snote(n761-1,[B,n],4,27:3,3/16,1/16,106.7500,107.0000,[v1,staff1])-note(n670,71,104137,104189,58,0,0).
+snote(n762-1,[A,#],4,27:4,0,1/16,107.0000,107.2500,[v1,staff1])-note(n671,70,104408,104655,50,0,0).
+snote(n774-1,[F,#],3,27:4,0,1/8,107.0000,107.5000,[v5,staff2])-note(n672,54,104415,104859,42,0,0).
+snote(n763-1,[B,n],4,27:4,1/16,1/16,107.2500,107.5000,[v1,staff1])-note(n673,71,104621,104888,50,0,0).
+snote(n764-1,[C,#],5,27:4,1/8,1/16,107.5000,107.7500,[v1,staff1])-note(n675,73,104883,105085,52,0,0).
+snote(n775-1,[E,#],3,27:4,1/8,1/8,107.5000,108.0000,[v5,staff2])-note(n674,53,104879,105160,39,0,0).
+snote(n765-1,[G,#],4,27:4,3/16,1/16,107.7500,108.0000,[v1,staff1])-note(n676,68,105091,105427,57,0,0).
+snote(n776-1,[A,#],4,28:1,0,1/8,108.0000,108.5000,[v1,staff1])-note(n678,70,105358,105851,52,0,0).
+snote(n806-1,[F,#],3,28:1,0,1/16,108.0000,108.2500,[v5,staff2])-note(n677,54,105358,105642,44,0,0).
+snote(n807-1,[A,#],3,28:1,1/16,1/16,108.2500,108.5000,[v5,staff2])-note(n679,58,105600,105659,52,0,0).
+snote(n777-1,[C,#],5,28:1,1/8,1/8,108.5000,109.0000,[v1,staff1])-note(n681,73,105840,106335,65,0,0).
+snote(n789-1,[F,#],4,28:1,1/8,1/8,108.5000,109.0000,[v2,staff1])-note(n682,66,105855,106116,56,0,0).
+snote(n808-1,[A,#],3,28:1,1/8,1/16,108.5000,108.7500,[v5,staff2])-note(n680,58,105840,106149,45,0,0).
+snote(n809-1,[F,#],3,28:1,3/16,1/16,108.7500,109.0000,[v5,staff2])-note(n683,54,106068,106227,49,0,0).
+snote(n778-1,[D,#],5,28:2,0,1/8,109.0000,109.5000,[v1,staff1])-note(n686,75,106335,106715,60,0,0).
+snote(n790-1,[B,n],4,28:2,0,1/8,109.0000,109.5000,[v2,staff1])-note(n685,71,106330,106847,67,0,0).
+snote(n810-1,[D,#],3,28:2,0,1/16,109.0000,109.2500,[v5,staff2])-note(n684,51,106330,106445,51,0,0).
+snote(n811-1,[F,#],3,28:2,1/16,1/16,109.2500,109.5000,[v5,staff2])-note(n687,54,106541,106597,58,0,0).
+snote(n779-1,[E,n],5,28:2,1/8,3/16,109.5000,110.2500,[v1,staff1])-note(n689,76,106806,107439,65,0,0).
+snote(n791-1,[A,#],4,28:2,1/8,1/8,109.5000,110.0000,[v2,staff1])-note(n688,70,106806,107259,70,0,0).
+snote(n812-1,[F,#],3,28:2,1/8,1/16,109.5000,109.7500,[v5,staff2])-note(n690,54,106821,107008,53,0,0).
+snote(n813-1,[D,#],3,28:2,3/16,1/16,109.7500,110.0000,[v5,staff2])-note(n691,51,107020,107214,62,0,0).
+snote(n792-1,[B,n],4,28:3,0,1/8,110.0000,110.5000,[v2,staff1])-note(n692,71,107270,107724,65,0,0).
+snote(n814-1,[B,n],2,28:3,0,1/8,110.0000,110.5000,[v5,staff2])-note(n693,47,107282,107959,46,0,0).
+snote(n781-1,[D,#],5,28:3,1/16,1/16,110.2500,110.5000,[v1,staff1])-note(n694,75,107494,107684,60,0,0).
+snote(n782-1,[C,#],5,28:3,1/8,1/16,110.5000,110.7500,[v1,staff1])-note(n695,73,107732,107953,59,0,0).
+snote(n793-1,[A,#],4,28:3,1/8,1/16,110.5000,110.7500,[v2,staff1])-note(n696,70,107738,107922,59,0,0).
+snote(n783-1,[E,n],5,28:3,3/16,1/16,110.7500,111.0000,[v1,staff1])-note(n698,76,107973,108304,52,0,0).
+snote(n794-1,[G,#],4,28:3,3/16,1/16,110.7500,111.0000,[v2,staff1])-note(n697,68,107959,108189,61,0,0).
+snote(n784-1,[D,#],5,28:4,0,1/16,111.0000,111.2500,[v1,staff1])-note(n700,75,108208,108449,57,0,0).
+snote(n795-1,[F,#],4,28:4,0,3/16,111.0000,111.7500,[v2,staff1,inverted-mordent])-note(n699,66,108201,108862,61,0,0).
+snote(n798-1,[G,#],4,28:4,0,3/128,111.0000,111.0938,[v4,staff1])-deletion.
+snote(n799-1,[F,#],4,28:4,3/128,3/128,111.0938,111.1875,[v4,staff1])-deletion.
+snote(n800-1,[G,#],4,28:4,3/64,3/128,111.1875,111.2812,[v4,staff1])-deletion.
+snote(n785-1,[B,n],4,28:4,1/16,1/16,111.2500,111.5000,[v1,staff1])-note(n701,71,108422,108464,63,0,0).
+snote(n801-1,[F,#],4,28:4,9/128,3/128,111.2812,111.3750,[v4,staff1])-deletion.
+snote(n802-1,[G,#],4,28:4,3/32,3/128,111.3750,111.4688,[v4,staff1])-deletion.
+snote(n803-1,[F,#],4,28:4,15/128,3/128,111.4688,111.5625,[v4,staff1])-deletion.
+snote(n786-1,[B,n],4,28:4,1/8,1/16,111.5000,111.7500,[v1,staff1])-note(n703,71,108676,108934,66,0,0).
+snote(n817-1,[B,n],3,28:4,1/8,1/8,111.5000,112.0000,[v5,staff2])-note(n702,59,108668,108776,52,0,0).
+snote(n804-1,[G,#],4,28:4,9/64,3/128,111.5625,111.6562,[v4,staff1])-deletion.
+snote(n805-1,[F,#],4,28:4,21/128,3/128,111.6562,111.7500,[v4,staff1])-deletion.
+snote(n787-1,[D,#],5,28:4,3/16,1/16,111.7500,112.0000,[v1,staff1])-note(n705,75,108904,108951,54,0,0).
+snote(n796-1,[E,n],4,28:4,3/16,1/32,111.7500,111.8750,[v2,staff1])-note(n704,64,108878,108987,66,0,0).
+snote(n797-1,[F,#],4,28:4,7/32,1/32,111.8750,112.0000,[v2,staff1])-note(n706,66,109017,109073,66,0,0).
+snote(n818-1,[E,n],5,29:1,0,1/16,112.0000,112.2500,[v1,staff1])-note(n708,76,109135,109360,69,0,0).
+snote(n834-1,[G,#],4,29:1,0,1/4,112.0000,113.0000,[v2,staff1])-note(n707,68,109135,110206,66,0,0).
+snote(n841-1,[B,n],3,29:1,0,17/16,112.0000,116.2500,[v5,staff2])-note(n709,59,109150,112896,56,0,0).
+snote(n819-1,[B,n],4,29:1,1/16,1/16,112.2500,112.5000,[v1,staff1])-note(n710,71,109356,109400,66,0,0).
+snote(n820-1,[B,n],4,29:1,1/8,1/16,112.5000,112.7500,[v1,staff1])-note(n711,71,109612,109868,70,0,0).
+snote(n821-1,[E,n],5,29:1,3/16,1/16,112.7500,113.0000,[v1,staff1])-note(n712,76,109833,109880,66,0,0).
+snote(n822-1,[F,#],5,29:2,0,1/16,113.0000,113.2500,[v1,staff1])-note(n713,78,110071,110337,70,0,0).
+snote(n823-1,[B,n],4,29:2,1/16,1/16,113.2500,113.5000,[v1,staff1])-note(n714,71,110308,110344,63,0,0).
+snote(n824-1,[B,n],4,29:2,1/8,1/16,113.5000,113.7500,[v1,staff1])-note(n715,71,110568,110832,69,0,0).
+snote(n836-1,[F,#],4,29:2,1/8,1/8,113.5000,114.0000,[v2,staff1])-note(n716,66,110580,111083,58,0,0).
+snote(n825-1,[F,#],5,29:2,3/16,1/16,113.7500,114.0000,[v1,staff1])-note(n717,78,110791,110852,67,0,0).
+snote(n826-1,[G,#],5,29:3,0,1/16,114.0000,114.2500,[v1,staff1])-note(n718,80,111045,111307,64,0,0).
+snote(n837-1,[E,n],4,29:3,0,1/8,114.0000,114.5000,[v2,staff1])-note(n719,64,111056,111601,62,0,0).
+snote(n827-1,[B,n],4,29:3,1/16,1/16,114.2500,114.5000,[v1,staff1])-note(n720,71,111297,111337,61,0,0).
+snote(n828-1,[B,n],4,29:3,1/8,1/16,114.5000,114.7500,[v1,staff1])-note(n722,71,111542,111780,63,0,0).
+snote(n838-1,[D,#],4,29:3,1/8,1/8,114.5000,115.0000,[v2,staff1])-note(n721,63,111533,112003,55,0,0).
+snote(n829-1,[G,#],5,29:3,3/16,1/16,114.7500,115.0000,[v1,staff1])-note(n723,80,111743,111789,62,0,0).
+snote(n830-1,[A,#],5,29:4,0,1/16,115.0000,115.2500,[v1,staff1])-note(n725,82,112016,112295,57,0,0).
+snote(n839-1,[C,#],4,29:4,0,1/8,115.0000,115.5000,[v2,staff1])-note(n724,61,112012,112478,49,0,0).
+snote(n831-1,[B,n],4,29:4,1/16,1/16,115.2500,115.5000,[v1,staff1])-note(n726,71,112255,112304,59,0,0).
+snote(n832-1,[B,n],4,29:4,1/8,1/16,115.5000,115.7500,[v1,staff1])-note(n728,71,112516,112754,55,0,0).
+snote(n840-1,[F,#],4,29:4,1/8,1/8,115.5000,116.0000,[v2,staff1])-note(n727,66,112516,112952,47,0,0).
+snote(n833-1,[A,#],5,29:4,3/16,1/16,115.7500,116.0000,[v1,staff1])-note(n729,82,112734,112787,51,0,0).
+snote(n842-1,[B,n],5,30:1,0,1/8,116.0000,116.5000,[v1,staff1])-note(n730,83,112990,113196,51,0,0).
+snote(n849-1,[D,#],4,30:1,0,1/8,116.0000,116.5000,[v2,staff1])-note(n731,63,113013,113242,48,0,0).
+snote(n857-1,[A,#],3,30:1,1/16,1/16,116.2500,116.5000,[v5,staff2])-note(n732,58,113253,113476,46,0,0).
+snote(n850-1,[D,#],4,30:1,1/8,1/8,116.5000,117.0000,[v2,staff1])-note(n734,63,113483,113993,58,0,0).
+snote(n858-1,[G,#],3,30:1,1/8,1/16,116.5000,116.7500,[v5,staff2])-note(n733,56,113483,113696,50,0,0).
+snote(n859-1,[F,#],3,30:1,3/16,1/16,116.7500,117.0000,[v5,staff2])-note(n735,54,113710,113925,53,0,0).
+snote(n851-1,[G,#],4,30:2,0,1/8,117.0000,117.5000,[v2,staff1])-note(n737,68,113981,114511,63,0,0).
+snote(n860-1,[E,n],3,30:2,0,1/16,117.0000,117.2500,[v5,staff2])-note(n736,52,113966,114231,51,0,0).
+snote(n861-1,[C,#],4,30:2,1/16,1/16,117.2500,117.5000,[v5,staff2])-note(n738,61,114187,114236,52,0,0).
+snote(n852-1,[F,x],4,30:2,1/8,1/8,117.5000,118.0000,[v2,staff1])-note(n740,67,114447,114922,59,0,0).
+snote(n862-1,[C,#],4,30:2,1/8,1/16,117.5000,117.7500,[v5,staff2])-note(n739,61,114433,114678,48,0,0).
+snote(n863-1,[E,n],3,30:2,3/16,1/16,117.7500,118.0000,[v5,staff2])-note(n741,52,114662,114742,52,0,0).
+snote(n853-1,[G,#],4,30:3,0,1/4,118.0000,119.0000,[v2,staff1])-note(n743,68,114937,115931,58,0,0).
+snote(n864-1,[D,#],3,30:3,0,1/16,118.0000,118.2500,[v5,staff2])-note(n742,51,114933,115215,49,0,0).
+snote(n865-1,[B,n],3,30:3,1/16,1/16,118.2500,118.5000,[v5,staff2])-note(n744,59,115174,115227,52,0,0).
+snote(n846-1,[D,#],5,30:3,1/8,1/8,118.5000,119.0000,[v1,staff1])-note(n745,75,115424,116308,60,0,0).
+snote(n866-1,[B,n],3,30:3,1/8,1/16,118.5000,118.7500,[v5,staff2])-note(n746,59,115435,115637,54,0,0).
+snote(n867-1,[D,#],3,30:3,3/16,1/16,118.7500,119.0000,[v5,staff2])-note(n747,51,115655,115728,57,0,0).
+snote(n847-1,[G,#],5,30:4,0,1/8,119.0000,119.5000,[v1,staff1])-note(n748,80,115902,116433,65,0,0).
+snote(n868-1,[C,#],3,30:4,0,1/16,119.0000,119.2500,[v5,staff2])-note(n749,49,115911,116184,47,0,0).
+snote(n869-1,[A,#],3,30:4,1/16,1/16,119.2500,119.5000,[v5,staff2])-note(n750,58,116139,116203,51,0,0).
+snote(n848-1,[F,x],5,30:4,1/8,1/8,119.5000,120.0000,[v1,staff1])-note(n751,79,116366,116784,71,0,0).
+snote(n855-1,[A,#],4,30:4,1/8,1/8,119.5000,120.0000,[v2,staff1])-note(n752,70,116385,116816,56,0,0).
+snote(n870-1,[A,#],3,30:4,1/8,1/16,119.5000,119.7500,[v5,staff2])-note(n753,58,116403,116592,47,0,0).
+snote(n871-1,[C,#],3,30:4,3/16,1/16,119.7500,120.0000,[v5,staff2])-note(n754,49,116606,116884,49,0,0).
+snote(n872-1,[G,#],5,31:1,0,1/8,120.0000,120.5000,[v1,staff1])-note(n755,80,116880,117459,67,0,0).
+snote(n880-1,[B,n],4,31:1,0,1/8,120.0000,120.5000,[v2,staff1])-note(n757,71,116895,117167,63,0,0).
+snote(n887-1,[B,n],2,31:1,0,1/16,120.0000,120.2500,[v5,staff2])-note(n756,47,116895,117145,46,0,0).
+snote(n888-1,[C,#],3,31:1,1/16,1/16,120.2500,120.5000,[v5,staff2])-note(n758,49,117121,117366,53,0,0).
+snote(n873-1,[A,#],5,31:1,1/8,1/8,120.5000,121.0000,[v1,staff1])-note(n759,82,117366,117834,75,0,0).
+snote(n881-1,[C,#],5,31:1,1/8,1/8,120.5000,121.0000,[v2,staff1])-note(n761,73,117388,117660,63,0,0).
+snote(n889-1,[B,n],2,31:1,1/8,1/16,120.5000,120.7500,[v5,staff2])-note(n760,47,117379,117612,53,0,0).
+snote(n890-1,[A,#],2,31:1,3/16,1/16,120.7500,121.0000,[v5,staff2])-note(n762,46,117598,117848,62,0,0).
+snote(n874-1,[B,n],5,31:2,0,1/8,121.0000,121.5000,[v1,staff1])-note(n763,83,117852,118250,73,0,0).
+snote(n882-1,[D,#],5,31:2,0,1/8,121.0000,121.5000,[v2,staff1])-note(n765,75,117886,118049,58,0,0).
+snote(n891-1,[G,#],2,31:2,0,1/16,121.0000,121.2500,[v5,staff2])-note(n764,44,117867,118186,60,0,0).
+snote(n892-1,[A,#],2,31:2,1/16,1/16,121.2500,121.5000,[v5,staff2])-note(n766,46,118082,118319,66,0,0).
+snote(n875-1,[G,#],5,31:2,1/8,1/8,121.5000,122.0000,[v1,staff1])-note(n767,80,118319,118521,79,0,0).
+snote(n883-1,[B,n],4,31:2,1/8,1/8,121.5000,122.0000,[v2,staff1])-note(n769,71,118340,118490,65,0,0).
+snote(n893-1,[B,n],2,31:2,1/8,1/16,121.5000,121.7500,[v5,staff2])-note(n768,47,118327,118507,56,0,0).
+snote(n894-1,[G,#],2,31:2,3/16,1/16,121.7500,122.0000,[v5,staff2])-note(n770,44,118551,118894,58,0,0).
+snote(n876-1,[E,#],5,31:3,0,1/8,122.0000,122.5000,[v1,staff1])-note(n771,77,118804,119365,69,0,0).
+snote(n884-1,[G,#],4,31:3,0,1/4,122.0000,123.0000,[v2,staff1])-note(n773,68,118834,119983,51,0,0).
+snote(n895-1,[C,#],3,31:3,0,1/16,122.0000,122.2500,[v5,staff2])-note(n772,49,118809,119014,50,0,0).
+snote(n896-1,[D,#],3,31:3,1/16,1/16,122.2500,122.5000,[v5,staff2])-note(n774,51,119031,119298,53,0,0).
+snote(n877-1,[C,#],5,31:3,1/8,1/8,122.5000,123.0000,[v1,staff1])-note(n775,73,119274,119980,68,0,0).
+snote(n897-1,[C,#],3,31:3,1/8,1/16,122.5000,122.7500,[v5,staff2])-note(n776,49,119287,119492,48,0,0).
+snote(n898-1,[B,n],2,31:3,3/16,1/16,122.7500,123.0000,[v5,staff2])-note(n777,47,119512,119752,50,0,0).
+snote(n878-1,[F,#],5,31:4,0,1/8,123.0000,123.5000,[v1,staff1])-note(n778,78,119773,120391,78,0,0).
+snote(n899-1,[A,#],2,31:4,0,1/16,123.0000,123.2500,[v5,staff2])-note(n779,46,119778,119999,49,0,0).
+snote(n900-1,[B,n],2,31:4,1/16,1/16,123.2500,123.5000,[v5,staff2])-note(n780,47,119988,120255,58,0,0).
+snote(n879-1,[E,#],5,31:4,1/8,1/8,123.5000,124.0000,[v1,staff1])-note(n781,77,120248,120742,80,0,0).
+snote(n886-1,[C,#],5,31:4,1/8,1/8,123.5000,124.0000,[v2,staff1])-note(n783,73,120282,120775,56,0,0).
+snote(n901-1,[C,#],3,31:4,1/8,1/16,123.5000,123.7500,[v5,staff2])-note(n782,49,120265,120404,52,0,0).
+snote(n902-1,[A,#],2,31:4,3/16,1/16,123.7500,124.0000,[v5,staff2])-note(n784,46,120471,120899,52,0,0).
+snote(n903-1,[F,#],5,32:1,0,1/8,124.0000,124.5000,[v1,staff1])-note(n786,78,120720,121257,76,0,0).
+snote(n912-1,[A,#],4,32:1,0,1/4,124.0000,125.0000,[v2,staff1])-note(n787,70,120737,121488,50,0,0).
+snote(n930-1,[D,#],3,32:1,0,1/16,124.0000,124.2500,[v5,staff2])-note(n785,51,120716,120954,62,0,0).
+snote(n931-1,[E,#],3,32:1,1/16,1/16,124.2500,124.5000,[v5,staff2])-note(n788,53,120954,121203,61,0,0).
+snote(n904-1,[E,#],5,32:1,1/8,1/16,124.5000,124.7500,[v1,staff1])-note(n790,77,121214,121459,77,0,0).
+snote(n932-1,[F,#],3,32:1,1/8,3/16,124.5000,125.2500,[v5,staff2])-note(n789,54,121209,121925,60,0,0).
+snote(n905-1,[D,#],5,32:1,3/16,1/16,124.7500,125.0000,[v1,staff1])-note(n791,75,121453,121685,71,0,0).
+snote(n906-1,[C,#],5,32:2,0,3/16,125.0000,125.7500,[v1,staff1,inverted-mordent])-note(n792,73,121683,121910,75,0,0).
+snote(n922-1,[D,#],5,32:2,0,3/128,125.0000,125.0938,[v3,staff1])-deletion.
+snote(n923-1,[C,#],5,32:2,3/128,3/128,125.0938,125.1875,[v3,staff1])-deletion.
+snote(n924-1,[D,#],5,32:2,3/64,3/128,125.1875,125.2812,[v3,staff1])-note(n793,75,121916,122029,66,0,0).
+snote(n934-1,[E,#],3,32:2,1/16,1/16,125.2500,125.5000,[v5,staff2])-note(n794,53,121934,122121,55,0,0).
+snote(n925-1,[C,#],5,32:2,9/128,3/128,125.2812,125.3750,[v3,staff1])-deletion.
+snote(n926-1,[D,#],5,32:2,3/32,3/128,125.3750,125.4688,[v3,staff1])-deletion.
+snote(n927-1,[C,#],5,32:2,15/128,3/128,125.4688,125.5625,[v3,staff1])-note(n795,73,122038,122118,72,0,0).
+snote(n914-1,[A,#],4,32:2,1/8,1/8,125.5000,126.0000,[v2,staff1])-note(n797,70,122148,122194,55,0,0).
+snote(n935-1,[D,#],3,32:2,1/8,1/16,125.5000,125.7500,[v5,staff2])-note(n796,51,122138,122359,56,0,0).
+snote(n928-1,[D,#],5,32:2,9/64,3/128,125.5625,125.6562,[v3,staff1])-note(n798,75,122157,122311,70,0,0).
+snote(n929-1,[C,#],5,32:2,21/128,3/128,125.6562,125.7500,[v3,staff1])-note(n799,73,122249,122350,73,0,0).
+snote(n907-1,[B,n],4,32:2,3/16,1/32,125.7500,125.8750,[v1,staff1])-note(n800,71,122350,122451,71,0,0).
+snote(n936-1,[C,#],3,32:2,3/16,1/16,125.7500,126.0000,[v5,staff2])-note(n801,49,122378,122577,53,0,0).
+snote(n908-1,[C,#],5,32:2,7/32,1/32,125.8750,126.0000,[v1,staff1])-note(n802,73,122455,122597,71,0,0).
+snote(n909-1,[D,#],5,32:3,0,1/4,126.0000,127.0000,[v1,staff1])-note(n803,75,122597,123587,72,0,0).
+snote(n915-1,[G,#],4,32:3,0,1/16,126.0000,126.2500,[v2,staff1])-note(n805,68,122616,122812,53,0,0).
+snote(n937-1,[B,n],2,32:3,0,1/16,126.0000,126.2500,[v5,staff2])-note(n804,47,122608,122826,50,0,0).
+snote(n916-1,[E,#],4,32:3,1/16,1/16,126.2500,126.5000,[v2,staff1])-note(n806,65,122834,123089,59,0,0).
+snote(n938-1,[C,#],3,32:3,1/16,1/16,126.2500,126.5000,[v5,staff2])-note(n807,49,122845,123052,55,0,0).
+snote(n917-1,[F,#],4,32:3,1/8,1/16,126.5000,126.7500,[v2,staff1])-note(n808,66,123077,123305,64,0,0).
+snote(n939-1,[D,#],3,32:3,1/8,1/16,126.5000,126.7500,[v5,staff2])-note(n809,51,123083,123271,55,0,0).
+snote(n918-1,[A,#],4,32:3,3/16,1/16,126.7500,127.0000,[v2,staff1])-note(n810,70,123305,123812,64,0,0).
+snote(n940-1,[A,#],2,32:3,3/16,1/16,126.7500,127.0000,[v5,staff2])-note(n811,46,123310,123554,48,0,0).
+snote(n919-1,[G,#],4,32:4,0,1/16,127.0000,127.2500,[v2,staff1])-note(n813,68,123547,123827,67,0,0).
+snote(n941-1,[B,n],2,32:4,0,1/16,127.0000,127.2500,[v5,staff2])-note(n812,47,123540,123751,53,0,0).
+snote(n920-1,[E,#],4,32:4,1/16,1/16,127.2500,127.5000,[v2,staff1])-note(n815,65,123766,123822,56,0,0).
+snote(n942-1,[C,#],3,32:4,1/16,1/16,127.2500,127.5000,[v5,staff2])-note(n814,49,123757,123966,55,0,0).
+snote(n911-1,[C,#],5,32:4,1/8,1/8,127.5000,128.0000,[v1,staff1])-note(n816,73,124007,124263,80,0,0).
+snote(n921-1,[F,#],4,32:4,1/8,3/16,127.5000,128.2500,[v2,staff1])-note(n818,66,124041,124693,47,0,0).
+snote(n943-1,[D,#],3,32:4,1/8,1/16,127.5000,127.7500,[v5,staff2])-note(n817,51,124027,124243,51,0,0).
+snote(n944-1,[B,n],2,32:4,3/16,1/16,127.7500,128.0000,[v5,staff2])-note(n819,47,124232,124453,47,0,0).
+snote(n945-1,[B,n],4,33:1,0,1/8,128.0000,128.5000,[v1,staff1])-note(n821,71,124496,125016,78,0,0).
+snote(n963-1,[G,#],2,33:1,0,1/8,128.0000,128.5000,[v5,staff2])-note(n820,44,124496,125124,50,0,0).
+snote(n958-1,[E,#],4,33:1,1/16,1/16,128.2500,128.5000,[v2,staff1])-note(n822,65,124728,124908,52,0,0).
+snote(n946-1,[A,#],4,33:1,1/8,1/8,128.5000,129.0000,[v1,staff1])-note(n823,70,124967,125525,68,0,0).
+snote(n959-1,[F,#],4,33:1,1/8,1/4,128.5000,129.5000,[v2,staff1])-note(n825,66,125013,125075,46,0,0).
+snote(n964-1,[A,#],2,33:1,1/8,1/16,128.5000,128.7500,[v5,staff2])-note(n824,46,124987,125148,49,0,0).
+snote(n965-1,[B,n],2,33:1,3/16,1/16,128.7500,129.0000,[v5,staff2])-note(n826,47,125200,125462,46,0,0).
+snote(n947-1,[G,#],4,33:2,0,1/8,129.0000,129.5000,[v1,staff1])-note(n827,68,125490,126010,58,0,0).
+snote(n966-1,[C,#],3,33:2,0,1/8,129.0000,129.5000,[v5,staff2])-note(n828,49,125525,125944,35,0,0).
+snote(n948-1,[C,#],5,33:2,1/8,1/8,129.5000,130.0000,[v1,staff1])-note(n829,73,126006,126492,61,0,0).
+snote(n960-1,[E,#],4,33:2,1/8,1/8,129.5000,130.0000,[v2,staff1])-note(n831,65,126027,126138,40,0,0).
+snote(n967-1,[C,#],2,33:2,1/8,1/8,129.5000,130.0000,[v5,staff2])-note(n830,37,126022,126373,35,0,0).
+snote(n949-1,[A,#],4,33:3,0,1/16,130.0000,130.2500,[v1,staff1])-note(n832,70,126514,126793,58,0,0).
+snote(n961-1,[F,#],4,33:3,0,1/4,130.0000,131.0000,[v2,staff1])-note(n833,66,126542,127271,51,0,0).
+snote(n968-1,[F,#],2,33:3,0,1/8,130.0000,130.5000,[v5,staff2])-note(n834,42,126547,126820,37,0,0).
+snote(n950-1,[C,#],5,33:3,1/16,1/16,130.2500,130.5000,[v1,staff1])-note(n835,73,126760,126809,64,0,0).
+snote(n951-1,[C,#],5,33:3,1/8,1/16,130.5000,130.7500,[v1,staff1])-note(n836,73,127024,127285,70,0,0).
+snote(n969-1,[F,#],3,33:3,1/8,1/8,130.5000,131.0000,[v5,staff2])-note(n837,54,127029,127319,46,0,0).
+snote(n952-1,[A,#],4,33:3,3/16,1/16,130.7500,131.0000,[v1,staff1])-note(n838,70,127249,127301,61,0,0).
+snote(n953-1,[G,#],4,33:4,0,1/16,131.0000,131.2500,[v1,staff1])-note(n839,68,127497,127732,66,0,0).
+snote(n970-1,[E,#],3,33:4,0,1/8,131.0000,131.5000,[v5,staff2])-note(n840,53,127504,127751,43,0,0).
+snote(n954-1,[C,#],5,33:4,1/16,1/16,131.2500,131.5000,[v1,staff1])-note(n841,73,127727,127780,60,0,0).
+snote(n955-1,[C,#],5,33:4,1/8,1/16,131.5000,131.7500,[v1,staff1])-note(n842,73,127974,128217,71,0,0).
+snote(n962-1,[E,#],4,33:4,1/8,1/8,131.5000,132.0000,[v2,staff1])-note(n844,65,127996,128192,42,0,0).
+snote(n971-1,[D,#],3,33:4,1/8,1/8,131.5000,132.0000,[v5,staff2])-deletion.
+insertion-note(n843,49,127989,128243,45,0,0).
+snote(n956-1,[G,#],4,33:4,3/16,1/16,131.7500,132.0000,[v1,staff1])-note(n845,68,128197,128247,58,0,0).
+snote(n972-1,[A,#],4,34:1,0,1/8,132.0000,132.5000,[v1,staff1])-note(n846,70,128454,129026,60,0,0).
+snote(n976-1,[F,#],4,34:1,0,1/4,132.0000,133.0000,[v2,staff1])-note(n847,66,128471,129599,51,0,0).
+snote(n987-1,[F,#],3,34:1,0,1/16,132.0000,132.2500,[v5,staff2])-note(n848,54,128474,128705,48,0,0).
+snote(n988-1,[A,#],3,34:1,1/16,1/16,132.2500,132.5000,[v5,staff2])-note(n849,58,128694,128747,54,0,0).
+snote(n973-1,[C,#],5,34:1,1/8,1/8,132.5000,133.0000,[v1,staff1])-note(n851,73,128947,129623,82,0,0).
+snote(n989-1,[A,#],3,34:1,1/8,1/16,132.5000,132.7500,[v5,staff2])-note(n850,58,128947,129148,49,0,0).
+snote(n990-1,[F,#],3,34:1,3/16,1/16,132.7500,133.0000,[v5,staff2])-note(n852,54,129173,129233,54,0,0).
+snote(n974-1,[F,#],5,34:2,0,1/2,133.0000,135.0000,[v1,staff1])-note(n853,78,129425,131224,83,0,0).
+snote(n991-1,[D,#],3,34:2,0,1/16,133.0000,133.2500,[v5,staff2])-note(n854,51,129445,129658,45,0,0).
+snote(n992-1,[F,#],3,34:2,1/16,1/16,133.2500,133.5000,[v5,staff2])-note(n855,54,129679,129724,50,0,0).
+snote(n978-1,[A,#],4,34:2,1/8,1/8,133.5000,134.0000,[v2,staff1])-note(n857,70,129921,130135,59,0,0).
+snote(n993-1,[F,#],3,34:2,1/8,1/16,133.5000,133.7500,[v5,staff2])-note(n856,54,129915,130172,39,0,0).
+snote(n994-1,[D,#],3,34:2,3/16,1/16,133.7500,134.0000,[v5,staff2])-note(n858,51,130142,130218,49,0,0).
+snote(n979-1,[G,#],4,34:3,0,1/16,134.0000,134.2500,[v2,staff1])-note(n860,68,130406,130644,64,0,0).
+snote(n995-1,[B,n],2,34:3,0,1/8,134.0000,134.5000,[v5,staff2])-note(n859,47,130404,130652,37,0,0).
+snote(n980-1,[D,#],5,34:3,1/16,1/16,134.2500,134.5000,[v2,staff1])-note(n861,75,130633,130684,57,0,0).
+snote(n981-1,[D,#],5,34:3,1/8,1/16,134.5000,134.7500,[v2,staff1])-note(n863,75,130929,131253,54,0,0).
+snote(n996-1,[G,#],2,34:3,1/8,1/8,134.5000,135.0000,[v5,staff2])-note(n862,44,130925,131215,42,0,0).
+snote(n982-1,[B,n],4,34:3,3/16,1/16,134.7500,135.0000,[v2,staff1])-note(n864,71,131180,131278,53,0,0).
+snote(n975-1,[E,#],5,34:4,0,1/4,135.0000,136.0000,[v1,staff1])-note(n865,77,131445,133022,67,0,0).
+snote(n983-1,[G,#],4,34:4,0,1/16,135.0000,135.2500,[v2,staff1])-note(n866,68,131468,131667,38,0,0).
+snote(n997-1,[C,#],3,34:4,0,1/8,135.0000,135.5000,[v5,staff2])-note(n867,49,131479,131797,37,0,0).
+snote(n984-1,[C,#],5,34:4,1/16,1/16,135.2500,135.5000,[v2,staff1])-note(n868,73,131723,131780,52,0,0).
+snote(n985-1,[C,#],5,34:4,1/8,1/16,135.5000,135.7500,[v2,staff1])-note(n869,73,132086,132466,44,0,0).
+snote(n998-1,[C,#],2,34:4,1/8,1/8,135.5000,136.0000,[v5,staff2])-note(n870,37,132094,132327,17,0,0).
+snote(n986-1,[B,n],4,34:4,3/16,1/16,135.7500,136.0000,[v2,staff1])-note(n871,71,132477,132805,51,0,0).
+snote(n999-1,[A,#],4,35:1,0,1,136.0000,140.0000,[v1,staff1,fermata])-note(n874,70,133359,136779,40,0,0).
+snote(n1000-1,[F,#],5,35:1,0,1,136.0000,140.0000,[v1,staff1])-note(n872,78,133336,137128,47,0,0).
+snote(n1001-1,[F,#],2,35:1,0,1,136.0000,140.0000,[v5,staff2,fermata])-note(n873,42,133359,138195,40,0,0).
+sustain(16513,31).
+sustain(16533,49).
+sustain(16552,59).
+sustain(16570,62).
+sustain(16612,63).
+sustain(16627,64).
+sustain(16647,65).
+sustain(16668,67).
+sustain(16686,69).
+sustain(16703,70).
+sustain(16724,71).
+sustain(16780,70).
+sustain(16821,69).
+sustain(16859,68).
+sustain(16879,67).
+sustain(16898,66).
+sustain(16917,65).
+sustain(16937,63).
+sustain(16958,62).
+sustain(16993,61).
+sustain(17011,58).
+sustain(17031,56).
+sustain(17051,53).
+sustain(17069,50).
+sustain(17088,44).
+sustain(17109,28).
+sustain(17127,0).
+sustain(36900,25).
+sustain(36921,38).
+sustain(36938,49).
+sustain(36960,59).
+sustain(36977,63).
+sustain(36995,64).
+sustain(37017,66).
+sustain(37035,68).
+sustain(37054,72).
+sustain(37073,76).
+sustain(37091,82).
+sustain(37111,88).
+sustain(37131,89).
+sustain(37206,87).
+sustain(37227,84).
+sustain(37247,78).
+sustain(37265,72).
+sustain(37285,65).
+sustain(37303,59).
+sustain(37324,52).
+sustain(37341,43).
+sustain(37363,34).
+sustain(37380,19).
+sustain(37399,0).
+sustain(41258,25).
+sustain(41278,38).
+sustain(41296,46).
+sustain(41316,54).
+sustain(41335,60).
+sustain(41355,61).
+sustain(41373,62).
+sustain(41395,63).
+sustain(41410,64).
+sustain(41546,63).
+sustain(41565,62).
+sustain(41584,60).
+sustain(41603,57).
+sustain(41623,51).
+sustain(41643,41).
+sustain(41662,25).
+sustain(41681,0).
+sustain(41756,16).
+sustain(41776,38).
+sustain(41798,50).
+sustain(41815,58).
+sustain(41833,62).
+sustain(41854,63).
+sustain(41890,64).
+sustain(41910,66).
+sustain(41930,68).
+sustain(41950,69).
+sustain(41989,68).
+sustain(42027,67).
+sustain(42044,65).
+sustain(42064,62).
+sustain(42082,57).
+sustain(42104,48).
+sustain(42122,35).
+sustain(42142,0).
+sustain(42198,27).
+sustain(42218,46).
+sustain(42236,57).
+sustain(42256,61).
+sustain(42278,62).
+sustain(42314,63).
+sustain(42334,64).
+sustain(42352,66).
+sustain(42374,68).
+sustain(42390,71).
+sustain(42409,73).
+sustain(42506,72).
+sustain(42526,71).
+sustain(42543,69).
+sustain(42563,65).
+sustain(42584,59).
+sustain(42601,49).
+sustain(42622,43).
+sustain(42643,41).
+sustain(42661,43).
+sustain(42680,50).
+sustain(42697,58).
+sustain(42718,62).
+sustain(42738,63).
+sustain(42754,64).
+sustain(42775,65).
+sustain(42797,66).
+sustain(42831,67).
+sustain(42873,69).
+sustain(43007,68).
+sustain(43025,66).
+sustain(43043,64).
+sustain(43063,61).
+sustain(43084,55).
+sustain(43107,49).
+sustain(43121,43).
+sustain(43138,42).
+sustain(43161,44).
+sustain(43179,51).
+sustain(43196,59).
+sustain(43219,62).
+sustain(43236,63).
+sustain(43256,64).
+sustain(43274,65).
+sustain(43332,66).
+sustain(43390,67).
+sustain(43466,66).
+sustain(43505,65).
+sustain(43523,63).
+sustain(43544,60).
+sustain(43560,55).
+sustain(43582,49).
+sustain(43620,52).
+sustain(43639,57).
+sustain(43659,62).
+sustain(43680,63).
+sustain(43697,64).
+sustain(43716,65).
+sustain(43733,66).
+sustain(43890,65).
+sustain(43926,64).
+sustain(43967,63).
+sustain(43984,60).
+sustain(44003,55).
+sustain(44022,47).
+sustain(44041,30).
+sustain(44059,0).
+sustain(53815,8).
+sustain(53833,40).
+sustain(53853,54).
+sustain(53872,60).
+sustain(53891,62).
+sustain(53911,63).
+sustain(53929,64).
+sustain(53950,65).
+sustain(53969,66).
+sustain(54139,65).
+sustain(54160,64).
+sustain(54180,61).
+sustain(54199,56).
+sustain(54220,47).
+sustain(54237,31).
+sustain(54257,0).
+sustain(54331,12).
+sustain(54351,40).
+sustain(54374,57).
+sustain(54389,63).
+sustain(54410,65).
+sustain(54430,67).
+sustain(54449,69).
+sustain(54466,72).
+sustain(54488,75).
+sustain(54508,78).
+sustain(54528,79).
+sustain(54582,78).
+sustain(54601,77).
+sustain(54620,76).
+sustain(54641,73).
+sustain(54659,69).
+sustain(54679,62).
+sustain(54697,53).
+sustain(54718,37).
+sustain(54737,23).
+sustain(54755,18).
+sustain(54773,24).
+sustain(54795,39).
+sustain(54812,53).
+sustain(54832,61).
+sustain(54851,64).
+sustain(54871,65).
+sustain(54908,66).
+sustain(54930,68).
+sustain(54950,71).
+sustain(54967,75).
+sustain(54986,78).
+sustain(55003,79).
+sustain(55082,78).
+sustain(55101,77).
+sustain(55121,76).
+sustain(55139,72).
+sustain(55159,67).
+sustain(55179,62).
+sustain(55197,57).
+sustain(55217,50).
+sustain(55237,39).
+sustain(55257,12).
+sustain(55274,0).
+sustain(55407,44).
+sustain(55431,58).
+sustain(55451,63).
+sustain(55464,65).
+sustain(55487,67).
+sustain(55504,69).
+sustain(55524,71).
+sustain(55542,73).
+sustain(55599,72).
+sustain(55619,71).
+sustain(55637,68).
+sustain(55658,64).
+sustain(55677,56).
+sustain(55697,48).
+sustain(55720,33).
+sustain(55734,0).
+sustain(55790,20).
+sustain(55811,43).
+sustain(55831,59).
+sustain(55850,63).
+sustain(55867,65).
+sustain(55887,67).
+sustain(55906,69).
+sustain(55926,74).
+sustain(55948,79).
+sustain(55966,83).
+sustain(55984,85).
+sustain(56004,86).
+sustain(56022,87).
+sustain(56061,86).
+sustain(56080,85).
+sustain(56099,82).
+sustain(56118,79).
+sustain(56138,73).
+sustain(56156,66).
+sustain(56177,59).
+sustain(56195,51).
+sustain(56212,42).
+sustain(56234,25).
+sustain(56253,10).
+sustain(56273,13).
+sustain(56289,29).
+sustain(56310,47).
+sustain(56328,59).
+sustain(56350,63).
+sustain(56368,65).
+sustain(56389,68).
+sustain(56406,74).
+sustain(56426,81).
+sustain(56446,88).
+sustain(56464,91).
+sustain(56484,92).
+sustain(56563,91).
+sustain(56580,90).
+sustain(56600,87).
+sustain(56620,81).
+sustain(56640,71).
+sustain(56660,59).
+sustain(56680,46).
+sustain(56698,31).
+sustain(56717,19).
+sustain(56735,20).
+sustain(56753,33).
+sustain(56775,48).
+sustain(56793,60).
+sustain(56813,63).
+sustain(56853,64).
+sustain(56870,65).
+sustain(56889,67).
+sustain(56911,71).
+sustain(56928,76).
+sustain(56949,80).
+sustain(56965,81).
+sustain(57024,80).
+sustain(57043,79).
+sustain(57061,78).
+sustain(57082,76).
+sustain(57099,73).
+sustain(57120,69).
+sustain(57141,65).
+sustain(57160,61).
+sustain(57176,58).
+sustain(57195,55).
+sustain(57219,51).
+sustain(57235,44).
+sustain(57255,31).
+sustain(57274,0).
+sustain(62108,44).
+sustain(62129,62).
+sustain(62147,69).
+sustain(62167,74).
+sustain(62184,78).
+sustain(62206,83).
+sustain(62224,90).
+sustain(62244,94).
+sustain(62282,92).
+sustain(62321,91).
+sustain(62337,89).
+sustain(62358,83).
+sustain(62380,76).
+sustain(62397,68).
+sustain(62416,62).
+sustain(62436,54).
+sustain(62454,45).
+sustain(62472,29).
+sustain(62492,0).
+sustain(62591,39).
+sustain(62608,56).
+sustain(62626,63).
+sustain(62645,65).
+sustain(62665,67).
+sustain(62685,69).
+sustain(62702,74).
+sustain(62724,78).
+sustain(62742,79).
+sustain(62780,78).
+sustain(62819,77).
+sustain(62839,76).
+sustain(62859,74).
+sustain(62880,71).
+sustain(62895,67).
+sustain(62915,63).
+sustain(62935,57).
+sustain(62954,50).
+sustain(62976,43).
+sustain(62992,41).
+sustain(63010,45).
+sustain(63030,54).
+sustain(63048,61).
+sustain(63067,63).
+sustain(63184,62).
+sustain(63206,61).
+sustain(63223,60).
+sustain(63241,58).
+sustain(63260,56).
+sustain(63279,52).
+sustain(63300,46).
+sustain(63319,34).
+sustain(63338,0).
+sustain(117015,25).
+sustain(117035,52).
+sustain(117052,61).
+sustain(117072,63).
+sustain(117091,65).
+sustain(117111,69).
+sustain(117132,78).
+sustain(117149,86).
+sustain(117168,88).
+sustain(117189,90).
+sustain(117207,92).
+sustain(117245,91).
+sustain(117267,89).
+sustain(117285,86).
+sustain(117304,81).
+sustain(117323,74).
+sustain(117342,65).
+sustain(117361,59).
+sustain(117383,51).
+sustain(117399,41).
+sustain(117420,22).
+sustain(117438,0).
+sustain(117513,29).
+sustain(117534,50).
+sustain(117554,61).
+sustain(117574,65).
+sustain(117598,67).
+sustain(117616,71).
+sustain(117633,79).
+sustain(117652,87).
+sustain(117671,93).
+sustain(117691,96).
+sustain(117710,97).
+sustain(117749,96).
+sustain(117768,94).
+sustain(117785,90).
+sustain(117806,82).
+sustain(117826,73).
+sustain(117848,65).
+sustain(117863,58).
+sustain(117882,46).
+sustain(117902,25).
+sustain(117922,0).
+sustain(117959,13).
+sustain(117978,40).
+sustain(117997,57).
+sustain(118016,64).
+sustain(118035,68).
+sustain(118056,72).
+sustain(118076,78).
+sustain(118093,86).
+sustain(118113,93).
+sustain(118132,95).
+sustain(118227,94).
+sustain(118246,91).
+sustain(118268,85).
+sustain(118287,75).
+sustain(118304,65).
+sustain(118324,53).
+sustain(118345,36).
+sustain(118363,16).
+sustain(118381,11).
+sustain(118401,26).
+sustain(118420,47).
+sustain(118438,61).
+sustain(118458,67).
+sustain(118477,73).
+sustain(118496,78).
+sustain(118517,82).
+sustain(118537,85).
+sustain(118556,86).
+sustain(118669,85).
+sustain(118689,83).
+sustain(118712,81).
+sustain(118726,77).
+sustain(118746,73).
+sustain(118766,67).
+sustain(118785,63).
+sustain(118804,58).
+sustain(118822,53).
+sustain(118843,46).
+sustain(118861,32).
+sustain(118880,0).
+sustain(119937,13).
+sustain(119958,9).
+sustain(119975,8).
+sustain(120014,11).
+sustain(120051,10).
+sustain(120091,11).
+sustain(120207,10).
+sustain(120224,9).
+sustain(120244,0).
+sustain(121011,8).
+sustain(121340,9).
+sustain(121492,10).
+sustain(121704,11).
+sustain(121721,12).
+sustain(121742,13).
+sustain(121895,14).
+sustain(121916,15).
+sustain(121991,16).
+sustain(122088,17).
+sustain(122508,16).
+sustain(123087,15).
+sustain(123180,14).
+sustain(123241,13).
+sustain(123256,10).
+sustain(123278,0).
+sustain(123547,18).
+sustain(123568,26).
+sustain(123585,35).
+sustain(123606,42).
+sustain(123623,49).
+sustain(123642,53).
+sustain(123662,56).
+sustain(123681,58).
+sustain(123699,59).
+sustain(123740,60).
+sustain(123776,61).
+sustain(123891,60).
+sustain(123929,58).
+sustain(123949,57).
+sustain(123970,52).
+sustain(123988,45).
+sustain(124007,30).
+sustain(124027,0).
+sustain(124104,24).
+sustain(124121,44).
+sustain(124142,55).
+sustain(124162,60).
+sustain(124179,61).
+sustain(124243,62).
+sustain(124278,63).
+sustain(124391,62).
+sustain(124408,61).
+sustain(124428,60).
+sustain(124448,57).
+sustain(124468,51).
+sustain(124487,43).
+sustain(124507,32).
+sustain(124527,29).
+sustain(124545,31).
+sustain(124562,42).
+sustain(124580,55).
+sustain(124600,60).
+sustain(124618,61).
+sustain(124640,62).
+sustain(124677,63).
+sustain(124716,64).
+sustain(124772,65).
+sustain(124867,64).
+sustain(124908,63).
+sustain(124926,62).
+sustain(124946,59).
+sustain(124963,55).
+sustain(124987,48).
+sustain(125001,37).
+sustain(125021,22).
+sustain(125045,15).
+sustain(125060,21).
+sustain(125080,37).
+sustain(125098,53).
+sustain(125119,61).
+sustain(125136,63).
+sustain(125196,64).
+sustain(125214,65).
+sustain(125252,66).
+sustain(125273,65).
+sustain(125328,64).
+sustain(125365,63).
+sustain(125386,62).
+sustain(125405,60).
+sustain(125424,58).
+sustain(125442,56).
+sustain(125467,51).
+sustain(125481,41).
+sustain(125501,18).
+sustain(125525,0).
+sustain(125619,28).
+sustain(125634,48).
+sustain(125655,60).
+sustain(125674,64).
+sustain(125694,65).
+sustain(125712,66).
+sustain(125734,67).
+sustain(125752,68).
+sustain(125770,70).
+sustain(125789,69).
+sustain(125865,68).
+sustain(125909,67).
+sustain(125924,64).
+sustain(125944,61).
+sustain(125963,56).
+sustain(125981,47).
+sustain(125999,22).
+sustain(126022,0).
+sustain(126077,11).
+sustain(126097,43).
+sustain(126116,59).
+sustain(126136,65).
+sustain(126155,67).
+sustain(126173,69).
+sustain(126193,70).
+sustain(126211,72).
+sustain(126229,73).
+sustain(126328,72).
+sustain(126347,71).
+sustain(126364,70).
+sustain(126386,69).
+sustain(126405,67).
+sustain(126424,62).
+sustain(126442,53).
+sustain(126462,46).
+sustain(126481,44).
+sustain(126499,48).
+sustain(126519,55).
+sustain(126538,61).
+sustain(126558,63).
+sustain(126579,64).
+sustain(126595,65).
+sustain(126671,64).
+sustain(126691,62).
+sustain(126713,58).
+sustain(126731,52).
+sustain(126749,42).
+sustain(126769,13).
+sustain(126793,0).
+sustain(132643,36).
+sustain(132663,49).
+sustain(132685,58).
+sustain(132701,62).
+sustain(132722,64).
+sustain(132739,66).
+sustain(132761,70).
+sustain(132780,76).
+sustain(132797,86).
+sustain(132815,108).
+sustain(132835,127).
+sustain(133373,118).
+sustain(133393,93).
+sustain(133413,77).
+sustain(133433,65).
+sustain(133449,53).
+sustain(133466,39).
+sustain(133486,18).
+sustain(133505,0).
+sustain(133805,9).
+sustain(133824,35).
+sustain(133842,48).
+sustain(133862,54).
+sustain(133880,58).
+sustain(133902,59).
+sustain(133918,60).
+sustain(133937,62).
+sustain(133959,63).
+sustain(133979,64).
+sustain(133995,65).
+sustain(134018,66).
+sustain(134033,69).
+sustain(134055,72).
+sustain(134072,76).
+sustain(134091,81).
+sustain(134110,85).
+sustain(134131,89).
+sustain(134151,93).
+sustain(134169,95).
+sustain(134703,94).
+sustain(136547,93).
+sustain(137046,92).
+sustain(137259,91).
+sustain(137372,90).
+sustain(137470,89).
+sustain(137563,88).
+sustain(137661,87).
+sustain(137795,86).
+sustain(137851,85).
+sustain(137967,84).
+sustain(138023,83).
+sustain(138084,82).
+sustain(138123,81).
+sustain(138178,80).
+sustain(138200,79).
+sustain(138235,78).
+sustain(138294,77).
+sustain(138350,76).
+sustain(138370,75).
+sustain(138389,74).
+sustain(138411,73).
+sustain(138446,71).
+sustain(138467,70).
+sustain(138485,69).
+sustain(138506,68).
+sustain(138524,67).
+sustain(138544,66).
+sustain(138565,65).
+sustain(138580,64).
+sustain(138658,63).
+sustain(138698,62).
+sustain(138734,61).
+sustain(138776,60).
+sustain(138791,59).
+sustain(138814,58).
+sustain(138830,57).
+sustain(138850,55).
+sustain(138868,53).
+sustain(138890,50).
+sustain(138908,45).
+sustain(138926,35).
+sustain(138948,22).
+sustain(138967,0).
diff --git a/tests/resources/Bach-fugue_bwv_858_beat_annotations.txt b/tests/resources/Bach-fugue_bwv_858_beat_annotations.txt
new file mode 100644
index 0000000..c05c9c2
--- /dev/null
+++ b/tests/resources/Bach-fugue_bwv_858_beat_annotations.txt
@@ -0,0 +1,136 @@
+1.037500 1.037500
+2.163542 2.163542
+3.217708 3.217708
+4.308239 4.308239
+5.399211 5.399211
+6.503624 6.503624
+7.642339 7.642339
+8.802995 8.802995
+9.854275 9.854275
+10.879991 10.879991
+11.883832 11.883832
+12.903733 12.903733
+13.915104 13.915104
+14.935199 14.935199
+16.019271 16.019271
+17.163302 17.163302
+18.175563 18.175563
+19.211243 19.211243
+20.237011 20.237011
+21.243533 21.243533
+22.260548 22.260548
+23.289323 23.289323
+24.374849 24.374849
+25.425998 25.425998
+26.451759 26.451759
+27.465624 27.465624
+28.458789 28.458789
+29.439192 29.439192
+30.441277 30.441277
+31.460676 31.460676
+32.440818 32.440818
+33.441145 33.441145
+34.451366 34.451366
+35.440237 35.440237
+36.422722 36.422722
+37.399023 37.399023
+38.399674 38.399674
+39.397591 39.397591
+40.403583 40.403583
+41.384830 41.384830
+42.369142 42.369142
+43.427212 43.427212
+44.431578 44.431578
+45.445311 45.445311
+46.443815 46.443815
+47.449849 47.449849
+48.447982 48.447982
+49.462674 49.462674
+50.465755 50.465755
+51.485937 51.485937
+52.507944 52.507944
+53.515494 53.515494
+54.520769 54.520769
+55.517450 55.517450
+56.525479 56.525479
+57.559809 57.559809
+58.552082 58.552082
+59.595572 59.595572
+60.577906 60.577906
+61.539440 61.539440
+62.516408 62.516408
+63.502607 63.502607
+64.574324 64.574324
+65.645430 65.645430
+66.657116 66.657116
+67.637153 67.637153
+68.626994 68.626994
+69.627432 69.627432
+70.606077 70.606077
+71.616495 71.616495
+72.623608 72.623608
+73.625173 73.625173
+74.624046 74.624046
+75.623608 75.623608
+76.625516 76.625516
+77.654858 77.654858
+78.666228 78.666228
+79.673610 79.673610
+80.682686 80.682686
+81.666440 81.666440
+82.666367 82.666367
+83.671964 83.671964
+84.676347 84.676347
+85.689585 85.689585
+86.678100 86.678100
+87.651369 87.651369
+88.604066 88.604066
+89.670444 89.670444
+90.682684 90.682684
+91.686199 91.686199
+92.705858 92.705858
+93.723175 93.723175
+94.735159 94.735159
+95.740623 95.740623
+96.743748 96.743748
+97.750916 97.750916
+98.742708 98.742708
+99.750780 99.750780
+100.753777 100.753777
+101.790104 101.790104
+102.790361 102.790361
+103.800001 103.800001
+104.798960 104.798960
+105.821350 105.821350
+106.836979 106.836979
+107.825003 107.825003
+108.816536 108.816536
+109.810938 109.810938
+110.816662 110.816662
+111.802605 111.802605
+112.770257 112.770257
+113.753122 113.753122
+114.729297 114.729297
+115.752493 115.752493
+116.754468 116.754468
+117.786308 117.786308
+118.787260 118.787260
+119.796570 119.796570
+120.806569 120.806569
+121.830596 121.830596
+122.844431 122.844431
+123.831739 123.831739
+124.830705 124.830705
+125.824291 125.824291
+126.848843 126.848843
+127.796359 127.796359
+128.766843 128.766843
+129.763891 129.763891
+130.825650 130.825650
+131.884949 131.884949
+132.891663 132.891663
+133.898138 133.898138
+134.912842 134.912842
+135.917694 135.917694
+137.031590 137.031590
+139.211209 139.211209
diff --git a/tests/resources/Bach-fugue_bwv_858_note_annotations.txt b/tests/resources/Bach-fugue_bwv_858_note_annotations.txt
new file mode 100644
index 0000000..d92a5ce
--- /dev/null
+++ b/tests/resources/Bach-fugue_bwv_858_note_annotations.txt
@@ -0,0 +1,522 @@
+0.500000 0.500000
+1.037500 1.037500
+1.600000 1.600000
+2.163542 2.163542
+2.697917 2.697917
+2.964583 2.964583
+3.217708 3.217708
+3.999566 3.999566
+4.125000 4.125000
+4.308239 4.308239
+5.944965 5.944965
+6.503624 6.503624
+7.077387 7.077387
+7.642339 7.642339
+8.224566 8.224566
+8.802995 8.802995
+9.345660 9.345660
+9.592210 9.592210
+9.854276 9.854276
+10.095638 10.095638
+10.364996 10.364996
+10.613238 10.613238
+10.879991 10.879991
+11.125825 11.125825
+11.394271 11.394271
+11.632161 11.632161
+11.883832 11.883832
+12.149635 12.149635
+12.390582 12.390582
+12.647655 12.647655
+12.770138 12.770138
+12.903732 12.903732
+13.171441 13.171441
+13.415277 13.415277
+13.651301 13.651301
+13.915104 13.915104
+14.158333 14.158333
+14.396527 14.396527
+14.646310 14.646310
+14.935199 14.935199
+15.180989 15.180989
+15.475738 15.475738
+16.019270 16.019270
+16.582684 16.582684
+17.163301 17.163301
+17.657682 17.657682
+17.907942 17.907942
+18.175564 18.175564
+18.417360 18.417360
+18.698460 18.698460
+18.954971 18.954971
+19.211243 19.211243
+19.465670 19.465670
+19.727259 19.727259
+19.973700 19.973700
+20.237011 20.237011
+20.484676 20.484676
+20.718359 20.718359
+20.986847 20.986847
+21.120399 21.120399
+21.243532 21.243532
+21.491146 21.491146
+21.751432 21.751432
+21.998829 21.998829
+22.260548 22.260548
+22.499546 22.499546
+22.767124 22.767124
+23.013281 23.013281
+23.289322 23.289322
+23.535633 23.535633
+23.826628 23.826628
+24.374849 24.374849
+24.918184 24.918184
+25.161804 25.161804
+25.425999 25.425999
+25.661263 25.661263
+25.944727 25.944727
+26.185871 26.185871
+26.451759 26.451759
+26.692707 26.692707
+26.967707 26.967707
+27.191927 27.191927
+27.465624 27.465624
+27.714455 27.714455
+27.954947 27.954947
+28.197721 28.197721
+28.458790 28.458790
+28.695898 28.695898
+28.959179 28.959179
+29.196354 29.196354
+29.439192 29.439192
+29.668272 29.668272
+29.938456 29.938456
+30.154427 30.154427
+30.441277 30.441277
+30.683723 30.683723
+30.950912 30.950912
+31.201824 31.201824
+31.460676 31.460676
+31.684244 31.684244
+31.939974 31.939974
+32.186005 32.186005
+32.440819 32.440819
+32.695576 32.695576
+32.942184 32.942184
+33.182552 33.182552
+33.441147 33.441147
+33.689518 33.689518
+33.951820 33.951820
+34.190628 34.190628
+34.451366 34.451366
+34.700848 34.700848
+34.953972 34.953972
+35.185417 35.185417
+35.440235 35.440235
+35.674217 35.674217
+35.931122 35.931122
+36.166862 36.166862
+36.422722 36.422722
+36.654625 36.654625
+36.911785 36.911785
+37.140301 37.140301
+37.399021 37.399021
+37.624153 37.624153
+37.874542 37.874542
+38.121811 38.121811
+38.399673 38.399673
+38.644531 38.644531
+38.897003 38.897003
+39.128841 39.128841
+39.397591 39.397591
+39.644466 39.644466
+39.911652 39.911652
+40.145897 40.145897
+40.403584 40.403584
+40.652866 40.652866
+40.897915 40.897915
+41.127407 41.127407
+41.384830 41.384830
+41.619270 41.619270
+41.862240 41.862240
+42.092319 42.092319
+42.369141 42.369141
+42.623569 42.623569
+42.882812 42.882812
+43.122395 43.122395
+43.427212 43.427212
+43.676559 43.676559
+43.915886 43.915886
+44.169598 44.169598
+44.431580 44.431580
+44.674282 44.674282
+44.933399 44.933399
+45.182163 45.182163
+45.445312 45.445312
+45.691277 45.691277
+45.936066 45.936066
+46.172203 46.172203
+46.443813 46.443813
+46.678646 46.678646
+46.943947 46.943947
+47.176933 47.176933
+47.449848 47.449848
+47.690235 47.690235
+47.946224 47.946224
+48.183136 48.183136
+48.447983 48.447983
+48.685436 48.685436
+48.946053 48.946053
+49.195614 49.195614
+49.462673 49.462673
+49.693165 49.693165
+49.965950 49.965950
+50.202084 50.202084
+50.465755 50.465755
+50.710609 50.710609
+50.970245 50.970245
+51.228256 51.228256
+51.485939 51.485939
+51.734375 51.734375
+51.998047 51.998047
+52.243877 52.243877
+52.507942 52.507942
+52.750782 52.750782
+53.018360 53.018360
+53.252995 53.252995
+53.515495 53.515495
+53.759895 53.759895
+54.025131 54.025131
+54.256313 54.256313
+54.520767 54.520767
+54.767273 54.767273
+55.019878 55.019878
+55.259766 55.259766
+55.517448 55.517448
+55.754036 55.754036
+56.024475 56.024475
+56.271439 56.271439
+56.525478 56.525478
+56.773396 56.773396
+57.017014 57.017014
+57.257854 57.257854
+57.559807 57.559807
+57.792316 57.792316
+58.066406 58.066406
+58.300388 58.300388
+58.552082 58.552082
+58.799088 58.799088
+59.076691 59.076691
+59.314194 59.314194
+59.595573 59.595573
+59.830013 59.830013
+60.085091 60.085091
+60.329296 60.329296
+60.577904 60.577904
+60.810829 60.810829
+61.052166 61.052166
+61.279514 61.279514
+61.387962 61.387962
+61.539440 61.539440
+61.791664 61.791664
+62.037846 62.037846
+62.279514 62.279514
+62.516407 62.516407
+62.758106 62.758106
+63.011520 63.011520
+63.257641 63.257641
+63.502605 63.502605
+63.748901 63.748901
+64.016724 64.016724
+64.264671 64.264671
+64.574326 64.574326
+65.099892 65.099892
+65.645432 65.645432
+65.883766 65.883766
+66.143837 66.143837
+66.386459 66.386459
+66.657120 66.657120
+66.883560 66.883560
+67.145775 67.145775
+67.375870 67.375870
+67.637154 67.637154
+67.874214 67.874214
+68.142105 68.142105
+68.372307 68.372307
+68.626991 68.626991
+68.865219 68.865219
+69.120018 69.120018
+69.357117 69.357117
+69.627434 69.627434
+69.856247 69.856247
+70.118744 70.118744
+70.353813 70.353813
+70.606079 70.606079
+70.851906 70.851906
+71.107986 71.107986
+71.345306 71.345306
+71.616493 71.616493
+71.858505 71.858505
+72.121780 72.121780
+72.358765 72.358765
+72.623611 72.623611
+72.874733 72.874733
+73.136543 73.136543
+73.374825 73.374825
+73.625175 73.625175
+73.859116 73.859116
+74.127075 74.127075
+74.370483 74.370483
+74.624046 74.624046
+74.864410 74.864410
+75.125687 75.125687
+75.361282 75.361282
+75.623611 75.623611
+75.861717 75.861717
+76.111366 76.111366
+76.357285 76.357285
+76.625519 76.625519
+76.864578 76.864578
+77.121010 77.121010
+77.359718 77.359718
+77.654854 77.654854
+77.913536 77.913536
+78.159889 78.159889
+78.396606 78.396606
+78.666229 78.666229
+78.895836 78.895836
+79.170311 79.170311
+79.414757 79.414757
+79.673607 79.673607
+79.916374 79.916374
+80.187523 80.187523
+80.420395 80.420395
+80.682686 80.682686
+80.899559 80.899559
+81.113800 81.113800
+81.402084 81.402084
+81.528328 81.528328
+81.666443 81.666443
+81.923439 81.923439
+82.173782 82.173782
+82.394012 82.394012
+82.666367 82.666367
+82.909248 82.909248
+83.159500 83.159500
+83.391190 83.391190
+83.671967 83.671967
+83.916168 83.916168
+84.181625 84.181625
+84.411850 84.411850
+84.676346 84.676346
+84.920296 84.920296
+85.181625 85.181625
+85.415108 85.415108
+85.689583 85.689583
+85.924896 85.924896
+86.187439 86.187439
+86.415039 86.415039
+86.678101 86.678101
+86.923004 86.923004
+87.161682 87.161682
+87.410660 87.410660
+87.651367 87.651367
+87.892929 87.892929
+88.141472 88.141472
+88.380539 88.380539
+88.604065 88.604065
+89.169273 89.169273
+89.408463 89.408463
+89.670441 89.670441
+89.916672 89.916672
+90.164322 90.164322
+90.421745 90.421745
+90.682686 90.682686
+90.923958 90.923958
+91.178909 91.178909
+91.413025 91.413025
+91.686203 91.686203
+91.947784 91.947784
+92.196228 92.196228
+92.424866 92.424866
+92.705856 92.705856
+92.957947 92.957947
+93.210808 93.210808
+93.459381 93.459381
+93.723175 93.723175
+93.970833 93.970833
+94.223701 94.223701
+94.462502 94.462502
+94.735161 94.735161
+94.977478 94.977478
+95.220184 95.220184
+95.463287 95.463287
+95.740623 95.740623
+95.990105 95.990105
+96.234634 96.234634
+96.479950 96.479950
+96.743744 96.743744
+96.977867 96.977867
+97.242706 97.242706
+97.488152 97.488152
+97.750916 97.750916
+97.998177 97.998177
+98.248444 98.248444
+98.483078 98.483078
+98.742706 98.742706
+98.981117 98.981117
+99.238411 99.238411
+99.480988 99.480988
+99.750778 99.750778
+100.003387 100.003387
+100.264587 100.264587
+100.494141 100.494141
+100.753777 100.753777
+100.997398 100.997398
+101.260422 101.260422
+101.510155 101.510155
+101.790100 101.790100
+102.027084 102.027084
+102.294533 102.294533
+102.535416 102.535416
+102.790359 102.790359
+103.024872 103.024872
+103.291016 103.291016
+103.531601 103.531601
+103.800003 103.800003
+104.051430 104.051430
+104.308205 104.308205
+104.534637 104.534637
+104.798958 104.798958
+105.040367 105.040367
+105.307556 105.307556
+105.551468 105.551468
+105.821350 105.821350
+106.087112 106.087112
+106.345970 106.345970
+106.569275 106.569275
+106.836975 106.836975
+107.066277 107.066277
+107.324875 107.324875
+107.555908 107.555908
+107.825005 107.825005
+108.066795 108.066795
+108.324089 108.324089
+108.547531 108.547531
+108.816536 108.816536
+109.047913 109.047913
+109.305725 109.305725
+109.539322 109.539322
+109.810936 109.810936
+110.063805 110.063805
+110.313286 110.313286
+110.556168 110.556168
+110.816666 110.816666
+111.050522 111.050522
+111.315880 111.315880
+111.545830 111.545830
+111.802605 111.802605
+112.035675 112.035675
+112.284111 112.284111
+112.526695 112.526695
+112.770256 112.770256
+113.008842 113.008842
+113.264832 113.264832
+113.504684 113.504684
+113.634109 113.634109
+113.753120 113.753120
+113.990273 113.990273
+114.246307 114.246307
+114.481682 114.481682
+114.729294 114.729294
+114.984978 114.984978
+115.247177 115.247177
+115.486130 115.486130
+115.752495 115.752495
+116.007439 116.007439
+116.247322 116.247322
+116.481293 116.481293
+116.754471 116.754471
+117.011581 117.011581
+117.270401 117.270401
+117.512520 117.512520
+117.786308 117.786308
+118.041756 118.041756
+118.280418 118.280418
+118.527969 118.527969
+118.787262 118.787262
+119.021652 119.021652
+119.275772 119.275772
+119.522522 119.522522
+119.796570 119.796570
+120.050537 120.050537
+120.307571 120.307571
+120.550369 120.550369
+120.806572 120.806572
+121.052765 121.052765
+121.301277 121.301277
+121.550865 121.550865
+121.830597 121.830597
+122.079025 122.079025
+122.335342 122.335342
+122.580048 122.580048
+122.844429 122.844429
+123.077026 123.077026
+123.326576 123.326576
+123.571030 123.571030
+123.831741 123.831741
+124.066422 124.066422
+124.320854 124.320854
+124.571724 124.571724
+124.830704 124.830704
+125.071655 125.071655
+125.338623 125.338623
+125.567589 125.567589
+125.824287 125.824287
+126.071983 126.071983
+126.335350 126.335350
+126.583420 126.583420
+126.848839 126.848839
+127.052437 127.052437
+127.266037 127.266037
+127.525696 127.525696
+127.662849 127.662849
+127.796356 127.796356
+128.041321 128.041321
+128.287338 128.287338
+128.527252 128.527252
+128.766846 128.766846
+129.009735 129.009735
+129.264587 129.264587
+129.500015 129.500015
+129.763885 129.763885
+130.015625 130.015625
+130.270142 130.270142
+130.523438 130.523438
+130.825653 130.825653
+131.358673 131.358673
+131.884949 131.884949
+132.134201 132.134201
+132.396530 132.396530
+132.638367 132.638367
+132.891663 132.891663
+133.138535 133.138535
+133.391312 133.391312
+133.632050 133.632050
+133.898132 133.898132
+134.144089 134.144089
+134.398254 134.398254
+134.646179 134.646179
+134.912842 134.912842
+135.165268 135.165268
+135.409027 135.409027
+135.655899 135.655899
+135.917694 135.917694
+136.178116 136.178116
+136.470139 136.470139
+136.744431 136.744431
+137.031586 137.031586
+137.338882 137.338882
+137.728119 137.728119
+138.300446 138.300446
+139.211212 139.211212
diff --git a/tests/resources/Chopin_op38.musicxml b/tests/resources/Chopin_op38.musicxml
deleted file mode 100644
index b6c1308..0000000
--- a/tests/resources/Chopin_op38.musicxml
+++ /dev/null
@@ -1,8703 +0,0 @@
-
-
-
- Chopin_op38.musicxml
-
- Music21
-
- 2025-02-18
- music21 v.8.3.0
- Partitura 0.2.0
-
-
-
-
- 7
- 40
-
-
-
-
- Chopin_op38
-
-
-
-
-
-
-
- 10080
-
- -1
- major
-
-
-
- G
- 2
-
-
-
-
- sotto voce
-
-
-
-
- Andantino
-
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 20160
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- A
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- A
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- B
- -1
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- E
- 5
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- D
- 5
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- F
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- D
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- B
- -1
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- A
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- 5040
- 4
- eighth
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- F
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- G
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- 20160
- 2
- half
-
-
-
- 5040
- 2
- eighth
-
-
-
- F
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- F
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- 10080
- 4
- quarter
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- D
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- D
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- G
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- G
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- D
- 4
-
- 5040
- 2
- eighth
-
-
-
- 15120
- 2
- quarter
-
-
-
- 30240
-
-
-
- B
- -1
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- 15120
- 4
- quarter
-
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- G
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- G
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- G
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 20160
- 2
- half
-
-
-
- 5040
- 2
- eighth
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- D
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- B
- -1
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- B
- -1
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- F
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- C
- 5
-
- 15120
-
- 1
- quarter
-
- up
-
-
-
-
-
- 30240
-
-
-
- 15120
- 2
- quarter
-
-
-
-
- A
- 4
-
- 10080
- 2
- quarter
-
-
-
- A
- 4
-
- 5040
-
- 2
- eighth
-
-
-
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- F
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
-
- 3
- eighth
- down
-
-
-
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 10080
-
- 1
- quarter
- up
-
-
-
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- A
- 4
-
- 10080
-
- 2
- quarter
-
-
-
-
-
-
- A
- 4
-
- 5040
- 2
- eighth
-
-
-
- B
- -1
- 4
-
- 10080
- 2
- quarter
-
-
-
- B
- -1
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- F
- 4
-
- 10080
-
- 3
- quarter
- down
-
-
-
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- G
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- E
- 5
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- D
- 5
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- F
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- D
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- B
- -1
- 4
-
- 10080
- 2
- quarter
-
-
-
- B
- -1
- 4
-
- 5040
- 2
- eighth
-
-
-
- A
- 4
-
- 10080
- 2
- quarter
-
-
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- G
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- F
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- 5040
- 4
- eighth
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- F
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- G
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- 20160
- 2
- half
-
-
-
- 5040
- 2
- eighth
-
-
-
- F
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- F
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- 10080
- 4
- quarter
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- D
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- D
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- G
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- G
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- D
- 4
-
- 5040
- 2
- eighth
-
-
-
- 15120
- 2
- quarter
-
-
-
- 30240
-
-
-
- B
- -1
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- 15120
- 4
- quarter
-
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- G
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- G
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- G
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 20160
- 2
- half
-
-
-
- 5040
- 2
- eighth
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- D
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- B
- -1
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- B
- -1
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- F
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- C
- 5
-
- 15120
-
- 1
- quarter
-
- up
-
-
-
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 10080
-
- 1
- quarter
- up
-
-
-
-
-
-
- B
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
-
- B
- 4
-
- 1
- eighth
- up
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- G
- 1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- 10080
- 2
- quarter
-
-
-
- F
- 4
-
- 5040
- 2
- eighth
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- 15120
- 4
- quarter
-
-
-
-
- E
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- E
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- E
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
-
- E
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- E
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
-
- G
- 4
-
- 10080
- 2
- quarter
-
-
-
- G
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- E
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- G
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
-
- G
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- A
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- A
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- E
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- D
- 5
-
- 5040
- 1
- eighth
- up
-
-
-
-
- D
- 5
-
- 1
- eighth
- up
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- 10080
- 2
- quarter
-
-
-
- A
- 4
-
- 5040
- 2
- eighth
-
-
-
- G
- 4
-
- 10080
- 2
- quarter
-
-
-
- G
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- 15120
- 4
- quarter
-
-
-
-
- G
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- E
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- G
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- G
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
-
-
-
-
- 15120
-
-
-
-
- C
- 5
-
- 15120
- 1
- quarter
-
- up
-
-
-
- E
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- F
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- G
- 4
-
- 10080
- 2
- quarter
-
-
-
- 20160
- 2
- half
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- A
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- G
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- G
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- E
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
-
- E
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- F
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- A
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- G
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- G
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- A
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- E
- 5
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- D
- 5
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- E
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- F
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- A
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- G
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- G
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- A
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- E
- 5
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- D
- 5
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- D
- 5
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 20160
- 2
- half
-
-
-
- 5040
- 2
- eighth
-
-
-
- B
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- G
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- A
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- G
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- E
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- F
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 4
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- G
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- G
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- G
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- G
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 15120
- 1
- quarter
-
- up
-
-
-
- B
- -1
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- G
- 4
-
- 15120
- 2
- quarter
-
-
-
-
- F
- 4
-
- 10080
- 2
- quarter
-
-
-
- G
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- D
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- -1
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- D
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- E
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- 10080
- 2
- quarter
-
-
-
- A
- 4
-
- 5040
- 2
- eighth
-
-
-
- 15120
- 2
- quarter
-
-
-
- 30240
-
-
-
- G
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- A
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- A
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- E
- 5
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- D
- 5
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- C
- 5
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- F
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- D
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- B
- -1
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- A
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- 5040
- 4
- eighth
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- F
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- G
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- 20160
- 2
- half
-
-
-
- 5040
- 2
- eighth
-
-
-
- F
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- F
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- 10080
- 4
- quarter
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- D
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- D
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- G
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- G
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- D
- 4
-
- 5040
- 2
- eighth
-
-
-
- 15120
- 2
- quarter
-
-
-
- 30240
-
-
-
- B
- -1
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- 15120
- 4
- quarter
-
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- G
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- A
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- B
- -1
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- F
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- G
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- F
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- G
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 20160
- 2
- half
-
-
-
- 5040
- 2
- eighth
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- D
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- F
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- B
- -1
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- B
- -1
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 20160
-
- 1
- half
- up
-
-
-
-
-
-
- C
- 5
-
- 5040
-
- 1
- eighth
- up
- begin
-
-
-
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- D
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- E
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- E
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- B
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- C
- 5
-
- 10080
- 1
- quarter
- up
-
-
-
- D
- 5
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- F
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- A
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- E
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- D
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- E
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- C
- 5
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- B
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- B
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 15120
- 2
- quarter
-
-
-
-
- A
- 4
-
- 10080
- 2
- quarter
-
-
-
- G
- 1
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 4
-
- 5040
- 4
- eighth
- up
-
-
-
- D
- 4
-
- 10080
- 4
- quarter
- up
-
-
-
- 5040
- 4
- eighth
-
-
- 30240
-
-
-
- E
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- E
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
- E
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- E
- 3
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- C
- 5
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
-
- A
- 4
-
- 15120
- 2
- quarter
-
-
-
- 30240
-
-
-
- C
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- C
- 4
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- -1
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- -1
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- A
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- A
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 1
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- B
- -1
- 4
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- A
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- G
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- A
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- G
- 4
-
- 7560
- 2
- eighth
-
- down
- begin
-
-
-
- F
- 1
- 4
-
- 2520
- 2
- 16th
- down
- end
- backward hook
-
-
-
- 5040
- 2
- eighth
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- D
- 4
-
- 7560
- 3
- eighth
-
- down
- begin
-
-
-
- C
- 4
-
- 2520
- 3
- 16th
- down
- continue
- forward hook
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
- end
-
-
-
- B
- -1
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- 20160
- 4
- half
-
-
-
- 5040
- 4
- eighth
-
-
-
- C
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- G
- 2
-
- 7560
- 5
- eighth
-
- down
- begin
-
-
-
- A
- 2
-
- 2520
- 5
- 16th
- down
- continue
- forward hook
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
- end
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- F
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- C
- 5
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 15120
- 2
- quarter
-
-
-
-
- A
- 4
-
- 15120
- 2
- quarter
-
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- A
- 3
-
- 5040
- 3
- eighth
- down
-
-
-
- E
- -1
- 4
-
- 10080
- 3
- quarter
- down
-
-
-
- E
- -1
- 4
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- 20160
- 4
- half
-
-
- 30240
-
-
-
- F
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 1
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- F
- 1
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
-
- C
- 5
-
- 1
- eighth
- up
-
-
-
- B
- -1
- 4
-
- 7560
- 1
- eighth
-
- up
- begin
-
-
-
- A
- 4
-
- 2520
- 1
- 16th
- up
- continue
- forward hook
-
-
-
- G
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- A
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- G
- 4
-
- 7560
- 2
- eighth
-
- down
- begin
-
-
-
- F
- 1
- 4
-
- 2520
- 2
- 16th
- down
- end
- backward hook
-
-
-
- 5040
- 2
- eighth
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- D
- 4
-
- 7560
- 3
- eighth
-
- down
- begin
-
-
-
- C
- 4
-
- 2520
- 3
- 16th
- down
- continue
- forward hook
-
-
-
- D
- 4
-
- 5040
- 3
- eighth
- down
- end
-
-
-
- B
- -1
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- 20160
- 4
- half
-
-
-
- 5040
- 4
- eighth
-
-
-
- C
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- G
- 2
-
- 7560
- 5
- eighth
-
- down
- begin
-
-
-
- A
- 2
-
- 2520
- 5
- 16th
- down
- continue
- forward hook
-
-
-
- B
- -1
- 2
-
- 5040
- 5
- eighth
- down
- end
-
-
-
- C
- 3
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- F
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- A
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 15120
- 2
- quarter
-
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- A
- 3
-
- 5040
- 3
- eighth
- down
-
-
-
- B
- -1
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 3
-
- 15120
- 4
- quarter
-
- up
-
-
- 30240
-
-
-
- F
- 2
-
- 7560
- 5
- eighth
-
- down
- begin
-
-
-
- E
- 2
-
- 2520
- 5
- 16th
- down
- continue
- forward hook
-
-
-
- D
- 2
-
- 5040
- 5
- eighth
- down
- end
-
-
-
- C
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- F
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
-
- A
- 4
-
- 15120
- 1
- quarter
-
- up
-
-
- 30240
-
-
-
- 15120
- 2
- quarter
-
-
-
-
- E
- 4
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- A
- 3
-
- 5040
- 3
- eighth
- down
-
-
-
- B
- -1
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 3
-
- 15120
- 4
- quarter
-
- up
-
-
- 30240
-
-
-
- F
- 2
-
- 7560
- 5
- eighth
-
- down
- begin
-
-
-
- E
- 2
-
- 2520
- 5
- 16th
- down
- continue
- forward hook
-
-
-
- D
- 2
-
- 5040
- 5
- eighth
- down
- end
-
-
-
- C
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- smorzando
-
-
-
-
- F
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- F
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
-
- A
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- F
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- F
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
-
-
-
- F
- 4
-
- 10080
- 1
- quarter
- up
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
-
-
- 30240
-
-
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
-
- 10080
- 2
- quarter
-
-
-
- E
- 4
-
- 5040
- 2
- eighth
-
-
- 30240
-
-
-
- A
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
-
- A
- 3
-
- 10080
- 3
- quarter
- down
-
-
-
- B
- -1
- 3
-
- 5040
- 3
- eighth
- down
-
-
- 30240
-
-
-
- C
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 3
-
- 5040
- 4
- eighth
- up
-
-
-
- C
- 3
-
- 10080
- 4
- quarter
- up
-
-
-
- C
- 3
-
- 5040
- 4
- eighth
- up
-
-
- 30240
-
-
-
- F
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
- F
- 2
-
- 10080
- 5
- quarter
- down
-
-
-
- C
- 2
-
- 5040
- 5
- eighth
- down
-
-
-
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- begin
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- continue
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- begin
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- continue
-
-
-
- A
- 4
-
- 5040
- 1
- eighth
- up
- end
-
-
- 30240
-
-
-
-
- F
- 1
-
- 5
- eighth
- down
-
-
-
-
- F
- 2
-
-
- 5
- eighth
- down
-
-
-
-
-
-
-
- C
- 3
-
-
- 5
- eighth
- down
-
-
-
-
-
-
-
- F
- 3
-
-
- 5
- eighth
- down
-
-
-
-
-
-
-
- A
- 3
-
-
- 5
- eighth
- down
-
-
-
-
-
-
-
- C
- 4
-
-
- 5
- eighth
- down
-
-
-
-
-
-
-
- F
- 4
-
-
- 5
- eighth
- down
-
-
-
-
-
-
- F
- 4
-
- 30240
-
- 5
- half
-
- down
-
-
-
-
-
-
-
- C
- 4
-
- 30240
-
- 5
- half
-
- down
-
-
-
-
-
-
-
- A
- 3
-
- 30240
-
- 5
- half
-
- down
-
-
-
-
-
-
-
- F
- 3
-
- 30240
-
- 5
- half
-
- down
-
-
-
-
-
-
-
- C
- 3
-
- 30240
-
- 5
- half
-
- down
-
-
-
-
-
-
-
- F
- 2
-
- 30240
-
- 5
- half
-
- down
-
-
-
-
-
-
-
diff --git a/tests/resources/Chopin_op38_p01.tsv b/tests/resources/Chopin_op38_p01.tsv
deleted file mode 100644
index d99ec07..0000000
--- a/tests/resources/Chopin_op38_p01.tsv
+++ /dev/null
@@ -1,274 +0,0 @@
-0.015104
-0.485417
-0.854687
-1.223958
-1.632292
-2.001823
-2.371354
-2.815104
-3.221354
-3.627604
-4.180989
-4.557422
-4.933854
-5.406510
-5.786458
-6.166407
-6.685416
-7.075694
-7.470573
-8.005208
-8.411632
-8.818055
-9.296528
-9.712587
-10.128646
-10.611718
-11.008047
-11.404375
-11.965104
-12.391580
-12.818055
-13.404947
-13.797135
-14.189323
-14.625260
-15.013542
-15.401823
-15.840364
-16.218881
-16.597397
-17.098177
-17.457031
-17.813541
-18.276043
-18.671094
-19.066145
-19.588802
-19.946962
-20.336456
-20.886198
-21.297787
-21.709375
-22.273178
-22.685200
-23.097221
-23.664165
-24.051353
-24.438541
-24.870834
-25.250313
-25.629791
-26.078751
-26.446772
-26.814793
-27.327707
-27.693958
-28.057501
-28.539791
-28.927361
-29.314932
-29.777084
-30.187631
-30.598177
-31.080730
-31.487240
-31.893749
-32.408073
-32.817753
-33.227432
-33.785156
-34.201302
-34.617447
-35.060677
-35.445572
-35.830467
-36.243752
-36.628778
-37.013805
-37.497135
-37.895573
-38.263023
-38.814064
-39.216146
-39.618229
-40.069012
-40.431337
-40.815102
-41.330990
-41.733854
-42.136719
-42.623177
-43.043186
-43.463196
-44.091671
-44.471876
-44.852081
-45.302082
-45.698307
-46.094532
-46.525520
-46.938177
-47.350834
-47.816872
-48.193748
-48.570625
-49.044582
-49.439375
-49.834167
-50.300781
-50.683203
-51.065624
-51.442707
-51.884165
-52.325623
-52.813538
-53.326559
-53.839581
-54.568489
-54.973957
-55.379425
-55.849998
-56.240105
-56.630211
-57.081772
-57.489452
-57.897133
-58.446354
-58.819617
-59.211456
-59.661201
-60.053518
-60.445835
-60.917969
-61.308072
-61.703384
-62.247658
-62.662762
-63.077866
-63.591148
-63.999481
-64.407814
-64.946091
-65.395962
-65.845833
-66.576042
-67.043961
-67.511879
-68.115097
-68.510544
-68.905991
-69.381508
-69.763975
-70.139580
-70.593231
-70.989498
-71.385765
-71.840973
-72.239105
-72.637238
-73.090622
-73.496143
-73.901665
-74.413544
-74.810421
-75.207298
-75.783859
-76.157295
-76.530731
-76.986717
-77.375523
-77.764328
-78.199997
-78.583721
-78.967445
-79.488022
-79.853648
-80.228127
-80.753647
-81.154556
-81.555466
-82.021095
-82.395922
-82.780991
-83.298958
-83.725651
-84.152344
-84.793747
-85.200172
-85.606598
-86.068748
-86.502995
-86.937241
-87.473694
-87.874348
-88.275002
-88.733597
-89.117188
-89.500778
-89.980728
-90.360936
-90.760414
-91.226044
-91.629429
-92.032814
-92.510681
-92.907033
-93.309113
-93.855469
-94.262981
-94.670494
-95.163887
-95.612846
-96.061806
-96.676559
-97.158592
-97.640625
-98.210152
-98.590538
-98.967018
-99.484116
-99.898571
-100.313026
-100.784119
-101.198311
-101.612503
-102.242966
-102.639973
-103.036980
-103.436455
-103.955208
-104.434029
-105.033852
-105.446224
-105.858597
-106.511459
-106.912155
-107.300003
-107.760414
-108.132118
-108.503822
-109.062759
-109.479950
-109.867706
-110.391663
-110.817356
-111.243050
-111.900261
-112.305344
-112.710426
-113.130203
-113.511665
-113.893127
-114.346100
-114.818779
-115.291458
-115.864845
-116.467113
-117.069382
-119.487350
-121.286461
-121.933334
-122.634377
-123.461456
-124.761459
diff --git a/tests/resources/Chopin_op38_p01.wav b/tests/resources/Chopin_op38_p01.wav
deleted file mode 100644
index bb8871b..0000000
Binary files a/tests/resources/Chopin_op38_p01.wav and /dev/null differ
diff --git a/tests/test_matchmaker.py b/tests/test_matchmaker.py
index 7cf81df..8a7d894 100644
--- a/tests/test_matchmaker.py
+++ b/tests/test_matchmaker.py
@@ -26,7 +26,7 @@ def setUp(self):
self.performance_file_audio = "./tests/resources/Bach-fugue_bwv_858.mp3"
self.performance_file_midi = "./tests/resources/Bach-fugue_bwv_858.mid"
self.performance_file_annotations = (
- "./tests/resources/Bach-fugue_bwv_858_annotations.txt"
+ "./tests/resources/Bach-fugue_bwv_858_note_annotations.txt"
)
self.test_datasets = [
@@ -35,15 +35,15 @@ def setUp(self):
"score": "./tests/resources/Bach-fugue_bwv_858.musicxml",
"audio": "./tests/resources/Bach-fugue_bwv_858.mp3",
"midi": "./tests/resources/Bach-fugue_bwv_858.mid",
- "annotations": "./tests/resources/Bach-fugue_bwv_858_annotations.txt",
+ "annotations": "./tests/resources/Bach-fugue_bwv_858_note_annotations.txt",
+ },
+ {
+ "name": "simple_mozart_k265_var1",
+ "score": "./matchmaker/assets/simple_mozart_k265_var1.musicxml",
+ "audio": "./matchmaker/assets/simple_mozart_k265_var1.mp3",
+ "midi": "./matchmaker/assets/simple_mozart_k265_var1.mid",
+ "annotations": "./matchmaker/assets/simple_mozart_k265_var1_note_annotations.txt",
},
- # {
- # "name": "mozart_k265_var1",
- # "score": "./matchmaker/assets/mozart_k265_var1.musicxml",
- # "audio": "./matchmaker/assets/mozart_k265_var1.mp3",
- # "midi": "./matchmaker/assets/mozart_k265_var1.mid",
- # "annotations": "./matchmaker/assets/mozart_k265_var1_annotations.txt",
- # },
]
def test_matchmaker_audio_init(self):
@@ -172,11 +172,12 @@ def test_matchmaker_audio_run_with_evaluation_in_beats(self):
mm._has_run = True
results = mm.run_evaluation(
- self.performance_file_annotations,
+ "./tests/resources/Bach-fugue_bwv_858_beat_annotations.txt",
+ level="beat",
debug=True,
save_dir=Path("./tests/results"),
run_name="test_matchmaker_audio_run_with_evaluation_in_beats",
- in_seconds=False,
+ domain="score",
)
print(f"RESULTS: {json.dumps(results, indent=4)}")