asigalov61 commited on
Commit
6756ea0
·
verified ·
1 Parent(s): 83585d2

Upload TMIDIX.py

Browse files
Files changed (1) hide show
  1. TMIDIX.py +107 -3
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
- return description
 
 
 
 
 
 
 
 
 
 
 
 
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