| @@ -3,31 +3,26 @@ import numpy as np | |||||
| import matplotlib.image as mpimg | import matplotlib.image as mpimg | ||||
| import wave | import wave | ||||
| from array import array | from array import array | ||||
| from progressbar import ProgressBar | |||||
| def write_column(output_file, pixels, rescale=.1): | |||||
| """ Write a single column of sound """ | |||||
| curve = np.fft.ifft(pixels, len(pixels)*2).real | |||||
| curve = np.array((curve-np.average(curve))*rescale, dtype=int) | |||||
| data = array("h", curve).tostring() | |||||
| output_file.writeframes(data) | |||||
| def make_wav(image_filename): | def make_wav(image_filename): | ||||
| """ Make a WAV file having a spectrogram resembling an image """ | """ Make a WAV file having a spectrogram resembling an image """ | ||||
| # Load image | |||||
| image = mpimg.imread(image_filename) | image = mpimg.imread(image_filename) | ||||
| image = np.sum(image, axis = 2).T[:, ::-1] | image = np.sum(image, axis = 2).T[:, ::-1] | ||||
| image = image**2 | |||||
| image = image**3 # ??? | |||||
| w, h = image.shape | |||||
| # Fourier transform, normalize, remove DC bias | |||||
| data = np.fft.irfft(image, h*2, axis=1).reshape((w*h*2)) | |||||
| data -= np.average(data) | |||||
| data *= (2**15.-1)/np.amax(data) | |||||
| data = array("h", np.int_(data)).tostring() | |||||
| # Write to disk | |||||
| output_file = wave.open(image_filename+".wav", "w") | output_file = wave.open(image_filename+".wav", "w") | ||||
| output_file.setparams((1, 2, 44100, 0, "NONE", "not compressed")) | output_file.setparams((1, 2, 44100, 0, "NONE", "not compressed")) | ||||
| pb = ProgressBar().start() | |||||
| n = float(len(image)) | |||||
| for index, column in enumerate(image): | |||||
| write_column(output_file, column) | |||||
| pb.update(index*100/n) | |||||
| output_file.writeframes(data) | |||||
| output_file.close() | output_file.close() | ||||
| print "Wrote %s.wav" % image_filename | print "Wrote %s.wav" % image_filename | ||||