Xsynth - a real-time software synthesizer

Copyright (C) 1999 S. J. Brookes

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License in the file COPYING for more details.


                                  Xsynth
                                  ------

Introduction
------------
Xsynth is a real-time software synthesizer for any computer running Linux,
the Open Sound System, and X windows.  The program also requires that the
computer be equipped with a sound-card, and a MIDI keyboard is required to
play the synthesizer.

The synthesizer is monophonic (highest note priority) and presently operates
in MIDI mode 2 (Omni-On Mono), ie. it receives on ALL MIDI channels.  It
would be simple to change the code such that the synth would operate in MIDI
mode 4 (Omni-Off Mono).  As well as receiving note on/off information, the
synth also receives pitch-bend and modulation input from the external MIDI
device.  The external modulation is routed to the filter cut-off frequency.

The synth architecture should be familiar to anyone that has previously used
an analogue synthesizer, and includes the following features:

2 oscillators (with independent pitch, balance control, and oscillator sync)
1 low frequency oscillator (used as a modulation source)
2 envelope generators
1 low pass filter
portamento (slides pitch from a PREVIOUSLY HELD note)

The control panel of the synthesizer appears in a window.  ALL the controls
may be operated in real-time using the mouse.

Error Messages
--------------
Some run-time errors are fatal, and if these are received then program will
shut down (or should be shut down!).  These include:

init_dsp: unable to open /dev/dsp
init_midi: unable to open /dev/midi
main: shmget error
main: shmat error
main: fork error for first child
main: fork error for second child
user_interface: cannot connect to X server
user_interface: cannot open ________ font
midi: cannot catch SIGUSR1
synth: cannot catch SIGUSR1

Other messages indicate problems that may affect the running of the program,
but are not fatal.  These include:

main: memory lock has failed
main: problem setting process scheduling
user_interface: unable to get background colour
user_interface: unable to get foreground colour

Further messages are used to indicate errors with the external MIDI device:

error: midi receive problem
error: current status byte is not set

The last error may generally be recovered from by moving a different
controller, eg. if pressing keys on the MIDI keyboard yields

error: current status byte is not set

then moving the pitch bend or modulation control should allow the program
to recover.
