diff --git a/partitura/directions.py b/partitura/directions.py index 80043d13..b52024f6 100644 --- a/partitura/directions.py +++ b/partitura/directions.py @@ -151,6 +151,8 @@ def unabbreviate(s): "adagio", "agitato", "andante", + "andante cantabile", + "andante amoroso", "andantino", "animato", "appassionato", @@ -193,6 +195,7 @@ def unabbreviate(s): "tranquilamente", "tranquilo", "recitativo", + "allegro moderato", r"/(vivo|vivacissimamente|vivace)/", r"/(allegro|allegretto)/", r"/(espressivo|espress\.?)/", diff --git a/partitura/io/exportmatch.py b/partitura/io/exportmatch.py index a23eee23..193b080f 100644 --- a/partitura/io/exportmatch.py +++ b/partitura/io/exportmatch.py @@ -37,6 +37,7 @@ FractionalSymbolicDuration, MatchKeySignature, MatchTimeSignature, + MatchTempoIndication, Version, ) @@ -71,6 +72,8 @@ def matchfile_from_alignment( score_filename: Optional[PathLike] = None, performance_filename: Optional[PathLike] = None, assume_part_unfolded: bool = False, + tempo_indication: Optional[str] = None, + diff_score_version_notes: Optional[list] = None, version: Version = LATEST_VERSION, debug: bool = False, ) -> MatchFile: @@ -106,6 +109,10 @@ def matchfile_from_alignment( repetitions in the alignment. If False, the part will be automatically unfolded to have maximal coverage of the notes in the alignment. See `partitura.score.unfold_part_alignment`. + tempo_indication : str or None + The tempo direction indicated in the beginning of the score + diff_score_version_notes : list or None + A list of score notes that reflect a special score version (e.g., original edition/Erstdruck, Editors note etc.) version: Version Version of the match file. For now only 1.0.0 is supported. Returns @@ -180,7 +187,7 @@ def matchfile_from_alignment( alignment=alignment, remove_ornaments=True, ) - + measures = np.array(list(spart.iter_all(score.Measure))) measure_starts_divs = np.array([m.start.t for m in measures]) measure_starts_beats = beat_map(measure_starts_divs) @@ -199,7 +206,6 @@ def matchfile_from_alignment( # Score prop header lines scoreprop_lines = defaultdict(list) - # For score notes score_info = dict() # Info for sorting lines @@ -276,7 +282,6 @@ def matchfile_from_alignment( # Get all notes in the measure snotes = spart.iter_all(score.Note, m.start, m.end, include_subclasses=True) # Beginning of each measure - for snote in snotes: onset_divs, offset_divs = snote.start.t, snote.start.t + snote.duration_tied duration_divs = offset_divs - onset_divs @@ -323,6 +328,12 @@ def matchfile_from_alignment( if fermata is not None: score_attributes_list.append("fermata") + + if isinstance(snote, score.GraceNote): + score_attributes_list.append("grace") + + if diff_score_version_notes is not None and snote.id in diff_score_version_notes: + score_attributes_list.append("diff_score_version") score_info[snote.id] = MatchSnote( version=version, @@ -346,6 +357,22 @@ def matchfile_from_alignment( ) snote_sort_info[snote.id] = (onset_beats, snote.doc_order) + # # NOTE time position is hardcoded, not pretty... Assumes there is only one tempo indication at the beginning of the score + if tempo_indication is not None: + score_tempo_direction_header = make_scoreprop( + version=version, + attribute="tempoIndication", + value=MatchTempoIndication( + tempo_indication, + is_list=False, + ), + measure=measure_starts[0][0], + beat=1, + offset=0, + time_in_beats=measure_starts[0][2], + ) + scoreprop_lines["tempo_indication"].append(score_tempo_direction_header) + perf_info = dict() pnote_sort_info = dict() for pnote in ppart.notes: @@ -372,6 +399,21 @@ def matchfile_from_alignment( sort_stime = [] note_lines = [] + + # Get ids of notes which voice overlap + sna = spart.note_array() + onset_pitch_slice = sna[["onset_div", "pitch"]] + uniques, counts = np.unique(onset_pitch_slice, return_counts=True) + duplicate_values = uniques[counts > 1] + duplicates = dict() + for v in duplicate_values: + idx = np.where(onset_pitch_slice == v)[0] + duplicates[tuple(v)] = idx + voice_overlap_note_ids = [] + if len(duplicates) > 0: + duplicate_idx = np.concatenate(np.array(list(duplicates.values()))).flatten() + voice_overlap_note_ids = list(sna[duplicate_idx]['id']) + for al_note in alignment: label = al_note["label"] @@ -384,6 +426,8 @@ def matchfile_from_alignment( elif label == "deletion": snote = score_info[al_note["score_id"]] + if al_note["score_id"] in voice_overlap_note_ids: + snote.ScoreAttributesList.append('voice_overlap') deletion_line = MatchSnoteDeletion(version=version, snote=snote) note_lines.append(deletion_line) sort_stime.append(snote_sort_info[al_note["score_id"]]) @@ -407,7 +451,7 @@ def matchfile_from_alignment( note_lines.append(ornament_line) sort_stime.append(pnote_sort_info[al_note["performance_id"]]) - + # sort notes by score onset (performed insertions are sorted # according to the interpolation map sort_stime = np.array(sort_stime) @@ -441,6 +485,7 @@ def matchfile_from_alignment( "clock_rate", "key_signatures", "time_signatures", + "tempo_indication", ] all_match_lines = [] for h in header_order: @@ -537,7 +582,7 @@ def save_match( else: raise ValueError( "`performance_data` should be a `Performance`, a `PerformedPart`, or a " - f"list of `PerformedPart` objects, but is {type(score_data)}" + f"list of `PerformedPart` objects, but is {type(performance_data)}" ) # Get matchfile diff --git a/partitura/io/exportmidi.py b/partitura/io/exportmidi.py index 61960d99..28ce7d83 100644 --- a/partitura/io/exportmidi.py +++ b/partitura/io/exportmidi.py @@ -8,7 +8,7 @@ from collections import defaultdict, OrderedDict from typing import Optional, Iterable -from mido import MidiFile, MidiTrack, Message, MetaMessage +from mido import MidiFile, MidiTrack, Message, MetaMessage, merge_tracks import partitura.score as score from partitura.score import Score, Part, PartGroup, ScoreLike @@ -87,6 +87,7 @@ def save_performance_midi( mpq: int = 500000, ppq: int = 480, default_velocity: int = 64, + merge_tracks_save: Optional[bool] = False, ) -> Optional[MidiFile]: """Save a :class:`~partitura.performance.PerformedPart` or a :class:`~partitura.performance.Performance` as a MIDI file @@ -107,6 +108,8 @@ def save_performance_midi( default_velocity : int, optional A default velocity value (between 0 and 127) to be used for notes without a specified velocity. Defaults to 64. + merge_tracks_save : bool, optional + Determines whether midi tracks are merged when exporting to a midi file. Defaults to False. Returns ------- @@ -134,7 +137,6 @@ def save_performance_midi( ) track_events = defaultdict(lambda: defaultdict(list)) - for performed_part in performed_parts: for c in performed_part.controls: track = c.get("track", 0) @@ -200,7 +202,7 @@ def save_performance_midi( track_events[tr][min(timepoints)].append( Message("program_change", program=0, channel=ch) ) - + midi_type = 0 if len(track_events) == 1 else 1 mf = MidiFile(type=midi_type, ticks_per_beat=ppq) @@ -217,6 +219,10 @@ def save_performance_midi( track.append(msg.copy(time=t_delta)) t_delta = 0 t = t_msg + + if merge_tracks_save and len(mf.tracks) > 1: + mf.tracks = [merge_tracks(mf.tracks)] + if out is not None: if hasattr(out, "write"): mf.save(file=out) diff --git a/partitura/io/importmidi.py b/partitura/io/importmidi.py index 63238640..77ddf749 100644 --- a/partitura/io/importmidi.py +++ b/partitura/io/importmidi.py @@ -183,11 +183,10 @@ def load_performance_midi( # end note if it's a 'note off' event or 'note on' with velocity 0 elif note_off or (note_on and msg.velocity == 0): if note not in sounding_notes: - warnings.warn("ignoring MIDI message %s" % msg) + warnings.warn(f"ignoring MIDI message {msg}") continue # append the note to the list associated with the channel - notes.append( dict( # id=f"n{len(notes)}", @@ -218,7 +217,7 @@ def load_performance_midi( # add note id to every note for k, note in enumerate(notes): - note["id"] = f"n{k}" + note["id"] = f"n{k+1}" if len(notes) > 0 or len(controls) > 0 or len(programs) > 0: pp = performance.PerformedPart( diff --git a/partitura/io/importmusicxml.py b/partitura/io/importmusicxml.py index c6d3e0b7..1e0fe45c 100644 --- a/partitura/io/importmusicxml.py +++ b/partitura/io/importmusicxml.py @@ -60,6 +60,22 @@ "sustain_pedal": score.SustainPedalDirection, } +TEMPO_DIRECTIONS = { + "Adagio": score.ConstantTempoDirection, + "Andante": score.ConstantTempoDirection, + "Andante amoroso": score.ConstantTempoDirection, + "Andante cantabile": score.ConstantTempoDirection, + "Andante grazioso": score.ConstantTempoDirection, + "Menuetto": score.ConstantTempoDirection, + "Allegretto grazioso": score.ConstantTempoDirection, + "Allegro moderato": score.ConstantTempoDirection, + "Allegro assai": score.ConstantTempoDirection, + "Allegro": score.ConstantTempoDirection, + "Allegretto": score.ConstantTempoDirection, + "Molto allegro": score.ConstantTempoDirection, + "Presto": score.ConstantTempoDirection, +} + OCTAVE_SHIFTS = {8: 1, 15: 2, 22: 3} @@ -114,7 +130,6 @@ def _parse_partlist(partlist): structure = [] current_group = None part_dict = {} - for e in partlist: if e.tag == "part-group": if e.get("type") == "start": @@ -146,7 +161,6 @@ def _parse_partlist(partlist): part.part_abbreviation = next( iter(e.xpath("part-abbreviation/text()")), None ) - part_dict[part_id] = part if current_group is None: @@ -239,11 +253,15 @@ def load_musicxml( composer = None scid = None + work_title = None + work_number = None + movement_title = None + movement_number = None title = None subtitle = None lyricist = None copyright = None - + # The work tag is preferred for the title of the score, otherwise # this method will search in the credit tags work_info_el = document.find("work") @@ -254,8 +272,20 @@ def load_musicxml( tag="work-title", as_type=str, ) + scidn = get_value_from_tag( + e=work_info_el, + tag="work-number", + as_type=str, + ) + work_title = scid + work_number = scidn - title = scid + movement_title_el = document.find('.//movement-title') + movement_number_el = document.find('.//movement-number') + if movement_title_el is not None: + movement_title = movement_title_el.text + if movement_number_el is not None: + movement_number = movement_number_el.text score_identification_el = document.find("identification") @@ -289,6 +319,10 @@ def load_musicxml( scr = score.Score( id=scid, partlist=partlist, + work_number=work_number, + work_title=work_title, + movement_number=movement_number, + movement_title=movement_title, title=title, subtitle=subtitle, composer=composer, @@ -880,6 +914,7 @@ def _handle_direction(e, position, part, ongoing): warnings.warn("Did not find a wedge start element for wedge stop!") elif dt.tag == "dashes": + # start/stop/continue dashes_type = get_value_from_attribute(dt, "type", str) number = get_value_from_attribute(dt, "number", int) or 1 @@ -1138,7 +1173,7 @@ def _handle_sound(e, position, part): if "tempo" in e.attrib: tempo = score.Tempo(int(e.attrib["tempo"]), "q") # part.add_starting_object(position, tempo) - _add_tempo_if_unique(position, part, tempo) + (position, part, tempo) def _handle_note(e, position, part, ongoing, prev_note, doc_order): diff --git a/partitura/io/matchfile_utils.py b/partitura/io/matchfile_utils.py index 4ad49b27..d32eeaa7 100644 --- a/partitura/io/matchfile_utils.py +++ b/partitura/io/matchfile_utils.py @@ -871,6 +871,32 @@ def format_time_signature_list(value: MatchTimeSignature) -> str: return str(value) +class MatchTempoIndication(MatchParameter): + def __init__( + self, + value: str, + is_list: bool = False, + ): + super().__init__() + self.value = self.from_string(value)[0] + self.is_list = is_list + + def __str__(self): + return self.value + + @classmethod + def from_string(cls, string: str) -> MatchTempoIndication: + content = interpret_as_list(string) + return content + +def interpret_as_tempo_indication(value: str) -> MatchTempoIndication: + tempo_indication = MatchTempoIndication.from_string(value) + return tempo_indication + +def format_tempo_indication(value: MatchTempoIndication) -> str: + value.is_list = False + return str(value) + ## Miscellaneous utils diff --git a/partitura/io/matchlines_v1.py b/partitura/io/matchlines_v1.py index 0900e969..1b1b3fbd 100644 --- a/partitura/io/matchlines_v1.py +++ b/partitura/io/matchlines_v1.py @@ -58,6 +58,9 @@ format_key_signature_v1_0_0, to_snake_case, get_kwargs_from_matchline, + MatchTempoIndication, + interpret_as_tempo_indication, + format_tempo_indication, ) # Define current version of the match file format @@ -224,7 +227,6 @@ def from_instance( format_fun=format_fun, ) - SCOREPROP_LINE = { Version(1, 0, 0): { "timeSignature": ( @@ -237,6 +239,11 @@ def from_instance( format_key_signature_v1_0_0, MatchKeySignature, ), + "tempoIndication": ( + interpret_as_tempo_indication, + format_tempo_indication, + MatchTempoIndication, + ), "beatSubDivision": (interpret_as_list_int, format_list, list), "directions": (interpret_as_list, format_list, list), } diff --git a/partitura/score.py b/partitura/score.py index 3a0589f0..d54c55bc 100644 --- a/partitura/score.py +++ b/partitura/score.py @@ -615,6 +615,18 @@ def dynamics(self): """ return [e for e in self.iter_all(LoudnessDirection, include_subclasses=True)] + @property + def tempo_directions(self): + """Return a list of all tempo direction in the part + + Returns + ------- + list + List of TempoDirection objects + + """ + return [e for e in self.iter_all(TempoDirection, include_subclasses=True)] + @property def articulations(self): """Return a list of all Articulation markings in the part @@ -2794,7 +2806,7 @@ def __str__(self): else: return f'{super().__str__()} "{self.text}"' - + class LoudnessDirection(Direction): pass @@ -2830,7 +2842,6 @@ class ConstantLoudnessDirection(ConstantDirection, LoudnessDirection): class ConstantTempoDirection(ConstantDirection, TempoDirection): pass - class ConstantArticulationDirection(ConstantDirection, ArticulationDirection): pass @@ -2990,8 +3001,16 @@ class Score(object): the identifier should not start with a number. partlist : `Part`, `PartGroup` or list of `Part` or `PartGroup` instances. List of `Part` or `PartGroup` objects. - title: str, optional - Title of the score. + work_title: str, optional + Work title of the score, if applicable. + work_number: str, optional + Work number of the score, if applicable. + movement_title: str, optional + Movement title of the score, if applicable. + movement_number: str, optional + Movement number of the score, if applicable. + title : str, optional + Title of the score, from tag subtitle: str, optional Subtitle of the score. composer: str, optional @@ -3010,7 +3029,13 @@ class Score(object): part_structure: list of `Part` or `PartGrop` List of all `Part` or `PartGroup` objects that specify the structure of the score. - title: str + work_title: str + See parameters. + work_number: str + See parameters. + movement_title: str + See parameters. + movement_number: str See parameters. subtitle: str See parameters. @@ -3024,6 +3049,10 @@ class Score(object): """ id: Optional[str] + work_title: Optional[str] + work_number: Optional[str] + movement_title: Optional[str] + movement_number: Optional[str] title: Optional[str] subtitle: Optional[str] composer: Optional[str] @@ -3036,6 +3065,10 @@ def __init__( self, partlist: Union[Part, PartGroup, Itertype[Union[Part, PartGroup]]], id: Optional[str] = None, + work_title: Optional[str] = None, + work_number: Optional[str] = None, + movement_title: Optional[str] = None, + movement_number: Optional[str] = None, title: Optional[str] = None, subtitle: Optional[str] = None, composer: Optional[str] = None, @@ -3045,6 +3078,10 @@ def __init__( self.id = id # Score Information (default from MuseScore/MusicXML) + self.work_title = work_title + self.work_number = work_number + self.movement_title = movement_title + self.movement_number = movement_number self.title = title self.subtitle = subtitle self.composer = composer diff --git a/tests/__init__.py b/tests/__init__.py index 80e898ab..712e6a11 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -26,6 +26,10 @@ os.path.join(MUSICXML_PATH, fn) for fn in ["test_note_ties.xml", "test_note_ties_divs.xml"] ] +MUSICXML_SCORE_OBJECT_TESTFILES = [ + os.path.join(MUSICXML_PATH, fn) + for fn in ["test_score_object.musicxml"] +] MUSICXML_UNFOLD_TESTPAIRS = [ ( os.path.join(MUSICXML_PATH, fn1), diff --git a/tests/data/match/mozart_k265_var1.match b/tests/data/match/mozart_k265_var1.match index fbf69446..35dc0fe0 100644 --- a/tests/data/match/mozart_k265_var1.match +++ b/tests/data/match/mozart_k265_var1.match @@ -8,225 +8,225 @@ info(midiClockUnits,480). info(midiClockRate,500000). scoreprop(keySignature,C,1:1,0,0.0000). scoreprop(timeSignature,2/4,1:1,0,0.0000). -snote(n1,[D,n],5,1:1,0,1/16,0.0000,0.2500,[v1,staff1])-note(n1,74,692,773,72,1,1). -snote(n9,[C,n],3,1:1,0,1/4,0.0000,1.0000,[v5,staff2])-note(n0,48,683,747,70,1,1). -snote(n2,[C,n],5,1:1,1/16,1/16,0.2500,0.5000,[v1,staff1])-note(n2,72,819,892,53,1,1). -snote(n3,[B,n],4,1:1,1/8,1/16,0.5000,0.7500,[v1,staff1])-note(n3,71,914,980,54,1,1). -snote(n4,[C,n],5,1:1,3/16,1/16,0.7500,1.0000,[v1,staff1])-note(n4,72,1009,1098,48,1,1). -snote(n5,[B,n],4,1:2,0,1/16,1.0000,1.2500,[v1,staff1])-note(n6,71,1128,1174,61,1,1). -snote(n10,[C,n],4,1:2,0,1/4,1.0000,2.0000,[v5,staff2])-note(n5,60,1122,1160,67,1,1). -snote(n6,[C,n],5,1:2,1/16,1/16,1.2500,1.5000,[v1,staff1])-note(n7,72,1233,1284,44,1,1). -snote(n7,[B,n],4,1:2,1/8,1/16,1.5000,1.7500,[v1,staff1])-note(n8,71,1316,1410,65,1,1). -snote(n8,[C,n],5,1:2,3/16,1/16,1.7500,2.0000,[v1,staff1])-note(n9,72,1420,1490,61,1,1). -snote(n11,[A,n],5,2:1,0,1/16,2.0000,2.2500,[v1,staff1])-note(n11,81,1556,1637,55,1,1). -snote(n19,[E,n],4,2:1,0,1/4,2.0000,3.0000,[v5,staff2])-note(n10,64,1541,1614,75,1,1). -snote(n12,[G,n],5,2:1,1/16,1/16,2.2500,2.5000,[v1,staff1])-note(n12,79,1683,1752,62,1,1). -snote(n13,[F,#],5,2:1,1/8,1/16,2.5000,2.7500,[v1,staff1])-note(n13,78,1785,1831,52,1,1). -snote(n14,[G,n],5,2:1,3/16,1/16,2.7500,3.0000,[v1,staff1])-note(n14,79,1893,1949,77,1,1). -snote(n15,[F,#],5,2:2,0,1/16,3.0000,3.2500,[v1,staff1])-note(n15,78,1984,2041,60,1,1). -snote(n20,[C,n],4,2:2,0,1/4,3.0000,4.0000,[v5,staff2])-note(n16,60,2002,2043,49,1,1). -snote(n16,[G,n],5,2:2,1/16,1/16,3.2500,3.5000,[v1,staff1])-note(n17,79,2100,2130,52,1,1). -snote(n17,[F,#],5,2:2,1/8,1/16,3.5000,3.7500,[v1,staff1])-note(n18,78,2180,2235,64,1,1). -snote(n18,[G,n],5,2:2,3/16,1/16,3.7500,4.0000,[v1,staff1])-note(n19,79,2275,2317,54,1,1). -snote(n21,[G,#],5,3:1,0,1/16,4.0000,4.2500,[v1,staff1])-note(n20,80,2392,2454,61,1,1). -snote(n29,[F,n],4,3:1,0,1/4,4.0000,5.0000,[v5,staff2])-note(n21,65,2416,2457,61,1,1). -snote(n22,[A,n],5,3:1,1/16,1/16,4.2500,4.5000,[v1,staff1])-note(n22,81,2495,2600,61,1,1). -snote(n23,[C,n],6,3:1,1/8,1/16,4.5000,4.7500,[v1,staff1])-note(n23,84,2611,2722,62,1,1). -snote(n24,[B,n],5,3:1,3/16,1/16,4.7500,5.0000,[v1,staff1])-note(n24,83,2722,2796,51,1,1). -snote(n25,[D,n],6,3:2,0,1/16,5.0000,5.2500,[v1,staff1])-note(n25,86,2807,2939,61,1,1). -snote(n30,[C,n],4,3:2,0,1/4,5.0000,6.0000,[v5,staff2])-note(n26,60,2836,2890,45,1,1). -snote(n26,[C,n],6,3:2,1/16,1/16,5.2500,5.5000,[v1,staff1])-note(n27,84,2939,3024,55,1,1). -snote(n27,[B,n],5,3:2,1/8,1/16,5.5000,5.7500,[v1,staff1])-note(n28,83,3033,3093,64,1,1). -snote(n28,[A,n],5,3:2,3/16,1/16,5.7500,6.0000,[v1,staff1])-note(n29,81,3138,3162,52,1,1). -snote(n31,[A,n],5,4:1,0,1/16,6.0000,6.2500,[v1,staff1])-note(n31,81,3280,3364,68,1,1). -snote(n39,[C,n],4,4:1,0,1/4,6.0000,7.0000,[v5,staff2])-note(n30,60,3275,3538,42,1,1). -snote(n40,[E,n],4,4:1,0,1/4,6.0000,7.0000,[v5,staff2])-note(n32,64,3291,3526,59,1,1). -snote(n32,[G,n],5,4:1,1/16,1/16,6.2500,6.5000,[v1,staff1])-note(n33,79,3413,3499,62,1,1). -snote(n33,[E,n],6,4:1,1/8,1/16,6.5000,6.7500,[v1,staff1])-note(n34,88,3531,3657,69,1,1). -snote(n34,[D,n],6,4:1,3/16,1/16,6.7500,7.0000,[v1,staff1])-note(n35,86,3639,3762,74,1,1). -snote(n35,[C,n],6,4:2,0,1/16,7.0000,7.2500,[v1,staff1])-note(n36,84,3758,3859,62,1,1). -snote(n36,[B,n],5,4:2,1/16,1/16,7.2500,7.5000,[v1,staff1])-note(n37,83,3845,3912,64,1,1). -snote(n37,[A,n],5,4:2,1/8,1/16,7.5000,7.7500,[v1,staff1])-note(n38,81,3933,3976,59,1,1). -snote(n38,[G,n],5,4:2,3/16,1/16,7.7500,8.0000,[v1,staff1])-note(n40,79,4058,4069,58,1,1). -snote(n42,[C,#],4,4:2,3/16,1/16,7.7500,8.0000,[v5,staff2])-note(n39,61,4050,4094,60,1,1). -snote(n43,[G,n],5,5:1,0,1/16,8.0000,8.2500,[v1,staff1])-note(n41,79,4187,4262,63,1,1). -snote(n51,[D,n],4,5:1,0,1/4,8.0000,9.0000,[v5,staff2])-note(n42,62,4203,4563,79,1,1). -snote(n44,[F,n],5,5:1,1/16,1/16,8.2500,8.5000,[v1,staff1])-note(n43,77,4289,4381,87,1,1). -snote(n45,[D,n],6,5:1,1/8,1/16,8.5000,8.7500,[v1,staff1])-note(n44,86,4410,4548,80,1,1). -snote(n46,[C,n],6,5:1,3/16,1/16,8.7500,9.0000,[v1,staff1])-note(n45,84,4531,4679,70,1,1). -snote(n47,[B,n],5,5:2,0,1/16,9.0000,9.2500,[v1,staff1])-note(n46,83,4637,4736,67,1,1). -snote(n48,[A,n],5,5:2,1/16,1/16,9.2500,9.5000,[v1,staff1])-note(n47,81,4730,4810,72,1,1). -snote(n49,[G,n],5,5:2,1/8,1/16,9.5000,9.7500,[v1,staff1])-note(n48,79,4838,4876,61,1,1). -snote(n50,[F,n],5,5:2,3/16,1/16,9.7500,10.0000,[v1,staff1])-note(n49,77,4939,4961,68,1,1). -snote(n53,[B,n],3,5:2,3/16,1/16,9.7500,10.0000,[v5,staff2])-note(n50,59,4944,4981,51,1,1). -snote(n54,[F,n],5,6:1,0,1/16,10.0000,10.2500,[v1,staff1])-note(n51,77,5062,5144,79,1,1). -snote(n62,[C,n],4,6:1,0,1/4,10.0000,11.0000,[v5,staff2])-note(n52,60,5099,5501,64,1,1). -snote(n55,[E,n],5,6:1,1/16,1/16,10.2500,10.5000,[v1,staff1])-note(n53,76,5176,5260,72,1,1). -snote(n56,[C,n],6,6:1,1/8,1/16,10.5000,10.7500,[v1,staff1])-note(n54,84,5303,5436,69,1,1). -snote(n57,[B,n],5,6:1,3/16,1/16,10.7500,11.0000,[v1,staff1])-note(n55,83,5407,5552,68,1,1). -snote(n58,[A,n],5,6:2,0,1/16,11.0000,11.2500,[v1,staff1])-note(n56,81,5509,5611,61,1,1). -snote(n59,[G,n],5,6:2,1/16,1/16,11.2500,11.5000,[v1,staff1])-note(n57,79,5596,5677,70,1,1). -snote(n60,[F,n],5,6:2,1/8,1/16,11.5000,11.7500,[v1,staff1])-note(n58,77,5684,5753,82,1,1). -snote(n61,[E,n],5,6:2,3/16,1/16,11.7500,12.0000,[v1,staff1])-note(n60,76,5809,5882,61,1,1). -snote(n64,[A,n],3,6:2,3/16,1/16,11.7500,12.0000,[v5,staff2])-note(n59,57,5793,5854,65,1,1). -snote(n65,[D,n],5,7:1,0,1/8,12.0000,12.5000,[v1,staff1])-note(n61,74,5922,6176,75,1,1). -snote(n69,[F,n],3,7:1,0,1/4,12.0000,13.0000,[v5,staff2])-note(n62,53,5978,6219,63,1,1). -snote(n66,[A,n],5,7:1,1/8,1/8,12.5000,13.0000,[v1,staff1])-note(n63,81,6197,6454,70,1,1). -snote(n67,[G,n],5,7:2,0,1/8,13.0000,13.5000,[v1,staff1])-note(n65,79,6420,6614,77,1,1). -snote(n70,[G,n],3,7:2,0,1/4,13.0000,14.0000,[v5,staff2])-note(n64,55,6416,6610,60,1,1). -snote(n68,[B,n],4,7:2,1/8,1/8,13.5000,14.0000,[v1,staff1])-note(n66,71,6643,6850,69,1,1). -snote(n71,[C,n],5,8:1,0,1/4,14.0000,15.0000,[v1,staff1])-note(n67,72,6898,7487,51,1,1). -snote(n73,[C,n],4,8:1,0,1/4,14.0000,15.0000,[v5,staff2])-note(n68,60,6911,7028,49,1,1). -snote(n74,[C,n],3,8:2,0,1/4,15.0000,16.0000,[v5,staff2])-note(n69,48,7434,7484,42,1,1). -snote(n75,[A,n],5,9:1,0,1/16,16.0000,16.2500,[v1,staff1])-note(n71,81,7928,7983,53,1,1). -snote(n83,[E,n],4,9:1,0,1/4,16.0000,17.0000,[v5,staff2])-note(n70,64,7920,7951,63,1,1). -snote(n76,[G,n],5,9:1,1/16,1/16,16.2500,16.5000,[v1,staff1])-note(n72,79,8012,8083,61,1,1). -snote(n77,[F,#],5,9:1,1/8,1/16,16.5000,16.7500,[v1,staff1])-note(n73,78,8126,8180,67,1,1). -snote(n78,[G,n],5,9:1,3/16,1/16,16.7500,17.0000,[v1,staff1])-note(n74,79,8258,8298,53,1,1). -snote(n79,[F,#],5,9:2,0,1/16,17.0000,17.2500,[v1,staff1])-note(n75,78,8358,8440,52,1,1). -snote(n84,[G,n],3,9:2,0,1/4,17.0000,18.0000,[v5,staff2])-note(n76,55,8362,8437,54,1,1). -snote(n80,[G,n],5,9:2,1/16,1/16,17.2500,17.5000,[v1,staff1])-note(n77,79,8459,8619,45,1,1). -snote(n81,[A,n],5,9:2,1/8,1/16,17.5000,17.7500,[v1,staff1])-note(n78,81,8565,8679,64,1,1). -snote(n82,[G,n],5,9:2,3/16,1/16,17.7500,18.0000,[v1,staff1])-note(n79,79,8673,8701,26,1,1). -snote(n85,[G,n],5,10:1,0,1/16,18.0000,18.2500,[v1,staff1])-note(n81,79,8812,8915,73,1,1). -snote(n93,[D,n],4,10:1,0,1/4,18.0000,19.0000,[v5,staff2])-note(n80,62,8806,8866,68,1,1). -snote(n86,[F,n],5,10:1,1/16,1/16,18.2500,18.5000,[v1,staff1])-note(n82,77,8931,8989,55,1,1). -snote(n87,[E,n],5,10:1,1/8,1/16,18.5000,18.7500,[v1,staff1])-note(n83,76,9002,9070,72,1,1). -snote(n88,[F,n],5,10:1,3/16,1/16,18.7500,19.0000,[v1,staff1])-note(n84,77,9126,9180,54,1,1). -snote(n89,[E,n],5,10:2,0,1/16,19.0000,19.2500,[v1,staff1])-note(n85,76,9206,9295,65,1,1). -snote(n94,[G,n],3,10:2,0,1/4,19.0000,20.0000,[v5,staff2])-note(n86,55,9256,9354,49,1,1). -snote(n90,[F,n],5,10:2,1/16,1/16,19.2500,19.5000,[v1,staff1])-note(n87,77,9325,9384,52,1,1). -snote(n91,[G,n],5,10:2,1/8,1/16,19.5000,19.7500,[v1,staff1])-note(n88,79,9415,9492,63,1,1). -snote(n92,[F,n],5,10:2,3/16,1/16,19.7500,20.0000,[v1,staff1])-note(n89,77,9500,9542,52,1,1). -snote(n95,[F,n],5,11:1,0,1/16,20.0000,20.2500,[v1,staff1])-note(n90,77,9649,9768,65,1,1). -snote(n103,[C,n],4,11:1,0,1/4,20.0000,21.0000,[v5,staff2])-note(n91,60,9665,9719,65,1,1). -snote(n96,[E,n],5,11:1,1/16,1/16,20.2500,20.5000,[v1,staff1])-note(n92,76,9763,9859,67,1,1). -snote(n97,[D,#],5,11:1,1/8,1/16,20.5000,20.7500,[v1,staff1])-note(n93,75,9870,9956,64,1,1). -snote(n98,[E,n],5,11:1,3/16,1/16,20.7500,21.0000,[v1,staff1])-note(n94,76,9988,10056,55,1,1). -snote(n99,[D,#],5,11:2,0,1/16,21.0000,21.2500,[v1,staff1])-note(n96,75,10090,10183,49,1,1). -snote(n104,[G,n],3,11:2,0,1/4,21.0000,22.0000,[v5,staff2])-note(n95,55,10085,10192,60,1,1). -snote(n100,[E,n],5,11:2,1/16,1/16,21.2500,21.5000,[v1,staff1])-note(n97,76,10205,10265,58,1,1). -snote(n101,[F,n],5,11:2,1/8,1/16,21.5000,21.7500,[v1,staff1])-note(n98,77,10313,10408,65,1,1). -snote(n102,[E,n],5,11:2,3/16,1/16,21.7500,22.0000,[v1,staff1])-note(n99,76,10394,10424,52,1,1). -snote(n105,[E,n],5,12:1,0,1/16,22.0000,22.2500,[v1,staff1])-note(n100,76,10527,10607,78,1,1). -snote(n113,[F,n],4,12:1,0,1/4,22.0000,23.0000,[v5,staff2])-note(n101,65,10540,10615,63,1,1). -snote(n106,[D,n],5,12:1,1/16,1/16,22.2500,22.5000,[v1,staff1])-note(n102,74,10646,10711,58,1,1). -snote(n107,[C,#],5,12:1,1/8,1/16,22.5000,22.7500,[v1,staff1])-note(n103,73,10755,10818,55,1,1). -snote(n108,[D,n],5,12:1,3/16,1/16,22.7500,23.0000,[v1,staff1])-note(n104,74,10870,10910,48,1,1). -snote(n109,[C,#],5,12:2,0,1/16,23.0000,23.2500,[v1,staff1])-note(n105,73,10958,11052,55,1,1). -snote(n114,[G,n],3,12:2,0,1/4,23.0000,24.0000,[v5,staff2])-note(n106,55,10993,11084,49,1,1). -snote(n110,[D,n],5,12:2,1/16,1/16,23.2500,23.5000,[v1,staff1])-note(n107,74,11095,11115,39,1,1). -snote(n111,[E,n],5,12:2,1/8,1/16,23.5000,23.7500,[v1,staff1])-note(n108,76,11161,11217,55,1,1). -snote(n112,[D,n],5,12:2,3/16,1/16,23.7500,24.0000,[v1,staff1])-note(n109,74,11233,11283,61,1,1). -snote(n115,[A,n],5,13:1,0,1/16,24.0000,24.2500,[v1,staff1])-note(n112,81,11420,11494,67,1,1). -snote(n123,[G,n],3,13:1,0,1/2,24.0000,26.0000,[v5,staff2])-note(n111,55,11406,12019,53,1,1). -snote(n124,[E,n],4,13:1,0,1/2,24.0000,26.0000,[v5,staff2])-note(n110,64,11400,12020,60,1,1). -snote(n116,[G,n],5,13:1,1/16,1/16,24.2500,24.5000,[v1,staff1])-note(n113,79,11536,11590,66,1,1). -snote(n117,[F,#],5,13:1,1/8,1/16,24.5000,24.7500,[v1,staff1])-note(n114,78,11643,11701,52,1,1). -snote(n118,[G,n],5,13:1,3/16,1/16,24.7500,25.0000,[v1,staff1])-note(n115,79,11731,11808,69,1,1). -snote(n119,[E,n],6,13:2,0,1/16,25.0000,25.2500,[v1,staff1])-note(n116,88,11851,11976,77,1,1). -snote(n120,[C,n],6,13:2,1/16,1/16,25.2500,25.5000,[v1,staff1])-note(n117,84,11963,12107,58,1,1). -snote(n121,[A,n],5,13:2,1/8,1/16,25.5000,25.7500,[v1,staff1])-note(n118,81,12068,12150,66,1,1). -snote(n122,[G,n],5,13:2,3/16,1/16,25.7500,26.0000,[v1,staff1])-note(n119,79,12149,12197,64,1,1). -snote(n125,[G,n],5,14:1,0,1/16,26.0000,26.2500,[v1,staff1])-note(n122,79,12315,12393,75,1,1). -snote(n133,[G,n],3,14:1,0,1/2,26.0000,28.0000,[v5,staff2])-note(n120,55,12304,12924,54,1,1). -snote(n134,[D,n],4,14:1,0,1/2,26.0000,28.0000,[v5,staff2])-note(n121,62,12313,12949,61,1,1). -snote(n126,[F,n],5,14:1,1/16,1/16,26.2500,26.5000,[v1,staff1])-note(n123,77,12425,12501,73,1,1). -snote(n127,[E,n],5,14:1,1/8,1/16,26.5000,26.7500,[v1,staff1])-note(n124,76,12548,12614,53,1,1). -snote(n128,[F,n],5,14:1,3/16,1/16,26.7500,27.0000,[v1,staff1])-note(n125,77,12643,12723,77,1,1). -snote(n129,[D,n],6,14:2,0,1/16,27.0000,27.2500,[v1,staff1])-note(n126,86,12762,12910,79,1,1). -snote(n130,[B,n],5,14:2,1/16,1/16,27.2500,27.5000,[v1,staff1])-note(n127,83,12884,13010,59,1,1). -snote(n131,[G,n],5,14:2,1/8,1/16,27.5000,27.7500,[v1,staff1])-note(n128,79,12988,13049,64,1,1). -snote(n132,[F,n],5,14:2,3/16,1/16,27.7500,28.0000,[v1,staff1])-note(n129,77,13061,13104,62,1,1). -snote(n135,[F,n],5,15:1,0,1/16,28.0000,28.2500,[v1,staff1])-note(n130,77,13215,13299,64,1,1). -snote(n143,[G,n],3,15:1,0,1/4,28.0000,29.0000,[v5,staff2])-note(n131,55,13227,13754,45,1,1). -snote(n144,[C,n],4,15:1,0,1/4,28.0000,29.0000,[v5,staff2])-note(n132,60,13229,13761,42,1,1). -snote(n136,[E,n],5,15:1,1/16,1/16,28.2500,28.5000,[v1,staff1])-note(n133,76,13343,13394,52,1,1). -snote(n137,[D,#],5,15:1,1/8,1/16,28.5000,28.7500,[v1,staff1])-note(n134,75,13449,13547,61,1,1). -snote(n138,[E,n],5,15:1,3/16,1/16,28.7500,29.0000,[v1,staff1])-note(n135,76,13570,13709,58,1,1). -snote(n139,[C,n],6,15:2,0,1/16,29.0000,29.2500,[v1,staff1])-note(n136,84,13666,13790,67,1,1). -insertion-note(n137,81,13852,13931,23,1,1). -snote(n140,[G,n],5,15:2,1/16,1/16,29.2500,29.5000,[v1,staff1])-note(n138,79,13854,13892,31,1,1). -snote(n141,[F,n],5,15:2,1/8,1/16,29.5000,29.7500,[v1,staff1])-note(n139,77,13900,13997,55,1,1). -snote(n142,[E,n],5,15:2,3/16,1/16,29.7500,30.0000,[v1,staff1])-note(n141,76,14007,14217,62,1,1). -snote(n146,[C,n],4,15:2,3/16,1/16,29.7500,30.0000,[v5,staff2])-note(n140,60,13990,14130,52,1,1). -snote(n147,[G,n],5,16:1,0,3/16,30.0000,30.7500,[v1,staff1])-note(n144,79,14219,14738,68,1,1). -snote(n150,[E,n],4,16:1,0,3/16,30.0000,30.7500,[v5,staff2])-note(n143,64,14198,14709,44,1,1). -snote(n153,[G,n],3,16:1,0,1/2,30.0000,32.0000,[v6,staff2])-note(n142,55,14181,14897,45,1,1). -snote(n148,[E,n],5,16:1,3/16,1/16,30.7500,31.0000,[v1,staff1])-note(n146,76,14733,14901,47,1,1). -snote(n151,[C,n],4,16:1,3/16,1/16,30.7500,31.0000,[v5,staff2])-note(n145,60,14730,14872,43,1,1). -snote(n149,[D,n],5,16:2,0,1/4,31.0000,32.0000,[v1,staff1])-note(n148,74,14894,15140,44,1,1). -snote(n152,[B,n],3,16:2,0,1/4,31.0000,32.0000,[v5,staff2])-note(n147,59,14892,15103,51,1,1). -snote(n154,[D,n],5,17:1,0,1/16,32.0000,32.2500,[v1,staff1])-note(n150,74,15590,15672,58,1,1). -snote(n162,[C,n],3,17:1,0,1/4,32.0000,33.0000,[v5,staff2])-note(n149,48,15585,15661,61,1,1). -snote(n155,[C,n],5,17:1,1/16,1/16,32.2500,32.5000,[v1,staff1])-note(n151,72,15720,15756,39,1,1). -snote(n156,[B,n],4,17:1,1/8,1/16,32.5000,32.7500,[v1,staff1])-note(n152,71,15800,15856,54,1,1). -snote(n157,[C,n],5,17:1,3/16,1/16,32.7500,33.0000,[v1,staff1])-note(n153,72,15895,15993,55,1,1). -snote(n158,[B,n],4,17:2,0,1/16,33.0000,33.2500,[v1,staff1])-note(n155,71,16026,16096,48,1,1). -snote(n163,[C,n],4,17:2,0,1/4,33.0000,34.0000,[v5,staff2])-note(n154,60,16014,16068,59,1,1). -snote(n159,[C,n],5,17:2,1/16,1/16,33.2500,33.5000,[v1,staff1])-note(n156,72,16170,16214,43,1,1). -snote(n160,[B,n],4,17:2,1/8,1/16,33.5000,33.7500,[v1,staff1])-note(n157,71,16255,16315,59,1,1). -snote(n161,[C,n],5,17:2,3/16,1/16,33.7500,34.0000,[v1,staff1])-note(n158,72,16355,16377,49,1,1). -snote(n164,[A,n],5,18:1,0,1/16,34.0000,34.2500,[v1,staff1])-note(n160,81,16460,16530,25,1,1). -snote(n172,[E,n],4,18:1,0,1/4,34.0000,35.0000,[v5,staff2])-note(n159,64,16437,16500,59,1,1). -snote(n165,[G,n],5,18:1,1/16,1/16,34.2500,34.5000,[v1,staff1])-note(n161,79,16576,16647,63,1,1). -snote(n166,[F,#],5,18:1,1/8,1/16,34.5000,34.7500,[v1,staff1])-note(n162,78,16674,16734,58,1,1). -snote(n167,[G,n],5,18:1,3/16,1/16,34.7500,35.0000,[v1,staff1])-note(n163,79,16802,16826,42,1,1). -snote(n168,[F,#],5,18:2,0,1/16,35.0000,35.2500,[v1,staff1])-note(n164,78,16897,16950,54,1,1). -snote(n173,[C,n],4,18:2,0,1/4,35.0000,36.0000,[v5,staff2])-note(n165,60,16900,16961,47,1,1). -snote(n169,[G,n],5,18:2,1/16,1/16,35.2500,35.5000,[v1,staff1])-note(n166,79,17000,17030,44,1,1). -snote(n170,[F,#],5,18:2,1/8,1/16,35.5000,35.7500,[v1,staff1])-note(n167,78,17095,17149,55,1,1). -snote(n171,[G,n],5,18:2,3/16,1/16,35.7500,36.0000,[v1,staff1])-note(n168,79,17227,17239,32,1,1). -snote(n174,[G,#],5,19:1,0,1/16,36.0000,36.2500,[v1,staff1])-note(n169,80,17291,17379,60,1,1). -snote(n182,[F,n],4,19:1,0,1/4,36.0000,37.0000,[v5,staff2])-note(n170,65,17318,17379,50,1,1). -snote(n175,[A,n],5,19:1,1/16,1/16,36.2500,36.5000,[v1,staff1])-note(n171,81,17413,17516,64,1,1). -snote(n176,[C,n],6,19:1,1/8,1/16,36.5000,36.7500,[v1,staff1])-note(n172,84,17515,17625,60,1,1). -snote(n177,[B,n],5,19:1,3/16,1/16,36.7500,37.0000,[v1,staff1])-note(n173,83,17639,17715,44,1,1). -snote(n178,[D,n],6,19:2,0,1/16,37.0000,37.2500,[v1,staff1])-note(n174,86,17721,17846,61,1,1). -snote(n183,[C,n],4,19:2,0,1/4,37.0000,38.0000,[v5,staff2])-note(n175,60,17737,17822,46,1,1). -snote(n179,[C,n],6,19:2,1/16,1/16,37.2500,37.5000,[v1,staff1])-note(n176,84,17871,17948,42,1,1). -snote(n180,[B,n],5,19:2,1/8,1/16,37.5000,37.7500,[v1,staff1])-note(n177,83,17953,18033,55,1,1). -snote(n181,[A,n],5,19:2,3/16,1/16,37.7500,38.0000,[v1,staff1])-note(n178,81,18035,18067,58,1,1). -snote(n184,[A,n],5,20:1,0,1/16,38.0000,38.2500,[v1,staff1])-note(n181,81,18201,18252,55,1,1). -snote(n192,[C,n],4,20:1,0,1/4,38.0000,39.0000,[v5,staff2])-note(n179,60,18194,18582,48,1,1). -snote(n193,[E,n],4,20:1,0,1/4,38.0000,39.0000,[v5,staff2])-note(n180,64,18201,18543,55,1,1). -snote(n185,[G,n],5,20:1,1/16,1/16,38.2500,38.5000,[v1,staff1])-note(n182,79,18290,18385,67,1,1). -snote(n186,[E,n],6,20:1,1/8,1/16,38.5000,38.7500,[v1,staff1])-note(n183,88,18420,18561,66,1,1). -snote(n187,[D,n],6,20:1,3/16,1/16,38.7500,39.0000,[v1,staff1])-note(n184,86,18532,18660,63,1,1). -snote(n188,[C,n],6,20:2,0,1/16,39.0000,39.2500,[v1,staff1])-note(n185,84,18632,18742,71,1,1). -snote(n189,[B,n],5,20:2,1/16,1/16,39.2500,39.5000,[v1,staff1])-note(n186,83,18721,18794,68,1,1). -snote(n190,[A,n],5,20:2,1/8,1/16,39.5000,39.7500,[v1,staff1])-note(n187,81,18813,18856,60,1,1). -snote(n191,[G,n],5,20:2,3/16,1/16,39.7500,40.0000,[v1,staff1])-note(n189,79,18948,18977,71,1,1). -snote(n195,[C,#],4,20:2,3/16,1/16,39.7500,40.0000,[v5,staff2])-note(n188,61,18940,18986,58,1,1). -snote(n196,[G,n],5,21:1,0,1/16,40.0000,40.2500,[v1,staff1])-note(n190,79,19065,19157,77,1,1). -snote(n204,[D,n],4,21:1,0,1/4,40.0000,41.0000,[v5,staff2])-note(n191,62,19087,19522,74,1,1). -snote(n197,[F,n],5,21:1,1/16,1/16,40.2500,40.5000,[v1,staff1])-note(n192,77,19185,19289,84,1,1). -snote(n198,[D,n],6,21:1,1/8,1/16,40.5000,40.7500,[v1,staff1])-note(n193,86,19293,19411,75,1,1). -snote(n199,[C,n],6,21:1,3/16,1/16,40.7500,41.0000,[v1,staff1])-note(n194,84,19409,19543,62,1,1). -snote(n200,[B,n],5,21:2,0,1/16,41.0000,41.2500,[v1,staff1])-note(n195,83,19506,19618,71,1,1). -snote(n201,[A,n],5,21:2,1/16,1/16,41.2500,41.5000,[v1,staff1])-note(n196,81,19616,19671,45,1,1). -snote(n202,[G,n],5,21:2,1/8,1/16,41.5000,41.7500,[v1,staff1])-note(n197,79,19679,19734,70,1,1). -snote(n203,[F,n],5,21:2,3/16,1/16,41.7500,42.0000,[v1,staff1])-note(n198,77,19810,19845,81,1,1). -snote(n206,[B,n],3,21:2,3/16,1/16,41.7500,42.0000,[v5,staff2])-note(n199,59,19840,19876,47,1,1). -snote(n207,[F,n],5,22:1,0,1/16,42.0000,42.2500,[v1,staff1])-note(n200,77,19948,20032,77,1,1). -snote(n215,[C,n],4,22:1,0,1/4,42.0000,43.0000,[v5,staff2])-note(n201,60,19981,20353,69,1,1). -snote(n208,[E,n],5,22:1,1/16,1/16,42.2500,42.5000,[v1,staff1])-note(n202,76,20053,20156,77,1,1). -snote(n209,[C,n],6,22:1,1/8,1/16,42.5000,42.7500,[v1,staff1])-note(n203,84,20176,20270,68,1,1). -snote(n210,[B,n],5,22:1,3/16,1/16,42.7500,43.0000,[v1,staff1])-note(n204,83,20276,20417,62,1,1). -snote(n211,[A,n],5,22:2,0,1/16,43.0000,43.2500,[v1,staff1])-note(n205,81,20379,20485,59,1,1). -snote(n212,[G,n],5,22:2,1/16,1/16,43.2500,43.5000,[v1,staff1])-note(n206,79,20462,20534,71,1,1). -snote(n213,[F,n],5,22:2,1/8,1/16,43.5000,43.7500,[v1,staff1])-note(n207,77,20557,20635,72,1,1). -snote(n214,[E,n],5,22:2,3/16,1/16,43.7500,44.0000,[v1,staff1])-note(n208,76,20663,20743,76,1,1). -snote(n217,[A,n],3,22:2,3/16,1/16,43.7500,44.0000,[v5,staff2])-note(n209,57,20675,20787,61,1,1). -snote(n218,[D,n],5,23:1,0,1/8,44.0000,44.5000,[v1,staff1])-note(n210,74,20796,21067,64,1,1). -snote(n222,[F,n],3,23:1,0,1/4,44.0000,45.0000,[v5,staff2])-note(n211,53,20854,21113,72,1,1). -snote(n219,[A,n],5,23:1,1/8,1/8,44.5000,45.0000,[v1,staff1])-note(n212,81,21064,21476,68,1,1). -snote(n220,[G,n],5,23:2,0,1/8,45.0000,45.5000,[v1,staff1])-note(n214,79,21296,21543,75,1,1). -snote(n223,[G,n],3,23:2,0,1/4,45.0000,46.0000,[v5,staff2])-note(n213,55,21287,21555,70,1,1). -snote(n221,[B,n],4,23:2,1/8,1/8,45.5000,46.0000,[v1,staff1])-note(n215,71,21540,21748,58,1,1). -snote(n224,[C,n],5,24:1,0,1/4,46.0000,47.0000,[v1,staff1])-note(n216,72,21793,22915,48,1,1). -snote(n226,[C,n],4,24:1,0,1/4,46.0000,47.0000,[v5,staff2])-note(n217,60,21819,22029,49,1,1). -snote(n227,[C,n],3,24:2,0,1/4,47.0000,48.0000,[v5,staff2])-note(n218,48,22393,22966,50,1,1). +snote(n1,[D,n],5,1:1,0,1/16,0.0000,0.2500,[v1,staff1])-note(n2,74,692,773,72,1,1). +snote(n9,[C,n],3,1:1,0,1/4,0.0000,1.0000,[v5,staff2])-note(n1,48,683,747,70,1,1). +snote(n2,[C,n],5,1:1,1/16,1/16,0.2500,0.5000,[v1,staff1])-note(n3,72,819,892,53,1,1). +snote(n3,[B,n],4,1:1,1/8,1/16,0.5000,0.7500,[v1,staff1])-note(n4,71,914,980,54,1,1). +snote(n4,[C,n],5,1:1,3/16,1/16,0.7500,1.0000,[v1,staff1])-note(n5,72,1009,1098,48,1,1). +snote(n5,[B,n],4,1:2,0,1/16,1.0000,1.2500,[v1,staff1])-note(n7,71,1128,1174,61,1,1). +snote(n10,[C,n],4,1:2,0,1/4,1.0000,2.0000,[v5,staff2])-note(n6,60,1122,1160,67,1,1). +snote(n6,[C,n],5,1:2,1/16,1/16,1.2500,1.5000,[v1,staff1])-note(n8,72,1233,1284,44,1,1). +snote(n7,[B,n],4,1:2,1/8,1/16,1.5000,1.7500,[v1,staff1])-note(n9,71,1316,1410,65,1,1). +snote(n8,[C,n],5,1:2,3/16,1/16,1.7500,2.0000,[v1,staff1])-note(n10,72,1420,1490,61,1,1). +snote(n11,[A,n],5,2:1,0,1/16,2.0000,2.2500,[v1,staff1])-note(n12,81,1556,1637,55,1,1). +snote(n19,[E,n],4,2:1,0,1/4,2.0000,3.0000,[v5,staff2])-note(n11,64,1541,1614,75,1,1). +snote(n12,[G,n],5,2:1,1/16,1/16,2.2500,2.5000,[v1,staff1])-note(n13,79,1683,1752,62,1,1). +snote(n13,[F,#],5,2:1,1/8,1/16,2.5000,2.7500,[v1,staff1])-note(n14,78,1785,1831,52,1,1). +snote(n14,[G,n],5,2:1,3/16,1/16,2.7500,3.0000,[v1,staff1])-note(n15,79,1893,1949,77,1,1). +snote(n15,[F,#],5,2:2,0,1/16,3.0000,3.2500,[v1,staff1])-note(n16,78,1984,2041,60,1,1). +snote(n20,[C,n],4,2:2,0,1/4,3.0000,4.0000,[v5,staff2])-note(n17,60,2002,2043,49,1,1). +snote(n16,[G,n],5,2:2,1/16,1/16,3.2500,3.5000,[v1,staff1])-note(n18,79,2100,2130,52,1,1). +snote(n17,[F,#],5,2:2,1/8,1/16,3.5000,3.7500,[v1,staff1])-note(n19,78,2180,2235,64,1,1). +snote(n18,[G,n],5,2:2,3/16,1/16,3.7500,4.0000,[v1,staff1])-note(n20,79,2275,2317,54,1,1). +snote(n21,[G,#],5,3:1,0,1/16,4.0000,4.2500,[v1,staff1])-note(n21,80,2392,2454,61,1,1). +snote(n29,[F,n],4,3:1,0,1/4,4.0000,5.0000,[v5,staff2])-note(n22,65,2416,2457,61,1,1). +snote(n22,[A,n],5,3:1,1/16,1/16,4.2500,4.5000,[v1,staff1])-note(n23,81,2495,2600,61,1,1). +snote(n23,[C,n],6,3:1,1/8,1/16,4.5000,4.7500,[v1,staff1])-note(n24,84,2611,2722,62,1,1). +snote(n24,[B,n],5,3:1,3/16,1/16,4.7500,5.0000,[v1,staff1])-note(n25,83,2722,2796,51,1,1). +snote(n25,[D,n],6,3:2,0,1/16,5.0000,5.2500,[v1,staff1])-note(n26,86,2807,2939,61,1,1). +snote(n30,[C,n],4,3:2,0,1/4,5.0000,6.0000,[v5,staff2])-note(n27,60,2836,2890,45,1,1). +snote(n26,[C,n],6,3:2,1/16,1/16,5.2500,5.5000,[v1,staff1])-note(n28,84,2939,3024,55,1,1). +snote(n27,[B,n],5,3:2,1/8,1/16,5.5000,5.7500,[v1,staff1])-note(n29,83,3033,3093,64,1,1). +snote(n28,[A,n],5,3:2,3/16,1/16,5.7500,6.0000,[v1,staff1])-note(n30,81,3138,3162,52,1,1). +snote(n31,[A,n],5,4:1,0,1/16,6.0000,6.2500,[v1,staff1])-note(n32,81,3280,3364,68,1,1). +snote(n39,[C,n],4,4:1,0,1/4,6.0000,7.0000,[v5,staff2])-note(n31,60,3275,3538,42,1,1). +snote(n40,[E,n],4,4:1,0,1/4,6.0000,7.0000,[v5,staff2])-note(n33,64,3291,3526,59,1,1). +snote(n32,[G,n],5,4:1,1/16,1/16,6.2500,6.5000,[v1,staff1])-note(n34,79,3413,3499,62,1,1). +snote(n33,[E,n],6,4:1,1/8,1/16,6.5000,6.7500,[v1,staff1])-note(n35,88,3531,3657,69,1,1). +snote(n34,[D,n],6,4:1,3/16,1/16,6.7500,7.0000,[v1,staff1])-note(n36,86,3639,3762,74,1,1). +snote(n35,[C,n],6,4:2,0,1/16,7.0000,7.2500,[v1,staff1])-note(n37,84,3758,3859,62,1,1). +snote(n36,[B,n],5,4:2,1/16,1/16,7.2500,7.5000,[v1,staff1])-note(n38,83,3845,3912,64,1,1). +snote(n37,[A,n],5,4:2,1/8,1/16,7.5000,7.7500,[v1,staff1])-note(n39,81,3933,3976,59,1,1). +snote(n38,[G,n],5,4:2,3/16,1/16,7.7500,8.0000,[v1,staff1])-note(n41,79,4058,4069,58,1,1). +snote(n42,[C,#],4,4:2,3/16,1/16,7.7500,8.0000,[v5,staff2])-note(n40,61,4050,4094,60,1,1). +snote(n43,[G,n],5,5:1,0,1/16,8.0000,8.2500,[v1,staff1])-note(n42,79,4187,4262,63,1,1). +snote(n51,[D,n],4,5:1,0,1/4,8.0000,9.0000,[v5,staff2])-note(n43,62,4203,4563,79,1,1). +snote(n44,[F,n],5,5:1,1/16,1/16,8.2500,8.5000,[v1,staff1])-note(n44,77,4289,4381,87,1,1). +snote(n45,[D,n],6,5:1,1/8,1/16,8.5000,8.7500,[v1,staff1])-note(n45,86,4410,4548,80,1,1). +snote(n46,[C,n],6,5:1,3/16,1/16,8.7500,9.0000,[v1,staff1])-note(n46,84,4531,4679,70,1,1). +snote(n47,[B,n],5,5:2,0,1/16,9.0000,9.2500,[v1,staff1])-note(n47,83,4637,4736,67,1,1). +snote(n48,[A,n],5,5:2,1/16,1/16,9.2500,9.5000,[v1,staff1])-note(n48,81,4730,4810,72,1,1). +snote(n49,[G,n],5,5:2,1/8,1/16,9.5000,9.7500,[v1,staff1])-note(n49,79,4838,4876,61,1,1). +snote(n50,[F,n],5,5:2,3/16,1/16,9.7500,10.0000,[v1,staff1])-note(n50,77,4939,4961,68,1,1). +snote(n53,[B,n],3,5:2,3/16,1/16,9.7500,10.0000,[v5,staff2])-note(n51,59,4944,4981,51,1,1). +snote(n54,[F,n],5,6:1,0,1/16,10.0000,10.2500,[v1,staff1])-note(n52,77,5062,5144,79,1,1). +snote(n62,[C,n],4,6:1,0,1/4,10.0000,11.0000,[v5,staff2])-note(n53,60,5099,5501,64,1,1). +snote(n55,[E,n],5,6:1,1/16,1/16,10.2500,10.5000,[v1,staff1])-note(n54,76,5176,5260,72,1,1). +snote(n56,[C,n],6,6:1,1/8,1/16,10.5000,10.7500,[v1,staff1])-note(n55,84,5303,5436,69,1,1). +snote(n57,[B,n],5,6:1,3/16,1/16,10.7500,11.0000,[v1,staff1])-note(n56,83,5407,5552,68,1,1). +snote(n58,[A,n],5,6:2,0,1/16,11.0000,11.2500,[v1,staff1])-note(n57,81,5509,5611,61,1,1). +snote(n59,[G,n],5,6:2,1/16,1/16,11.2500,11.5000,[v1,staff1])-note(n58,79,5596,5677,70,1,1). +snote(n60,[F,n],5,6:2,1/8,1/16,11.5000,11.7500,[v1,staff1])-note(n59,77,5684,5753,82,1,1). +snote(n61,[E,n],5,6:2,3/16,1/16,11.7500,12.0000,[v1,staff1])-note(n61,76,5809,5882,61,1,1). +snote(n64,[A,n],3,6:2,3/16,1/16,11.7500,12.0000,[v5,staff2])-note(n60,57,5793,5854,65,1,1). +snote(n65,[D,n],5,7:1,0,1/8,12.0000,12.5000,[v1,staff1])-note(n62,74,5922,6176,75,1,1). +snote(n69,[F,n],3,7:1,0,1/4,12.0000,13.0000,[v5,staff2])-note(n63,53,5978,6219,63,1,1). +snote(n66,[A,n],5,7:1,1/8,1/8,12.5000,13.0000,[v1,staff1])-note(n64,81,6197,6454,70,1,1). +snote(n67,[G,n],5,7:2,0,1/8,13.0000,13.5000,[v1,staff1])-note(n66,79,6420,6614,77,1,1). +snote(n70,[G,n],3,7:2,0,1/4,13.0000,14.0000,[v5,staff2])-note(n65,55,6416,6610,60,1,1). +snote(n68,[B,n],4,7:2,1/8,1/8,13.5000,14.0000,[v1,staff1])-note(n67,71,6643,6850,69,1,1). +snote(n71,[C,n],5,8:1,0,1/4,14.0000,15.0000,[v1,staff1])-note(n68,72,6898,7487,51,1,1). +snote(n73,[C,n],4,8:1,0,1/4,14.0000,15.0000,[v5,staff2])-note(n69,60,6911,7028,49,1,1). +snote(n74,[C,n],3,8:2,0,1/4,15.0000,16.0000,[v5,staff2])-note(n70,48,7434,7484,42,1,1). +snote(n75,[A,n],5,9:1,0,1/16,16.0000,16.2500,[v1,staff1])-note(n72,81,7928,7983,53,1,1). +snote(n83,[E,n],4,9:1,0,1/4,16.0000,17.0000,[v5,staff2])-note(n71,64,7920,7951,63,1,1). +snote(n76,[G,n],5,9:1,1/16,1/16,16.2500,16.5000,[v1,staff1])-note(n73,79,8012,8083,61,1,1). +snote(n77,[F,#],5,9:1,1/8,1/16,16.5000,16.7500,[v1,staff1])-note(n74,78,8126,8180,67,1,1). +snote(n78,[G,n],5,9:1,3/16,1/16,16.7500,17.0000,[v1,staff1])-note(n75,79,8258,8298,53,1,1). +snote(n79,[F,#],5,9:2,0,1/16,17.0000,17.2500,[v1,staff1])-note(n76,78,8358,8440,52,1,1). +snote(n84,[G,n],3,9:2,0,1/4,17.0000,18.0000,[v5,staff2])-note(n77,55,8362,8437,54,1,1). +snote(n80,[G,n],5,9:2,1/16,1/16,17.2500,17.5000,[v1,staff1])-note(n78,79,8459,8619,45,1,1). +snote(n81,[A,n],5,9:2,1/8,1/16,17.5000,17.7500,[v1,staff1])-note(n79,81,8565,8679,64,1,1). +snote(n82,[G,n],5,9:2,3/16,1/16,17.7500,18.0000,[v1,staff1])-note(n80,79,8673,8701,26,1,1). +snote(n85,[G,n],5,10:1,0,1/16,18.0000,18.2500,[v1,staff1])-note(n82,79,8812,8915,73,1,1). +snote(n93,[D,n],4,10:1,0,1/4,18.0000,19.0000,[v5,staff2])-note(n81,62,8806,8866,68,1,1). +snote(n86,[F,n],5,10:1,1/16,1/16,18.2500,18.5000,[v1,staff1])-note(n83,77,8931,8989,55,1,1). +snote(n87,[E,n],5,10:1,1/8,1/16,18.5000,18.7500,[v1,staff1])-note(n84,76,9002,9070,72,1,1). +snote(n88,[F,n],5,10:1,3/16,1/16,18.7500,19.0000,[v1,staff1])-note(n85,77,9126,9180,54,1,1). +snote(n89,[E,n],5,10:2,0,1/16,19.0000,19.2500,[v1,staff1])-note(n86,76,9206,9295,65,1,1). +snote(n94,[G,n],3,10:2,0,1/4,19.0000,20.0000,[v5,staff2])-note(n87,55,9256,9354,49,1,1). +snote(n90,[F,n],5,10:2,1/16,1/16,19.2500,19.5000,[v1,staff1])-note(n88,77,9325,9384,52,1,1). +snote(n91,[G,n],5,10:2,1/8,1/16,19.5000,19.7500,[v1,staff1])-note(n89,79,9415,9492,63,1,1). +snote(n92,[F,n],5,10:2,3/16,1/16,19.7500,20.0000,[v1,staff1])-note(n90,77,9500,9542,52,1,1). +snote(n95,[F,n],5,11:1,0,1/16,20.0000,20.2500,[v1,staff1])-note(n91,77,9649,9768,65,1,1). +snote(n103,[C,n],4,11:1,0,1/4,20.0000,21.0000,[v5,staff2])-note(n92,60,9665,9719,65,1,1). +snote(n96,[E,n],5,11:1,1/16,1/16,20.2500,20.5000,[v1,staff1])-note(n93,76,9763,9859,67,1,1). +snote(n97,[D,#],5,11:1,1/8,1/16,20.5000,20.7500,[v1,staff1])-note(n94,75,9870,9956,64,1,1). +snote(n98,[E,n],5,11:1,3/16,1/16,20.7500,21.0000,[v1,staff1])-note(n95,76,9988,10056,55,1,1). +snote(n99,[D,#],5,11:2,0,1/16,21.0000,21.2500,[v1,staff1])-note(n97,75,10090,10183,49,1,1). +snote(n104,[G,n],3,11:2,0,1/4,21.0000,22.0000,[v5,staff2])-note(n96,55,10085,10192,60,1,1). +snote(n100,[E,n],5,11:2,1/16,1/16,21.2500,21.5000,[v1,staff1])-note(n98,76,10205,10265,58,1,1). +snote(n101,[F,n],5,11:2,1/8,1/16,21.5000,21.7500,[v1,staff1])-note(n99,77,10313,10408,65,1,1). +snote(n102,[E,n],5,11:2,3/16,1/16,21.7500,22.0000,[v1,staff1])-note(n100,76,10394,10424,52,1,1). +snote(n105,[E,n],5,12:1,0,1/16,22.0000,22.2500,[v1,staff1])-note(n101,76,10527,10607,78,1,1). +snote(n113,[F,n],4,12:1,0,1/4,22.0000,23.0000,[v5,staff2])-note(n102,65,10540,10615,63,1,1). +snote(n106,[D,n],5,12:1,1/16,1/16,22.2500,22.5000,[v1,staff1])-note(n103,74,10646,10711,58,1,1). +snote(n107,[C,#],5,12:1,1/8,1/16,22.5000,22.7500,[v1,staff1])-note(n104,73,10755,10818,55,1,1). +snote(n108,[D,n],5,12:1,3/16,1/16,22.7500,23.0000,[v1,staff1])-note(n105,74,10870,10910,48,1,1). +snote(n109,[C,#],5,12:2,0,1/16,23.0000,23.2500,[v1,staff1])-note(n106,73,10958,11052,55,1,1). +snote(n114,[G,n],3,12:2,0,1/4,23.0000,24.0000,[v5,staff2])-note(n107,55,10993,11084,49,1,1). +snote(n110,[D,n],5,12:2,1/16,1/16,23.2500,23.5000,[v1,staff1])-note(n108,74,11095,11115,39,1,1). +snote(n111,[E,n],5,12:2,1/8,1/16,23.5000,23.7500,[v1,staff1])-note(n109,76,11161,11217,55,1,1). +snote(n112,[D,n],5,12:2,3/16,1/16,23.7500,24.0000,[v1,staff1])-note(n110,74,11233,11283,61,1,1). +snote(n115,[A,n],5,13:1,0,1/16,24.0000,24.2500,[v1,staff1])-note(n113,81,11420,11494,67,1,1). +snote(n123,[G,n],3,13:1,0,1/2,24.0000,26.0000,[v5,staff2])-note(n112,55,11406,12019,53,1,1). +snote(n124,[E,n],4,13:1,0,1/2,24.0000,26.0000,[v5,staff2])-note(n111,64,11400,12020,60,1,1). +snote(n116,[G,n],5,13:1,1/16,1/16,24.2500,24.5000,[v1,staff1])-note(n114,79,11536,11590,66,1,1). +snote(n117,[F,#],5,13:1,1/8,1/16,24.5000,24.7500,[v1,staff1])-note(n115,78,11643,11701,52,1,1). +snote(n118,[G,n],5,13:1,3/16,1/16,24.7500,25.0000,[v1,staff1])-note(n116,79,11731,11808,69,1,1). +snote(n119,[E,n],6,13:2,0,1/16,25.0000,25.2500,[v1,staff1])-note(n117,88,11851,11976,77,1,1). +snote(n120,[C,n],6,13:2,1/16,1/16,25.2500,25.5000,[v1,staff1])-note(n118,84,11963,12107,58,1,1). +snote(n121,[A,n],5,13:2,1/8,1/16,25.5000,25.7500,[v1,staff1])-note(n119,81,12068,12150,66,1,1). +snote(n122,[G,n],5,13:2,3/16,1/16,25.7500,26.0000,[v1,staff1])-note(n120,79,12149,12197,64,1,1). +snote(n125,[G,n],5,14:1,0,1/16,26.0000,26.2500,[v1,staff1])-note(n123,79,12315,12393,75,1,1). +snote(n133,[G,n],3,14:1,0,1/2,26.0000,28.0000,[v5,staff2])-note(n121,55,12304,12924,54,1,1). +snote(n134,[D,n],4,14:1,0,1/2,26.0000,28.0000,[v5,staff2])-note(n122,62,12313,12949,61,1,1). +snote(n126,[F,n],5,14:1,1/16,1/16,26.2500,26.5000,[v1,staff1])-note(n124,77,12425,12501,73,1,1). +snote(n127,[E,n],5,14:1,1/8,1/16,26.5000,26.7500,[v1,staff1])-note(n125,76,12548,12614,53,1,1). +snote(n128,[F,n],5,14:1,3/16,1/16,26.7500,27.0000,[v1,staff1])-note(n126,77,12643,12723,77,1,1). +snote(n129,[D,n],6,14:2,0,1/16,27.0000,27.2500,[v1,staff1])-note(n127,86,12762,12910,79,1,1). +snote(n130,[B,n],5,14:2,1/16,1/16,27.2500,27.5000,[v1,staff1])-note(n128,83,12884,13010,59,1,1). +snote(n131,[G,n],5,14:2,1/8,1/16,27.5000,27.7500,[v1,staff1])-note(n129,79,12988,13049,64,1,1). +snote(n132,[F,n],5,14:2,3/16,1/16,27.7500,28.0000,[v1,staff1])-note(n130,77,13061,13104,62,1,1). +snote(n135,[F,n],5,15:1,0,1/16,28.0000,28.2500,[v1,staff1])-note(n131,77,13215,13299,64,1,1). +snote(n143,[G,n],3,15:1,0,1/4,28.0000,29.0000,[v5,staff2])-note(n132,55,13227,13754,45,1,1). +snote(n144,[C,n],4,15:1,0,1/4,28.0000,29.0000,[v5,staff2])-note(n133,60,13229,13761,42,1,1). +snote(n136,[E,n],5,15:1,1/16,1/16,28.2500,28.5000,[v1,staff1])-note(n134,76,13343,13394,52,1,1). +snote(n137,[D,#],5,15:1,1/8,1/16,28.5000,28.7500,[v1,staff1])-note(n135,75,13449,13547,61,1,1). +snote(n138,[E,n],5,15:1,3/16,1/16,28.7500,29.0000,[v1,staff1])-note(n136,76,13570,13709,58,1,1). +snote(n139,[C,n],6,15:2,0,1/16,29.0000,29.2500,[v1,staff1])-note(n137,84,13666,13790,67,1,1). +insertion-note(n138,81,13852,13931,23,1,1). +snote(n140,[G,n],5,15:2,1/16,1/16,29.2500,29.5000,[v1,staff1])-note(n139,79,13854,13892,31,1,1). +snote(n141,[F,n],5,15:2,1/8,1/16,29.5000,29.7500,[v1,staff1])-note(n140,77,13900,13997,55,1,1). +snote(n142,[E,n],5,15:2,3/16,1/16,29.7500,30.0000,[v1,staff1])-note(n142,76,14007,14217,62,1,1). +snote(n146,[C,n],4,15:2,3/16,1/16,29.7500,30.0000,[v5,staff2])-note(n141,60,13990,14130,52,1,1). +snote(n147,[G,n],5,16:1,0,3/16,30.0000,30.7500,[v1,staff1])-note(n145,79,14219,14738,68,1,1). +snote(n150,[E,n],4,16:1,0,3/16,30.0000,30.7500,[v5,staff2])-note(n144,64,14198,14709,44,1,1). +snote(n153,[G,n],3,16:1,0,1/2,30.0000,32.0000,[v6,staff2])-note(n143,55,14181,14897,45,1,1). +snote(n148,[E,n],5,16:1,3/16,1/16,30.7500,31.0000,[v1,staff1])-note(n147,76,14733,14901,47,1,1). +snote(n151,[C,n],4,16:1,3/16,1/16,30.7500,31.0000,[v5,staff2])-note(n146,60,14730,14872,43,1,1). +snote(n149,[D,n],5,16:2,0,1/4,31.0000,32.0000,[v1,staff1])-note(n149,74,14894,15140,44,1,1). +snote(n152,[B,n],3,16:2,0,1/4,31.0000,32.0000,[v5,staff2])-note(n148,59,14892,15103,51,1,1). +snote(n154,[D,n],5,17:1,0,1/16,32.0000,32.2500,[v1,staff1])-note(n151,74,15590,15672,58,1,1). +snote(n162,[C,n],3,17:1,0,1/4,32.0000,33.0000,[v5,staff2])-note(n150,48,15585,15661,61,1,1). +snote(n155,[C,n],5,17:1,1/16,1/16,32.2500,32.5000,[v1,staff1])-note(n152,72,15720,15756,39,1,1). +snote(n156,[B,n],4,17:1,1/8,1/16,32.5000,32.7500,[v1,staff1])-note(n153,71,15800,15856,54,1,1). +snote(n157,[C,n],5,17:1,3/16,1/16,32.7500,33.0000,[v1,staff1])-note(n154,72,15895,15993,55,1,1). +snote(n158,[B,n],4,17:2,0,1/16,33.0000,33.2500,[v1,staff1])-note(n156,71,16026,16096,48,1,1). +snote(n163,[C,n],4,17:2,0,1/4,33.0000,34.0000,[v5,staff2])-note(n155,60,16014,16068,59,1,1). +snote(n159,[C,n],5,17:2,1/16,1/16,33.2500,33.5000,[v1,staff1])-note(n157,72,16170,16214,43,1,1). +snote(n160,[B,n],4,17:2,1/8,1/16,33.5000,33.7500,[v1,staff1])-note(n158,71,16255,16315,59,1,1). +snote(n161,[C,n],5,17:2,3/16,1/16,33.7500,34.0000,[v1,staff1])-note(n159,72,16355,16377,49,1,1). +snote(n164,[A,n],5,18:1,0,1/16,34.0000,34.2500,[v1,staff1])-note(n161,81,16460,16530,25,1,1). +snote(n172,[E,n],4,18:1,0,1/4,34.0000,35.0000,[v5,staff2])-note(n160,64,16437,16500,59,1,1). +snote(n165,[G,n],5,18:1,1/16,1/16,34.2500,34.5000,[v1,staff1])-note(n162,79,16576,16647,63,1,1). +snote(n166,[F,#],5,18:1,1/8,1/16,34.5000,34.7500,[v1,staff1])-note(n163,78,16674,16734,58,1,1). +snote(n167,[G,n],5,18:1,3/16,1/16,34.7500,35.0000,[v1,staff1])-note(n164,79,16802,16826,42,1,1). +snote(n168,[F,#],5,18:2,0,1/16,35.0000,35.2500,[v1,staff1])-note(n165,78,16897,16950,54,1,1). +snote(n173,[C,n],4,18:2,0,1/4,35.0000,36.0000,[v5,staff2])-note(n166,60,16900,16961,47,1,1). +snote(n169,[G,n],5,18:2,1/16,1/16,35.2500,35.5000,[v1,staff1])-note(n167,79,17000,17030,44,1,1). +snote(n170,[F,#],5,18:2,1/8,1/16,35.5000,35.7500,[v1,staff1])-note(n168,78,17095,17149,55,1,1). +snote(n171,[G,n],5,18:2,3/16,1/16,35.7500,36.0000,[v1,staff1])-note(n169,79,17227,17239,32,1,1). +snote(n174,[G,#],5,19:1,0,1/16,36.0000,36.2500,[v1,staff1])-note(n170,80,17291,17379,60,1,1). +snote(n182,[F,n],4,19:1,0,1/4,36.0000,37.0000,[v5,staff2])-note(n171,65,17318,17379,50,1,1). +snote(n175,[A,n],5,19:1,1/16,1/16,36.2500,36.5000,[v1,staff1])-note(n172,81,17413,17516,64,1,1). +snote(n176,[C,n],6,19:1,1/8,1/16,36.5000,36.7500,[v1,staff1])-note(n173,84,17515,17625,60,1,1). +snote(n177,[B,n],5,19:1,3/16,1/16,36.7500,37.0000,[v1,staff1])-note(n174,83,17639,17715,44,1,1). +snote(n178,[D,n],6,19:2,0,1/16,37.0000,37.2500,[v1,staff1])-note(n175,86,17721,17846,61,1,1). +snote(n183,[C,n],4,19:2,0,1/4,37.0000,38.0000,[v5,staff2])-note(n176,60,17737,17822,46,1,1). +snote(n179,[C,n],6,19:2,1/16,1/16,37.2500,37.5000,[v1,staff1])-note(n177,84,17871,17948,42,1,1). +snote(n180,[B,n],5,19:2,1/8,1/16,37.5000,37.7500,[v1,staff1])-note(n178,83,17953,18033,55,1,1). +snote(n181,[A,n],5,19:2,3/16,1/16,37.7500,38.0000,[v1,staff1])-note(n179,81,18035,18067,58,1,1). +snote(n184,[A,n],5,20:1,0,1/16,38.0000,38.2500,[v1,staff1])-note(n182,81,18201,18252,55,1,1). +snote(n192,[C,n],4,20:1,0,1/4,38.0000,39.0000,[v5,staff2])-note(n180,60,18194,18582,48,1,1). +snote(n193,[E,n],4,20:1,0,1/4,38.0000,39.0000,[v5,staff2])-note(n181,64,18201,18543,55,1,1). +snote(n185,[G,n],5,20:1,1/16,1/16,38.2500,38.5000,[v1,staff1])-note(n183,79,18290,18385,67,1,1). +snote(n186,[E,n],6,20:1,1/8,1/16,38.5000,38.7500,[v1,staff1])-note(n184,88,18420,18561,66,1,1). +snote(n187,[D,n],6,20:1,3/16,1/16,38.7500,39.0000,[v1,staff1])-note(n185,86,18532,18660,63,1,1). +snote(n188,[C,n],6,20:2,0,1/16,39.0000,39.2500,[v1,staff1])-note(n186,84,18632,18742,71,1,1). +snote(n189,[B,n],5,20:2,1/16,1/16,39.2500,39.5000,[v1,staff1])-note(n187,83,18721,18794,68,1,1). +snote(n190,[A,n],5,20:2,1/8,1/16,39.5000,39.7500,[v1,staff1])-note(n188,81,18813,18856,60,1,1). +snote(n191,[G,n],5,20:2,3/16,1/16,39.7500,40.0000,[v1,staff1])-note(n190,79,18948,18977,71,1,1). +snote(n195,[C,#],4,20:2,3/16,1/16,39.7500,40.0000,[v5,staff2])-note(n189,61,18940,18986,58,1,1). +snote(n196,[G,n],5,21:1,0,1/16,40.0000,40.2500,[v1,staff1])-note(n191,79,19065,19157,77,1,1). +snote(n204,[D,n],4,21:1,0,1/4,40.0000,41.0000,[v5,staff2])-note(n192,62,19087,19522,74,1,1). +snote(n197,[F,n],5,21:1,1/16,1/16,40.2500,40.5000,[v1,staff1])-note(n193,77,19185,19289,84,1,1). +snote(n198,[D,n],6,21:1,1/8,1/16,40.5000,40.7500,[v1,staff1])-note(n194,86,19293,19411,75,1,1). +snote(n199,[C,n],6,21:1,3/16,1/16,40.7500,41.0000,[v1,staff1])-note(n195,84,19409,19543,62,1,1). +snote(n200,[B,n],5,21:2,0,1/16,41.0000,41.2500,[v1,staff1])-note(n196,83,19506,19618,71,1,1). +snote(n201,[A,n],5,21:2,1/16,1/16,41.2500,41.5000,[v1,staff1])-note(n197,81,19616,19671,45,1,1). +snote(n202,[G,n],5,21:2,1/8,1/16,41.5000,41.7500,[v1,staff1])-note(n198,79,19679,19734,70,1,1). +snote(n203,[F,n],5,21:2,3/16,1/16,41.7500,42.0000,[v1,staff1])-note(n199,77,19810,19845,81,1,1). +snote(n206,[B,n],3,21:2,3/16,1/16,41.7500,42.0000,[v5,staff2])-note(n200,59,19840,19876,47,1,1). +snote(n207,[F,n],5,22:1,0,1/16,42.0000,42.2500,[v1,staff1])-note(n201,77,19948,20032,77,1,1). +snote(n215,[C,n],4,22:1,0,1/4,42.0000,43.0000,[v5,staff2])-note(n202,60,19981,20353,69,1,1). +snote(n208,[E,n],5,22:1,1/16,1/16,42.2500,42.5000,[v1,staff1])-note(n203,76,20053,20156,77,1,1). +snote(n209,[C,n],6,22:1,1/8,1/16,42.5000,42.7500,[v1,staff1])-note(n204,84,20176,20270,68,1,1). +snote(n210,[B,n],5,22:1,3/16,1/16,42.7500,43.0000,[v1,staff1])-note(n205,83,20276,20417,62,1,1). +snote(n211,[A,n],5,22:2,0,1/16,43.0000,43.2500,[v1,staff1])-note(n206,81,20379,20485,59,1,1). +snote(n212,[G,n],5,22:2,1/16,1/16,43.2500,43.5000,[v1,staff1])-note(n207,79,20462,20534,71,1,1). +snote(n213,[F,n],5,22:2,1/8,1/16,43.5000,43.7500,[v1,staff1])-note(n208,77,20557,20635,72,1,1). +snote(n214,[E,n],5,22:2,3/16,1/16,43.7500,44.0000,[v1,staff1])-note(n209,76,20663,20743,76,1,1). +snote(n217,[A,n],3,22:2,3/16,1/16,43.7500,44.0000,[v5,staff2])-note(n210,57,20675,20787,61,1,1). +snote(n218,[D,n],5,23:1,0,1/8,44.0000,44.5000,[v1,staff1])-note(n211,74,20796,21067,64,1,1). +snote(n222,[F,n],3,23:1,0,1/4,44.0000,45.0000,[v5,staff2])-note(n212,53,20854,21113,72,1,1). +snote(n219,[A,n],5,23:1,1/8,1/8,44.5000,45.0000,[v1,staff1])-note(n213,81,21064,21476,68,1,1). +snote(n220,[G,n],5,23:2,0,1/8,45.0000,45.5000,[v1,staff1])-note(n215,79,21296,21543,75,1,1). +snote(n223,[G,n],3,23:2,0,1/4,45.0000,46.0000,[v5,staff2])-note(n214,55,21287,21555,70,1,1). +snote(n221,[B,n],4,23:2,1/8,1/8,45.5000,46.0000,[v1,staff1])-note(n216,71,21540,21748,58,1,1). +snote(n224,[C,n],5,24:1,0,1/4,46.0000,47.0000,[v1,staff1])-note(n217,72,21793,22915,48,1,1). +snote(n226,[C,n],4,24:1,0,1/4,46.0000,47.0000,[v5,staff2])-note(n218,60,21819,22029,49,1,1). +snote(n227,[C,n],3,24:2,0,1/4,47.0000,48.0000,[v5,staff2])-note(n219,48,22393,22966,50,1,1). sustain(0,0). sustain(3316,67). sustain(3346,127). @@ -299,4 +299,4 @@ sustain(20077,43). sustain(20107,127). sustain(20682,61). sustain(20711,50). -sustain(20740,0). +sustain(20740,0). \ No newline at end of file diff --git a/tests/data/musicxml/test_score_object.musicxml b/tests/data/musicxml/test_score_object.musicxml index ab3b38f6..84025f84 100644 --- a/tests/data/musicxml/test_score_object.musicxml +++ b/tests/data/musicxml/test_score_object.musicxml @@ -3,6 +3,7 @@ Test Title + Test Opus 1 T. H. E. Composer diff --git a/tests/test_match_import.py b/tests/test_match_import.py index 0b703e9f..64356a8a 100644 --- a/tests/test_match_import.py +++ b/tests/test_match_import.py @@ -269,7 +269,8 @@ def test_info_lines(self): audioLastNote_line = "info(audioLastNote,9.8372)." composer_line = "info(composer,Frèdéryk Chopin)." performer_line = "info(performer,A. Human Pianist)." - midiClockUnits_line = "info(midiClockUnits,4000)." + midiClockUnits_line = "info(midiClockUnits,480)." + # midiClockUnits_line = "info(midiClockUnits,4000)." midiClockRate_line = "info(midiClockRate,500000)." approximateTempo_line = "info(approximateTempo,98.2902)." subtitle_line = "info(subtitle,Subtitle)." diff --git a/tests/test_pianoroll.py b/tests/test_pianoroll.py index 18eed529..7e04e366 100644 --- a/tests/test_pianoroll.py +++ b/tests/test_pianoroll.py @@ -214,14 +214,12 @@ def test_pianoroll_to_notearray(self): self.assertTrue(test) def test_reconstruction_score(self): - for fn in MUSICXML_IMPORT_EXPORT_TESTFILES: score = load_musicxml(fn) note_array = score[0].note_array() pr = compute_pianoroll( score[0], time_unit="div", time_div=1, remove_silence=False ) - rec_note_array = pianoroll_to_notearray(pr, time_div=1, time_unit="div") original_pitch_idx = np.argsort(note_array["pitch"]) @@ -233,7 +231,7 @@ def test_reconstruction_score(self): rec_note_array = rec_note_array[rec_pitch_idx] rec_onset_idx = np.argsort(rec_note_array["onset_div"], kind="mergesort") rec_note_array = rec_note_array[rec_onset_idx] - + test_pitch = np.all(note_array["pitch"] == rec_note_array["pitch"]) self.assertTrue(test_pitch) test_onset = np.all(note_array["onset_div"] == rec_note_array["onset_div"]) @@ -442,3 +440,6 @@ def test_indices(self): # Onsets and offsets should be identical self.assertTrue(np.all(pr_idxs[:, 2:4] == pcr_idxs[:, 2:4])) + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_tonal_tension.py b/tests/test_tonal_tension.py index b7a6f970..e80d8b34 100644 --- a/tests/test_tonal_tension.py +++ b/tests/test_tonal_tension.py @@ -26,9 +26,9 @@ class TestTonalTension(unittest.TestCase): def test_prepare_notearray(self): target_note_array = np.array( [ - (0.0, 2.0, 69, 64, "n0", "A", 0, 4, 0, -1), - (1.0, 1.0, 72, 64, "n1", "C", 0, 5, 0, -1), - (1.0, 1.0, 76, 64, "n2", "E", 0, 5, 0, -1), + (0.0, 2.0, 69, 64, "n1", "A", 0, 4, 0, -1), + (1.0, 1.0, 72, 64, "n2", "C", 0, 5, 0, -1), + (1.0, 1.0, 76, 64, "n3", "E", 0, 5, 0, -1), ], dtype=[ ("onset_sec", "