Spaces:
Sleeping
Sleeping
| """ | |
| Utilities for inspecting encoded music data. | |
| """ | |
| import numpy as np | |
| import matplotlib | |
| import matplotlib.pyplot as plt | |
| import anticipation.ops as ops | |
| from anticipation.config import * | |
| from anticipation.vocab import * | |
| def visualize(tokens, output, selected=None): | |
| #colors = ['white', 'silver', 'red', 'sienna', 'darkorange', 'gold', 'yellow', 'palegreen', 'seagreen', 'cyan', | |
| # 'dodgerblue', 'slategray', 'navy', 'mediumpurple', 'mediumorchid', 'magenta', 'lightpink'] | |
| colors = ['white', '#426aa0', '#b26789', '#de9283', '#eac29f', 'silver', 'red', 'sienna', 'darkorange', 'gold', 'yellow', 'palegreen', 'seagreen', 'cyan', 'dodgerblue', 'slategray', 'navy'] | |
| plt.rcParams['figure.dpi'] = 300 | |
| plt.rcParams['savefig.dpi'] = 300 | |
| max_time = ops.max_time(tokens, seconds=False) | |
| grid = np.zeros([max_time, MAX_PITCH]) | |
| instruments = list(sorted(list(ops.get_instruments(tokens).keys()))) | |
| if 128 in instruments: | |
| instruments.remove(128) | |
| for j, (tm, dur, note) in enumerate(zip(tokens[0::3],tokens[1::3],tokens[2::3])): | |
| if note == SEPARATOR: | |
| assert tm == SEPARATOR and dur == SEPARATOR | |
| print(j, 'SEPARATOR') | |
| continue | |
| if note == REST: | |
| continue | |
| assert note < CONTROL_OFFSET | |
| tm = tm - TIME_OFFSET | |
| dur = dur - DUR_OFFSET | |
| note = note - NOTE_OFFSET | |
| instr = note//2**7 | |
| pitch = note - (2**7)*instr | |
| if instr == 128: # drums | |
| continue # we don't visualize this | |
| if selected and instr not in selected: | |
| continue | |
| grid[tm:tm+dur, pitch] = 1+instruments.index(instr) | |
| plt.clf() | |
| plt.axis('off') | |
| cmap = matplotlib.colors.ListedColormap(colors) | |
| bounds = list(range(MAX_TRACK_INSTR)) + [16] | |
| norm = matplotlib.colors.BoundaryNorm(bounds, cmap.N) | |
| plt.imshow(np.flipud(grid.T), aspect=16, cmap=cmap, norm=norm, interpolation='none') | |
| patches = [matplotlib.patches.Patch(color=colors[i+1], label=f"{instruments[i]}") | |
| for i in range(len(instruments))] | |
| plt.legend(handles=patches, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0. ) | |
| plt.tight_layout() | |
| plt.savefig(output) | |