From af017a3aae52eaab5402c7943e56ba1146ddbf7e Mon Sep 17 00:00:00 2001 From: yoojin Date: Thu, 30 Jan 2020 19:07:57 +0900 Subject: [PATCH 1/4] minor import modification --- feature_utils.py | 2 +- pedal_cleaning.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/feature_utils.py b/feature_utils.py index cbb4376..a603160 100644 --- a/feature_utils.py +++ b/feature_utils.py @@ -12,7 +12,7 @@ """ import math -import utils +from . import utils def cal_beat_importance(beat_position, numerator): """ Returns beat importance in integer diff --git a/pedal_cleaning.py b/pedal_cleaning.py index 7560099..b8db998 100644 --- a/pedal_cleaning.py +++ b/pedal_cleaning.py @@ -1,4 +1,4 @@ -from binary_index import binary_index +from .utils import binary_index import pretty_midi THRESHOLD = 64 From 31c73e281c74a1d662507652654c72d672f6a5b8 Mon Sep 17 00:00:00 2001 From: yoojin Date: Thu, 30 Jan 2020 19:20:54 +0900 Subject: [PATCH 2/4] minor test code modification --- data_class.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/data_class.py b/data_class.py index e20d40d..f229918 100644 --- a/data_class.py +++ b/data_class.py @@ -341,14 +341,16 @@ def align_score_and_perf_with_nakamura(self, midi_file_path): os.chdir(current_dir) def _load_composer_name(self): - + print(self.folder_path) if self.data_structure == 'folder': # self.folder_path = 'pyScoreParser/chopin_cleaned/{composer_name}/...' path_split = copy.copy(self.folder_path).split('/') - if path_split[0] == 'chopin_cleaned': + #if path_split[0] == 'chopin_cleaned': + if path_split[0] == 'test_examples': composer_name = path_split[1] else: - dataset_folder_name_index = path_split.index('chopin_cleaned') + #dataset_folder_name_index = path_split.index('chopin_cleaned') + dataset_folder_name_index = path_split.index('test_examples') composer_name = path_split[dataset_folder_name_index+1] else: # self.folder_path = '.../emotionDataset/{data_name.mid}' From bce43c52733bdfc60f803c6247dce8f660727b55 Mon Sep 17 00:00:00 2001 From: yoojin Date: Thu, 30 Jan 2020 20:21:34 +0900 Subject: [PATCH 3/4] modify load_composer_name --- data_class.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/data_class.py b/data_class.py index 756dfe7..56f2e74 100644 --- a/data_class.py +++ b/data_class.py @@ -32,6 +32,7 @@ class DataSet: def __init__(self, path, data_structure='folder'): self.path = path + self.dataset_name = copy.copy(path).split('/')[-1] self.pieces = [] self.performances = [] self.performs_by_tag = {} @@ -54,7 +55,7 @@ def _load_all_scores(self): # musicxml_list = sorted(path.glob('**.xml')) for xml in musicxml_list: try: - piece = PieceData(xml, data_structure=self.data_structure) + piece = PieceData(xml, data_structure=self.data_structure, dataset_name=self.dataset_name) self.pieces.append(piece) except Exception as ex: print('Error type :', ex) @@ -193,8 +194,8 @@ def _divide_by_tag(self, list_of_tag): # score data class class PieceData: - def __init__(self, xml_path, data_structure='folder', composer=None): - self.meta = PieceMeta(xml_path, data_structure, composer=composer) + def __init__(self, xml_path, data_structure='folder', dataset_name='chopin_cleaned', composer=None): + self.meta = PieceMeta(xml_path, data_structure, dataset_name=dataset_name, composer=composer) self.xml_obj = None self.xml_notes = None self.num_notes = 0 @@ -215,7 +216,6 @@ def __init__(self, xml_path, data_structure='folder', composer=None): self.meta._load_composer_name() def _load_score_xml(self): - print(self.meta.xml_path) self.xml_obj = MusicXMLDocument(str(self.meta.xml_path)) self._get_direction_encoded_notes() self.notes_graph = score_graph.make_edge(self.xml_notes) @@ -271,9 +271,10 @@ def __str__(self): # score meta data class class PieceMeta: - def __init__(self, xml_path, data_structure='folder', composer=None): + def __init__(self, xml_path, data_structure='folder', dataset_name='chopin_cleaned', composer=None): self.xml_path = xml_path self.folder_path = os.path.dirname(xml_path) + self.dataset_name = dataset_name self.composer = composer self.data_structure = data_structure self.pedal_elongate = False @@ -343,12 +344,10 @@ def _load_composer_name(self): if self.data_structure == 'folder': # self.folder_path = 'pyScoreParser/chopin_cleaned/{composer_name}/...' path_split = copy.copy(self.folder_path).split('/') - #if path_split[0] == 'chopin_cleaned': - if path_split[0] == 'test_examples': + if path_split[0] == self.dataset_name: composer_name = path_split[1] else: - #dataset_folder_name_index = path_split.index('chopin_cleaned') - dataset_folder_name_index = path_split.index('test_examples') + dataset_folder_name_index = path_split.index(self.dataset_name) composer_name = path_split[dataset_folder_name_index+1] else: # self.folder_path = '.../emotionDataset/{data_name.mid}' From e063bfcd16f239da38316eade2e51a2cecbbac6d Mon Sep 17 00:00:00 2001 From: yoojin Date: Thu, 30 Jan 2020 20:22:21 +0900 Subject: [PATCH 4/4] add dataset test code and merge it with original PieceData test code by tgk --- test_dataset.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 test_dataset.py diff --git a/test_dataset.py b/test_dataset.py new file mode 100644 index 0000000..44b09e0 --- /dev/null +++ b/test_dataset.py @@ -0,0 +1,43 @@ +from .data_class import PieceData +from pathlib import Path +from .feature_extraction import ScoreExtractor, PerformExtractor + +import argparse +from .data_class import DataSet + +DEFAULT_SCORE_FEATURES = ['midi_pitch', 'duration', 'beat_importance', 'measure_length', 'qpm_primo', + 'following_rest', 'distance_from_abs_dynamic', 'distance_from_recent_tempo', + 'beat_position', 'xml_position', 'grace_order', 'preceded_by_grace_note', + 'followed_by_fermata_rest', 'pitch', 'tempo', 'dynamic', 'time_sig_vec', + 'slur_beam_vec', 'composer_vec', 'notation', 'tempo_primo'] +DEFAULT_PERFORM_FEATURES = ['beat_tempo', 'velocity', 'onset_deviation', 'articulation', 'pedal_refresh_time', + 'pedal_cut_time', 'pedal_at_start', 'pedal_at_end', 'soft_pedal', + 'pedal_refresh', 'pedal_cut', 'qpm_primo', 'align_matched', 'articulation_loss_weight'] + + +parser = argparse.ArgumentParser() +parser.add_argument('dataset_path', type=str) +args = parser.parse_args() + +dataset = DataSet(args.dataset_path) +piece = dataset.pieces[0] + +first_note = dict(duration= 60, midi_ticks= 27.5, seconds= 0.20833333333333334, pitch= 'Eb4', MIDI_pitch= 63, voice= 5, velocity= 64) +assert (piece.xml_notes[0].note_duration.duration == 60 and + piece.xml_notes[0].note_duration.midi_ticks == 27.5 and + piece.xml_notes[0].pitch[0] == 'Eb4' and + piece.xml_notes[0].pitch[1] == 63 and + piece.xml_notes[0].voice == 5 and + piece.xml_notes[0].velocity == 64), \ + f"first note not matched. \nans:{first_note}, \ngot:{piece.xml_notes[0]}" + +piece._load_performances() +perform_ext = PerformExtractor(DEFAULT_PERFORM_FEATURES) +perform_f = perform_ext.extract_perform_features(piece, piece.performances[0]) +for key in perform_f: + try: + print(f'{key}: len={len(perform_f[key])}, \n ex:{perform_f[key][:5]}') + except: + print(key, perform_f[key]) + +print('Test success') \ No newline at end of file