|
|
"""
|
|
|
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', '#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:
|
|
|
continue
|
|
|
|
|
|
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)
|
|
|
|