|
""" |
|
Implementation of Audio Effects Chain Manipulation for the task 'Mixing Style Transfer' |
|
""" |
|
from glob import glob |
|
import os |
|
import sys |
|
|
|
currentdir = os.path.dirname(os.path.realpath(__file__)) |
|
sys.path.append(currentdir) |
|
sys.path.append(os.path.dirname(currentdir)) |
|
from common_audioeffects import * |
|
from common_dataprocessing import create_dataset |
|
|
|
|
|
|
|
|
|
def create_effects_augmentation_chain(effects, \ |
|
ir_dir_path=None, \ |
|
sample_rate=44100, \ |
|
shuffle=False, \ |
|
parallel=False, \ |
|
parallel_weight_factor=None): |
|
''' |
|
Args: |
|
effects (list of tuples or string) : First tuple element is string denoting the target effects. |
|
Second tuple element is probability of applying current effects. |
|
ir_dir_path (string) : directory path that contains directories of impulse responses organized according to RT60 |
|
sample_rate (int) : using sampling rate |
|
shuffle (boolean) : shuffle FXs inside current FX chain |
|
parallel (boolean) : compute parallel FX computation (alpha * input + (1-alpha) * manipulated output) |
|
parallel_weight_factor : the value of alpha for parallel FX computation. default=None : random value in between (0.0, 0.5) |
|
''' |
|
fx_list = [] |
|
apply_prob = [] |
|
for cur_fx in effects: |
|
|
|
if isinstance(cur_fx, tuple): |
|
apply_prob.append(cur_fx[1]) |
|
cur_fx = cur_fx[0] |
|
else: |
|
apply_prob.append(1) |
|
|
|
|
|
if isinstance(cur_fx, AugmentationChain) or isinstance(cur_fx, Processor): |
|
fx_list.append(cur_fx) |
|
elif cur_fx.lower()=='gain': |
|
fx_list.append(Gain()) |
|
elif 'eq' in cur_fx.lower(): |
|
fx_list.append(Equaliser(n_channels=2, sample_rate=sample_rate)) |
|
elif 'comp' in cur_fx.lower(): |
|
fx_list.append(Compressor(sample_rate=sample_rate)) |
|
elif 'expand' in cur_fx.lower(): |
|
fx_list.append(Expander(sample_rate=sample_rate)) |
|
elif 'pan' in cur_fx.lower(): |
|
fx_list.append(Panner()) |
|
elif 'image'in cur_fx.lower(): |
|
fx_list.append(MidSideImager()) |
|
elif 'algorithmic' in cur_fx.lower(): |
|
fx_list.append(AlgorithmicReverb(sample_rate=sample_rate)) |
|
elif 'reverb' in cur_fx.lower(): |
|
|
|
if ir_dir_path==None: |
|
fx_list.append(AlgorithmicReverb(sample_rate=sample_rate)) |
|
|
|
else: |
|
IR_paths = glob(f"{ir_dir_path}*/RT60_avg/[!0-]*") |
|
IR_list = [] |
|
IR_dict = {} |
|
for IR_path in IR_paths: |
|
cur_rt = IR_path.split('/')[-1] |
|
if cur_rt not in IR_dict: |
|
IR_dict[cur_rt] = [] |
|
IR_dict[cur_rt].extend(create_dataset(path=IR_path, \ |
|
accepted_sampling_rates=[sample_rate], \ |
|
sources=['impulse_response'], \ |
|
mapped_sources={}, load_to_memory=True, debug=False)[0]) |
|
long_ir_list = [] |
|
for cur_rt in IR_dict: |
|
cur_rt_len = int(cur_rt.split('-')[0]) |
|
if cur_rt_len < 3000: |
|
IR_list.append(IR_dict[cur_rt]) |
|
else: |
|
long_ir_list.extend(IR_dict[cur_rt]) |
|
|
|
IR_list.append(long_ir_list) |
|
fx_list.append(ConvolutionalReverb(IR_list, sample_rate)) |
|
else: |
|
raise ValueError(f"make sure the target effects are in the Augment FX chain : received fx called {cur_fx}") |
|
|
|
aug_chain_in = [] |
|
for cur_i, cur_fx in enumerate(fx_list): |
|
normalize = False if isinstance(cur_fx, AugmentationChain) or cur_fx.name=='Gain' else True |
|
aug_chain_in.append((cur_fx, apply_prob[cur_i], normalize)) |
|
|
|
return AugmentationChain(fxs=aug_chain_in, shuffle=shuffle, parallel=parallel, parallel_weight_factor=parallel_weight_factor) |
|
|
|
|
|
|
|
def create_inst_effects_augmentation_chain(inst, \ |
|
apply_prob_dict, \ |
|
ir_dir_path=None, \ |
|
algorithmic=False, \ |
|
sample_rate=44100): |
|
''' |
|
Args: |
|
inst (string) : FXmanipulator for target instrument. Current version only distinguishes 'drums' for applying reverberation |
|
apply_prob_dict (dictionary of (FX name, probability)) : applying proababilities for each FX |
|
ir_dir_path (string) : directory path that contains directories of impulse responses organized according to RT60 |
|
algorithmic (boolean) : rather to use algorithmic reverberation (True) or convolution reverberation (False) |
|
sample_rate (int) : using sampling rate |
|
''' |
|
reverb_type = 'algorithmic' if algorithmic else 'reverb' |
|
eq_comp_rand = create_effects_augmentation_chain([('eq', apply_prob_dict['eq']), ('comp', apply_prob_dict['comp'])], \ |
|
ir_dir_path=ir_dir_path, \ |
|
sample_rate=sample_rate, \ |
|
shuffle=True) |
|
pan_image_rand = create_effects_augmentation_chain([('pan', apply_prob_dict['pan']), ('imager', apply_prob_dict['imager'])], \ |
|
ir_dir_path=ir_dir_path, \ |
|
sample_rate=sample_rate, \ |
|
shuffle=True) |
|
if inst=='drums': |
|
|
|
low_pass_eq_params = ParameterList() |
|
low_pass_eq_params.add(Parameter('high_shelf_gain', -50.0, 'float', minimum=-50.0, maximum=-50.0)) |
|
low_pass_eq_params.add(Parameter('high_shelf_freq', 100.0, 'float', minimum=100.0, maximum=100.0)) |
|
low_pass_eq = Equaliser(n_channels=2, \ |
|
sample_rate=sample_rate, \ |
|
bands=['high_shelf'], \ |
|
parameters=low_pass_eq_params) |
|
reverb_parallel_low = create_effects_augmentation_chain([low_pass_eq, (reverb_type, apply_prob_dict['reverb']*0.01)], \ |
|
ir_dir_path=ir_dir_path, \ |
|
sample_rate=sample_rate, \ |
|
parallel=True, \ |
|
parallel_weight_factor=0.8) |
|
|
|
high_pass_eq_params = ParameterList() |
|
high_pass_eq_params.add(Parameter('low_shelf_gain', -50.0, 'float', minimum=-50.0, maximum=-50.0)) |
|
high_pass_eq_params.add(Parameter('low_shelf_freq', 100.0, 'float', minimum=100.0, maximum=100.0)) |
|
high_pass_eq = Equaliser(n_channels=2, \ |
|
sample_rate=sample_rate, \ |
|
bands=['low_shelf'], \ |
|
parameters=high_pass_eq_params) |
|
reverb_parallel_high = create_effects_augmentation_chain([high_pass_eq, (reverb_type, apply_prob_dict['reverb'])], \ |
|
ir_dir_path=ir_dir_path, \ |
|
sample_rate=sample_rate, \ |
|
parallel=True, \ |
|
parallel_weight_factor=0.6) |
|
reverb_parallel = create_effects_augmentation_chain([reverb_parallel_low, reverb_parallel_high], \ |
|
ir_dir_path=ir_dir_path, \ |
|
sample_rate=sample_rate) |
|
else: |
|
reverb_parallel = create_effects_augmentation_chain([(reverb_type, apply_prob_dict['reverb'])], \ |
|
ir_dir_path=ir_dir_path, \ |
|
sample_rate=sample_rate, \ |
|
parallel=True) |
|
|
|
effects_chain = create_effects_augmentation_chain([eq_comp_rand, \ |
|
pan_image_rand, \ |
|
reverb_parallel, \ |
|
('gain', apply_prob_dict['gain'])], \ |
|
ir_dir_path=ir_dir_path, \ |
|
sample_rate=sample_rate) |
|
|
|
return effects_chain |
|
|
|
|