Offline processing of multiple audio files in batch¶
05-batch-processing.py
This program demonstrates how to use pyo to do offline batch processing given a folder of sounds.
import os
from pyo import *
# Initialize the Server in offline mode.
s = Server(audio="offline")
# Path to your sound folder (SNDS_PATH is a folder containing a few sounds installed with pyo,
# you can change this path to try with your own sounds).
folder_path = SNDS_PATH
# Path to the processed sounds folder (user's home directory/pyo_batch_fx/).
output_folder = os.path.join(os.path.expanduser("~"), "pyo_batch_fx")
# create the folder if it does not exist.
if not os.path.isdir(output_folder):
os.mkdir(output_folder)
# Get the list of audio files to process.
sounds = [f for f in os.listdir(folder_path) if sndinfo(os.path.join(folder_path, f)) is not None]
# Enter the batch processing loop.
for sound in sounds:
# Retrieve info about the sound from its header.
path = os.path.join(folder_path, sound)
info = sndinfo(path)
dur, sr, chnls = info[1], info[2], info[3]
fformat = ["WAVE", "AIFF", "AU", "RAW", "SD2", "FLAC", "CAF", "OGG"].index(info[4])
samptype = [
"16 bit int",
"24 bit int",
"32 bit int",
"32 bit float",
"64 bits float",
"U-Law encoded",
"A-Law encoded",
].index(info[5])
# Set server parameters according to the current sound info.
s.setSamplingRate(sr)
s.setNchnls(chnls)
s.boot()
s.recordOptions(
dur=dur + 1, # give some room for the reverb trail!
filename=os.path.join(output_folder, sound),
fileformat=fformat,
sampletype=samptype,
)
# Simple processing applied to the sound.
source = SfPlayer(path)
bandpass = ButBP(source, 1000, 5)
disto = Disto(bandpass, drive=0.9, slope=0.8)
output = WGVerb(source + disto, feedback=0.8, cutoff=5000, bal=0.25, mul=0.5).out()
# Start the rendering.
s.start()
# Cleanup for the next pass.
s.shutdown()