Spaces:
Running
Running
""" | |
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) | |