add calf2ladspa

This commit is contained in:
boyska 2018-08-29 12:24:48 +02:00
parent be487f1cb4
commit 2a401bebd8
2 changed files with 126 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
calf2ladspa/*.xml
*.ogg

124
calf2ladspa/calf2ladspa.py Normal file
View file

@ -0,0 +1,124 @@
#!/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))