- big bug: feature extractor really was PLP since version 0.20, we didn't set 
  the lrasta flag in mrasta/rasta.c: init_param() (Arne Schpers), see 
  README.upto031 for details; after configuring FEATURE, files are rescanned
- bug in lscreen::init(): debug window in listen wasn't at the top left
- mrasta/Makefile: use some gcc optimizations
- mrasta/README.first: added exact reference to original ICSI archive
- using FFT code from libfxt (Jrg Arndt) didn't yield sign. speedups
- Makefile: added macros for Sun sound (Michael Ward)
- Makefile and modules/Makefile: renamed OSS_PATH --> SOUND_INCLUDE
- added getopt.{c,h} to contrib/ for those who don't have a recent GNU libc
- renamed makesysdefs.sh --> configure and moved Note: into configure rule
- changed util/configure to check _G_LIB_VERSION, new file util/test02.cc
- changed 'sleep 1s' to 'sleep 1' for portability reasons
- started doc/ears-requirements.txt
--------------------------------------------------------------------------
18-Mar-1997: Version 0.31
- bugs in UpdateConfigP: changes to config were not shown in config window
- words containing whitespace were a problem when reading the words file
  new word file format: <label>SPACE<string which may include spaces>EOL
- -x option in 'listen' to interpret word strings as system() arguments
  BE CAREFUL with 'rm -rf' and such things!!!
- open sound device only for recording --- deinit/init takes only 2ms!
- Makefile and sub-Makefiles: removed inclusion of sysdefs.sh --> configured
--------------------------------------------------------------------------
15-Mar-1997: Version 0.30
- sound: we just use deaf_mic() and full_mic() without empty_buffer() (Ragnar)
  to work around bug in OSS/Lite, removed GETBLKSIZE in sound_voxware.cc
- Makefile: touch sysdefs for those with buggy default rules
- cosmetic changes to README, and a reference to FvwmVoice
--------------------------------------------------------------------------
29-Dec-1996: Version 0.29
- bug in modules/r_dtw.cc: bad typo
- bug in utils/makesysdefs.sh: gcc regex didn't catch 2.7.2.1 (Colin)
- README.af wasn't included in the distribution
- added sun sound driver (Michael Ward), new files modules/sound_sun.*
  for more info, read README.sun
--------------------------------------------------------------------------
30-Oct-1996: Version 0.28
- bug in modules/Makefile: OSS_PATH was not included
- STL: don't use strstream in ears/messages.cc, still seems too buggy
- STL: use class string directly, with a few additions in others/mystring.*
  binary size increase (probably from inlining?): about 20k
- libg++-2.7.2 was not recognized by util/makesysdefs
--------------------------------------------------------------------------
6-Oct-1996: Version 0.27
- bug: linking order of ncurses libs was wrong (shows only with libncurses_g)
- bug: String::capitalize() and its usage was Broken As Designed
- bug: when UINcurses::infow_fill()ing, we didn't pad with spaces
- util/makesysdefs: we check for existence of libg++-2.7.1.4 function.h
- enhanced ui/win_reg.h logic, new windows take now empty slots
- fixed most -Wall warnings
--------------------------------------------------------------------------
22-Sep-1996: Version 0.26
- bug in Makefile: some gcc's seem to dislike a naked -I
- worked around a gcc bug in r_dtw.h when compiling with -O
- renamed all instances of Unix Sound System (USS) to Open ... (OSS)
- outcommented two lines in contrib/act.c (Uwe Gellhaus)
- changed documentation:  ncurses-1.9.9e is needed
---------------------------------------------------------------------------
10-Sep-1996: Version 0.25
- bug: "There are new words..." or "Do you want to save..." -> ESC -> left
  train_ears with fatal.  Changed messages::yesno() and words::try_to_load()
- bug: on first startup "Do you want to use the digits..." didn't accept RET
- bug: crash if InfoCfg::helpmap_ < number of config options
- bug: command line options were not handled right (overloaded config::set())
- bug: throw() now checks status of Sound before shutting down
- bug: && instead of & when checking mixer channels in sound_voxware.cc
- added support for Unix Sound System (USS) driver: modules/sound_uss.cc
- we check commandline options -B and -S for legality in pr_config.cc
- removed config option SAMPLING_DEV, is now handled by SoundInterface
- basename can now be given without -b on command line
- C++: removed goto usage in TrainEarsProtocol by using a destructor
- OOP: moved save_sample() from RecordingAllWordsP to SoundInterface
- OOP: moved ears/sample.* into modules/, removed references to throw()
- OOP: put deb_info() into recognizer, removed ears/info_debug.*
- OOP: put cfg::update() in a protocol, new files ears/pr_update_config.{cc,h}
- OOP: made Checkable abstract
- OOP: class words no longer references config and messages
- OOP: broke dependency of ui/ on ears/ (ui_ncurses.cc needed exception.h)
- optimized -D switch usage, ears/* shouldn't need any defines
- renamed recog-->RecognizerImplementation, word_pattern-->pattern
          pattern-->PatternImplementation
- ui/win_reg.h: a third window is always placed middle bottom
- updated README and doc/implementation.txt
----------------------------------------------------------------------------
19-Jul-1996: Version 0.24
- bugs: removed lib_getch ncurses hackery, sigh.
- bug: C++ style comment in texts.c
- bug: typo in AF part of sample.cc
- separated Curses/Nocurses binaries and added a switch for compiling
- we check for the right libraries to be there:  ConfigProtocol::check_libs()
- default SOUND_BITS set to 8, because 16-bit isn't robust enough
- if sound couldn't be init'ed we start nevertheless but check if Instance()
  is called.  Sound is now derived from Checkable
- OOP: major rewrite of source for the sake of user interface independency,
  we can now make UI=raw and no ncurses functions are linked in,
  porting to other GUIs should be very easy now
  porting to other sound drivers should be very easy now
  Major code structure changes: top directory with several subdirectories. 
- updated INDEX.eng
----------------------------------------------------------------------------
10-May-1996: Version 0.23
- bug: 8-bit endpoint detection was broken, 16-bit not fine-tuned
- bug: yes/no config change wasn't possible (mystring snafu)
- bug: changing rate,bits,device with F2 didn't reset isndstream
- bug: recording_window::gauge() could draw outside of the border
- bug: we didn't check for mixer existence in full_mic(), deaf_mic()
- bug: word file pointer wasn't always deleted
- added explanation strings in the "Change Config" list box,
  new files: cfg_help.{cc,h}
- implemented debug window in listen, new files debug_win.{cc,h}
- implemented 16-bit WAV writing
- we use a tempfile in cfg_file::write() to minimize loss probability
- C++: implemented my own fake exceptions, unwind was too buggy.  therefore,
  classes screen and isndstream must be singletons, which they are now
  New file:  exceptions.cc, removed unwind.*
- C++: removed many exit() calls, used throw instead
- C++: use 'explicit' in ctors to avoid implicit conversions
- STL: use push_back() instead of back_insert_iterator
- STL: replaced qsort() in r_dtw.cc with STL sort()
- STL: more const correctness / warning suppression by using const_iterator
- OOP: rewrote samples.cc so that we can use ostream << sample_format::xxx <<...
- OOP: config and messages are now singletons, makes things clearer
- OOP: words is an object with max. 1 instance, but not really a singleton
- OOP: encapsulated config::pattern_path_ and train_ in accessor functions
- OOP: screen now has-the recording_window, handles total shutdown of app terminak
- OOP: we have put cfg_w_ in tscreen, where it belongs
- improved doc/implementation.txt
----------------------------------------------------------------------------
28-Apr-1996: Version 0.22
- Linux config.sh still had -g and -ldmalloc
- Makefile: words.cc and mystring.cc can't be compiled with -O3
            config.sh is now run by sh not ./ (Avner Lottem)
            added $(INCLUDEDIRS)   (AL)
- bug: C++ style comment in mymath.h    (AL)
- gcc-elf: when mystring.h isn't #included at the top then problems in sinst.h
- work around gcc-elf different behaviour:  introduced String::not_eq()...
- bug: unwind.cc still had #include "String.h" and screen.cc had "string.h"
- bug: the raw samples dir is .ears/raw not .earsraw
- included dummy nc_* functions in lib_getch.c for older ncurses versions (AL)
- bug: couldn't ESC out of recording_window when no speech
- recording_window was not unwindable
- keyboard input in recording_window wasn't raw
- nodelay() didn't always work.  timeout() seems to.
- encapsulated calls to usleep() in Time(int) constructor.  Beware!
----------------------------------------------------------------------------
05-Apr-1996: Version 0.21
- we no longer need to link with libg++.a by using libstdc++ 'string' and 
  emulating some other funcs from libg++.a . Removed string_less.{cc,h},
  new files: mystring.{cc.h}, mygetopt.h, myrandom.h
- bugfix:  we didn't always create a dir for raw samples
- bug: templates.cc had a debug #include
- cursor is now always hidden, except in NCinputbox
- introduced canonic singletons: classes recording_window
----------------------------------------------------------------------------
06-Mar-1996: Version 0.20
- included sources for libmrasta, we build from there with mymath.h
  included inline-math-1.9, so we don't need to link libm anymore (i386)
- included patches to compile on systems with AF_tools (Niels Thorwirth)
  Not tested!  New files: README.af, config.sh, doc/INDEX.ger
- ported the dialog package to ncurses/c++, wrote some help screens
  new files: curses{w,p,d}.{cc,h}, {,t,l}screen.{cc,h}
  new option -c to turn off curses user interface
- implemented key control for recording/listening (^C,PAUSE,STOP)
  to get real key control and shut down gracefully, we emulate exceptions 
  new files: rec_win.{cc,h}, unwind.{cc,h}, exception.{cc,h}. 
  The classes sound,screen,NCursesDialog are unwindable.
- made speechstream::e_limit_ adaptive.  We now simply wait 200 ms
  then record some samples to have noise level to compare against.
- fixed the bug that no dtors are called when hitting Control-C in 'listen'
  by installing a SIGINT handler and throwing an exception
- libstdc++ bug workaround: reimplemented class words as list<Word*>
- some patches to work around a gcc-2.7.2 bug
- ncurses' notimeout() doesn't work as described in the man page, so we
  use a patched lib_getch.c from ncurses to get immediate response to ESC
- we check for the words file now also in the current dir
- config.cc: after chdir/mkdir, go back to the current directory
- word_pattern::copyctor now also copies empty patterns
- templates are now handled with -fno-implicit-templates.  This reduces
  object file size heavily, esp. with -g.  New source file: templates.cc
  Removed <algo.h> and <function.h> from files.  Further reductions.
- isolated classes sample, sndblock, speechstream 
  new source files: sample.{cc,h} sndblock.{cc,h}, speechstream.{cc,h}
- placed #ifdefs into r_* files to be able to compile stripped down versions
- changed default sound_bits to 16
- forgot to include contrib/ in binary distribution
- updated INDEX.ger, wrote INDEX.eng
- README: included pointer to new mailing list
----------------------------------------------------------------------------
21-Aug-1995: Version 0.15
- speedup in NDTW::do_dtw() by comparing with the best value so far
  therefore, even less local distances need to be computed
  no comparison at all whenever unknown>2*reference and vice versa
- implemented FEATURE=MRASTA, not only is this default now, but
  we also don't use any other feature extractors from the OGI library,
  exchanged libnspeech.a with libmrasta.a in source distribution
  Rasta model is now always 7 (no need for it being a parameter)
- made a contrib directory with the act program (chaney@dans.com)
  and a perl script for launching programs (runge@redhook.llnl.gov) 
- included inline-math-1.3 for i386s as new file mymath.h
- yet another bugfix in cfg_file.h
- we now catch errors when DTW pattern files are bogus
- some changes to isndstream::ctor() to make it usable with plain files
- listen: wrote usage text, implemented -n and -t options
- alphabet.words was missing 'delta d' and noone noticed... 8-)
- README: included pointer to mailinglist, to contrib/
- README: included pointer to GPL
============ Many design changes:
- we use revision control (RCS)
- ears now doesn't compile with gcc older than 2.7.0, because we
  - implemented all containers via the Standard Template Library (STL)
  - adhere to the new for-scope standard (ANSI C++)
- we now use the new bool type (ANSI C++, gcc 2.6.x)
- no more global instances of config, messages, the_words
  renamed class 'the_words' to 'words'
- implemented WordSLList as SLList<Word>, intSLList as SLList<int>
- implemented exception handling, BUT #defined it out again due to
  bugs in gcc-2.7.0.  You can get real exception code with -DEXCEPTIONS.
- eliminated need to have a friend class <recog> inside patterns
  also, using word_pattern::base() wasn't really correct
- word_pattern::ctor now uses recognizer::pat_type()
- design bug: config should have-a, not be-a-kind-of-a map
- wrote some other copy ctors
- tribute to const correctness in most class interfaces
- split recording class, new source files: rec_aw.{cc,h}
- isolated class feature, new source files: feature.{cc,h}
- split recognizer.cc/h and isolated riff_wave.h
  new source files: r_dtw.{cc,h}, r_bp.{cc,h}, r_elman.{cc,h}
- began coding of a C++ Rasta feature extractor, not ready yet
  new source files: dsp_fvec.{cc,h}, dsp_fft.cc, fmat.h, fvec.h
---------------------------------------------------------------------
16-Apr-95: Version 0.14
- implemented RECOGNIZER = NDTW: improved implementation/heuristics over DTW 
  (speedup factor nearly 2).  This is the default now.
- renamed .C to .cc and made filenames consistent
- changed net filenames to <basename>.<recognizer> so one can have
  multiple different rec's with the same name for comparison.
- what do we do if the net file does not match the recognizer?
  we now save the recognizer type with the .net file and check for it.
- ditched all times() calls in favor of gettimeofday(), wrote timer.h
- DTW::eval(): included code for timing the recognition
- started coding of an ELMAN recognizer.  Doesn't train yet, sorry.
- fixed nframe<trace feature by introducing pattern::bad()
- allowed graceful exit by introducing recognizer::bad()
- added copy ctor to class Word.  Ho hum.
- some changes to make the code compile with gcc-2.6.3
- somehow README and COPYING weren't distributed...
- somewhat expanded doc/implementation.txt
- made first binary distribution (Linux)
--------------------------------------------------------------------
08-Jan-95: Version 0.13
- implemented RECOGNIZER = BP (vanilla backpropagation)
- implemented RECOGNIZER = BPMT (backprop with momentum term)
- implemented util/showpat, a quick'n'dirty svga viewer for pattern files
- don't ask if no recognizer::training_needed()
- patterns are now put in <EARS_PATH>/<FEATURE>-{V,F,B}
  (implemented recognizer::pat_type() and config::pattern_path for this)
- implemented -d flag, mainly for recognition to output more info
- listen didn't complain when no .net file exists
- fixed bug with filling the pattern table in training.C
- random number generators now use times() for seeding
- changed misleading message M_Default_Words
- wrote comments in sound, pattern, recognizer, listen.
--------------------------------------------------------------------
18-Dec-94: Version 0.12
- implemented and tested new feature extractors: LPC, PLP, MEL.
  these seem inferior to RASTA, so that stays the default.
  LPC code in the OGI library seems to be buggy, too.
- tried to set a minimum distance for DTW so that noise results in '?'
  (implemented a recognizer::eval() return value of -1)
- yikes!  alphabet.words was not included in 0.11.  Changed Makefile.
- changed Makefile, so old versions of tar are supported
- improved doc/implementation.txt
--------------------------------------------------------------------
13-Dec-94: Version 0.11 released
