File size: 2,462 Bytes
df5dab1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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)