diff --git a/render.py b/render.py index 3e3c46e..0e49164 100755 --- a/render.py +++ b/render.py @@ -20,49 +20,45 @@ import sys import wave - -import pyaudio -from PIL import Image +from svgpathtools import svg2paths samplerate = 44100 #192000 default_duration = 5.0 - -def read_image(image): - print("image: width={} height={} total={}".format(image.width, image.height, image.width * image.height)) - - # resize coordinates for conversion to amplitude values - max_len = max(image.width, image.height) - fact = 32767 / max_len - sw, sh = int(image.width * fact), int(image.height * fact) - print("amplitude: width={} height={}".format(sw, sh)) +default_outfile = "out.wav" + +def read_image(filename): + paths, attributes = svg2paths(filename) + path = paths[0] + if len(paths) > 1: + print("WARNING: multiple paths in file. will just draw first one.") + + print("paths={} segments={}".format(len(paths), len(path))) + + points = [[path[0].start.real, path[0].start.imag]] + p_min = [points[0][0], points[0][1]] + p_max = [points[0][0], points[0][1]] + for segment in path: + p = [segment.end.real, segment.end.imag] + for i in range(0, 2): + if p[i] < p_min[i]: + p_min[i] = p[i] + if p[i] > p_max[i]: + p_max[i] = p[i] + points.append(p) + print("min={} max={}".format(p_min, p_max)) data = bytearray() - for x in range(0, image.width): - for y in range(0, image.height): - if image.getpixel((x, y))[3] > 127: - xc, yc = int((x - (image.width / 2)) * fact), int((y - (image.height / 2)) * fact) - data.extend(yc.to_bytes(2, byteorder="little", signed=True)) - data.extend(xc.to_bytes(2, byteorder="little", signed=True)) + for n in range(0, len(points)): + for i in range(0, 2): + v = points[n][i] + v -= p_min[i] + v /= p_max[i] - p_min[i] + c = int((v * 2 - 1) * (32767 / 100 * 70)) + data.extend(c.to_bytes(2, byteorder="little", signed=True)) return data -def play_waveform(data): - pa = pyaudio.PyAudio() - - # int16 - stream = pa.open(format=pa.get_format_from_width(2), - channels=2, - rate=samplerate, - output=True) - - stream.write(data, int(len(data) / 4), True) - - stream.stop_stream() - stream.close() - - pa.terminate() - -def write_waveform(data): - with wave.open("out.wav", "w") as f: +def write_waveform(data, filename): + with wave.open(filename, "w") as f: f.setnchannels(2) f.setsampwidth(2) f.setframerate(samplerate) @@ -71,16 +67,20 @@ def write_waveform(data): def main(): if len(sys.argv) <= 1: print("Usage:") - print("\t" + sys.argv[0] + " image.png [seconds]") + print("\t" + sys.argv[0] + " image.png [out.wav] [seconds]") sys.exit(1) - if len(sys.argv) >= 3: + if len(sys.argv) == 3: + duration = float(sys.argv[2]) + outfile = default_outfile + if len(sys.argv) >= 4: duration = float(sys.argv[2]) + outfile = sys.argv[3] else: duration = default_duration + outfile = default_outfile - with Image.open(sys.argv[1]) as image: - wave = read_image(image) + wave = read_image(sys.argv[1]) samplecount = int(len(wave) / 2 / 2) # stereo, int16 drawrate = samplerate / samplecount @@ -92,8 +92,7 @@ def main(): data.extend(wave) print("len={}".format(len(data))) - #play_waveform(bytes(data)) - write_waveform(bytes(data)) + write_waveform(bytes(data), outfile) if __name__ == "__main__": main() diff --git a/toolbox.png b/toolbox.png deleted file mode 100644 index ec15986..0000000 Binary files a/toolbox.png and /dev/null differ diff --git a/toolbox.svg b/toolbox.svg new file mode 100644 index 0000000..5402b3b --- /dev/null +++ b/toolbox.svg @@ -0,0 +1,48 @@ + + + + + + + + + +