Skip to content

Commit

Permalink
fix(tokenizer): still update ray's pba on failure
Browse files Browse the repository at this point in the history
  • Loading branch information
webpolis committed Feb 2, 2025
1 parent b92250d commit 79fe426
Showing 1 changed file with 83 additions and 80 deletions.
163 changes: 83 additions & 80 deletions src/tools/tokenizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,91 +313,94 @@ def process_midi(midi_path, pba: ActorHandle, classes=None, classes_req=None, mi
except Exception as err:
midi_score = None

if midi is None or midi_score is None:
return midi_doc

try:
required_ticks = max(BEAT_RES.values()) * 4
length_in_beats = midi.max_tick / midi.ticks_per_beat
has_req_length = not (
length_in_beats < minlength or midi.ticks_per_beat < required_ticks)

if has_req_length:
programs = get_score_programs(midi_score)
midi_programs = list(set([p[0] for p in programs]))
drum_programs = list(set([p[0] for p in programs if p[1] == True]))

# check if midi has at least one program from each required class
meets_req = True

if classes_req != None:
classes_req = classes_req.strip().split(',')
classes_req = [int(c.strip()) for c in classes_req]

for ic in classes_req:
class_programs = list(
INSTRUMENT_CLASSES[ic]['program_range'])
intersect = list(set(midi_programs) & set(class_programs))
meets_req = (ic == 16 and len(drum_programs) > 0) \
or meets_req and len(intersect) > 0

if not meets_req:
break

if meets_req:
# remove unwanted tracks
programs_to_delete = []

if classes is None:
for ic in CLASS_EFFECTS:
programs_to_delete += list(
if midi is not None and midi_score is not None:
try:
required_ticks = max(BEAT_RES.values()) * 4
length_in_beats = midi.max_tick / midi.ticks_per_beat
has_req_length = not (
length_in_beats < minlength or midi.ticks_per_beat < required_ticks)

if has_req_length:
programs = get_score_programs(midi_score)
midi_programs = list(set([p[0] for p in programs]))
drum_programs = list(
set([p[0] for p in programs if p[1] == True]))

# check if midi has at least one program from each required class
meets_req = True

if classes_req != None:
classes_req = classes_req.strip().split(',')
classes_req = [int(c.strip()) for c in classes_req]

for ic in classes_req:
class_programs = list(
INSTRUMENT_CLASSES[ic]['program_range'])
else:
classes = classes.strip().split(',')
classes = [int(c.strip()) for c in classes]
programs_to_delete = get_other_programs(classes)

keep_programs = filter_programs(programs_to_delete)
intersect = list(set(midi_programs) &
set(class_programs))
meets_req = (ic == 16 and len(drum_programs) > 0) \
or meets_req and len(intersect) > 0

# some drum tracks use non-standard programs
if classes != None and 16 in classes \
and len(drum_programs) > 0:
keep_programs = list(set(keep_programs + drum_programs))
if not meets_req:
break

# remove unwanted tracks
merge_tracks_per_class(
midi_score, valid_programs=keep_programs)
if meets_req:
# remove unwanted tracks
programs_to_delete = []

# discard empty songs
if len(midi.instruments) >= 1:
if classes is None:
# merge percussion/drums
merge_tracks_per_class(midi_score, CLASSES_PERCUSSION)

# merge synths
merge_tracks_per_class(midi_score, CLASSES_SYNTHS)

# merge strings
merge_tracks_per_class(midi_score, CLASSES_STRINGS)

# merge guitar & bass
merge_tracks_per_class(midi_score, CLASSES_GUITAR_BASS)

# merge_same_program_tracks(midi.instruments)

midi_name = re.sub(r'[^0-9a-z_]{1,}', '_',
str.lower(os.path.basename(midi_path)))

programs = list(set([program[0]
for program in get_score_programs(midi_score)]))

midi_doc = {
'programs': programs,
'path': midi_path,
'name': midi_name
}
except Exception as err:
return None
for ic in CLASS_EFFECTS:
programs_to_delete += list(
INSTRUMENT_CLASSES[ic]['program_range'])
else:
classes = classes.strip().split(',')
classes = [int(c.strip()) for c in classes]
programs_to_delete = get_other_programs(classes)

keep_programs = filter_programs(programs_to_delete)

# some drum tracks use non-standard programs
if classes != None and 16 in classes \
and len(drum_programs) > 0:
keep_programs = list(
set(keep_programs + drum_programs))

# remove unwanted tracks
merge_tracks_per_class(
midi_score, valid_programs=keep_programs)

# discard empty songs
if len(midi.instruments) >= 1:
if classes is None:
# merge percussion/drums
merge_tracks_per_class(
midi_score, CLASSES_PERCUSSION)

# merge synths
merge_tracks_per_class(midi_score, CLASSES_SYNTHS)

# merge strings
merge_tracks_per_class(midi_score, CLASSES_STRINGS)

# merge guitar & bass
merge_tracks_per_class(
midi_score, CLASSES_GUITAR_BASS)

# merge_same_program_tracks(midi.instruments)

midi_name = re.sub(r'[^0-9a-z_]{1,}', '_',
str.lower(os.path.basename(midi_path)))

programs = list(set([program[0]
for program in get_score_programs(midi_score)]))

midi_doc = {
'programs': programs,
'path': midi_path,
'name': midi_name
}
except Exception as err:
pass

if pba != None:
pba.update.remote(1)
Expand Down

0 comments on commit 79fe426

Please sign in to comment.