brainblow's picture
Duplicate from dpe1/beat_manipulator
df5dab1
raw
history blame contribute delete
No virus
2.46 kB
from . import io, main
import numpy as np
def generate(song, beatmap = None, mode='median', sr = None, log = True):
if log is True: print(f'Generating an image from beats...', end = ' ')
song = main.song(song, sr=sr)
if song.beatmap is None: song.beatmap = beatmap
if song.beatmap is None: song.beatmap_generate()
if isinstance(song.audio, np.ndarray): song.audio = song.audio.tolist()
# create the image
image = [[],[]]
for i in range(1, len(song.beatmap)):
beat = song[i]
image[0].append(beat[0])
image[1].append(beat[1])
# find image width
lengths = [len(i) for i in image[0]]
mode = mode.lower()
if 'max' in mode:
width = max(lengths)
elif 'med' in mode:
width = int(np.median(lengths))
elif 'av' in mode:
width = int(np.average(lengths))
# fill or crop rows:
for i in range(len(image[0])):
difference = lengths[i] - width
if difference<0:
image[0][i].extend([np.nan]*(-difference))
image[1][i].extend([np.nan]*(-difference))
elif difference>0:
image[0][i] = image[0][i][:-difference]
image[1][i] = image[1][i][:-difference]
song.audio = np.array(song.audio, copy=False)
if log is True: print('Done!')
return np.array(image, copy=False)
def bw_to_colored(image, channel = 2, fill = True):
if fill is True:
combined = image[0] * image[1]
combined = (np.abs(combined)**0.5)*np.sign(combined)
else: channel = np.zeros(shape = image[0].shape)
image = image.tolist()
if channel == 2: image.append(combined)
else: image.insert(channel, combined)
return np.rot90(np.array(image, copy=False).T)
def colored_to_bw(image, l=0, r=1):
image = np.array(image, copy=False)
return np.array([image[:,:,l],image[:,:,r]])
def write(image, output, mode = 'r', max_size = 4096, rotate = True, contrast=1):
import cv2
if max_size is not None:
w = max_size
h = min(len(image[0][0]), max_size)
if mode == 'color':
image = bw_to_colored(image)
elif mode == 'r':
image = image[0]
elif mode == 'l':
image = image[1]
elif mode == 'combine':
image = image[0] + image[1]
image = image*(255*contrast)
image = cv2.resize(src=image, dsize=(w, h), interpolation = cv2.INTER_NEAREST)
if rotate is True: image = np.rot90(image)
cv2.imwrite(output, image)