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)}")