Upload TMIDIX.py
Browse files
TMIDIX.py
CHANGED
@@ -9728,7 +9728,14 @@ def escore_notes_to_text_description(escore_notes,
|
|
9728 |
song_name='',
|
9729 |
artist_name='',
|
9730 |
timings_divider=16,
|
|
|
|
|
9731 |
):
|
|
|
|
|
|
|
|
|
|
|
9732 |
|
9733 |
#==============================================================================
|
9734 |
|
@@ -9742,6 +9749,9 @@ def escore_notes_to_text_description(escore_notes,
|
|
9742 |
|
9743 |
elif song_time_min >= 2.5:
|
9744 |
song_length = 'long'
|
|
|
|
|
|
|
9745 |
|
9746 |
#==============================================================================
|
9747 |
|
@@ -9753,18 +9763,25 @@ def escore_notes_to_text_description(escore_notes,
|
|
9753 |
if len(escore_times) == len(set(escore_times)):
|
9754 |
comp_type = 'monophonic melody'
|
9755 |
ctype = 'melody'
|
|
|
9756 |
|
9757 |
elif len(escore_times) >= len(set(escore_times)) and 1 in Counter(escore_times).values():
|
9758 |
comp_type = 'melody and accompaniment'
|
9759 |
ctype = 'song'
|
|
|
9760 |
|
9761 |
elif len(escore_times) >= len(set(escore_times)) and 1 not in Counter(escore_times).values():
|
9762 |
comp_type = 'accompaniment'
|
9763 |
ctype = 'song'
|
|
|
9764 |
|
9765 |
else:
|
9766 |
comp_type = 'drum track'
|
9767 |
ctype = 'drum track'
|
|
|
|
|
|
|
|
|
9768 |
|
9769 |
#==============================================================================
|
9770 |
|
@@ -9779,6 +9796,13 @@ def escore_notes_to_text_description(escore_notes,
|
|
9779 |
nd_patches_counts = Counter([p for p in all_patches if p < 128]).most_common()
|
9780 |
|
9781 |
dominant_instrument = alpha_str(Number2patch[nd_patches_counts[0][0]])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9782 |
|
9783 |
if 128 in patches:
|
9784 |
drums_present = True
|
@@ -9786,9 +9810,16 @@ def escore_notes_to_text_description(escore_notes,
|
|
9786 |
drums_pitches = [e[4] for e in escore_notes if e[3] == 9]
|
9787 |
|
9788 |
most_common_drums = [alpha_str(Notenum2percussion[p[0]]) for p in Counter(drums_pitches).most_common(3) if p[0] in Notenum2percussion]
|
|
|
|
|
|
|
9789 |
|
9790 |
else:
|
9791 |
drums_present = False
|
|
|
|
|
|
|
|
|
9792 |
|
9793 |
#==============================================================================
|
9794 |
|
@@ -9798,60 +9829,111 @@ def escore_notes_to_text_description(escore_notes,
|
|
9798 |
|
9799 |
if pitches:
|
9800 |
key = SEMITONES[statistics.mode(pitches) % 12]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9801 |
|
9802 |
#==============================================================================
|
9803 |
|
9804 |
scale = ''
|
9805 |
mood = ''
|
9806 |
|
|
|
|
|
|
|
|
|
|
|
9807 |
if pitches:
|
9808 |
|
9809 |
result = escore_notes_scale(escore_notes)
|
9810 |
|
9811 |
scale = result[0]
|
9812 |
mood = result[1].split(' ')[0].lower()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9813 |
|
9814 |
#==============================================================================
|
9815 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9816 |
if pitches:
|
9817 |
|
9818 |
escore_averages = escore_notes_averages(escore_notes, return_ptcs_and_vels=True)
|
9819 |
|
9820 |
if escore_averages[0] < (128 / timings_divider):
|
9821 |
rythm = 'fast'
|
|
|
9822 |
|
9823 |
elif (128 / timings_divider) <= escore_averages[0] <= (192 / timings_divider):
|
9824 |
rythm = 'average'
|
|
|
9825 |
|
9826 |
elif escore_averages[0] > (192 / timings_divider):
|
9827 |
rythm = 'slow'
|
|
|
9828 |
|
9829 |
if escore_averages[1] < (256 / timings_divider):
|
9830 |
tempo = 'fast'
|
|
|
9831 |
|
9832 |
elif (256 / timings_divider) <= escore_averages[1] <= (384 / timings_divider):
|
9833 |
tempo = 'average'
|
|
|
9834 |
|
9835 |
elif escore_averages[1] > (384 / timings_divider):
|
9836 |
tempo = 'slow'
|
|
|
9837 |
|
9838 |
if escore_averages[2] < 50:
|
9839 |
tone = 'bass'
|
|
|
9840 |
|
9841 |
elif 50 <= escore_averages[2] <= 70:
|
9842 |
tone = 'midrange'
|
|
|
9843 |
|
9844 |
elif escore_averages[2] > 70:
|
9845 |
tone = 'treble'
|
|
|
9846 |
|
9847 |
if escore_averages[3] < 64:
|
9848 |
dynamics = 'quiet'
|
|
|
9849 |
|
9850 |
elif 64 <= escore_averages[3] <= 96:
|
9851 |
dynamics = 'average'
|
|
|
9852 |
|
9853 |
elif escore_averages[3] > 96:
|
9854 |
dynamics = 'loud'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9855 |
|
9856 |
#==============================================================================
|
9857 |
|
@@ -9859,6 +9941,12 @@ def escore_notes_to_text_description(escore_notes,
|
|
9859 |
|
9860 |
lead_melodies = []
|
9861 |
base_melodies = []
|
|
|
|
|
|
|
|
|
|
|
|
|
9862 |
|
9863 |
if mono_melodies:
|
9864 |
|
@@ -9868,15 +9956,19 @@ def escore_notes_to_text_description(escore_notes,
|
|
9868 |
|
9869 |
if mel[0] in LEAD_INSTRUMENTS and escore_avgs[3] > 60:
|
9870 |
lead_melodies.append([Number2patch[mel[0]], mel[1]])
|
|
|
9871 |
|
9872 |
elif mel[0] in BASE_INSTRUMENTS and escore_avgs[3] <= 60:
|
9873 |
base_melodies.append([Number2patch[mel[0]], mel[1]])
|
|
|
9874 |
|
9875 |
if lead_melodies:
|
9876 |
lead_melodies.sort(key=lambda x: x[1], reverse=True)
|
|
|
9877 |
|
9878 |
if base_melodies:
|
9879 |
base_melodies.sort(key=lambda x: x[1], reverse=True)
|
|
|
9880 |
|
9881 |
#==============================================================================
|
9882 |
|
@@ -10063,8 +10155,20 @@ def escore_notes_to_text_description(escore_notes,
|
|
10063 |
description += '\n'
|
10064 |
|
10065 |
#==============================================================================
|
10066 |
-
|
10067 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10068 |
|
10069 |
###################################################################################
|
10070 |
|
|
|
9728 |
song_name='',
|
9729 |
artist_name='',
|
9730 |
timings_divider=16,
|
9731 |
+
return_feat_dict=False,
|
9732 |
+
return_feat_dict_vals=False
|
9733 |
):
|
9734 |
+
|
9735 |
+
#==============================================================================
|
9736 |
+
|
9737 |
+
feat_dict = {}
|
9738 |
+
feat_dict_vals = {}
|
9739 |
|
9740 |
#==============================================================================
|
9741 |
|
|
|
9749 |
|
9750 |
elif song_time_min >= 2.5:
|
9751 |
song_length = 'long'
|
9752 |
+
|
9753 |
+
feat_dict['song_len'] = song_length.capitalize()
|
9754 |
+
feat_dict_vals['song_len'] = song_time_min
|
9755 |
|
9756 |
#==============================================================================
|
9757 |
|
|
|
9763 |
if len(escore_times) == len(set(escore_times)):
|
9764 |
comp_type = 'monophonic melody'
|
9765 |
ctype = 'melody'
|
9766 |
+
ctv = 0
|
9767 |
|
9768 |
elif len(escore_times) >= len(set(escore_times)) and 1 in Counter(escore_times).values():
|
9769 |
comp_type = 'melody and accompaniment'
|
9770 |
ctype = 'song'
|
9771 |
+
ctv = 1
|
9772 |
|
9773 |
elif len(escore_times) >= len(set(escore_times)) and 1 not in Counter(escore_times).values():
|
9774 |
comp_type = 'accompaniment'
|
9775 |
ctype = 'song'
|
9776 |
+
ctv = 2
|
9777 |
|
9778 |
else:
|
9779 |
comp_type = 'drum track'
|
9780 |
ctype = 'drum track'
|
9781 |
+
ctv = 3
|
9782 |
+
|
9783 |
+
feat_dict['song_type'] = comp_type.capitalize()
|
9784 |
+
feat_dict_vals['song_type'] = ctv
|
9785 |
|
9786 |
#==============================================================================
|
9787 |
|
|
|
9796 |
nd_patches_counts = Counter([p for p in all_patches if p < 128]).most_common()
|
9797 |
|
9798 |
dominant_instrument = alpha_str(Number2patch[nd_patches_counts[0][0]])
|
9799 |
+
|
9800 |
+
feat_dict['most_com_instr'] = instruments
|
9801 |
+
feat_dict_vals['most_com_instr'] = [p for p in patches if p < 128]
|
9802 |
+
|
9803 |
+
else:
|
9804 |
+
feat_dict['most_com_instr'] = None
|
9805 |
+
feat_dict_vals['most_com_instr'] = []
|
9806 |
|
9807 |
if 128 in patches:
|
9808 |
drums_present = True
|
|
|
9810 |
drums_pitches = [e[4] for e in escore_notes if e[3] == 9]
|
9811 |
|
9812 |
most_common_drums = [alpha_str(Notenum2percussion[p[0]]) for p in Counter(drums_pitches).most_common(3) if p[0] in Notenum2percussion]
|
9813 |
+
|
9814 |
+
feat_dict['most_com_drums'] = most_common_drums
|
9815 |
+
feat_dict_vals['most_com_drums'] = [p[0] for p in Counter(drums_pitches).most_common(3)]
|
9816 |
|
9817 |
else:
|
9818 |
drums_present = False
|
9819 |
+
|
9820 |
+
feat_dict['most_com_drums'] = None
|
9821 |
+
|
9822 |
+
feat_dict_vals['most_com_drums'] = []
|
9823 |
|
9824 |
#==============================================================================
|
9825 |
|
|
|
9829 |
|
9830 |
if pitches:
|
9831 |
key = SEMITONES[statistics.mode(pitches) % 12]
|
9832 |
+
|
9833 |
+
feat_dict['key'] = key.title()
|
9834 |
+
feat_dict_vals['key'] = statistics.mode(pitches) % 12
|
9835 |
+
|
9836 |
+
else:
|
9837 |
+
feat_dict['key'] = None
|
9838 |
+
feat_dict_vals['key'] = -1
|
9839 |
|
9840 |
#==============================================================================
|
9841 |
|
9842 |
scale = ''
|
9843 |
mood = ''
|
9844 |
|
9845 |
+
feat_dict['scale'] = None
|
9846 |
+
feat_dict['mood'] = None
|
9847 |
+
feat_dict_vals['scale'] = -1
|
9848 |
+
feat_dict_vals['mood'] = -1
|
9849 |
+
|
9850 |
if pitches:
|
9851 |
|
9852 |
result = escore_notes_scale(escore_notes)
|
9853 |
|
9854 |
scale = result[0]
|
9855 |
mood = result[1].split(' ')[0].lower()
|
9856 |
+
|
9857 |
+
feat_dict['scale'] = scale.title()
|
9858 |
+
feat_dict['mood'] = mood.title()
|
9859 |
+
|
9860 |
+
res = escore_notes_scale(escore_notes, return_scale_indexes=True)
|
9861 |
+
feat_dict_vals['scale'] = res[0]
|
9862 |
+
feat_dict_vals['mood'] = res[1]
|
9863 |
|
9864 |
#==============================================================================
|
9865 |
+
|
9866 |
+
feat_dict['rythm'] = None
|
9867 |
+
feat_dict['tempo'] = None
|
9868 |
+
feat_dict['tone'] = None
|
9869 |
+
feat_dict['dynamics'] = None
|
9870 |
+
|
9871 |
+
feat_dict_vals['rythm'] = -1
|
9872 |
+
feat_dict_vals['tempo'] = -1
|
9873 |
+
feat_dict_vals['tone'] = -1
|
9874 |
+
feat_dict_vals['dynamics'] = -1
|
9875 |
+
|
9876 |
if pitches:
|
9877 |
|
9878 |
escore_averages = escore_notes_averages(escore_notes, return_ptcs_and_vels=True)
|
9879 |
|
9880 |
if escore_averages[0] < (128 / timings_divider):
|
9881 |
rythm = 'fast'
|
9882 |
+
ryv = 0
|
9883 |
|
9884 |
elif (128 / timings_divider) <= escore_averages[0] <= (192 / timings_divider):
|
9885 |
rythm = 'average'
|
9886 |
+
ryv = 1
|
9887 |
|
9888 |
elif escore_averages[0] > (192 / timings_divider):
|
9889 |
rythm = 'slow'
|
9890 |
+
ryv = 2
|
9891 |
|
9892 |
if escore_averages[1] < (256 / timings_divider):
|
9893 |
tempo = 'fast'
|
9894 |
+
tev = 0
|
9895 |
|
9896 |
elif (256 / timings_divider) <= escore_averages[1] <= (384 / timings_divider):
|
9897 |
tempo = 'average'
|
9898 |
+
tev = 1
|
9899 |
|
9900 |
elif escore_averages[1] > (384 / timings_divider):
|
9901 |
tempo = 'slow'
|
9902 |
+
tev = 2
|
9903 |
|
9904 |
if escore_averages[2] < 50:
|
9905 |
tone = 'bass'
|
9906 |
+
tov = 0
|
9907 |
|
9908 |
elif 50 <= escore_averages[2] <= 70:
|
9909 |
tone = 'midrange'
|
9910 |
+
tov = 1
|
9911 |
|
9912 |
elif escore_averages[2] > 70:
|
9913 |
tone = 'treble'
|
9914 |
+
tov = 2
|
9915 |
|
9916 |
if escore_averages[3] < 64:
|
9917 |
dynamics = 'quiet'
|
9918 |
+
dyn = 0
|
9919 |
|
9920 |
elif 64 <= escore_averages[3] <= 96:
|
9921 |
dynamics = 'average'
|
9922 |
+
dyn = 1
|
9923 |
|
9924 |
elif escore_averages[3] > 96:
|
9925 |
dynamics = 'loud'
|
9926 |
+
dyn = 2
|
9927 |
+
|
9928 |
+
feat_dict['rythm'] = rythm.title()
|
9929 |
+
feat_dict['tempo'] = tempo.title()
|
9930 |
+
feat_dict['tone'] = tone.title()
|
9931 |
+
feat_dict['dynamics'] = dynamics.title()
|
9932 |
+
|
9933 |
+
feat_dict_vals['rythm'] = ryv
|
9934 |
+
feat_dict_vals['tempo'] = tev
|
9935 |
+
feat_dict_vals['tone'] = tov
|
9936 |
+
feat_dict_vals['dynamics'] = dyn
|
9937 |
|
9938 |
#==============================================================================
|
9939 |
|
|
|
9941 |
|
9942 |
lead_melodies = []
|
9943 |
base_melodies = []
|
9944 |
+
|
9945 |
+
feat_dict['lead_mono_mels'] = None
|
9946 |
+
feat_dict['base_mono_mels'] = None
|
9947 |
+
|
9948 |
+
feat_dict_vals['lead_mono_mels'] = []
|
9949 |
+
feat_dict_vals['base_mono_mels'] = []
|
9950 |
|
9951 |
if mono_melodies:
|
9952 |
|
|
|
9956 |
|
9957 |
if mel[0] in LEAD_INSTRUMENTS and escore_avgs[3] > 60:
|
9958 |
lead_melodies.append([Number2patch[mel[0]], mel[1]])
|
9959 |
+
feat_dict_vals['lead_mono_mels'].append(mel[0])
|
9960 |
|
9961 |
elif mel[0] in BASE_INSTRUMENTS and escore_avgs[3] <= 60:
|
9962 |
base_melodies.append([Number2patch[mel[0]], mel[1]])
|
9963 |
+
feat_dict_vals['base_mono_mels'].append(mel[0])
|
9964 |
|
9965 |
if lead_melodies:
|
9966 |
lead_melodies.sort(key=lambda x: x[1], reverse=True)
|
9967 |
+
feat_dict['lead_mono_mels'] = lead_melodies
|
9968 |
|
9969 |
if base_melodies:
|
9970 |
base_melodies.sort(key=lambda x: x[1], reverse=True)
|
9971 |
+
feat_dict['base_mono_mels'] = base_melodies
|
9972 |
|
9973 |
#==============================================================================
|
9974 |
|
|
|
10155 |
description += '\n'
|
10156 |
|
10157 |
#==============================================================================
|
10158 |
+
|
10159 |
+
final_feat_dict = []
|
10160 |
+
|
10161 |
+
if return_feat_dict:
|
10162 |
+
final_feat_dict.append(feat_dict)
|
10163 |
+
|
10164 |
+
if return_feat_dict_vals:
|
10165 |
+
final_feat_dict.append(feat_dict_vals)
|
10166 |
+
|
10167 |
+
if return_feat_dict or return_feat_dict_vals:
|
10168 |
+
return final_feat_dict
|
10169 |
+
|
10170 |
+
else:
|
10171 |
+
return description
|
10172 |
|
10173 |
###################################################################################
|
10174 |
|