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 |
|