Sophie

Sophie

distrib > Fedora > 13 > i386 > by-pkgid > eec33fafa3a997e97371997459df13ea > files > 1208

bristol-0.40.7-7.fc13.i686.rpm


    0.40.7 22 Nov 2009 Maintenance release

Fixed some compilation flags that could still cause the build to fail if Jack
drivers were not included in an installation. This is a backport from 0.50 for
compatibility purposes.

The sid.c code had as issue with debuging being executed without suitable
checks on the handle. Could cause a crash which has now been fixed.

The XPM reader had a couple of issues with parameter naming collisions and its
file naming for temporary files used for decompression could also fail if more
than a single GUI intialised at the same time.

Had to implement some extra local memory sanity checks before calling the
emulator operate() code. Depending on timing these may still be null as the
emulator initialises.

The bristol BassMaker would give incorrect panel rendering when panel selections
were made on a resized window. This could have affected other emulators as well.

The BassMaker would jump the first step of a sequence.

The BassMaker did not correctly clear the LED status of the stop position.

There was a hole in the voice management code that would prevent a voice from
ever being freed up if it had a null baudio. This could happen if a voice is
still active as an emulator is terminated.

Cleaned up a compilation flag that could still cause compilation to fail if
Jack was not included in the system or build process.

A failure in limits checking lead to a potential memory corruption issue in the
continuous controller code and NRP handling.

Removed an issue with the libbristolmidi ALSA SEQ interface handling for the
channel identifier, it was not correctly being merged across resulting in all
channels converging onto zero.

A couple of the emulators were exhibiting fairly random segmentation faults, 
indicative of memory corruption. Ran up valgrind to clear up a few memory leaks
of small amounts of memory on things like audio device restarts and also to 
track down the corruption. It was partly the controller ID damages given above
however the baudio structure was getting freed before its ultimate use which
could intermittently lead to further damage. There are still some minor memory
leaks however these are related mostly to ALSA library interfacing where
structure ownership is not really that clear. This can be reviewed later as
the loss is still small and does not affect functionality yet. In total there
were about 15 changes, not all of them would have caused segmentation fauls as
they were not all write operations, some were read. These would have caused
intermittent noise (ticks) and potentially wild modulation, especially of the
DX FM operators.

The B11 library stops key repeat on window entry and reenables on LeaveNotify,
this is use to make sure the QWERTY keyboard tracking functions as expected. 
With some window managers (reported against fvwm) the window Destroy function
only sends a wmDelete request and no LeaveNotify as the window exits which 
would result in loss of key repeat. The command 'xset r on' fixes that however
submitted a fix to turn repeat back on under these circumstances too, and added
in some X11 event debuging at -debug 9 or higher.

    0.40.6 28 Sep 2009 Maintenance release

Resolved a name resolution issue that would cause the split/layer keyboard
emulators to fail. The dual manual ones should have worked. The workaround was
to default the hostname when null but the actual fix is to request the same
destination host in all cases, something that will now only go into 0.50.

Included some memory packs for the trilogy and polysix emulators.

    0.40.5 23 Jul 2009 Distributed processing maintenance release

Added an option to startBristol, -gui, which will prevent the GUI from being
started and invoke the engine with all the resolved bristol variables. This
will allow for easier distribution of the applications with GUI and engine on
different hosts, this was always a part of the design but was never really made
that accessible. This can be used in conjunction with the -server flag which
will leave the engine active even when the last emulator has disconnected.
Running as a server lead to a few issues that were anticipated - constantly
reconnecting GUIs would exhaust various engine tables that were not being
cleaned up correctly as this had never been widely used. The file descriptor
table was not being cleaned up, the handle and device tables similarly. There
was an issue with SID selection of the EXIT requests not being correctly matched
causing the wrong emulators to be disconnected, and with failure to correctly
close input file descriptors on active sense failure requiring a small change
to the device reading logic. It was finally possible to run a test script to
reconnect several hundred times without failure, all emulators still audible
and so moved to released code.

Several issues arose whilst building the application without ALSA drivers. This
is supported, especially now that Jack MIDI is integrated, however since ALSA
turned 1.0 the coding has been a bit lax, assuming that ALSA was available and
integrated. The result was that building without ALSA might fail and that even
when compiled there were issues with device open() requests. Resolved these and
added the flags required to accept note events over the control link so that
GUI keyboard events are still tracked even if the ALSA code is not integrated.

Was requested to remove all OSS dependencies from the build process as well.
This was a little more work than ALSA since that was always intended to be a
build option, OSS by contrast was always anticipated to be present. Had to 
clean up some of the socket toolkit header files and some erroneous definitions
in the midi library that was being flagged by some more meticulous compilers.

Reworked the TCP addressing code to accept -host <hostname:port> where hostname
can naturally be a IP address or (non)canonical hostname. The port option can
be used with the -engine flag to connect the GUI to a specific host where the 
engine is running, remotely: it is an alternative to the -port flag however
it is still advised to actually use -port for other reasons.

There was some general code cleanup from the request to have bristol function
on a system that had neither OSS nor ALSA installed. This was never anticipated 
and making it possible brought other issues to light.

The Trilogy had a very unequal mixing section, the organ gain was too quiet 
and the synth section too loud. These were evened out.

The Trilogy also had some rather unusual use of volume controls. To reduce
CPU load the synth would not run the organ and string sections unless they had
a non-zero gain. This achieved its affect however the result was that if the
gain was zero at note_on then the voice would be muted (it actually just fell
through the note logic and turned itself off). The fix was to always run the
oscillator divider circuit envelopes under all circumstances to engage the note
logic. The audio generation code is still skipped as it would be silent anyway
when the gain is set to zero.

    0.40.4 06 Jun 2009 Audio Driver Mainenance Release

Added an autodetect for Jack where a small program will connect to the daemon
and find out the sampling rate and period size. These are then given to bristol
as parameters preventing unexpected mismatches later.

Fixed a watermark issue with the ALSA drivers, the high available threshold was
too low which causes the library to report false overruns. Since these come
back as a failed write operation the bristol audio library was restarting the
audio devices. The diagnostics reported this as a broken pipe.

Resolved a typo in the ALSA drivers that damaged the periodsize and buffersize
matching. Caused cyclic ticks in the output stream depending on hardware and
ALSA driver versions.

Changed the activesense period to 3s and timeout to 15s. There are issues when
running with RT scheduling where the GUI may get starved when there is a lot
of audio activity causing the engine to give a false positive of a GUI failure.
Since active sense is really there to make sure everything exits gracefully 
when there really is a failure then the timers need to be more flexible to 
cater for situations of high CPU load. [0.40.5: as a side note, this only 
really affected a system if it had cpu-speed ondemand, or was massively over-
loaded, neither of which are optimal for audio processing.]

    0.40.3 25 May 2009 Maintenance release, B3 stuck notes.

The Bristol B3 was exhibiting stuck notes, fairly arbitrarily however the
issue was not reproducable on the development system. After a ludicrous number
of debug builds to get different statistics the cause turned out to be the B3
postOpts which manipulated the voice flags and the resolution was to extend
the semaphore coverage to include emulator postopts. Theoretically it would 
be possible to have just changed the B3 code however the engine that hosts 
the emulator should not be open to flag abuse in the voices and the voices
are allowed to manipulate these flags. The actual cause was a race condition
that only really exhibited itself on multicore/HT systems.
Thanks to Andrew Coughlan and Damon Chaplin for the report and debuging
output to isolate this issue. As the problem was not reproducible on the 
development system (single core) then tracking down the cause required a
number of different debug revisions and a great deal of patience and output
logging from the people involved.

Releases 0.40.1 and 0.40.2 will be removed from the download site.

The bristol shutdown procedures were not really compliant with the Jack API
definitions, they would not deactivate/unregister the active handles before
exiting. This does not work very well with multiapp environments, it causes
a subgraph timeout in the API. Changed the shutdodwn code sequences so that
the last exit operation will clean up the emulators in the audio thread and
let the MIDI thread then unregister jack and exit so that all parties are
happy. Also added some diagnostic output in the event that ports cannnot be
registered - this happens if Jack has a lot of application ports to deal 
with so the additional message makes sense. Also coded in jack_client_open()
to replace the now deprecated jack_client_new() previously being used.

The Sidney emulator was about 1/2 a semitone out. After a lot of delving into
the correctness of the code without much success (ie, it seemed correct) it 
turned out the C64 had different versions for NTSC and PAL, with different
CPU clock speeds. The frequency tables were built from data taken from what had
to be a confused manual since they did not match up for the clock speeds. When
the due correction was applied (0.985 to 1.02 and finally 1.023MHz) it was
finally pitched correctly.

The trigger events for the SID MOD Env were not really correct. Any accepted
note_on event would cause them to trigger however in light of the way voice
separation happens it really required that the Env was only triggered if it 
would have a affect on the given voice. There were a few cases, voice goes
via the filter and env modulates the filter or if the Env modules the voice
that is being activated. Added the logic. Voice-2 arpeggiating never triggers
the envelope, only its own envelope.

Increased the minimum Sidney arpeggiation step, it was a ludicrous 0.3 ms, it
is now a more reasonable 16ms. Maximum stays the same at roughly 250ms.

The Sidney emulator had an issue with some memories and its keymode settings,
the indexes were not converged correctly resulting in the radio buttons not
working normally (double selected radio buttons).

The OB-Xa 4-pole filter was incorrectly mixing its feedback loop, silencing
the output signal. The 2-pole worked correctly.

The MIDI library was altered such that all messages now carry a sequence
number, it's only u32 but its only use is debugging events and with the typical
event rates this will last far longer than any session. Also finally fixed the
event timestamps which were previously just null.

The midi and audio threads had different scheduling algorithms, one was FIFO
the other RR. Since the two threads used semaphores for a critical code
section for note events then there existed the possibility that the midi thread
could cause large delays to the audio thread by taking the semaphore and then
getting pre-empted. The fix was pragmatic, both thread have been made FIFO
with different priorities. A full fix would also have been to adjust the
thread priorities in the critical code however the current fix works except
when there are multiple RT programs running and that should only be the case
if they are all audio threads.

    0.40.2 05 May 2009 Maintenance release, usability improvements.

This is primarily maintenance for the last couple of releases including fixes
to the SID emulator and some ARP improvements.

The SID synth has more key assignment modes, both arpeggiating, visible in the
GUI as Arpeg 1 and Arpeg 2. They will split the keyboard at MIDI note number 52
then assign two voices to one half and one voice to the other. Arpeg-1 has its
function on the upper half, leaving the lower half as a duophonic synth
allowing an arpeggiated chord as rythm for a bass sequence. Arpeg-2 will do the
opposite, it will arpeggiate on the lower half allowing for arpeggiated rythm
with a duophonic lead solo. These were seen as an improvement over the previous
but the results need to be reported back.

Bristol will now check the system for the availability of the TCP control port,
defaulting to 5028. The application behaviour has always been that an engine is
attempted every time the application starts and correctly speaking if a user
wants to work multitimbral then the second request should be given the -engine
option. Without this flag it still worked but was sloppy, the second engine
would fail to get its control port and so would exit, the second GUI would
still connect to the first engine and start a second emulator. The current
behaviour is that each time the application is started it will look for the port
availability and if it is already taken then an upwards scan is done from the
port number looking for a free socket. The port can be specified explicitly
with the -port option if fixed ports are required however this is not a real
requirement if the -audiodev is used with Jack, for example, to specify the
registration identifier for the new engine. If no engine is requested the GUI
will just attempt to connect to the specified port although arguably it should
check to see if the port is open - this is kind of done implicitly when the GUI
attempts to connect to the port.

Extended the BRISTOL_AUTOCONN by adding the following environment variables,
BRISTOL_AUTO_LEFT, BRISTOL_AUTO_RIGHT and BRISTOL_AUTO_IN. If these are set
they will be searched in the relevant ports list and then connected up. This
only happens in conjunction with AUTOCONN. On my systems this was tested by
setting them to system:playback_1, system:playback_2 and system:capture_1
resprectively, and by leaving them unset. Will see how much use they are,
since they are environement variables then to be useful they would have to
be scripted.

Submitted code to repaint transparency layer devices when windows sizes are 
changed. This affects shadow layers and transparencies (such as the ARP 2600
patch cables). Prior to this the objects painted on to this layer were lost
which was confusing with the ARP at least. The effort to do this was considered
preferential to the alternative which was to fix the window size once defined,
not allow resizing and just have the -scale option at startup.

There were some compilation issues due to the SID test program not having the
correct dependencies. Removed sidtest from the distribution, it is no longer
required, it was only used to exercise the bristol softSID chip until it was
integrated into an emulator, now done.

Known issues are that the Pro-10 would fail on some systems. This is a very
specific issue as some systems have been reported not to suffer from the
issue. A workaround is in place however a longer term resolution will have to
be sought and a bug is open against the issue.

    0.40.1 25 Apr 2009 Commodore C64 SID emulator

This release introduces an emulator for the Commodore C64 6581 SID audio chip.
The implementation has a digital access method to program the chip registers
and an 'analogue' access method to extract the audio signal. The oscillators
and envelopes are implmented with integer functions as the original was partly
digital, and then the filters are in floating point to emulate the analogue
components. Specifics of the chip will be in the README file presently.

Two of these chips were then used for a bespoke synth, the -sid. This is not
based on any original design but exercises the SID emulator. One of the two
chips gives the audio output, the second gives signals for modulation: one
LFO, one Env and one noise source which can be as an input to a S&H circuit.
This design uses a few different voice allocation routines, monophonic, three
voice polyphonic plus some combination algorithms to give access to the high
frequency arpeggiation used often in the C64 where a single voice would do a
fast scan of several frequencies to give chords and widen out the sounds. Each
of the three voices can be programmed independently.

Added an environnment variable, BRISTOL_AUTOCONN, which when set will direct
the jack library to autoconnect its ports to the first IO found. This will not
be much use for general users however it will make testing easier.

Fixed an issue where the emulations would fail unless started on midi
channel 1. The issue was caused by the Globals settings using a system
connection id rather than the negotiated midi channel for setting up
diverse defaults tables.

    0.30.9 02 Apr 2009 Bristol BassMaker, massive filter optimisations.

Coded a 16 step, 4 page sequencer along the lines of the SQ-10 to generate
bass lines, hence the pun. The overall feature set it pretty sparse since this
is not intended to be a general purpose sequencer. Each step has a note,
transpose, volume for the MIDI note and a Control option to send fine tune, 
mod or another MIDI note on a second channel, plus the triggers can be skipped
to join notes. The control features have not been widely tested and may need 
some fixes. Also the fine tune and glide when applied to the Control setting
are a little dependent on the emulator, something that can be altered if the
is a demand. A full description is in the README file.

Colin Fletcher optimised the houvilainen filter code, first factoring out kfc
to reduce the number of multiplications being executed, then continueing with
completely factoring out v2, and since it was generally used as a divider
function this was a considerable CPU overhead. This delivered a massive 
improvement in the CPU utilisation, not only of the filter but the emulator
generally due to the filter being so CPU intensive. The factoring out of v2
was ingenious since it was not immediately evident from the code that this
would have been possible.
Testing this also corrected some anomalies in the OBXa filter selection code.

About 5 superfluous variables were stripped out of the filter code to reduce
parameter popping and actually improve readability providing minor improvements
in the filter efficiency.

Applied noise injection code generally to prevent filter denormals with low
to zero input signal. This is quite efficient noise generation code so should
not have a big affect on the optimisations and prevent 100% from denormals.

Another optimisation was applied to the filter for higher sample rates which
removes the internal oversampling. At the higher rates this delivers around 40%
reduced load and should not result in any loss in quality since it only applies
when playing at 88kHz or greater where the filter response is still good to
over 20kHz without resampling. Not all the emulators will actually use this
code modification since it is only in B_FILTER2 which is sparsely deployed at
the moment, something that will change as the different modifications are
qualified. The result of all these optimisations is that this filter code
should be about as fast at 96kHz as the previous one was at 48kHz, and as the
filter code currently uses the vast majority of the emulator cycles then it is
probably possible to run any of them now at the higher sample rates with 
little affect on net load.

Applied some reduced EQ to the Hammond B3 Bright signal levels. This kept the
same rough profile however the overall signal level was far in excess of the 
existing normal gearbox. This was required due to some big reductions in the
crosstalk levels of the normal gearbox leaving bright as too loud. The changes
to the crosstalk was required since the net amount was superfluous and
although it brings some nice overdriven sounds it was excessive for both of
the configurations to have that amount.

Bristol no longer implements any Jack port auto-connect per default. After a
trail of submits to LAU there were very good arguments as to why having
default connections always being applied is a dangerous feature. The auto-
connect remains but has to be requested with '-autoconn' although admittedly
this does make it a fairly superfluous feature.

The VOX Continental M2/Super/300 was silent. The global parameters page had
zero set for all parameters that needed corrections to the memory loading code
to force the save settings into the active set.

The Polysix emulation would clip excessively with the modgroup was routed
fully to the VCA. The signal gain from the LFO would result in an overdriven
output. Reduced all the respective output stage signal levels, which are still
quite strong anyway, and also some of the tremelo depth when mod routed. This
will have a minor effect on some patches.

Incorporated Andrew Coughlan's manual page for the Polysix emulator.

    0.30.8 20 Mar 2009 Maintenance release, ARP 2600 fixes.

When using Jack as the MIDI interface it was possible that the engine would 
attempt to link audio to midi channels and vice versa. The requests fail and do
not break anything but the default connections don't work so its not quite as
plug-n-play. Added code to check for the port name and also to parse the whole
list of outputs for the first two that will link up, similarly all the inputs
later.

Resolved a strange issue with the ARP 2600 with respect to discrepencies 
between the GUI indeces and the engine indices. The problem did not show up
on all systems and the root cause was being masked by a programming error in 
the engine using an incorrect scaling for parameters passed to it. The problem
was not evident on all systems probably due to differences in type casting -
the parameter is delivered as a float however the index is taken from that 
cast into an int with a range considerably wider than '1.0'. The fix also 
required changes for removing cables.

The ARP 2600 filter and amplifier outputs had a signal level far stronger than
most of the other components, this came from reworking the general filter
input/output levels to ensure it was being driven correctly. Added in a bit of
normalisation code to even the levels up.

The ARP 2600 filter would also suffer denormals if all the inputs were move to
zero. Almost to be expected due to the DSP involved in the filter. The initial
fix is to inject about -96dB of noise if all the inputs sum to less than that.
This has the nice side effect of making the filter self oscillating at high
resonance, that was not previously the case.

Reorganised the ARP 2600 volume options. There was a single 'Global Volume'
that just drove the output stage. This was broken in several ways. Firstly it
was in the memory which was a mistake to start with. Then it did not function
as per the original where this single control was called 'initial volume' and
was a kind of drone level for the VCA. To correct this the parameter was
separated into 3 controls: Global Volume which is not in the memory, Program
Volume that is in the memory, and Init Volume to allow the VCA to drone. It
is noted that droning in polyphonic mode is messy however not having it with
mono mode did affect capabilities.

The BME filter tracking keyboard selector did not function to expectation, the
tracking was either off, or honoured along with the mod group which was wrong
as these are exclusive options.

The X11 library will now only handle single configure events at a time. These
are typically window resizing that come by the boatload due to mouse motion
and if they are all handled at once we tend to get active sense failure and
the engine (then the GUI) exiting.

Reduced the B3 drawbar crosstalk values for both gearboxes. The previous
values worked but the signal to noise (crossbar leakage) was excessive. The
bright gearbox settings are still quite rich in harmonics giving a reasonably 
overdriven signal but the normal gearbox is now not so noisy.

Distributed Andrew Coughlan Polysix patch 23 and added his sample to the
website.

    0.30.7 02 Mar 2009 Baumann BME-700

Build a BME-700 emulator. This is a rather rare synthesizer and is probably 
the best example of where an emulator makes sense, it would be pretty much 
impossible to get ones hands on one of these. The emulator is in its first 
build and the oscillator may well need some improvements. Future work will
also improve response with higher samples rates by removing the internal
oversampling code. To test this emulator try the options
    startBristol -bme700 -mono -hnp -retrig
This will give a monphonic emulation with high note precedence and envelope
retriggers for any note change.

Added a velocity flag to the monophonic key logic such that velocity may then
optionally only be taken from the first note in a legato sequence rather than
from every note in the sequence. Option is called -lvel.

Monophonic triggers were a little broken, the current fixed code will either
always send a retrigger when the voice moves to a different note with the
-retrig flag or will only send a trigger for the first of a legato sequence.

The Korg MonoPoly emulator would crash. The new synchronisation code did not
check for a null sync buffer and some of the emulators would pass a null
buffer if sync was not configured. Related to this was reassignment of the
-mono switch to be 'monophonic', equivalent to '-voices 1' rather than as an
acronym for -monopoly. The switch was reassigned to make the monophonic note
logic more sensible.

Prophet bank select was broken, code was adding incorrect offset into the
selection algorithm.

    0.30.6 22 Feb 2009 Monophonic note precedence key logic.

The note assignement logic now correctly implements/emulates a monophonic 
keyboard with low note precedence (-lnp), high note precedence (-hnp) and last
note precedence. Previously there had only been code for last note - it was
the polyphonic algorithm with just one voice however this gives a completely
different playing style. The option only works when the voicecount is set as
a single voice. Additionally there is a -retrig option to trigger in both 
directions when playing legato style. The code is interesting since it was
firstly a little awkward to do and also since the final solution was to have
the monophonic synth start playing its single voice and then just keep the 
voice rolling forever. It stacks up the CPU constantly but gives some useful
features with the ARP 2600 and Moog Sonic-6 (and others) for droning or just
tweaking them without playing and is arguably a closer emulation of a real
mono synth. The voice, once assigned to a mono synth, should not be preempted
by other emulations, ie, it becomes dedicated.
A present release may make hnp and retrig the defaults for mono synths, and
similarly invoke a single voicecount if precedence is requested. For not you
will probably want to use -hnp/-lnp and -retrig to get useful results.
This release might include some monophonic note logic debugging output, it
will probably stay there until 0.30.7/8 depending on testing or bug reports.

Finalised the frequency/step tables and moved on to implementing glide for the
non-resampling oscillators. The oscillator already supported this but the
frequency tables were needed to correctly fill the buffers. Poly-800 parameter
#67 now controls glide for that emulator, previously not operable.

Reworked all the filter code keeping only the Chamberlain and Houvilainen. Then
reworked the Houvilainen for 2pole/4pole (non-resampling versions later). Put
in an Oberheim modification that remixes the different pole outputs back into
the main signal path. The mix is configurable however the GUI has no control
that drives it: a default value is taken. The filter is a bit richer for the
mix. This mod was at least considered by Oberheim for the Matrix-12 but then 
never implemented as the discrete circuits with quality components was a bit
cost prohibitive. Here is is relatively simple work and since the filter is
already computationally expensive this operation does not add much to the CPU
requirements. Different codes sections use different mixing loops. The main
one puts the tapped signals into the output stage only, others will mix it 
back into the filter feedback loop which give yet another quality however it
also suppresses resonance due to the resulting phase complexities.
[As a note, the application still implements 3 other filter types, the rather
weak rooneys and a butterworth. The ARP also has its own lag filter for
voltage processing.]

The Arpeggiator/Sequencer code would leave voices hanging after the operation
terminated. This was kind of known, start/stop just set the emulator flags to
allow the code to be called. The resolution was to actively deschedule all
voices associated with the arpeg/seq function.

The LFO changes to 0.30.4 to increase the maximum speed did adversely affect a
number of memories and, rather than back them out, this version introduces
parameterisation to set the upper and lower limits of the LFO with defaults
that were as per 0.30.3 and below. The new emulators that want to use LFO up
to ranges that verge on FM functionality will request wider ranges. The
default values should go from 0.1Hz to 20Hz in line with the previous releases.

Build options was damaging the LD_LIBRARY_PATH where jack libs were included
before the newly built library path. The result was that rebuilding the code
would probably find the installed libraries rather than the new ones.

The Hammond was loading excessive memories on switching the opts panels in and
out, added some flags to prevent this.

    0.30.5 01 Feb 2009 Maintenance release?

Worked on a slew of new (short) recordings for the website, fattening out a
few of the exising memories. This lead to some issues with sound quality in
some emulators. These would have been fixed earlier if I actually used bristol
however most of the work is in development rather than operation. Most of the
sounds were configured in a matter of minutes, more work would have improved
the depth but they give an idea of each of the emulations that were recorded.
These short recordings highlighted a few anomalies in the code, and along with
some other issues that have been gathering over a few releases the rest of
this release is a set of fixes.

There were apparant envelope clicks on the axxe emulation, primarily on note
off events. This was due to a direct 'gain' level being mixed in with the 
ADSR. Corrected it with a grooming envelope on the key however the ARP lag
processor would also have done this trick quite well.
Applied the same change into the Odyssey as it uses a similar gain section on
the amplifier. The 2600 is not affected by this since it uses patching to get
around the amplifier rather than fixed signal gains.

PWM on the Arp DCO was failing, affecting all the Arp emulations. The cause
turned out to be a mixup with the min and max limits for the pulse width, 
something that was introduced when the corrected sync code was introduced in
release 0.30.3.

Fixed a key mapping issue where the '\' character mapped to key id zero rather
than two semitones above the ']' key where it should really have been mapped.
The changes are in the text profiles so could have been done locally in the
event of complaints. Apart from that the mappings only cover a US QWERTY 
keyboard anyway.

Some of the keyboard graphics were damaged during the redesign for the
Poly-800 giving incorrect redraws for the 3 octave emulations.

The Poly800 GUI had a typo that stuffed a non-zero termination signal level
into its DCO-2 envelope causing clicking if Double was selected. A separate
issue occured with the filter envelope that was not retriggering correctly,
resolution was to configure this one envelope for re-zero and will have to 
see if it needs to be done for all of them.

The duplicated raw audio output code does silence suppression however this was
only intended to be for leading silence. It was implemented as a cheap way to
get sample for the website but it was doing permanant silence suppression which
damages the audio in most cases.

Added a -mbi option and structure entry to the GUI for memory supersets that
came as a side effect of reworking just some minor details of the polysix
options (the -load worked however the GUI did not reflect the true memory).
This was rolled into general use however some emulations already use local
methods to manage this. This will only conflict if the global method is
requested and it also affects Chord and Sequence memory as that does not
access this parameter (yet). This is a single digit parameter adding that
number of K to all memory access. Memory #1 with '-mbi 2' accesses memory 
#2001 on disk. The option is additionally set from the -load setting, if a
memory above 999 is requested then mbi is stuffed with the most significant
part and the memory index is the remainder.

Revised the LFO to have a range from 0.1 to 100Hz for a pending BME emulation.
The rate control is a power function so it should not affect any existing
memories excessively.

Broken in this release and until further notice is the -glwf option, it causes
note vocalisation errors. The -lwf option should be used with each emulator to
activate the lightweight filters individually rather than globally.

    0.30.4 20 Jan 2009 Korg Poly-800

Built a Korg Poly 800 which was more work than anticipated. The GUI needed to 
have a 'membrane' support for the parameters which generally takes quite a lot
of effort, perhaps less since the bit-1 already had much of the code. Another
envelope was built as it is a 6 stage design however that is reusable for the
pending Yamaha CS-80 that has been under construction for a while. The Poly800
emulates all the dual/single oscillator with an envelope each, plus the single
filter design was integrated into the emulator PostOps() routine as well as
the Poly code so that there can be a single high key tracking filter as per
the original design or you can have one per voice as a bristol mod. The full
set of mods and general construction are described in the README file, the
only remark here is that the single filter code is a bit jumpy when the notes
change by large amounts, something that could be improved.

Added modifications to the bitone oscillator such that it integrates a separate
sync output. This is at the base frequency with a resampled squarewave only,
allowing this complex oscillator to still drive sync into other oscillators.
Tested with the Crumar and Jupiter emulators.

The same modifications were rolled into the explorer DCO since it also
generates some combined waveforms that could distort the sync algorithms.

Reworked the bitone oscillator to generate what I am for now calling waveform
tendencies. The output signal will tend towards a target value under a kind
of discharge circuit at a controlled rate. The result is a non-resampling
oscillator, more or less, the wave is generated based on algorithms rather 
than wavetable resampling. The results are at least harmonically unique within
bristol, at the moment only integrated into the Poly-800 emulator. They sound
reasonable when heavily filtered, a little raspy otherwise. The nice thing
is that they are still quite efficient (will change as the waveform heuristics
develop), costing only a few percent for the generation of 8 oscillators each
with 8 strands of tendencies, all slightly detuned from each other to give a
quite rich result. The oscillators can generate square, ramp, saw, tri and sine
with support for PW/PWM of the square, sync in/out on ramp/saw/square/tri.
The triwave sync is correct softsync, the rest are hardsync with waveform
inversion as required. The efficiency lends itself to oversampling which in
turn could make the Houvilainen oversampling filter more efficient and give
a net improvement in the sound at very little cost however that is FFS and
will not be done until after the P800 is released.

Integrated a new noise generator which has better performance and also a cleaner
overall signal. The previous code has some excessive LF components.

The Preacher gearbox was a sixth out of tune, 8 semitones. Pretty strange it
was not reported and I admit I had not noticed it. The default gearbox seems
to take the wheel indeces from an incorrect starting point. This also brought
to light another issue with the same code. Since the user profiles were
enforced recently then the tonewheel mapping file had to be in ~/.bristol and
was not shadowed back to /usr/local/share. This would have caused some issues
with the tones rather than the frequencies.

Built another set of keyboard layouts, this time for the Poly-800 but may get
rolled into other emulators later.

Check Button devices would still dispatch an event if the mouse is released
outside the bounds on the device. This should not be the case so checks were 
added for limits before callbacks are made.

There was a small window when killing the app during initialisation could leave
the engine waiting for the audio thread forever. It should all exit so added
some timeouts to the status polling routines in the midi thread.

Key bindings were not being read for library testing. Not an operational issue
however it needed a fix for testing purposes at least.

The pitchwheel and its associated Registered Parameter were not working in
unison, had to reorganise their internal variables and the frequency calc
code when changes are made.

Reworked a few more shade layers and put the new key designs into a couple of
the other emulators.

Configure will now prompt the user to install libasound2-dev as well as
libx11-dev if either are misssing.

    0.30.3 19 Dec 2008 Crumar Tilogy, PWM and Sync fixes, Polysix improvements

Added the String section to the Stratus emulator to produce the bigger brother
of the pair, the Trilogy. As with the Organ section of the original, the string
section is not a major feature and was nothing to write home about. The code
adds some extra harmonics to fatten out the sound plus some panning and 
spacialisation to enhance the section. The features can be disabled to give
a more authentic emulation of the original.

Changed the graphics on the Stratus synth waveform selector, it was not a true
mix but a three way switch. The graphic is emulated however the control is
still continuous here.

The default memory for the stratus had a bit too much key tracking configured
and it shut off the filter completely for the lower octaves.

Fixed some minor issues with the Stratus options panel.

Took excess debugging out of Trilogy/Stratus code.

Touched up the shadow layer for both these emulations.

The Polysix mg controller side affected the oscillator frequency. The wheelmod
should just affect the overall depth of the routed LFO, it was doing separate
mod for vibrato which was undesirable. Also changed the default switch for the 
polysix from -poly to -polysix and -poly6. For now it will respond to both.
This was an unfortunate choice originally and will presently be dropped to
just the newer options.
Similarly changed the Korg Mono/Poly switch to be -monopoly from -mono, also 
an unfortunate historical choice.

The polysix waveform selection was actually wrong regarding Square and Pulse
wave - square is a fixed wave that only uses a PW control to select its width,
the pulse wave uses the same setting but adds PWM via another LFO, these were
out of sync. Thanks to Andrew Coughlan for the insight whilst working on a Jens
Johannsons lead sound, apparantly originally done with a Polysix.

Andrew's patch also showed some issues with parameter memorisation for the 
operating modes: Poly and Mono mode could be lost on reloading a memory, now
also fixed.

Added in some diverse changes for the PWM code, historically the width has 
been an integer value in the range of the size of the wavetables and at least
for some of the oscillators this was still being managed as an integer. The
pulse width is now floating point and the resampling is independent of the
main waveform being generated. The difference is only subtle since the
original code resolved to better then 0.1% accuracy already however it did
show up a couple of bugs in the prophet DCO code regarding offsets and brought
to light the noise on oscillator sync with certain waveforms (notably square)
that really also need to be addressed but probably in the next release as it
really needs triangular (soft) sync as well as hard sync.

Fixed a long running issue with oscillator sync, namely that it worked but
very badly if the synchronised wave as a square. It was always ok with ramp
for example. The cause related to how sync was being done, it was just
resetting the resampled wave table index to zero, correctly speaking it needed
phase inversion as well, now implemented. The synchronising wave is also
resampled before it goes to the synchronised wave to remove the flutter or
shimmer associated with synchronising to whole samples, it basically
synchronises to subsamples. Phonically this is a big change and it may be 
rolled back into 0.20 since 0.30 is still relatively new.

Alterations for this fix are still needed for bit1osc, it generates complex
waves by default and they are not very good for sync signals. For now users
will have to simplify the synchronising wave, a future release will have the
oscillator generate a sync output signal at its base frequency.

    0.30.2 15 Dec 2008 Crumar Stratus

This release has an implementation of the Crumar Status 'duosynth', it used an
organ divider circuit to produce some slightly lacking organ sounds with four
harmonics of pure square waves plus a six voice poly synth. The organ circuit
has been beefed up considerably - it can produce the same square waves however
adds in alternatives (square and sine through ramp, smoothly) and some added
stereo spacialisation. The interesting synth glide circuits are emulated, this
is not typically polyphonic portamiento since this beast used organ divider 
circuits for the oscillators so independent glide on each voice was not
possible. In contrast the circuits could be over and underclocked as a note
starts then glide back to the target note, here emulated polyphonically.
All the legato features should work - the LFO in mono mode will only strike
open the LFO envelope grooming circuit once, the glide features will work in
a similar legato fashion and the oscillator output can be kind of random with
legato.

Improved the oscillator sync algorithm however certain waveforms are still
noisier than they should be. This was only in the Crumar Stratus oscillator
but the alterations can be moved over to the other synchronising oscillators
when finished.

Altered the filter keyboard tracking for the Houvilainen to try and get better
tuning. It can be made playable however that still takes quite a lot of
tweaking so a few more changes are likely over the coming releases.

Put the reverb back into the Sonic-6, will see what people make of it as it
only works well with fat sounds (B3) or at low delays.

Reworked some of the button control logic since they were not being set when
withdrawn. The logic for withdrawn should really be just 'don't draw' and this
was corrected.

Reworked some more off the graphics for better drop shadow on the keyboards.

    0.30.1 03 Dec 2008 Voyager Electric Blue, Moog Sonic 6.

Voyager Electric Blue released in conjunction with some fixes to the existing
explorer algorithm as detailed below.

Moog Sonic 6 released, the suitcase synth. There are diverse differences with
the original, implemented largely because they were denoted at the weakest 
points of this fair synth:

    Added a mod wheel that can drive GenX/Y.
	PWM is implemented on oscillator B
	Installed an ADSR rather than AR, selectable.
	No alternative scalings - use scala file support

The emulation is not duophonic. Primarily poly with separated glide. It does
have the same 'diaphonic' capabilities although they were pretty dubious in
the original. Details are in the README file. There are sadly few memories
configured in this first release, none in fact.

The Sonic-6 implementation was the first new algorithm in a while and it has
shown a few issues with gain levels regarding the filter output. This lead
to a few more alterations to the normalisation of diverse emulators but it
should fix the issue of filter resonance overdriving the outputs and causing
clipping. It should now be a gentler easy sine wave, probably still quite
strong but it should not cause clipping with most emulations.

The Explorer code needed to be reviewed for a changed filter set and filter
characteristics, the original stacked LPF was wrong. The code needs to have
either serialised HPF/LPF or parallelised (and then stereo) LPF. This was 
worked into the code and an interface put together to emulate the 'Blue Ice'
version of the synth.

Reworked the Release parameter of the Voyager/Explorer. The existing code
either configured the value or just '10' depending on the release switch. The
correct coding is to either send the value or a small part of the value based
on the switch setting, closer to the original.

OSS drivers were broken due to a failure to convert some of the device flags
correctly. The result was no subfragmentation and no subfragment buffer. Only
tested with ALSA compatibility mode.

Reworking the drop shadow step by step on the piano keyboard. Gives a better
effect.

Minor changes to the options for the different Prophet emulators.

The 0.20 stream is now maintenance only.

    0.20.10 27 Nov 2008 Maintenance release.

Altered the permissions on the memory files and pixmap files since some users
would have had problem accessing them. That would have made memories
unreadable and given some incorrectly painted images. There were no complaints
however it probably would not have been totally obvious what the problems
even were.

OSS drivers were broken due to a failure to convert some of the device flags
correctly. The result was no subfragmentation and no subfragment buffer. Only
tested with ALSA compatibility mode.

    0.20.9 14 Nov 2008 Maintenance release.

Changed the lightweight filter option to be emulation local rather than global
but kept the global option now as -glwf. This allows for mono lead synths to 
have a thick filter and the rest to have the lower cost Chamberlains.

Added an option to prevent the user interface from requesting window sizes to
the window manager by default used to ensure that the aspect ratio was some
kind of reasonable match to the original however this causes problems with 
some tiled window managers causing endless redraws. The -ar or -aspect option
will just make the library paint into whatever available space is given to the
GUI - the results may look gruesome if either the height or width is excessive.

Added code to the XPM reader to look for *.xpm.gz and then to gunzip them
first to /tmp. This reduces the installation nearly by a factor of 5 and is
minimal overhead an this is only in the startup routines. If the bitmaps are
manually decompressed then the overhead is avoided as the xpm is then found
first. It probably needs to be noted that the benefit of having the gz images
will only be seen if the previous installation is first removed. If not then
the .xpm and the .gz will remain.

Alterations to the diverse blueprints, most notably the MS-20 however since
that is not yet functional it was a bit superfluous.

The following synths still need some filter work:

        -explorer          - moog voyager. Needs more work (*)
        -cs80              - Yamaha. Needs more work (* and is unfinished)

* needs to be two separate filters, Chamberlain HP into Houvilainen LP.

Added some checks for the number of options being given to both bristol and
brighton, and if they are too few to then advise using startBristol and exiting.
The goal was to advise on what should be done if somebody just attempts to use
the binaries without the wrapping script, and since the script uses a host of
default switches it doesn't cause these messages to print.

Resolved a long running and annoying problem with closing the GUI windows -
when the close is requested from the Window Manager [x] button (typically in
the top right) the application does not exit as fast as it should. Had to set
some WM attributes and do some more checking for Client Messages. Also had to
clean up the code to terminate dual manual synths, something that became
evident once the shutdown did not require a ^C in the controlling terminal.

Improved the state logic between the threads such that if the audio thread
cannot get hold of the target audio device then all threads will exit. This
was giving problems since previously the parent thread would not exit even
though the audio thread had failed. Recovery was then a manual process. We
do not need to apply similar logic to the midi thread since if that does not
open we will never proceed to the audio thread anyway.

Known issues:
Starting two mini on the same engine will seg fault when one is closed. The
buffer pointers are cleared incorrectly. It will probably be a trivial fix: not
to free the buffers on exit. The floating buffers are little overhead and will
get reused if another emulater is started.

    0.20.8 28 Sept 2008 New filters, normalised gains, diverse fixes

Integrated the Houvilainen filters into the full set of emulators. Some still
have filter options that may use the Chamberlain however that may change by
converting the Houvilainen to a 12dB/octave option and using the Chamberlain
for lightweight filters, BP and HP:

Added an option for lightweight filters where the CPU intensive Houvilainen
are replaced by the colder but a lot less expensive Chamberlain, -lwf.

Bandwidth limited oscillators are now the default with up to 31 harmonics. The
previous geometric waveforms are still available with '-blo 0' however their 
roughness was highlighted by the reworked filters. A few emulators do not use
the global wave tables and will not inherit the BLO option but they should all
use other distorts to reduce the edginess of infinite bandwidth waveforms.

Normalised the signal levels on most emulations. This was lead by the Pro One
developments since it gave a reasonable signal and was used to baseline the 
other emulations.

Converted glide into a power function to give better control at low values.
Converted attack into a power function to give better control at low values.

Pitch wheel depth was half a semitone out of configured value. The default
of 2 was being misinterpreted.

Rhodes was damaged due to a conflict in operator selection since the code for
the arpeggiator was finalised. The Chorus controls would select ARPEG code and
that would eventually cause issues.

Noise was inadvertently mixed in the Mini algorithm, passing through the reused
filter buffer. Fixed this and other anomalies with mod routing.

Mono emulators appeared to drop new notes when played quickly. The actual cause 
was a loose coding of the note_off logic where an off event would match any
voice on the channel even though note_on had reassigned the voice a new key.
This only happened if the note_on voice was still on the newlist waiting to
be promoted onto the playlist.

Normalised gains and integrated Houvilainen filters to other emulations.

    0.20.7 29 Aug 2008 Sequential Circuits Pro-One, Scala tonal mapping tables, overhaul of the Prophet-10

Built a Sequential Circuits Pro-1 as a polyphonic emulator. There are some
differences in operation compared to the original. Details are in the README
file.

The Prophet-10 needed some work primarily on layer management. The original 
had a few features for in-memory volume/balance/tuning, a sequencer and the
memory bank functionality was organised differently. These were all worked 
into the emulation. The sequencer is a lot simpler than the original but can
function with a sequence per memory and adds the ability to arpeggiate and to
chord notes. Also reorganised the 5/10 voice management since it was a little
incorrect previously and realigned the midi channel utilisation.

Reworked the hammond drawbar device to support fully painted images and used
that to render a new ModWheel dev with a rolling tooth design for the Pro-1.
It could be improved with a local highlight rather than using the global
shadow layer, something for future study.

Reworked the rotary pot to support limited motion from -60 to +60 degrees
with stepped movement for the Pro-1 octave selector. This could be used in the
other emulations however the general use was for waveform selectors and the
problem here is realestate to show the waveforms - without the full rotary
action the diagrams will not fit the available space. Mono, Poly now also use
it for octave controls and waveform selections requiring a bit of redesign of
their blueprints. Also put into the LFO waveform selection of the Jupiter.
The work also included redrawing code the complete rotary to support irregular
designs. This was required for the tip of the ProOne pot that sticks out.

Added a parser for Scala .scl files to build a microTonalMap for the synth. It
is possible to retune the synth based on the thousands of Scala maps. The
option is '-scl <file>' where the file can be a full path name (leading '/') or
if the mapping file has been placed in the $BRISTOL/memory/profiles directory
it can be a "filename.scl" or just "filename". The settings are global at the
moment and there is no default scala map although that would be possible if
people were interested, or a default per emulation for example.

Added another two taps to the Hammond chorus organised such that there is a
unique tap sweep per VC rate. Each sweep is offset against each other and for
chorus then either 1, 2 or all 3 taps are remixed with the original signal at
a configurable mix level. Changed the scan betweeen taps to be a more gentle
sloped fade rather than a linear transition. The scan delay and LC are user
configurable parameters and the tap scan time also to alter the overall speed
of rotation. Altered the addition and subtraction of taps to fatten out and
smoothen the sound. Reduced the spread of the taps since they are only
interesting at low delays. Filled out the lower scan ranges so that they at
least always scan between taps. It no longer sounds like it has a broken cap.

Added a build option to configure: --disable-jack-midi. There were complaints of
interoperability with the older jack MIDI libraries. I do not want to support
the previous releases and this is the lowest common denominator to allow the
application to at least build with the 0.103.0 API. The complaint is 
"too few arguments to function 'jack_midi_get_event_count()'" or similar.

The audiodev name is now used for jack registrations. It is defaulted to the
program name when jack drivers are requested and then overwritten if given as
an explicit option. This allows visibility of each invocation of bristol into
jackd.

MS-20 was packing too many panels. Cleaned it up and added in the new ModWheel
however it still does not work - should move it along a little bit.

Minor bitmap manipulations for some resizing misfits using the -scale option.

Added some more output text for cases where jackd could not be started however
a review should be made of the the audio and midi thread status selections to 
make the operation smoother.

Fixed some issues with detuning (sensitivity) where if not initialised it led
to unexpected results.

Put in limits testing in bristolMidiSendMsg(), something I did not want to do
preferring a well behaved GUI however it has lead to issues during development
that would have been nicer to have avoided and its at very little cost.

The per user private memory cache should now be enforced, this should allow
people to keep their private memories over reinstalls and upgrades. Prior to
this the cache was only used if the directory structure was in place however
that is rather unwieldly for most users for the current number of emulations.


    0.20.6 13 Jun 2008 Bandwidth limited oscllators. UI Heartbeats, GUI scaling.

Added in bandwidth limited master waveform tables for the base waves: square, 
tri, ramp/saw, and a sine wave just to be complete. These were then pushed into
the diverse oscillator code for most of the emulations. The results are a lot
smoother if a sufficient number of harmonics is used, '-blo 21' or more, however
smaller values also give interesting results. The Mini is generally improved by
not having the 'infinate bandwidth' geometrically correct waveforms, the sound
is softer and warmer with relatively few harmonics. The next work on the sound
generation will need to go into the filter.

GUI now sends active sensing updates to the engine. This means the engine can
detect UI failure and exit rather than hang around and damage the next attempt
to connect (with the same MIDI channels, etc). There is one timer to control
the rate at which the GUI sends updates and another time for when the engine
will decide to stop the emulation. The GUI can detect failure of the engine
the same way - the write operation of the active sense will fail if the TCP
connection terminates at the remote side. The code could be improved, it 
should actually scan the list of synths however it is pretty trivial to extend
it later. The reason is that the heartbeats are per emulation rather than at
the top level however the generation of the heartbeats occurs in the GUI in a
separate MIDI thread and hence is at the top level.

GUI now has a -scale option to presize the window. Default remains 1.0 and at
large scaling will automatically enable aliastype 'pre'. This can be overridden
with -aliastype none. There were too many remarks about the diminutive size
of the GUI and whilst the author likes the size this option improves usability.

Started work on a Yamaha CS-80.

Backing of Realistic MG-1 was offset since the prealiasing code, needed to be
corrected (actually had a third layer still packed but not used).

Explorer glide was not working due to changes to the operator indeces in the
emulation not being mirrored in the GUI.

Change the max device ccont from 128 to 512, already under the limit with some
of the synths probably leading to a few of the crashes I have been seeing.

Applied build patches from Alexis Bailler's gentoo packaging.

With antialias and mobile devices (sliders) we need to repaint extra pixels
during move operation or the 'blur' starts to stain the image. Fixed with some
minor alterations to the Undraw code extending its range by a pixel on the X
and Y axis.

XImage creation failure now suggests using the '-pixmap' option but its almost
a case of better never than late. I could consider changing the flag and then
attempting the load again however this may already be a non-issue (was a broken
64 bit X Server issue).

Introduced a lever operator that changes its size at it moves up and down its
scale. This was for a part of the CS80 code.

Added a configurable timer into the GUI host code midi scanning period.

Horizontal scales needed redrawing fixes.

    0.20.5 20 Apr 2008 First release of the Jupiter-8 emulation, GUI prealiasing, Vasiliy Basic's Mini memory suite.

Integrated a 4+4 split/layerable Jupiter algorithm with arpeggiator, sequencer
and chording function assignable per layer. Full write up in the README file.

Changed the Jupiter design such that the VCO have selector buttons rather than
single switches for register and waveform. This is not per the original but it
allows me to make them non-exclusive and that will fatten up the sound. This
functionality is more like the JP-6 and MKS-80.

This code includes a Jack MIDI client interface. It is started with the normal
options plus '-midi jack' so that it can be used in parallel to an ALSA link
and TCP link to the GUI. The result is that the engine uses two midi threads,
one doing bulk operations for GUI settings which might be quite slow, a higher
priority thread doing Jack MIDI, and the highest priority thread doing the 
audio processing. Semaphores are implemented to prevent the threads interfering
with eachother.

Reorganised qwerty mappings for correct MIDI note selection and transpositions,
brightonController.c confdev may need to be buried in window structures.
Worked especially for a couple of keyboards that were not C-C.

Implemented a prealiasing code which uses whole pixel blending. It is only
applied to the silkscreens and gives far better imaging when the synths are 
resized towards fullscreen - they are still reasonably readable. Reducing the
window size and normal size are a bit blurred. Configured with '-aliastype pre'.

Reevaluated the arpeggiator step rates to go from 1Hz to 20Hz.

The implementation of antialiasing allow threw light on some coredumps at 
very small window sizes caused by anomalies in the drop shadow rendering
going negative due to the small sizes.

Arpeggiator did not correctly terminate the note list when more keys than
available voices were pressed. Resulted in hanging arpeggiation and holes in
the arpeggiation sequence.

Resizing windows failed on some emulations with the output signal going to 
zero: If some of the GUI settings did not match the engine before the resize
then the sound will change. We should suppress all updates when resizing since
no changes should happen to the engine.

Resolved an issue with the -emulate and its interpretation of gain levels,
they were a bit low.

Touched up the rhodes bass graphics. Minimal, but was bored.

Minor touch ups to the memorymoog, prophet, prophet52, axxe, odyssey, mini,
explorer and rhodes shading graphics. Adjusted some offsets on the B3 to
prevent some lines of transparency on resizing.

    0.20.4 26 Mar 2008 Arpeggiating OB-Xa, fixes, synchronised threads.

This is maintenance code however you may prefer to defer using it until 0.20.5
is released. There are numerous fixed integrated here however the midi note
event management has changed considerably and there may be some anomalies in the
implementation of the multiple dual linked listed that govern key assignments.
The symptoms of such anomalies are potentially quite ugly if you run bristol
with real time scheduling, the tight loops may lock your system so you may
want to run it with '-priority 0' for no realtime prioritisation. There may be
lots of thread and arpeggiator diagnostics that will also disappear in the next
release but you can also use the -quiet flag to prevent them.
Also, since the MIDI and audio thread now use exclusion then a very busy audio
thread may result in what appear to be dropped notes: The note_on gets delayed
due to system overhead but eventually generates a 'newlist' entry for the
engine to process. If the note_off arrives before the audio thread has taken
the newlist entry then it is removed before it even gets started. These actions
are visible with the current debugging. A master keyboard should not be badly 
affected by this however the GUI can end up clumping together multiple events
if the CPU load is high and that causes/exacerbates the situation.

Reworked the OBXa for some stronger sounds with a couple of routing corrections.
Overall sounds is a lot richer. This lead to changing the glide to be a log
controller rather than lin, another improvement that will affect existing
memories though. Will become a general capability. Fixed some flagging issues
with OBX modpanel and layer assignments. Adjusted the mod mix and corrected
the mod LFO rate controller. Should build some more OBXa memories as well.
Rework OBXa dual/split options for single midi channel. Reworked some of the
OBXa graphics including a shading layer ready for distribution.

Arpeggiating sequencing now records under suitable control - only emulation with
an interface is in the OBXa, Bit-100 but others may follow. The settings can be
saved in a memory to be recalled and recoded to the engine. There is serious
fun to be had now with the OBX-a emulator and sequencing/arpeggiation. Details
are in the readme file but basically start arpeggiating and then crank down
the filter envelope decay and play with the filter cutoff and mod level.

Implemented the chording code as a small extension to the 0.20.3 sequencer.
When enabled it will assign a voice to every note in the note list, transposing
them as it goes.

Worked the arpeggiator changes back into the Juno-60 code. Made the OBX-a Seq
be once per voice rather than once per synth.

The LFO rate parameter was converted to a log controller rather than a linear
one, it improves response and allows for some very slow cycles. It will affect
some memory settings. Glide also changed to logarithmic control. Arpeggiator
rate similarly.

The memory library was changed such that it honoured the active parameter 
when calling memory locations, something that may well have changed the 
characters of the other synths. Went through the code to clean up the obvious
ones but should run through them all again.

It is now possible to have the GUI search for an emulation rather than passing
the emulation exlicitly. This is with the -emulate option. The feature also
sets default voice counts, detunes, gains, etc, from the emulation such that
the options such as "-voices 10 -emulate jupiter8" and "-voices 10 -jupiter8"
are different - the first call would default the voice count to 8 from the
emulator, the second would have the emulate inherit the explicit option of 10
voices and since we have not actually requested an emulation then the remaining
options will not be taken from the application defaults.

Installed some new key bitmaps, not sure about the results as they look a little
surreal, almost chrome rather than ebony.

Corrected some tv_usec comparison failures that were damaging the double click
timers and defaulting to 1000ms only.

The bristol ASLA seq interface would misinterpret note on/velocity zero. Caused
some strange results with certain keyboards, and only with some bristol 
features (arpeggio) since it is correctly reinterpretted later in the chain.
Also, the OB-Xa midi tracking would double strike with the GUI linked up to
the master controller, the GUI was not honouring exclusion and retransmitted
midi events already seen by the engine.

Reorganise the transposition system for some emulations, they now correctly
request the transpose to the engine rather than just scale their own keyboard.
Both methods work and are arguably both correct however unless the engine is
informed of a tranposition then it will not be audibile from a master keyboard
driving the engine. This alteration needs to be reviewed as it separates the
midi key id from the qwerty keyboard id's and that is awkward for anybody who
wants to build their own mapping files. The mapping is now not qwerty key to
midi key but qwerty key to GUI button index - for most emulations this is the
key 0 to 60 on a 61 notes keyboard. Also separated the mapping table per
window rather than globally - when the GUI goes medusa this will be required.

Resolved another window timing issue with note on events at high load. This
required using a couple of semaphores and was a big change to the note event
management. It ironed out a few other unlikely situation such as running two
monophonic synths simultaneously would give unexpected results - their note
selections could get intermixed. The use of semaphores for mutual exclusion
of the midi and audio threads was very worth the effort as it will probably
be used to distribute load over different cores with multiple audio threads
presently.

Resolved a lingering seg fault in the DX operator with the bounds checking
that was added and cleaned up the L1/L2 gain levels to be lin rather than log,
the log did not work well for these controls.

Fixed a heap corruption in GUI has needed addressing for rather a long time
instead of providing a long term workaround. Resolved a couple of related
issues with detection of pure blue from negative offsets that also caused
segfaults that have been annoying me for a while. The workaround that had
been in place for several releases was pretty ugly.

Cleaned up some parts of the code that were giving in my opinion spurious
error messaging during compilation.

    0.20.3 05 Mar 2008 Integrated a new Crumar Bit-100 emulation

Finalised the bit-100, some extra options, ability to save -1 and -99 memories.

Restructured the rate algorithm for the glide, there were historical issues
with its mathematical correctness. Additionally added a bristol NRP to allow
the maximum glide time to be configurable. The default value was up to 30s 
however that often felt excessive and makes configuring short values awkward,
changed this to be 10s with the ability to request up to 30. The GUI now
responds to the -glide option per emulation and the Bit emulations have memory
parameterisation.

Added pink and filtered noise options to the BIT synths, defaults to white. The
option 'white' could be dropped and turned into Pink with progressive filter.

Added a flag required to enable NRP parameter changes in the engine. Default
is now not to pass them for interpretation since it is a rather arbitrary 
interface and has been probably responsible for noisy interaction with some
master keyboards.

Diverse fixes to the BIT emulations:
Layer volumes were damaged going into split/layer settings.
Layer transpose, split and midi channel tracking needed some corrections for
the different options. Specifically there are flags for supporting different
settings per layer (per default they remain in sync) and these were not being
honoured.
The same fixes were required to ensure that non-aligned settings would be 
correctly returned after dual loading splits and layers.
Layer parking was damaged (required writeThru cache enabled to work).
Memory loading was damages for high ordered parameters.
More issues with the high order parameters.

Restructured the arpeggiator to cetralise the code ready to put it into the
Jupiter emulator. Code inserted to allow the arpeggiator to hook into the
midi note event dispatching to prepare it for reprogramming.

Tested now with jack 0.99, 0.103 and 0.109 successfully.

Updated copyright dates to reflect 2008.

    0.20.2 25 Feb 2008 Integrated a few Crumar Bit emulations.

Edited brightonButton for highlighted buttons, required repainting the control
and could be rolled back into the brightonButton rather than being separate.
Build a Crumar Bit-99/Bit-1 and an m2, all variations on the bit-99. Added 
several bristol features via data entry parameters. The capabilities and the
differences to the original are documented on the website and in the README
files with the distribution.
Patched in a dummy audio driver such that no audio operations are executed. This
may seem rather daft for a synth however working under virtualized systems often
gives dodgy and unreliable audio interfacing so having a dummy lets me still
work on the GUI to engine interfacing rather than limiting the work to the GUI.
This is accessible with '-audio dummy'.
Fixed an issue with port redirection and multilayer synths failing.
NRP were being incorrectly interpreted which meant that emulation gains and
detunes were not being registered.
Velocity of note off events was being mapped into voice velocity as well as
note-off velocity. This is incorrect as it causes jumps in envelope gains, etc.
The correct behaviour is for device that want to use note off velocity should
search for it in the correct place. The bristol ADSR does not adjust release
rates by velocity however it could by using this explicitly.
The envelope uses a power gain curve that is precalculated for lookups on 
attack/decay rates. It was a little damaged at the zero point and could cause
'inf' failures on some of the work being done, highly inefficient. Only seen
in very rare cases and normally just during development since the code avoided
using the limits. Corrected.
Implemented OMNI mode however only the Crumar allow access to it at the moment.
Transpose has been reimplemented such that the MIDI library is correctly
handling the transpose. Previously it would lose track of some notes - press
key 36, transpose 12 notes and it would not be able to match the note off to the
original note on. The fix was resonable trivial and now the rest of the synths
should also start using this method, something that will happen later.
Velocity control has been added into the GUI so that it can be requested at
start time per emulation. I should try and document all the 500 or so different
mappings - the only references at the moment are the source code.

    0.20.1 20 Jan 2008 First release of the 0.20 stream

Designed a 7 segment red led digit display for the Jupiter panel. The original
had an 8 segment display however the floating point was superfluous and has 
been left out.
Compilation without jack or ALSA would fail dismally, the make routines would
not pull out all the ALSA definitions. There may remain some issues since the
OSS Midi interface does not seem to work, only rawmidi. If you really want OSS
support with MIDI and all then mail the author. The changes altered the list of
drivers, removing the Sun D-BRI and ALSA revisions prior to 0.9, both of which
are now antiquated anyway.
The remaining audio interfaces are:

    OSS (pretty much any release as the interface is stable)
    ALSA 0.9 or greater (SND_LIB_MAJOR=1)
    Jack 0.99 or greater

There does not seem to be any jack version information available from the 
include files at compile time unfortunately, something that may be an issue
with the currently new 0.109 release that appears to have altered the library
interface specification.

This should not be released until jackd with a 64 sample period size has been
tested (reported to fail) and we should also consider waiting until the jack
interface has been folded into the bristol audio library even though it does
not like being there. That may wait, the alterations the audio library to remove
the diverse unused interfaces and changes to the compilation flags seems to
improve stability (and may be ported back to 0.10 at some point). After that we
can start breaking things again.

Cleaned up some of the debuging.
Removed the bristol files from the brighton directory.
This release is based on 0.10.13 with the above changes.

    0.10.13 19 Jan 2008 Maintenance release.

Resolved a failure in the Vox M2 percussive harmonics, they were not decaying,
an issue with the operator selection in the GUI.
Cosmetic alterations to some of the vox switch images, prophet panels, etc.
Added some bounds checking to the jack interface to prevent a couple of errors
that occur when failing to open the interface.
XImage issues with 64bit sytems - the XCreateImage() fails due to pad and line
length errata. Workaround is to use -pixmap (avoids the XImage acceleration
code) and the fix needs testing but does not break 32 bit systems.
This will be the last development of 0.10 stream, no more features only bug
fixes. Further developments will go into the pending 0.20 stream.

    0.10.12 03 Dec 2007 Maintenance release.

RT priority is now defaulted to 75, a value of zero for the runtime parameter
does not reschedule the thread at all, it is left up to the linked libraries.
Vox Continental would segfault due to pedalboard buffer pointers.
Implemented a workaround for damaged segment sizes with some jack attachements
but this is not really a fix, it just avoids the problem by exiting a little
more gracefully when there is a mismatch. It may become the fix though, the
problem only happens when I cannot find the period size a priori.
Reworked parts of the engine code such that it checks for data availability
with select rather than going into a wait state. This is a lot cleaner as it
has a timeout for failure situations. Timer defaults to a few seconds only, 
that could be improved.
Rhodes voices were broken due to reorganisation of the ADSR default gain to be
liniar rather than logarithmic, firstly the notes barely decayed but also the
harmonic content did not vary from the FM algorithm.
Integrated a chorus into the Rhodes GUI and a wrapper in the engine FM code.

    0.10.11 27 Oct 2007 Arpeggiator written into the MIDI library.

Reworked the Juno image for more edging and new sliders.
Built some default "temperature sensitivity" into the dual manual synths, it
should improve the sound, at least when layered.
Reorganised the voice initialisation code to have better GM2 conformancy.
Double click timout made into a GUI configurable option.
Added a 7 segment LED digit block to the library for the Jupiter display.
Implemented the arpeggiator for the Juno. It was a requirments for the Jupiter
however it is easier to test with a synth that already works.
Reworked the threeway switch so that it was sequential, required some changes
to the emulations using them.

    0.10.10 01 Oct 2007 Bass pedalboard integration for Hammond and VOX.

Fixed the Vox M2 memories. Also reworked the octave frequency of its harmonics
since the reed should be an octave higher. The bass pedals are now visible but
the envelope closes early under some situations.
The frequency table for the VOX was 'too correct', rewrote the vox microtonal
map to have a table based on integer division from 1MHz to introduce a few
cents of detune as per original.
Some of the microtonal maps were incorrect, loss of key 108. Had no effect as
none of the emulations used the microtonal map however it needed to be fixed.
Put a bass pedalboard into the Hammond B3 emulation. It requires extra graphics
space which is not an issue, and for both emulations the pedalboards kind of
come for free - they use the same MIDI channel as the lower manual but call a
different oscillator depending on MIDI note. The B3 memory structures had to
change to support the lower manual drawbars. If you had your own memories
in ~/.bristol/memory/hammondB3/* then you should really delete them.
Made the audio thread priority a runtime option.
Reworked the prophet pot bitmaps for higher contrast and closer alignment.
Distributing the GM2 MIDI controller mappings as default, not all emulations
support it though - does not work well for the dual manual synths nor the
organs.

    0.10.9 16 Sept 2007 Reworked installation procedures, Vox-300

Thanks to Nicolai Lissner for some directions on the autoconf install locations.
Made some fixes to the control key interpretation however, correctly speaking,
it is still actually damaged. The 'incorrectness' is minimal so will spare any
resolution until it really is needed.
Finished work on a dual manual VOX Super Continental (M-II, 300, etc), most of
it works, the only unimplemented feature is the bass sustain envelope.
Recoloured the Memory Moog buttons.

    0.10.8 01 Sept 2007 Realistic Concertmate, recolorations, fixes

Fixed some issues with the OB routing for correcting the mix button settings.
Transparency shadow would damage on redrawing. Fixed for the hammond however
for some of the synths (pro10) this shadow is lost on resizing the window. FFS.
Minor recolouration of some of the hammond bitmaps for offwhite controls.
Recoloration of the ARP Odyssey sliders.
ARP Odyssey Ring Mod was broken due to 2600 alterations.
Was bored, so programmed a Realistic (Moog) Concertmate MG-1 as a giveaway.

    0.10.7 29 Jul 2007 migration of graphics from pixmap to ximage

Net performance improvement just for this one change is 5 to 10 times the
rendering rate. The brighton and B11 library are now again in the same
order of magnitude of CPU requirements with brighton about 1/4 of the B11 
interface. The overall improvement is best reviewed with the ARP 2600, before
all the optimisations it could take over 10 seconds to load a memory, now it
is probably closer to 1/10th of a second. There are still some issues with 
the XImage interface and this is a configurable option (--disable-ximage) 
however I am also going to turn this into a runtime option rather than just
compile time.

Now that the interface speed is optimised the antialiasing code has been 
reintroduced again as a compile and runtime option. It does have a performance
hit. The antialiasing has two parameters, the depth of bit masking and the 
type - texture or all. Antialiasing with the 'all' option affects the total
representation, using the texture option only affects the backgrounds such 
that the devices maintain clarity.

Added a monochrome '-grayscale' option, aliasaed as '-gs|-greyscale' which
does late stage color replacement to shades of gray. In itself it is not very
useful as all displays are color however the algorithms for color conversion
will be used presently in some menuing features. There are 5 values:

    1 is an average of the three color components.
    2 is half the average (dimming)
    3 is quarter the average (dimming)
    4 is the minimum component
    5 is the maximum component

Of these the first 3 will be used, in a generalised algorithm, for the grey
shaded floating menus.

    0.10.6 27 June 2007 bugfixes and GUI efficiency improvements.

Implemented a color cache to optimize the rendering algorithm. It changes the
'quality' parameter to a BBP value to which colors are rounded (thus affecting
the quality of the rendered image) and uses the subsequent red color as an 
index into a cache table. Each row is a doubly linked sorted list, first by 
green, then blue by green. Search depth is now no longer the average of half 
the number of colors but closer to half the row length (which in turn depends
on the color quality). Delivers about 10 to 50 times improvement, especially 
for the color intensive transparency layers. Cache stats are available from 
the ^P XPM dump command. The remaining inefficiencies in the brighton X11 lib
should now also be addressed. Prior to these changes the brigton interface
itself was the most intensive operation, it is now only about 10% of the CPU
required to repaint, hence there is space for another 5 to 10 fold improvement.

Corrected inefficiencies in the horizontal scaler repainting. Originally this
painted the whole width of the scaler and was resolved to just paint the area
redrawn by the movement, roughly doubling its performance.

Perfectly vertical patchcables were incorrecty rendered. The actual painting
was correct however the rendering onto the screen was too narrow.

    0.10.5 06 June 2007 added roadrunner electric piano

    0.10.4 24 May 2007 added Solina string machine

Potentials:
Some of the diverse synth memories are damaged.
ARP 2600 has damaged vertical patch cables.
Move the key mappings and controller mappings to .mcm file as they are static.
Removed clipping in new keyclick generation.

    0.10.3 18 May 2007 added the following

Modifications to configure.ac and Makefile.am to correct autotools errors.
Corrected use of --exec_prefix for configure process.

Note velocity, Poly and Channel Pressure curve mappings from file. Global.
Note integer index mapping in same configuration file. Global.
Note Microtonal tunings. Global settings - affects the whole engine.

Note velocity map - per emulation.
Note microtonal map - per emulation.

B3 key noise generated per bus with configurable delays and gain per contact.
Reverse controller motion of hammond drawbars (mappings?).

Controller mapped value curves for lin/log/exp/parabolic with inverse table.

Resolved issues with use of '-jack' flag as opposed to '-audio jack'.

More keyboard velocity curves of which one mapping per emulation.

Pitch bend damaged by microtonal mapping implementation, fixed.

    0.10.2: 10 May 2007

Changes to automake configuration files for installation prefixes.

    0.10.1: 4 May 2007

Probable first distribution of the bristol version using GNU autotools.

TBD:

User caching needs to be initialised more comprehensively.