Spaces:
Running
on
Zero
Running
on
Zero
import numpy as np | |
def note_detection_with_onset_offset_regress(frame_output, onset_output, | |
onset_shift_output, offset_output, offset_shift_output, velocity_output, | |
frame_threshold): | |
"""Process prediction matrices to note events information. | |
First, detect onsets with onset outputs. Then, detect offsets | |
with frame and offset outputs. | |
Args: | |
frame_output: (frames_num,) | |
onset_output: (frames_num,) | |
onset_shift_output: (frames_num,) | |
offset_output: (frames_num,) | |
offset_shift_output: (frames_num,) | |
velocity_output: (frames_num,) | |
frame_threshold: float | |
Returns: | |
output_tuples: list of [bgn, fin, onset_shift, offset_shift, normalized_velocity], | |
e.g., [ | |
[1821, 1909, 0.47498, 0.3048533, 0.72119445], | |
[1909, 1947, 0.30730522, -0.45764327, 0.64200014], | |
...] | |
""" | |
output_tuples = [] | |
bgn = None | |
frame_disappear = None | |
offset_occur = None | |
for i in range(onset_output.shape[0]): | |
if onset_output[i] == 1: | |
"""Onset detected""" | |
if bgn: | |
"""Consecutive onsets. E.g., pedal is not released, but two | |
consecutive notes being played.""" | |
fin = max(i - 1, 0) | |
output_tuples.append([bgn, fin, onset_shift_output[bgn], | |
0, velocity_output[bgn]]) | |
frame_disappear, offset_occur = None, None | |
bgn = i | |
if bgn and i > bgn: | |
"""If onset found, then search offset""" | |
if frame_output[i] <= frame_threshold and not frame_disappear: | |
"""Frame disappear detected""" | |
frame_disappear = i | |
if offset_output[i] == 1 and not offset_occur: | |
"""Offset detected""" | |
offset_occur = i | |
if frame_disappear: | |
if offset_occur and offset_occur - bgn > frame_disappear - offset_occur: | |
"""bgn --------- offset_occur --- frame_disappear""" | |
fin = offset_occur | |
else: | |
"""bgn --- offset_occur --------- frame_disappear""" | |
fin = frame_disappear | |
output_tuples.append([bgn, fin, onset_shift_output[bgn], | |
offset_shift_output[fin], velocity_output[bgn]]) | |
bgn, frame_disappear, offset_occur = None, None, None | |
if bgn and (i - bgn >= 600 or i == onset_output.shape[0] - 1): | |
"""Offset not detected""" | |
fin = i | |
output_tuples.append([bgn, fin, onset_shift_output[bgn], | |
offset_shift_output[fin], velocity_output[bgn]]) | |
bgn, frame_disappear, offset_occur = None, None, None | |
# Sort pairs by onsets | |
output_tuples.sort(key=lambda pair: pair[0]) | |
return output_tuples | |
def pedal_detection_with_onset_offset_regress(frame_output, offset_output, | |
offset_shift_output, frame_threshold): | |
"""Process prediction array to pedal events information. | |
Args: | |
frame_output: (frames_num,) | |
offset_output: (frames_num,) | |
offset_shift_output: (frames_num,) | |
frame_threshold: float | |
Returns: | |
output_tuples: list of [bgn, fin, onset_shift, offset_shift], | |
e.g., [ | |
[1821, 1909, 0.4749851, 0.3048533], | |
[1909, 1947, 0.30730522, -0.45764327], | |
...] | |
""" | |
output_tuples = [] | |
bgn = None | |
frame_disappear = None | |
offset_occur = None | |
for i in range(1, frame_output.shape[0]): | |
if frame_output[i] >= frame_threshold and frame_output[i] > frame_output[i - 1]: | |
"""Pedal onset detected""" | |
if bgn: | |
pass | |
else: | |
bgn = i | |
if bgn and i > bgn: | |
"""If onset found, then search offset""" | |
if frame_output[i] <= frame_threshold and not frame_disappear: | |
"""Frame disappear detected""" | |
frame_disappear = i | |
if offset_output[i] == 1 and not offset_occur: | |
"""Offset detected""" | |
offset_occur = i | |
if offset_occur: | |
fin = offset_occur | |
output_tuples.append([bgn, fin, 0., offset_shift_output[fin]]) | |
bgn, frame_disappear, offset_occur = None, None, None | |
if frame_disappear and i - frame_disappear >= 10: | |
"""offset not detected but frame disappear""" | |
fin = frame_disappear | |
output_tuples.append([bgn, fin, 0., offset_shift_output[fin]]) | |
bgn, frame_disappear, offset_occur = None, None, None | |
# Sort pairs by onsets | |
output_tuples.sort(key=lambda pair: pair[0]) | |
return output_tuples |