ghostess - A GUI host for DSSI plugins
======================================
Copyright (C) 2012 by Sean Bolton and others.

This is sloppy, hurried HACKWARE -- please do not consider
this exemplary of the authors' skills or preferences, nor
of good DSSI or general programming practices. (In particular,
I don't want anyone attributing my mess to Chris or Steve ;-)

ghostess is licensed under the GNU General Public License,
version 2 or later, and comes with ABSOLUTELY NO WARRANTY,
including fitness for any particular purpose. See the
enclosed file COPYING for details.

New Stuff
=========
- ghostess works with JACK session managament, assuming
    you have a new enough version of JACK, and configure finds
    jack/session.h.

- ghostess works with JACK MIDI. To build it, use:
    - JACK version 0.105.0 or newer.
    - pkgconfig, liblo 0.18, and DSSI 0.9 or later.
    - if './configure --with-jackmidi' detects the
        jack_midi_get_event_count() function in your libjack.so,
        then ghostess will be built with JACK MIDI support, omitting
        the ALSA or CoreMIDI driver.

- ghostess can now export an XML patchlist for use by Freewheeling.

- blinkin' lights show MIDI activity for each instance.

- ghostess works on OS X.  To build it, I used:
    - pkgconfig, with PKG_CONFIG_PATH set appropriately (Gentoo OS-X)
    - liblo installed (liblo-0.18 from Gentoo OS-X)
    - JACK (JackOSX 0.61)
    - DSSI 0.9
    - libdssialsacompat 1.0.8a
    - './configure && make && make install'
    - Note that to use the CoreMIDI driver, you need to start
        ghostess _after_ any virtual sources you want to connect
        from, since my stupid CoreMIDI driver just connects to all
        existing sources when it starts up.


Quick-and-Dirty Intro
=====================
This assumes you are familiar with jack-dssi-host.  ghostess and
jack-dssi-host both descended from the same dssi_example_host
source, and in many ways are still very similar.  A summary of
the differences (as of 2005/4/11):

* ghostess is GPL, jack-dssi-host is BSD-ish.

* ghostess uses GNU autotools. Use the usual './configure && make &&
    make install' to build.

* ghostess has a simple GTK+ GUI.  Click on the 'UI' button for any
    instance to launch or hide its UI.  Right-click on the 'UI'
    button for more options.

* ghostess comes with a minimal universal DSSI GUI (installed as
    <prefix>/bin/ghostess_universal_gui) that can be used with any
    DSSI or LADSPA plugin.  It does not read RDF files or
    instantiate the plugin, so it's not as full-featured as a
    universal GUI could be, but it does allow for adjusting
    DSSI/LADSPA ports, selecting bank and program (for plugins with
    select_program()), and sending test notes (for plugins with any
    of the run_synth() functions).

    If ghostess cannot find a UI for a plugin, and the universal GUI
    is in the PATH, ghostess will launch it.

* ghostess allows specification of the MIDI channel for each plugin
    instance, allowing layering of multiple synths per channel.

* ghostess allows specification of initial configure, program, and
    port values from the command line.  See below for a description
    of the syntax.

* ghostess tracks configure items set on startup or sent by plugin
    UIs.

* ghostess, through its 'Save Configuration...' menu option, can
    save the current configuration of its plugins.  Basically, it
    just writes a Bourne shell script that can be used to start a
    (mostly) identical session.

* ghostess creates a separate MIDI reception thread, and makes it
    low-priority SCHED_FIFO if possible (ALSA-only, at the moment).

* ghostess has a (clumsy but functional) CoreMIDI driver, allowing
    its use on Mac OS X.

* ghostess double-forks its plugin UIs, putting them in separate
    process groups, and it does not SIGHUP everything on shutdown.
    jack-dssi-host keeps the UIs in its process group, and SIGHUPs
    them all as it exits (Linux-only, at the moment).

* jack-dssi-host uses dual gettimeofday()s in the MIDI and audio
    process threads to do event dejittering, which seems expensive.
    ghostess uses jack_frame_time() and jack_last_frame_time(). This
    means ghostess needs JACK 0.99.0 or newer.

* ghostess uses the LADSPA plugin Label and port Names when creating
    JACK port names, hopefully resulting in short-but-useful port
    names.

* unlike jack-dssi-host, ghostess will not automatically load a
    plugin if it is invoked without arguments via a symlink of the
    same name as the plugin.

* ghostess passes the JACK audio input buffers directly to plugins,
    eliminating a memcpy() that jack-dssi-host does.

* jack-dssi-host includes ~/.dssi in its default for DSSI_PATH,
    ghostess does not.

'Save Configuration...' File Format
===================================
Below is an example of the Bourne shell script saved by 'Save
Configuration...', which demonstrates almost all of ghostess's
options. Refer to the enclosed ghostess.1 manual page for a
description of each option.

#!/bin/sh
DSSI_PATH='/opt/audio/lib/dssi'
export DSSI_PATH
exec /tmp/dssi/bin/ghostess \
 -hostname 'ghostess_test' \
 -projdir '/home/smbolton/dssi' \
-comment 'hexter/hexter/inst00' \
 -chan 0 \
 -conf 'monophonic' 'on' \
 -conf 'GLOBAL:polyphony' '13' \
 -prog 0 0 \
 -port 1 440 \
 -port 2 0 \
 'hexter.so':'hexter' \
-comment 'fluidsynth-dssi/FluidSynth-DSSI/inst01' \
 -chan 3 \
 -conf 'load' '/t/soundfonts/Mega25.sf2' \
 -prog 0 0 \
 'fluidsynth-dssi.so':'FluidSynth-DSSI' \
-comment 'lp4pole_1671/lp4pole_fcrcia_oa/inst02' \
 -chan 1 \
 -port 0 1600 \
 -port 1 4 \
 '/usr/lib/ladspa/lp4pole_1671.so':'lp4pole_fcrcia_oa' \
-comment 'xsynth-dssi/Xsynth/inst03' \
 -chan 4 \
 -prog 0 0 \
 -port 1 0.996955 \
 -port 2 2 \
 -port 3 0.5 \
 -port 4 1.00305 \
 -port 5 2 \
 -port 6 0.5 \
 -port 7 0 \
 -port 8 0.5 \
 -port 9 0.1 \
 -port 10 0 \
 -port 11 0 \
 -port 12 0 \
 -port 13 0.0002 \
 -port 14 0.1 \
 -port 15 1 \
 -port 16 1e-04 \
 -port 17 0 \
 -port 18 0 \
 -port 19 14.5722 \
 -port 20 0.1 \
 -port 21 0.1 \
 -port 22 1 \
 -port 23 0.1 \
 -port 24 0 \
 -port 25 0 \
 -port 26 1e-06 \
 -port 27 11.4258 \
 -port 28 0.388616 \
 -port 29 1 \
 -port 30 0.984375 \
 -port 31 0.5 \
 -port 32 440 \
 'xsynth-dssi.so':'Xsynth' \

