asigalov61 commited on
Commit
00cacb8
·
verified ·
1 Parent(s): 3e36d06

Upload TMIDIX.py

Browse files
Files changed (1) hide show
  1. TMIDIX.py +195 -20
TMIDIX.py CHANGED
@@ -51,7 +51,7 @@ r'''############################################################################
51
 
52
  ###################################################################################
53
 
54
- __version__ = "25.4.11"
55
 
56
  print('=' * 70)
57
  print('TMIDIX Python module')
@@ -3874,7 +3874,7 @@ 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 = nmt-note[1]-1
3878
  else:
3879
  note_dur = note[2]
3880
 
@@ -3892,7 +3892,7 @@ 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 = nmt-note[0]-1
3896
  else:
3897
  note_dur = note[1]
3898
 
@@ -11338,13 +11338,27 @@ def system_memory_utilization(return_dict=False):
11338
 
11339
  ###################################################################################
11340
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11341
  def create_files_list(datasets_paths=['./'],
11342
  files_exts=['.mid', '.midi', '.kar', '.MID', '.MIDI', '.KAR'],
11343
- use_md5_hashes=False,
11344
  max_num_files_per_dir=-1,
11345
  randomize_dir_files=False,
11346
  max_total_files=-1,
11347
  randomize_files_list=True,
 
 
11348
  return_dupes=False,
11349
  verbose=True
11350
  ):
@@ -11360,8 +11374,13 @@ def create_files_list(datasets_paths=['./'],
11360
  filez_set = defaultdict(None)
11361
  dupes_list = []
11362
 
11363
- for dataset_addr in tqdm.tqdm(datasets_paths, disable=not verbose):
11364
- for dirpath, dirnames, filenames in os.walk(dataset_addr):
 
 
 
 
 
11365
 
11366
  if randomize_dir_files:
11367
  random.shuffle(filenames)
@@ -11374,22 +11393,27 @@ def create_files_list(datasets_paths=['./'],
11374
 
11375
  for file in filenames[:max_num_files]:
11376
  if file.endswith(files_exts):
11377
- if use_md5_hashes:
11378
- md5_hash = hashlib.md5(open(os.path.join(dirpath, file), 'rb').read()).hexdigest()
11379
-
11380
- if md5_hash not in filez_set:
11381
- filez_set[md5_hash] = os.path.join(dirpath, file)
11382
-
 
 
 
 
 
11383
  else:
11384
- dupes_list.append(os.path.join(dirpath, file))
 
11385
 
 
 
11386
  else:
11387
- if file not in filez_set:
11388
- filez_set[file] = os.path.join(dirpath, file)
11389
-
11390
- else:
11391
- dupes_list.append(os.path.join(dirpath, file))
11392
-
11393
  filez = list(filez_set.values())
11394
 
11395
  if verbose:
@@ -12847,7 +12871,7 @@ def convert_escore_notes_pitches_chords_signature(signature, convert_to_full_cho
12847
 
12848
  pitches_counts = [c for c in signature if -1 < c[0] < 128]
12849
  chords_counts = [c for c in signature if 127 < c[0] < len(SRC_CHORDS)+128]
12850
- drums_counts = [[c[0]-cdiff, c[1]] for c in signature if len(SRC_CHORDS)+127 < c[0] < len(SRC_CHORDS)+256]
12851
  bad_chords_count = [c for c in signature if c[0] == -1]
12852
 
12853
  new_chords_counts = []
@@ -12865,6 +12889,157 @@ def convert_escore_notes_pitches_chords_signature(signature, convert_to_full_cho
12865
 
12866
  ###################################################################################
12867
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12868
  print('Module loaded!')
12869
  print('=' * 70)
12870
  print('Enjoy! :)')
 
51
 
52
  ###################################################################################
53
 
54
+ __version__ = "25.4.30"
55
 
56
  print('=' * 70)
57
  print('TMIDIX Python module')
 
3874
  nmt = monophonic_score[i+1][1]
3875
 
3876
  if note[1]+note[2] >= nmt:
3877
+ note_dur = max(1, nmt-note[1]-1)
3878
  else:
3879
  note_dur = note[2]
3880
 
 
3892
  nmt = monophonic_score[i+1][0]
3893
 
3894
  if note[0]+note[1] >= nmt:
3895
+ note_dur = max(1, nmt-note[0]-1)
3896
  else:
3897
  note_dur = note[1]
3898
 
 
11338
 
11339
  ###################################################################################
11340
 
11341
+ def system_cpus_utilization(return_dict=False):
11342
+
11343
+ if return_dict:
11344
+ return {'num_cpus': psutil.cpu_count(),
11345
+ 'cpus_util': psutil.cpu_percent()
11346
+ }
11347
+
11348
+ else:
11349
+ print('Number of CPUs:', psutil.cpu_count())
11350
+ print('CPUs utilization:', psutil.cpu_percent())
11351
+
11352
+ ###################################################################################
11353
+
11354
  def create_files_list(datasets_paths=['./'],
11355
  files_exts=['.mid', '.midi', '.kar', '.MID', '.MIDI', '.KAR'],
 
11356
  max_num_files_per_dir=-1,
11357
  randomize_dir_files=False,
11358
  max_total_files=-1,
11359
  randomize_files_list=True,
11360
+ check_for_dupes=False,
11361
+ use_md5_hashes=False,
11362
  return_dupes=False,
11363
  verbose=True
11364
  ):
 
11374
  filez_set = defaultdict(None)
11375
  dupes_list = []
11376
 
11377
+ for dataset_addr in datasets_paths:
11378
+
11379
+ print('=' * 70)
11380
+ print('Processing', dataset_addr)
11381
+ print('=' * 70)
11382
+
11383
+ for dirpath, dirnames, filenames in tqdm.tqdm(os.walk(dataset_addr), disable=not verbose):
11384
 
11385
  if randomize_dir_files:
11386
  random.shuffle(filenames)
 
11393
 
11394
  for file in filenames[:max_num_files]:
11395
  if file.endswith(files_exts):
11396
+ if check_for_dupes:
11397
+
11398
+ if use_md5_hashes:
11399
+ md5_hash = hashlib.md5(open(os.path.join(dirpath, file), 'rb').read()).hexdigest()
11400
+
11401
+ if md5_hash not in filez_set:
11402
+ filez_set[md5_hash] = os.path.join(dirpath, file)
11403
+
11404
+ else:
11405
+ dupes_list.append(os.path.join(dirpath, file))
11406
+
11407
  else:
11408
+ if file not in filez_set:
11409
+ filez_set[file] = os.path.join(dirpath, file)
11410
 
11411
+ else:
11412
+ dupes_list.append(os.path.join(dirpath, file))
11413
  else:
11414
+ fpath = os.path.join(dirpath, file)
11415
+ filez_set[fpath] = fpath
11416
+
 
 
 
11417
  filez = list(filez_set.values())
11418
 
11419
  if verbose:
 
12871
 
12872
  pitches_counts = [c for c in signature if -1 < c[0] < 128]
12873
  chords_counts = [c for c in signature if 127 < c[0] < len(SRC_CHORDS)+128]
12874
+ drums_counts = [[c[0]+cdiff, c[1]] for c in signature if len(SRC_CHORDS)+127 < c[0] < len(SRC_CHORDS)+256]
12875
  bad_chords_count = [c for c in signature if c[0] == -1]
12876
 
12877
  new_chords_counts = []
 
12889
 
12890
  ###################################################################################
12891
 
12892
+ def convert_bytes_in_nested_list(lst, encoding='utf-8', errors='ignore'):
12893
+
12894
+ new_list = []
12895
+
12896
+ for item in lst:
12897
+ if isinstance(item, list):
12898
+ new_list.append(convert_bytes_in_nested_list(item))
12899
+
12900
+ elif isinstance(item, bytes):
12901
+ new_list.append(item.decode(encoding, errors=errors))
12902
+
12903
+ else:
12904
+ new_list.append(item)
12905
+
12906
+ return new_list
12907
+
12908
+ ###################################################################################
12909
+
12910
+ def mult_pitches(pitches, min_oct=4, max_oct=6):
12911
+
12912
+ tones_chord = sorted(set([p % 12 for p in pitches]))
12913
+
12914
+ mult_ptcs = []
12915
+
12916
+ for t in tones_chord:
12917
+ for i in range(min_oct, max_oct):
12918
+ mult_ptcs.append((i*12)+t)
12919
+
12920
+ return mult_ptcs
12921
+
12922
+ ###################################################################################
12923
+
12924
+ def find_next(pitches, cur_ptc):
12925
+
12926
+ i = 0
12927
+
12928
+ for i, p in enumerate(pitches):
12929
+ if p != cur_ptc:
12930
+ break
12931
+
12932
+ return i
12933
+
12934
+ ###################################################################################
12935
+
12936
+ def ordered_groups(data, key_index):
12937
+
12938
+ def keyfunc(sublist):
12939
+ return sublist[key_index]
12940
+
12941
+ groups = []
12942
+
12943
+ for key, group in groupby(data, key=keyfunc):
12944
+ groups.append((key, list(group)))
12945
+
12946
+ return groups
12947
+
12948
+ ###################################################################################
12949
+
12950
+ def merge_melody_notes(escore_notes, pitches_idx=4, max_dur=255):
12951
+
12952
+ groups = ordered_groups(escore_notes, pitches_idx)
12953
+
12954
+ merged_melody_notes = []
12955
+
12956
+ for i, (k, g) in enumerate(groups[:-1]):
12957
+
12958
+ if len(g) == 1:
12959
+ merged_melody_notes.extend(g)
12960
+
12961
+ else:
12962
+ dur = min(max_dur, groups[i+1][1][0][1] - g[0][1])
12963
+
12964
+ merged_melody_notes.append(['note',
12965
+ g[0][1],
12966
+ dur,
12967
+ g[0][3],
12968
+ g[0][4],
12969
+ g[0][5],
12970
+ g[0][6]
12971
+ ])
12972
+
12973
+ return merged_melody_notes
12974
+
12975
+ ###################################################################################
12976
+
12977
+ def add_expressive_melody_to_enhanced_score_notes(escore_notes,
12978
+ melody_start_chord=0,
12979
+ melody_notes_max_duration=255,
12980
+ melody_channel=3,
12981
+ melody_patch=40,
12982
+ melody_max_velocity=120,
12983
+ acc_max_velocity=90,
12984
+ return_melody=False
12985
+ ):
12986
+
12987
+
12988
+ score = copy.deepcopy(escore_notes)
12989
+
12990
+ adjust_score_velocities(score, acc_max_velocity)
12991
+
12992
+ cscore = chordify_score([1000, score])
12993
+
12994
+ melody_pitches = [72]
12995
+
12996
+ for i, c in enumerate(cscore[melody_start_chord:]):
12997
+
12998
+ pitches = [e[4] for e in c if e[3] != 9]
12999
+
13000
+ if pitches:
13001
+ cptc = find_closest_value(mult_pitches(pitches), melody_pitches[-1])[0]
13002
+ melody_pitches.append(cptc)
13003
+
13004
+ song_f = []
13005
+ mel_f = []
13006
+
13007
+ idx = 1
13008
+
13009
+ for i, c in enumerate(cscore[:-1]):
13010
+ pitches = [e[4] for e in c if e[3] != 9]
13011
+
13012
+ if pitches and i >= melody_start_chord:
13013
+ dur = min(cscore[i+1][0][1] - c[0][1], melody_notes_max_duration)
13014
+
13015
+ mel_f.append(['note',
13016
+ c[0][1],
13017
+ dur,
13018
+ melody_channel,
13019
+ 60+(melody_pitches[idx] % 24),
13020
+ 100 + ((melody_pitches[idx] % 12) * 2),
13021
+ melody_patch
13022
+ ])
13023
+ idx += 1
13024
+
13025
+ song_f.extend(c)
13026
+
13027
+ song_f.extend(cscore[-1])
13028
+
13029
+ adjust_score_velocities(mel_f, melody_max_velocity)
13030
+
13031
+ song_f = sorted(merge_melody_notes(mel_f, max_dur=melody_notes_max_duration) + song_f,
13032
+ key=lambda x: x[1]
13033
+ )
13034
+
13035
+ if return_melody:
13036
+ return mel_f
13037
+
13038
+ else:
13039
+ return song_f
13040
+
13041
+ ###################################################################################
13042
+
13043
  print('Module loaded!')
13044
  print('=' * 70)
13045
  print('Enjoy! :)')