Source code for pyscab.utils


[docs]def generate_pcm(number_of_channels=1, frequency=440, duration = 1.0, volume = 1.0, fs=44100, format="INT16", window = "linear", t_raise_fall = 0.01): import numpy t = numpy.arange(0, duration, 1/fs) sin = volume * numpy.sin(2*numpy.pi*frequency*t) if window is None: pass elif window.upper() == "LINEAR": #import sys #import matplotlib.pyplot as plt raise_ = numpy.arange(0, int(t_raise_fall*fs)) fall_ = numpy.arange(int(t_raise_fall*fs), 0, -1) raise_ = raise_ / max(raise_) fall_ = fall_ / max(fall_) flat = numpy.ones((int((duration-2*t_raise_fall)*fs))) win_filter = numpy.concatenate([raise_, flat, fall_]) sin = sin * win_filter if format.upper() == "INT16": dt = numpy.dtype("int16") sin = sin * 32767 sin = sin.astype(dt) # FOR DEBUGGING if max(sin) > 32767 or min(sin) < -32768: raise ValueError("ERROR : generate_pcm() in utils.py, error happened in type conversion. int16") elif format.upper() == "UINT8": dt = numpy.dtype("uint8") sin = ((sin*0.5)+0.5)*255 sin = sin.astype(dt) # FOR DEBUGGING if max(sin) > 255 or min(sin) < 0: raise ValueError("ERROR : generate_pcm() in utils.py, error happened in type conversion. uint8") else: raise ValueError("Unknown Format : " + format + ". It can only take INT16 or UINT8.") if number_of_channels > 1: n_frames = len(sin) #print(n_frames) sin = numpy.reshape(sin, (n_frames, 1)) sin = numpy.repeat(sin, number_of_channels, axis=1) return sin