1
0
Fork 0
pico-led-matrix/firmware/scripts/audio_convert.py

67 lines
1.7 KiB
Python

import os
import sys
import soundfile as sf
import samplerate
# Adapted from https://github.com/rgrosset/pico-pwm-audio
print("loading file...")
soundfile = 'audio/output.wav'
data_in, datasamplerate = sf.read(soundfile)
# This means stereo so extract one channel 0
if len(data_in.shape)>1:
data_in = data_in[:,0]
print("resampling...")
converter = 'sinc_best' # or 'sinc_fastest', ...
desired_sample_rate = 22000.0
ratio = desired_sample_rate/datasamplerate
data_out = samplerate.resample(data_in, ratio, converter)
print("analyzing...")
maxValue = max(data_out)
minValue = min(data_out)
print("length", len(data_out))
print("max value", max(data_out))
print("min value", min(data_out))
vrange = (maxValue - minValue)
print("value range", vrange)
print("normalizing...")
# normalize to 0-1
normalized = [int((v-minValue)/vrange*255) for v in data_out]
# print("generating header...")
# m68code = "/* File "+soundfile+ "\r\n * Sample rate "+str(int(desired_sample_rate)) +" Hz\r\n */\r\n"
# m68code += "#define WAV_DATA_LENGTH "+str(len(data_out))+" \r\n\r\n"
# m68code += "static const uint8_t WAV_DATA[] = {\r\n "
# m68code += ','.join(str(v) for v in normalized)
# # keep track of first and last values to avoid
# # blip when the loop restarts.. make the end value
# # the average of the first and last.
# end_value = int( (normalized[0] + normalized[len(normalized) - 1]) / 2)
# m68code+=","+str(end_value)+'\n};\n'
# print("writing output...")
# with open("src/audio_sample.h", "w") as f:
# f.write(m68code)
# print("done!")
print("writing blob...")
os.makedirs("video_output", exist_ok=True)
with open("video_output/audio.bin", "wb") as f:
f.write(bytes(normalized))
print("done!")