Upload TMIDIX.py
Browse files
TMIDIX.py
CHANGED
|
@@ -51,7 +51,7 @@ r'''############################################################################
|
|
| 51 |
|
| 52 |
###################################################################################
|
| 53 |
|
| 54 |
-
__version__ = "25.5.
|
| 55 |
|
| 56 |
print('=' * 70)
|
| 57 |
print('TMIDIX Python module')
|
|
@@ -1488,6 +1488,7 @@ from itertools import groupby
|
|
| 1488 |
|
| 1489 |
from collections import Counter
|
| 1490 |
from collections import defaultdict
|
|
|
|
| 1491 |
|
| 1492 |
from operator import itemgetter
|
| 1493 |
|
|
@@ -1510,6 +1511,8 @@ import shutil
|
|
| 1510 |
|
| 1511 |
import hashlib
|
| 1512 |
|
|
|
|
|
|
|
| 1513 |
###################################################################################
|
| 1514 |
#
|
| 1515 |
# Original TMIDI Tegridy helper functions
|
|
@@ -3862,7 +3865,10 @@ def chordify_score(score,
|
|
| 3862 |
else:
|
| 3863 |
return None
|
| 3864 |
|
| 3865 |
-
def fix_monophonic_score_durations(monophonic_score
|
|
|
|
|
|
|
|
|
|
| 3866 |
|
| 3867 |
fixed_score = []
|
| 3868 |
|
|
@@ -3874,15 +3880,17 @@ def fix_monophonic_score_durations(monophonic_score):
|
|
| 3874 |
nmt = monophonic_score[i+1][1]
|
| 3875 |
|
| 3876 |
if note[1]+note[2] >= nmt:
|
| 3877 |
-
note_dur = max(1, nmt-note[1]-
|
| 3878 |
else:
|
| 3879 |
note_dur = note[2]
|
| 3880 |
|
| 3881 |
new_note = [note[0], note[1], note_dur] + note[3:]
|
| 3882 |
-
|
| 3883 |
-
|
| 3884 |
-
|
| 3885 |
-
|
|
|
|
|
|
|
| 3886 |
|
| 3887 |
elif type(monophonic_score[0][0]) == int:
|
| 3888 |
|
|
@@ -3892,15 +3900,17 @@ def fix_monophonic_score_durations(monophonic_score):
|
|
| 3892 |
nmt = monophonic_score[i+1][0]
|
| 3893 |
|
| 3894 |
if note[0]+note[1] >= nmt:
|
| 3895 |
-
note_dur = max(1, nmt-note[0]-
|
| 3896 |
else:
|
| 3897 |
note_dur = note[1]
|
| 3898 |
-
|
| 3899 |
new_note = [note[0], note_dur] + note[2:]
|
| 3900 |
-
|
| 3901 |
-
|
| 3902 |
-
|
| 3903 |
-
|
|
|
|
|
|
|
| 3904 |
|
| 3905 |
return fixed_score
|
| 3906 |
|
|
@@ -12933,7 +12943,7 @@ def find_next(pitches, cur_ptc):
|
|
| 12933 |
|
| 12934 |
###################################################################################
|
| 12935 |
|
| 12936 |
-
def
|
| 12937 |
|
| 12938 |
def keyfunc(sublist):
|
| 12939 |
return sublist[key_index]
|
|
@@ -12947,9 +12957,25 @@ def ordered_groups(data, key_index):
|
|
| 12947 |
|
| 12948 |
###################################################################################
|
| 12949 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12950 |
def merge_melody_notes(escore_notes, pitches_idx=4, max_dur=255):
|
| 12951 |
|
| 12952 |
-
groups =
|
| 12953 |
|
| 12954 |
merged_melody_notes = []
|
| 12955 |
|
|
@@ -13045,6 +13071,53 @@ def add_expressive_melody_to_enhanced_score_notes(escore_notes,
|
|
| 13045 |
return song_f
|
| 13046 |
|
| 13047 |
###################################################################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13048 |
|
| 13049 |
print('Module loaded!')
|
| 13050 |
print('=' * 70)
|
|
|
|
| 51 |
|
| 52 |
###################################################################################
|
| 53 |
|
| 54 |
+
__version__ = "25.5.4"
|
| 55 |
|
| 56 |
print('=' * 70)
|
| 57 |
print('TMIDIX Python module')
|
|
|
|
| 1488 |
|
| 1489 |
from collections import Counter
|
| 1490 |
from collections import defaultdict
|
| 1491 |
+
from collections import OrderedDict
|
| 1492 |
|
| 1493 |
from operator import itemgetter
|
| 1494 |
|
|
|
|
| 1511 |
|
| 1512 |
import hashlib
|
| 1513 |
|
| 1514 |
+
from array import array
|
| 1515 |
+
|
| 1516 |
###################################################################################
|
| 1517 |
#
|
| 1518 |
# Original TMIDI Tegridy helper functions
|
|
|
|
| 3865 |
else:
|
| 3866 |
return None
|
| 3867 |
|
| 3868 |
+
def fix_monophonic_score_durations(monophonic_score,
|
| 3869 |
+
notes_min_gap=1,
|
| 3870 |
+
min_notes_dur=1
|
| 3871 |
+
):
|
| 3872 |
|
| 3873 |
fixed_score = []
|
| 3874 |
|
|
|
|
| 3880 |
nmt = monophonic_score[i+1][1]
|
| 3881 |
|
| 3882 |
if note[1]+note[2] >= nmt:
|
| 3883 |
+
note_dur = max(1, nmt-note[1]-notes_min_gap)
|
| 3884 |
else:
|
| 3885 |
note_dur = note[2]
|
| 3886 |
|
| 3887 |
new_note = [note[0], note[1], note_dur] + note[3:]
|
| 3888 |
+
|
| 3889 |
+
if new_note[2] >= min_notes_dur:
|
| 3890 |
+
fixed_score.append(new_note)
|
| 3891 |
+
|
| 3892 |
+
if monophonic_score[-1][2] >= min_notes_dur:
|
| 3893 |
+
fixed_score.append(monophonic_score[-1])
|
| 3894 |
|
| 3895 |
elif type(monophonic_score[0][0]) == int:
|
| 3896 |
|
|
|
|
| 3900 |
nmt = monophonic_score[i+1][0]
|
| 3901 |
|
| 3902 |
if note[0]+note[1] >= nmt:
|
| 3903 |
+
note_dur = max(1, nmt-note[0]-notes_min_gap)
|
| 3904 |
else:
|
| 3905 |
note_dur = note[1]
|
| 3906 |
+
|
| 3907 |
new_note = [note[0], note_dur] + note[2:]
|
| 3908 |
+
|
| 3909 |
+
if new_note[1] >= min_notes_dur:
|
| 3910 |
+
fixed_score.append(new_note)
|
| 3911 |
+
|
| 3912 |
+
if monophonic_score[-1][1] >= min_notes_dur:
|
| 3913 |
+
fixed_score.append(monophonic_score[-1])
|
| 3914 |
|
| 3915 |
return fixed_score
|
| 3916 |
|
|
|
|
| 12943 |
|
| 12944 |
###################################################################################
|
| 12945 |
|
| 12946 |
+
def ordered_groups_unsorted(data, key_index):
|
| 12947 |
|
| 12948 |
def keyfunc(sublist):
|
| 12949 |
return sublist[key_index]
|
|
|
|
| 12957 |
|
| 12958 |
###################################################################################
|
| 12959 |
|
| 12960 |
+
def ordered_groups(data, key_index):
|
| 12961 |
+
|
| 12962 |
+
groups = OrderedDict()
|
| 12963 |
+
|
| 12964 |
+
for sublist in data:
|
| 12965 |
+
key = sublist[key_index]
|
| 12966 |
+
|
| 12967 |
+
if key not in groups:
|
| 12968 |
+
groups[key] = []
|
| 12969 |
+
|
| 12970 |
+
groups[key].append(sublist)
|
| 12971 |
+
|
| 12972 |
+
return list(groups.items())
|
| 12973 |
+
|
| 12974 |
+
###################################################################################
|
| 12975 |
+
|
| 12976 |
def merge_melody_notes(escore_notes, pitches_idx=4, max_dur=255):
|
| 12977 |
|
| 12978 |
+
groups = ordered_groups_unsorted(escore_notes, pitches_idx)
|
| 12979 |
|
| 12980 |
merged_melody_notes = []
|
| 12981 |
|
|
|
|
| 13071 |
return song_f
|
| 13072 |
|
| 13073 |
###################################################################################
|
| 13074 |
+
|
| 13075 |
+
def int_list_md5_hash(int_list):
|
| 13076 |
+
|
| 13077 |
+
arr = array('H', int_list)
|
| 13078 |
+
binary_data = arr.tobytes()
|
| 13079 |
+
|
| 13080 |
+
return hashlib.md5(binary_data).hexdigest()
|
| 13081 |
+
|
| 13082 |
+
###################################################################################
|
| 13083 |
+
|
| 13084 |
+
def merge_escore_notes_durations(escore_notes,
|
| 13085 |
+
notes_min_gap=1,
|
| 13086 |
+
min_notes_dur=2,
|
| 13087 |
+
times_idx=1,
|
| 13088 |
+
durs_idx=2,
|
| 13089 |
+
channels_idx = 3,
|
| 13090 |
+
pitches_idx=4
|
| 13091 |
+
):
|
| 13092 |
+
|
| 13093 |
+
notes = [e for e in escore_notes if e[channels_idx] != 9]
|
| 13094 |
+
drums = [e for e in escore_notes if e[channels_idx] == 9]
|
| 13095 |
+
|
| 13096 |
+
escore_groups = ordered_groups(notes, pitches_idx)
|
| 13097 |
+
|
| 13098 |
+
merged_score = []
|
| 13099 |
+
|
| 13100 |
+
for k, g in escore_groups:
|
| 13101 |
+
if len(g) > 2:
|
| 13102 |
+
fg = fix_monophonic_score_durations(g,
|
| 13103 |
+
notes_min_gap=notes_min_gap,
|
| 13104 |
+
min_notes_dur=min_notes_dur
|
| 13105 |
+
)
|
| 13106 |
+
merged_score.extend(fg)
|
| 13107 |
+
|
| 13108 |
+
elif len(g) == 2:
|
| 13109 |
+
|
| 13110 |
+
if g[0][times_idx]+g[0][durs_idx] >= g[1][times_idx]:
|
| 13111 |
+
g[0][durs_idx] = max(1, g[1][times_idx] - g[0][times_idx] - 1)
|
| 13112 |
+
|
| 13113 |
+
merged_score.extend(g)
|
| 13114 |
+
|
| 13115 |
+
else:
|
| 13116 |
+
merged_score.extend(g)
|
| 13117 |
+
|
| 13118 |
+
return sorted(merged_score + drums, key=lambda x: x[times_idx])
|
| 13119 |
+
|
| 13120 |
+
###################################################################################
|
| 13121 |
|
| 13122 |
print('Module loaded!')
|
| 13123 |
print('=' * 70)
|