audloop
is a library in development. Its purpose is to enable rapid prototyping of DSP algorithms and/or audio synthesis
experimentation in a Python programming environment.
audloop
will run all audio DSP offline. Audio is meant to be read in as a wav file or synthesized from scratch. The
audible result will be a newly written wav file.
This library aims to achieve similar functionality to that of sound specific languages/programs
such as SuperCollider, FAUST, or MAX-MSP. Unlike those programs, audloop
is written entirely in the general purpose
language Python. This means that nothing is abstracted from the user. Because Python is general purpose, algorithms
written in audloop
can be ported to other general purpose languages such as C++. To further enable coherency with
audloop
and realtime DSP environment, all audloop
modules are coded as if they are running in a realtime audio loop.
This design choice was specifically made so that algorithms written with audloop
could be ported into a realtime DSP
environment via another general purpose language.
The code below is a suggested use case. Simply create a class that inherits from the AudioProcessorGeneric
class.
The three methods on_start_up()
, process_block()
, and post_process()
need to be implemented. You need to, at the very
least, put pass
in each method to get the class to run. The names suggest when each one will be executed at runtime.
from audloop import AudioProcessorGeneric
import audloop as pst
class AudioProcessor(AudioProcessorGeneric):
def on_start_up(self):
self.fio.read_wav("EXAMPLE_FILE.wav") # import wav file
self.set_process_time(self.fio.length_samples,
'samples') # set the audio loop to be the same length as the imported audio.
self.fl = pst.Flanger() # initialize the Flanger module
def process_block(self):
for i in range(self.process_time):
self.output_stream[i] += self.fl.flanger(self.fio.imported_audio[i], 2, 0.6,
0.3) # calling the flanger module in the audio loop
def post_process(self):
self.fio.write_wav("EXAMPLE_OUTPUT.wav", self.output_stream)
class PTAudioProcessor(AudioProcessorGeneric):
def on_start_up(self):
self.set_process_time(10)
self.s1 = pst.Sawosc() # Initialize Sawosc module
self.en = pst.EnvGen([(0.01, 1),(0.2, 0)]) # Generate a linear envelope from breakpoints
self.cl = pst.Clock() # Intialize Clock
self.no = pst.WhiteNoise() # Initialize Whitenoise
def process_block(self):
for i in range(self.process_time):
f = self.no.whitenoise_range(200, 1000, 2) # Value between 200 and 1000 every 2Hz
self.output_stream[i] += self.s1.sawosc(f) * self.en.env(self.cl.clock(2)) # clock will trigger envelope every 2Hz
def post_process(self):
self.fio.write_wav('saw_melody.wav', self.output_stream)
AudioProcessorGeneric
Sinosc
Cososc
Sawosc
Triosc
Sqrosc
Whitenoise
EnvGen
Clock
Score
RMSDetector
PeakDetector
Delay
FDelay
Flanger
rad2deg
deg2rad
lin_pan
const_pwr_pan