Source code for widgets.widgetutilities
import numpy as np
def convert_str(string):
return u''.join(string).encode('utf-8').strip()
def set_css(widget, css_path):
try:
with open(css_path) as f:
css = f.read()
widget.setStyleSheet(css)
except IOError:
pass
[docs]def downsample_plot(plot_array, ds_limit):
# Decide by how much we should downsample
"""
Downsamples the given pitch array according to the given downsample limit.
:param plot_array: (numpy array) A sequence of pitch values
[440.4, 442.3, 440.0, ...]
:param ds_limit: (int) Maximum number of samples to be plotted.
:return: (numpy array) A sequence of pitch values
"""
size_array = np.size(plot_array)
ds = int(size_array / ds_limit) + 1
if ds == 1:
# Small enough to display with no intervention.
return plot_array
else:
# Here convert data into a down-sampled array suitable for
# visualizing. Must do this piecewise to limit memory usage.
samples = 1 + (size_array // ds)
visible = np.zeros(samples * 2, dtype=plot_array.dtype)
source_ptr = 0
target_ptr = 0
# read data in chunks of ~1M samples
chunk_size = (1000000 // ds) * ds
while source_ptr < size_array - 1:
chunk = plot_array[source_ptr:min(size_array,
source_ptr+chunk_size)]
size_chunk = np.size(chunk)
source_ptr += size_chunk
# reshape chunk to be integral multiple of ds
chunk = chunk[:(size_chunk // ds) * ds].reshape(size_chunk//ds, ds)
# compute max and min
chunk_max = chunk.max(axis=1)
chunk_min = chunk.min(axis=1)
# interleave min and max into plot data to preserve
# envelope shape
visible[target_ptr:target_ptr + chunk.shape[0] * 2:2] = chunk_min
visible[1+target_ptr:1+target_ptr+chunk.shape[0] * 2:2] = chunk_max
target_ptr += chunk.shape[0] * 2
plot_y = visible[:target_ptr]
plot_y[-1] = np.nan
return plot_y
[docs]def cursor_pos_sample(pos, samplerate, hopsize):
"""
Returns the current index of sample.
:param pos: (int or float) Playback position in seconds.
"""
return np.int(pos * samplerate / hopsize)
[docs]def current_pitch(sample, pitch_plot):
"""
Returns the current pitch value in Hz.
:param sample: (int) Index of sample.
:return: (float) Pitch in Hz.
"""
return pitch_plot[sample]