13
0
livetrax/gtk2_ardour/wscript
Paul Davis b0e4f81eb3 merge exportvis branch into cairocanvas, to reduce the number of "floating" branches.
Still need to add API export/visibility macros for the canvas library.
2013-12-27 14:29:06 -05:00

720 lines
23 KiB
Python

#!/usr/bin/env python
from waflib.extras import autowaf as autowaf
from waflib import Options, TaskGen
import waflib.Logs as Logs, waflib.Utils as Utils
import os
import sys
import re
import time
from waflib.Task import Task
I18N_PACKAGE = 'gtk2_ardour3'
# Mandatory variables
top = '.'
out = 'build'
path_prefix = 'gtk2_ardour/'
gtk2_ardour_sources = [
'about.cc',
'actions.cc',
'add_route_dialog.cc',
'ambiguous_file_dialog.cc',
'analysis_window.cc',
'ardour_button.cc',
'ardour_dialog.cc',
'ardour_ui.cc',
'ardour_ui2.cc',
'ardour_ui_dependents.cc',
'ardour_ui_dialogs.cc',
'ardour_ui_ed.cc',
'ardour_ui_mixer.cc',
'ardour_ui_options.cc',
'ardour_window.cc',
'audio_clock.cc',
'audio_region_editor.cc',
'audio_region_view.cc',
'audio_streamview.cc',
'audio_time_axis.cc',
'automation_controller.cc',
'automation_line.cc',
'automation_region_view.cc',
'automation_streamview.cc',
'automation_time_axis.cc',
'axis_view.cc',
'big_clock_window.cc',
'bundle_manager.cc',
'button_joiner.cc',
'clock_group.cc',
'configinfo.cc',
'control_point.cc',
'control_point_dialog.cc',
'curvetest.cc',
'debug.cc',
'edit_note_dialog.cc',
'editing.cc',
'editor.cc',
'editor_actions.cc',
'editor_audio_import.cc',
'editor_audiotrack.cc',
'editor_canvas.cc',
'editor_canvas_events.cc',
'editor_component.cc',
'editor_cursors.cc',
'editor_drag.cc',
'editor_route_groups.cc',
'editor_export_audio.cc',
'editor_group_tabs.cc',
'editor_keys.cc',
'editor_locations.cc',
'editor_markers.cc',
'editor_mixer.cc',
'editor_mouse.cc',
'editor_ops.cc',
'editor_regions.cc',
'editor_routes.cc',
'editor_rulers.cc',
'editor_selection.cc',
'editor_snapshots.cc',
'editor_summary.cc',
'editor_tempodisplay.cc',
'editor_timefx.cc',
'engine_dialog.cc',
'enums.cc',
'export_channel_selector.cc',
'export_dialog.cc',
'export_file_notebook.cc',
'export_filename_selector.cc',
'export_format_dialog.cc',
'export_format_selector.cc',
'export_preset_selector.cc',
'export_timespan_selector.cc',
'fft.cc',
'fft_graph.cc',
'fft_result.cc',
'sfdb_freesound_mootcher.cc',
'gain_meter.cc',
'generic_pluginui.cc',
'ghostregion.cc',
'global_port_matrix.cc',
'group_tabs.cc',
'gtk-custom-hruler.c',
'gtk-custom-ruler.c',
'gtk_pianokeyboard.c',
'gui_object.cc',
'insert_time_dialog.cc',
'interthread_progress_window.cc',
'io_selector.cc',
'hit.cc',
'keyboard.cc',
'keyeditor.cc',
'latency_gui.cc',
'led.cc',
'level_meter.cc',
'location_ui.cc',
'main.cc',
'main_clock.cc',
'marker.cc',
'midi_automation_line.cc',
'midi_channel_dialog.cc',
'midi_channel_selector.cc',
'midi_cut_buffer.cc',
'midi_export_dialog.cc',
'midi_list_editor.cc',
'midi_port_dialog.cc',
'midi_region_view.cc',
'midi_scroomer.cc',
'midi_selection.cc',
'midi_streamview.cc',
'midi_time_axis.cc',
'midi_tracer.cc',
'midi_velocity_dialog.cc',
'missing_file_dialog.cc',
'missing_plugin_dialog.cc',
'mixer_actor.cc',
'mixer_group_tabs.cc',
'mixer_strip.cc',
'mixer_ui.cc',
'meterbridge.cc',
'meter_strip.cc',
'meter_patterns.cc',
'monitor_section.cc',
'mono_panner.cc',
'mono_panner_editor.cc',
'mouse_cursors.cc',
'nag.cc',
'new_plugin_preset_dialog.cc',
'normalize_dialog.cc',
'note.cc',
'note_base.cc',
'note_player.cc',
'nsm.cc',
'nsmclient.cc',
'option_editor.cc',
'opts.cc',
'panner2d.cc',
'panner_editor.cc',
'panner_interface.cc',
'panner_ui.cc',
'patch_change.cc',
'piano_roll_header.cc',
'pingback.cc',
'playlist_selector.cc',
'plugin_eq_gui.cc',
'plugin_selector.cc',
'plugin_ui.cc',
'port_group.cc',
'port_insert_ui.cc',
'port_matrix.cc',
'port_matrix_body.cc',
'port_matrix_column_labels.cc',
'port_matrix_component.cc',
'port_matrix_grid.cc',
'port_matrix_labels.cc',
'port_matrix_row_labels.cc',
'processor_box.cc',
'patch_change_dialog.cc',
'progress_reporter.cc',
'prompter.cc',
'public_editor.cc',
'quantize_dialog.cc',
'rc_option_editor.cc',
'region_editor.cc',
'region_gain_line.cc',
'region_layering_order_editor.cc',
'region_selection.cc',
'region_view.cc',
'return_ui.cc',
'rhythm_ferret.cc',
'route_group_dialog.cc',
'route_group_menu.cc',
'route_params_ui.cc',
'route_processor_selection.cc',
'route_time_axis.cc',
'route_ui.cc',
'search_path_option.cc',
'selection.cc',
'send_ui.cc',
'session_dialog.cc',
'session_import_dialog.cc',
'session_metadata_dialog.cc',
'session_option_editor.cc',
'sfdb_ui.cc',
'shuttle_control.cc',
'splash.cc',
'speaker_dialog.cc',
'startup.cc',
'step_editor.cc',
'step_entry.cc',
'stereo_panner.cc',
'stereo_panner_editor.cc',
'streamview.cc',
'strip_silence_dialog.cc',
'sys_ex.cc',
'tape_region_view.cc',
'tempo_dialog.cc',
'tempo_lines.cc',
'theme_manager.cc',
'time_axis_view.cc',
'time_axis_view_item.cc',
'time_fx_dialog.cc',
'time_info_box.cc',
'time_selection.cc',
'track_selection.cc',
'track_view_list.cc',
'transpose_dialog.cc',
'ui_config.cc',
'utils.cc',
'verbose_cursor.cc',
'version.cc',
'visibility_group.cc',
'volume_controller.cc',
'window_manager.cc',
# video-timeline related sources:
'video_image_frame.cc',
'add_video_dialog.cc',
'editor_videotimeline.cc',
'video_timeline.cc',
'system_exec.cc',
'video_monitor.cc',
'transcode_ffmpeg.cc',
'transcode_video_dialog.cc',
'video_server_dialog.cc',
'utils_videotl.cc',
'export_video_dialog.cc',
'export_video_infobox.cc'
]
def options(opt):
autowaf.set_options(opt)
def configure(conf):
conf.load('misc')
conf.load('compiler_cxx')
# we don't use hard-coded micro versions with ardour, so hard code it to zero
autowaf.build_version_files(
path_prefix + 'version.h',
path_prefix + 'version.cc',
'gtk2_ardour', conf.env['MAJOR'], conf.env['MINOR'], 0,
'', '')
autowaf.configure(conf)
if re.search ("linux", sys.platform) != None:
autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA')
# TODO: Insert a sanity check for on OS X to ensure CoreAudio is present
autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW3F',
mandatory=True)
autowaf.check_pkg(conf, 'flac', uselib_store='FLAC',
atleast_version='1.2.1')
autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD',
atleast_version='2.10.1')
autowaf.check_pkg(conf, 'gtk+-2.0', uselib_store='GTK',
atleast_version='2.18')
autowaf.check_pkg(conf, 'gtkmm-2.4', uselib_store='GTKMM',
atleast_version='2.18')
autowaf.check_pkg(conf, 'ogg', uselib_store='OGG', atleast_version='1.1.2')
autowaf.check_pkg(conf, 'x11', uselib_store='X11', atleast_version='1.1', mandatory=False)
autowaf.check_pkg(conf, 'fontconfig', uselib_store='FONTCONFIG')
conf.write_config_header('gtk2ardour-config.h', remove=False)
# Boost headers
autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp')
autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp')
# Add a waf `feature' to allow compilation of things using winegcc
from waflib.TaskGen import feature
@feature("wine")
def set_winegcc(self):
self.env.LINK_CXX = self.env.LINK_CC = 'wineg++'
self.env.CC = 'winegcc'
def _doPyp(infileName, deps = False):
outStr = ''
out = []
re_spaces = re.compile("\s+")
if infileName == '-':
fd = sys.stdin
else:
fd = open(infileName)
inLines = fd.readlines()
if fd != sys.stdin:
fd.close()
for line in inLines:
bits = re_spaces.split(line)
if bits[0] == '##include':
incName = bits[1]
if (deps):
out += [ incName ]
else:
# assume included file comes from same place as source file
incName = os.path.join (os.path.dirname (infileName), incName);
outStr += _doPyp(incName)
else:
if not deps:
outStr += line
# done
if deps:
return out
else:
return outStr
def include_processor(task):
infileName = task.inputs[0].srcpath()
outfileName = os.path.join(out, task.outputs[0].bldpath())
fdOut = open (outfileName, "w")
fdOut.write (_doPyp(infileName))
fdOut.close ()
def build_color_scheme(path, prefix):
f = open (path, 'r')
color_scheme = ''
for line in f:
if re.search ('^#@color', line):
line.strip() # remove newline
words = line.split()
if len(color_scheme):
color_scheme += ';'
color_scheme += prefix
color_scheme += '_'
color_scheme += words[1]
color_scheme += ':'
color_scheme += words[2]
f.close()
return color_scheme
def build(bld):
VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
if bld.is_defined('WINDOWS_VST_SUPPORT'):
# If we require VST support we build a stub main() and the FST library
# here using winegcc, and link it to the GTK front-end library
obj = bld (features = 'cxx c cxxprogram wine')
obj.source = (
'../libs/fst/fst.c',
'../libs/fst/fstinfofile.c',
'../libs/fst/vsti.c',
'../libs/fst/vstwin.c',
'../vst/winmain.c',
)
#
# XXX do we really need to explicitly link to all of these for the wine executable?
#
obj.use = [ 'libpbd',
'libmidipp',
'libardour',
'libardour_cp',
'libtimecode',
'libmidipp',
'libgtk2_ardour',
'libgtkmm2ext',
'libcanvas'
]
obj.target = 'ardour-' + bld.env['VERSION'] + '-vst.exe.so'
obj.includes = [ '../libs/fst', '.' ]
obj.linkflags = ['-mwindows', '-Wl,--export-dynamic']
obj.defines = ['_POSIX_SOURCE', 'USE_WS_PREFIX']
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
# end of the wine executable
# now the shared library containing the GTK GUI for ardour
obj = bld (features = 'cxx c cxxshlib')
obj.source = gtk2_ardour_sources
obj.includes = [ '../libs/fst', '.' ]
obj.name = 'libgtk2_ardour'
obj.target = 'gtk2_ardour'
else:
# just the normal executable version of the GTK GUI
obj = bld (features = 'cxx c cxxprogram')
obj.source = gtk2_ardour_sources
obj.target = 'ardour-' + bld.env['VERSION']
obj.includes = ['.']
# at this point, "obj" refers to either the normal native executable
# OR the shared library built for use with wine on linux.
obj.use = [ 'libpbd',
'libardour',
'libardour_cp',
'libtimecode',
'libmidipp',
'libgtkmm2ext',
'libcanvas',
]
obj.defines = [
'PACKAGE="' + I18N_PACKAGE + '"',
'VERSIONSTRING="' + bld.env['VERSION'] + '"',
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"'
]
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL'
obj.uselib += ' GTKMM CANVAS FFTW3F'
obj.uselib += ' AUDIOUNITS OSX GTKOSX LO '
if bld.is_defined('USE_EXTERNAL_LIBS'):
obj.uselib += ' TAGLIB'
else:
obj.use += ('libtaglib')
if sys.platform == 'darwin':
obj.uselib += ' AUDIOUNITS OSX GTKOSX'
obj.use += ' libappleutility'
obj.includes += ['../libs']
if bld.is_defined('HAVE_SUIL'):
obj.source += [ 'lv2_plugin_ui.cc' ]
obj.use += [ 'SUIL' ]
if bld.is_defined('NEED_INTL'):
obj.linkflags = ' -lintl'
if bld.is_defined('WINDOWS_VST_SUPPORT'):
obj.source += [ 'windows_vst_plugin_ui.cc' ]
obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
obj.use += [ 'X11' ]
if bld.is_defined('LXVST_SUPPORT'):
obj.source += [ 'linux_vst_gui_support.cc', 'lxvst_plugin_ui.cc' ]
obj.defines += [ 'LXVST_SUPPORT' ]
obj.use += [ 'X11' ]
if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT'):
obj.source += [ 'vst_plugin_ui.cc' ]
if bld.is_defined('PHONE_HOME'):
obj.defines += [ 'PHONE_HOME' ]
if bld.is_defined('HAVE_COREAUDIO'):
TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc']
obj.source += [ 'cocoacarbon.mm' ]
obj.use += ' libappleutility '
if bld.is_defined('AUDIOUNIT_SUPPORT'):
obj.source += [ 'au_pluginui.mm' ]
# Wrappers
wrapper_subst_dict = {
'INSTALL_PREFIX' : bld.env['PREFIX'],
'LIBDIR' : os.path.normpath(bld.env['LIBDIR']),
'DATADIR' : os.path.normpath(bld.env['DATADIR']),
'SYSCONFDIR' : os.path.normpath(bld.env['SYSCONFDIR']),
'LIBS' : 'build/libs',
'VERSION' : bld.env['VERSION'],
'EXECUTABLE' : 'build/gtk2_ardour/ardour-' + bld.env['VERSION']
}
def set_subst_dict(obj, dict):
for i in dict:
setattr(obj, i, dict[i])
obj = bld(features = 'subst', rule= 'chmod 0755 ${TGT}')
obj.source = 'ardev_common.sh.in'
obj.target = 'ardev_common_waf.sh'
obj.chmod = Utils.O755
obj.dict = wrapper_subst_dict
set_subst_dict(obj, wrapper_subst_dict)
obj = bld(features = 'subst')
obj.source = 'ardour.sh.in'
obj.target = 'ardour3'
obj.chmod = Utils.O755
obj.dict = wrapper_subst_dict
obj.install_path = bld.env['BINDIR']
set_subst_dict(obj, wrapper_subst_dict)
if bld.is_defined('WINDOWS_VST_SUPPORT'):
obj = bld(features = 'subst')
obj.source = '../vst/ardourvst.in'
obj.target = 'ardourvst3'
obj.chmod = Utils.O755
obj.dict = wrapper_subst_dict
obj.install_path = bld.env['BINDIR']
set_subst_dict(obj, wrapper_subst_dict)
# Font configuration
dark_rc_subst_dict = {}
light_rc_subst_dict = {}
font_sizes = {}
base_font = ""
# Set up font sizes
if bld.is_defined('GTKOSX'): # OS X fonts
basefont = ""
font_sizes = {
'SMALLER' : '9',
'SMALL' : '10',
'NORMAL' : '11',
'BIG' : '13',
'BIGGER' : '17',
'LARGE' : '18',
'LARGER' : '28',
'HUGER' : '36',
'MASSIVE' : '60',
}
# There is no acceptable monospace font available on older versions of OS X
# and no API on those versions to load TTF files that will work with
# GTK/fontconfig/pango.
#
# In addition, the ArdourMono font gets clipped for some reason on OS X
#
# Moreover, Lucida Grande just seems to work even though it is not monospace
# so just use it.
#
font_names = {
'MONOSPACE' : 'Lucida Grande',
}
else: # Linux/X11 fonts
basefont = '' # unspecified - use system defaults
font_sizes = {
'SMALLER' : '8',
'SMALL' : '9',
'NORMAL' : '10',
'BIG' : '14',
'BIGGER' : '17',
'LARGE' : '18',
'LARGER' : '24',
'HUGER' : '34',
'MASSIVE' : '60',
}
font_names = {
'MONOSPACE' : 'ArdourMono',
}
# Set up font substitution dictionary
# @FONT_XXXX@
for style in ['', 'BOLD', 'ITALIC']:
for sizename,points in iter(font_sizes.items()):
if (len (style)):
key = "_".join (['FONT',style,sizename])
fontstyle = " ".join ([basefont,style.lower(),points])
else:
key = "_".join (['FONT',sizename])
fontstyle = " ".join ([basefont,points])
dark_rc_subst_dict[key] = fontstyle
light_rc_subst_dict[key] = fontstyle
# @FONT_SIZE_XXXX@
for sizename,points in iter(font_sizes.items()):
key = "_".join (['FONT_SIZE',sizename])
dark_rc_subst_dict[key] = points
light_rc_subst_dict[key] = points
# various font names, eg @BOLD_MONOSPACE@
for font_sym,text in iter(font_names.items()):
key = font_sym
dark_rc_subst_dict[key] = text
light_rc_subst_dict[key] = text
# RC files
dark_rc_subst_dict['COLOR_SCHEME'] = build_color_scheme(
'gtk2_ardour/ardour3_ui_dark.rc.in', 'ARDOUR_DARK')
dark_rc_subst_dict['COLPREFIX'] = 'ARDOUR_DARK'
light_rc_subst_dict['COLOR_SCHEME'] = build_color_scheme(
'gtk2_ardour/ardour3_ui_light.rc.in', 'ARDOUR_LIGHT')
light_rc_subst_dict['COLPREFIX'] = 'ARDOUR_LIGHT'
obj = bld(features = 'subst')
obj.source = [ 'ardour3_ui_dark.rc.in' ]
obj.target = 'ardour3_ui_dark.rc.pre'
obj.install_path = None
set_subst_dict(obj, dark_rc_subst_dict)
obj = bld(features = 'subst')
obj.source = [ 'ardour3_ui_light.rc.in' ]
obj.target = 'ardour3_ui_light.rc.pre'
obj.install_path = None
set_subst_dict(obj, light_rc_subst_dict)
obj = bld(features = 'subst')
obj.source = [ 'ardour3_styles.rc.in' ]
obj.target = 'ardour3_dark_styles.rc'
obj.install_path = None
set_subst_dict(obj, dark_rc_subst_dict)
obj = bld(features = 'subst')
obj.source = [ 'ardour3_styles.rc.in' ]
obj.target = 'ardour3_light_styles.rc'
obj.install_path = None
set_subst_dict(obj, light_rc_subst_dict)
obj = bld(features = 'subst')
obj.source = [ 'ardour3_fonts.rc.in' ]
obj.target = 'ardour3_dark_fonts.rc'
obj.install_path = None
set_subst_dict(obj, dark_rc_subst_dict)
obj = bld(features = 'subst')
obj.source = [ 'ardour3_fonts.rc.in' ]
obj.target = 'ardour3_light_fonts.rc'
obj.install_path = None
set_subst_dict(obj, light_rc_subst_dict)
obj = bld(rule = 'cp ${SRC} ${TGT}')
obj.source = [ 'ardour3_widget_list.rc' ]
obj.target = 'ardour3_widgets.rc'
obj.install_path = None
obj = bld (rule = include_processor)
obj.source = [ 'ardour3_ui_dark.rc.pre' ]
# find and add all ##include dependencies as sources
obj.source += _doPyp (bld.path.find_resource ('ardour3_ui_dark.rc.in').srcpath(), True)
obj.target = 'ardour3_ui_dark.rc'
obj.install_path = '${SYSCONFDIR}/ardour3'
obj = bld (rule = include_processor)
obj.source = [ 'ardour3_ui_light.rc.pre' ]
# find and add all ##include dependencies as sources
obj.source += _doPyp (bld.path.find_resource ('ardour3_ui_light.rc.in').srcpath(), True)
obj.target = 'ardour3_ui_light.rc'
obj.install_path = '${SYSCONFDIR}/ardour3'
# Menus
menus_argv = []
if bld.is_defined('GTKOSX'):
menus_argv = [ '-E', '-P', '-DGTKOSX' ]
else:
menus_argv = [ '-E', '-P' ]
obj = bld(features = 'command-output')
obj.command = 'cpp'
obj.command_is_external = True
obj.no_inputs = True
obj.argv = menus_argv
obj.stdin = 'ardour.menus.in'
obj.stdout = 'ardour.menus'
obj.dep_vars = ['GTKOSX']
bld.install_files(os.path.join(bld.env['SYSCONFDIR'], 'ardour3'),
'ardour.menus')
# Keybindings
# 'SAE-de-keypad', 'SAE-de-nokeypad', 'SAE-us-keypad',
# 'SAE-us-nokeypad', 'ergonomic-us'
for b in [ 'mnemonic-us' ] :
obj = bld(
target = b + '.bindings',
source = b + '.bindings.in',
rule = '../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap <${SRC} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
)
obj.install_path = os.path.join(bld.env['SYSCONFDIR'], 'ardour3')
# not modified at present
bld.install_files(os.path.join(bld.env['SYSCONFDIR'], 'ardour3'),
'step_editing.bindings')
bld.install_files(os.path.join(bld.env['SYSCONFDIR'], 'ardour3'),
'mixer.bindings')
# Icons/Images
bld.install_files('${DATADIR}/ardour3/icons', bld.path.ant_glob('icons/*.png'))
bld.install_files('${DATADIR}/ardour3/pixmaps', bld.path.ant_glob('pixmaps/*.xpm'))
bld.install_files('${DATADIR}/ardour3', 'splash.png')
bld.install_files('${DATADIR}/ardour3', 'ArdourMono.ttf')
# Default UI configuration
bld.install_files('${SYSCONFDIR}/ardour3', 'ardour3_ui_default.conf')
# Default export stuff
bld.install_files('${SYSCONFDIR}/ardour3/export', bld.path.ant_glob('export/*.format'))
# i18n
if bld.is_defined('ENABLE_NLS'):
mo_files = bld.path.ant_glob('po/*.mo')
for mo in mo_files:
lang = os.path.basename(mo.srcpath()).replace('.mo', '')
bld.install_as(os.path.join(bld.env['PREFIX'], 'share', 'locale',
lang, 'LC_MESSAGES', I18N_PACKAGE + '.mo'),
mo)
def i18n(bld):
autowaf.build_i18n(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
'Paul Davis')
def i18n_pot(bld):
autowaf.build_i18n_pot(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
'Paul Davis')
def i18n_po(bld):
autowaf.build_i18n_po(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
'Paul Davis')
def i18n_mo(bld):
autowaf.build_i18n_mo(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
'Paul Davis')