124 lines
4 KiB
Python
124 lines
4 KiB
Python
#!/usr/bin/env python3
|
|
import sys
|
|
from xml.dom.minidom import parse
|
|
import re
|
|
|
|
|
|
def key_change(key):
|
|
if key[-1].isdigit():
|
|
num = int(key[-1])
|
|
return '%s_%d' % (key[:-1], num+1)
|
|
return key
|
|
|
|
|
|
def starting(key, args):
|
|
'''returns True if key starts with any of the string in args'''
|
|
return any(key.startswith(x) for x in args)
|
|
|
|
|
|
def parse_params(preset):
|
|
return {par.attributes['name'].value: par.attributes['value'].value
|
|
for par in preset.getElementsByTagName('param')}
|
|
|
|
|
|
def multibandcompressor_get_params(params):
|
|
newparams = {}
|
|
for key in params:
|
|
if starting(key, ('level_', 'meter_', 'clip_', 'detection',
|
|
'compression', 'mode', 'output', 'notebook')):
|
|
continue
|
|
if key == 'bypass' or key.startswith('solo'):
|
|
newparams[key_change(key)] = bool(int(params[key]))
|
|
elif key.startswith('bypass') or re.match(r'output\d', key):
|
|
continue
|
|
elif starting(key, ('attack', 'ratio', 'release', 'makeup', 'knee',
|
|
'threshold')):
|
|
newparams[key_change(key)] = float(params[key])
|
|
elif starting(key, ('mode', 'notebook', 'output')):
|
|
newparams[key_change(key)] = int(params[key])
|
|
elif key.startswith('freq'):
|
|
num = int(key[-1])
|
|
newparams['split_%d_%d' % (num+1, num+2)] = float(params[key])
|
|
else:
|
|
print('!!', key, params[key], file=sys.stderr)
|
|
return newparams
|
|
|
|
|
|
def filter_get_params(params):
|
|
newparams = {}
|
|
for key in params:
|
|
if key == 'freq':
|
|
newparams['frequency'] = float(params[key])
|
|
elif key == 'res':
|
|
newparams['resonance'] = float(params[key])
|
|
elif key == 'inertia':
|
|
newparams[key] = float(params[key])
|
|
elif key in ('mode',):
|
|
newparams[key] = int(params[key])
|
|
else:
|
|
print('!!', key, params[key], file=sys.stderr)
|
|
return newparams
|
|
|
|
|
|
get_params = {
|
|
'multibandcompressor': multibandcompressor_get_params,
|
|
'filter': filter_get_params,
|
|
}
|
|
|
|
|
|
def ls_value_format(v):
|
|
if type(v) is bool:
|
|
return 'true' if v else 'false'
|
|
if type(v) is int:
|
|
return str(v)
|
|
if type(v) is float:
|
|
return str(v)
|
|
if type(v) is str:
|
|
return '"%s"' % v # let's hope no quote inside!
|
|
raise ValueError('Unsupported type')
|
|
|
|
|
|
def ls_format(params, plugin_name):
|
|
param_set = ', '.join(['{}={}'.format(k, ls_value_format(v))
|
|
for k, v in params.items()])
|
|
return 'a = ladspa.%s(%s, in)' % (plugin_name, param_set)
|
|
|
|
|
|
def usage():
|
|
print('%s: Convert an XML file created by calfjackhost to '
|
|
'liquidsoap-equivalent code, making use of calf-ladspa' %
|
|
sys.argv[0])
|
|
print('\nUsage:')
|
|
print(' %s FILENAME.xml [PRESET]' % sys.argv[0])
|
|
print('\nIf PRESET is omitted, the command will print a list of available '
|
|
'presets found in the specified file')
|
|
print('\nIf PRESET is given, the command will convert that preset in '
|
|
'liquidsoap ladspa code')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) <= 1:
|
|
usage()
|
|
sys.exit(2)
|
|
if sys.argv[1] in ('-h', '--help'):
|
|
usage()
|
|
sys.exit(0)
|
|
fname = sys.argv[1]
|
|
preset = sys.argv[2] if len(sys.argv) > 2 else None
|
|
dom = parse(fname)
|
|
if preset is None:
|
|
print('available presets:')
|
|
for preset in dom.getElementsByTagName('preset'):
|
|
print('-', preset.attributes['name'].value)
|
|
sys.exit(0)
|
|
preset = [p for p in dom.getElementsByTagName('preset')
|
|
if p.attributes['name'].value == preset][0]
|
|
raw_params = parse_params(preset)
|
|
fx_type = preset.attributes['plugin'].value
|
|
if fx_type not in get_params:
|
|
print('plugin <%s> unsupported! output will probably be wrong' %
|
|
fx_type, file=sys.stderr)
|
|
params = raw_params
|
|
else:
|
|
params = get_params[fx_type](raw_params)
|
|
print(ls_format(params, fx_type))
|