Versions:

   1.17  add __XTRLCTRL__ runtime model 
         add RemoteCtrl module
         add USE_INTERNAL_PRESETS
         add USE_DEVICES 
         the following macros are null if ! USE_INTERNAL_PRESETS:
            define_preset(x, y)
            extern_preset(x)   
            _preset(x) 
         Preset methods declared as stubs in Synth.h #ifndef USE_INTERNAL_PRESETS
         add Synth::segueOff() ::segueOn()
         nix Synth::quiet_reset ::preset_loading
         add Synth::xtrlCmd()
         add Synth::xtrlReq()
         add Synth::nthPreset()
         add Synth::loadPresets()
         add Console::mode0()
         add Console::read()
         Console::setMode() skips newline/prompt if prompt() returns NULL
         in KeyBrd class add ' ' for KEY_UP
         nix MacroBank class
         PresetBank inherits directly from Bank
         PresetBank::onChoice() calls synth->execute()
         add MixOsc::getSpectrum()
         add RealTimeSequencer::getBeats()
         add RealTimeSequencer::getMeasures()
         Synth(p) not compiled #ifndef USE_INTERNAL_PRESETS
         __PROGNAME__ is defined if __XTRLCTRL__
         add ENABLE_BUT1_DTAP_FROM_CONSOLE switch
         Synth(/) generates a BUT1_DTAP event when ENABLE_BUT1_DTAP_FROM_CONSOLE
   1.16  Embedded User Interface Frames
         re-implementation of ADSR class uses 16-bit fixed pt math internally 
         improved Voice squelching eliminates audio glitch on initial note after reset
         remove Scroller module 
         add compound pot_frame events
         type field in obEvent extended to lower 5 bits of hi byte
         add obEvent::amPot() ::getPotVal128() ::stripFrame()
         add Mode::potEv()
         add Control::frame ::enableFrame() ::setFrameDimensions() ::getPotNum()
         add pushDisplay() popDisplay() resetDisplay()
         add _ledsStk[]
         add get/setLEDs()
         Console::pushMode() ::popMode automatically save and restore display state of LEDs
         Console:exeIn() calls resetDisplay()
         add USE_LEDS symbolic constant
         bottom 4 bits of blinkTime are always 0
         rework Voice, ADSR, and AutoADSR::evHandler() to handle frame-extended pot events
         bugfix: Stock/ADSRVoice::charEv() were not returning result of super::charEv()
   1.15  add 47 sinusoidal wave tables (named "Sn...") 
         add PanFlute wave table 
         add VoxSynth::forEach()
         nix QuadSynth::noteOn()
         nix QuadSynth::deferVoc ::dynamics()
         move ::lastNote and ::reTrigger() from QuadSynth to VoxSynth
         VoxSynth(!) resets ::lastNote
         private Voice members now scoped as protected
         add BankOsc256 class
         nix Bank::Max (Max is now implicitly 255)
         Bank::numMem() renamed ::numMembers()
         Bank(s) selects member by index #
         add key::reset(), key::null(), NULL_KEY
         add Console::infoRAMStr()
   1.14  RealTimeSequencer::jiffsToTrans is relaxed to the duration of a sixteenth note (was 1 jiff)
         the following fixes to the RealTimeSequencer class ...
         bugfix: super was type-defed as Sequencer instead of SequencerRAM!
         bugfix: multiple key events during transition no longer cause haywire record compilation
         bugfix: :evHandler() no longer compiles bogus rest records
         bugfix: when dynamics() concatenated a rest it was not checking for an empty buffer 
   1.13  re-implementation of LFO class:
           1) internally uses 16-bit fixed pt math instead of floating pt math
           2) adds signed/unsigned oscillator ranges
           3) adds square, rising sawtooth and falling sawtooth waveforms
           4) LFO::setDepth() takes 8-bit values (0 to 128, where 128 == 1.0)
           5) add lfoIniPos command
           6) nix lfoOnDepth command
           7) flags.PEAK renamed .PHASE
         add Long type
         use PROMPT_STR() macro in KeyBrd, Bank, NoiseOsc modules
   1.12  KEYBRD_MENUS is deprecated
         add Synth::tuning() callback method
         ardutouch_setup() instantiates master tuning object via Synth::tuning() 
         add AutoADSR class
         add MasterADSR, MasterAutoADSR classes
         add optional invert arg to blinkLED()
         add LEDFrame struct
         add saveLEDs() restoreLEDs()
         add LED_ONOFF LED_INVERT
         add syncLED()
         blinkRate, setBlinkRate() getBlinkRate() renamed to *BlinkTime*
         add Console::getChar() ::infoChar()
         private function readPot() renamed scanPot()
         add public function readPot()
         add empty RingMod() constructor
         Envelope get* routines defined in header file instead of module
         use PROMPT_STR() macro in Voice, Envelope, Sequencer modules
   1.11  add Gain class to StdEffects module
         add HarmonicTuning class to Tuning module
         ::numNotes moved from EqualTemperament to Tuning
         add Synth::runPreset()
         add empty DualOsc() MixOsc() constructors
         XorOsc::freqDiff made public
         Synth::preset_loading made protected (from private) 
         use PROMPT_STR() macro in Osc DualOsc QuantumOsc StdEffects WaveGen modules
   1.10  Synth::setup() renamed ::config() to circumvent Arduino bug
         VoxSynth::setupVoices() renamed ::configVoices()
         ADSRVoice class is broken out from Voice class
         nix VoxSynth::setAttack/Decay/Sustain/Release()
         nix WaveOsc::period
         add WaveOsc::getPeriod()
         Envelope class renamed ADSR
         add ModSampleOsc class
         add TunedSampleOsc class
         add Wood01, lofi_Wood01 samples
   1.09  add QuantumOsc module
         add VirtualPot module
         add the virtual method Osc::realFreq()
         Osc::charEv( chrInfo ) displays real, not effective, frequency
         Voice::Voice() sets osc to NULL
         VoxSynth::setupVoices() only calls newOsc() for voices with osc == NULL
         in readNVS() and writeNVS(), addrRAM arg typed as void* instead of byte*
         add AUTO_METRICS, AUTO_METRICS_ADDR
         add writeMetrics(), readMetrics() 
         System::numKeys renamed ::NumKeys, changed from const byte to a define
         NumKeys moved from System.cpp to System.h
         add key::physkey()
         add Console::getBits() and BitMode class
         break Console::dispBits() out from Console::infoBits()
         add Console::infoBits()
         add Console::infoCharBits
         add Console::infoIntBits
         Bank::select() returns status boolean as opposed to idx chosen
         add NULL_LED 
         add PROMPT_STR() macro
         drum sounds reauthored (gg 2.56f) to remove leading, trailing 0's
         add "What's New" section in README.TXT
         additions to KEYWORDS.TXT
         bugfix: in TwoVoxPanSynth QuadPanSynth QuadDualPanSynth -- 
                 panPos now interpreted as parts per 256, not parts per 255 
   1.08  __BAUDRATE__ defined in Model.h
         set_baud_rate() macro does nothing 
         add Console::getBool() ::infoBool()
   1.07  DualOsc module is broken out from Osc module
         add MixOsc XorOsc RingMod classes
         add TabOsc256 Sine classes 
         add NullOsc class
         add DualOsc( chrTrigger )
         drop rounding of values in WaveOsc::evaluate()
         drop rounding of values in SawTooth::output()
         ByteMenu::evHandler() eats all except KEY events
         bugfix: FastWaveOsc::onFreq() must check for aggEnd underflow 
         add example sketch _40_Dual_Oscillators.ino
         add example sketch _41_MixOsc.ino
         add example sketch _42_XorOsc.ino
         add example sketch _43_Ring_Modulation.ino
         add example sketch _44_Nested_Oscillators.ino
         additions to KEYWORDS.TXT
   1.06  add DelayVibrato class
         break Vibrato module out from StdEffects module
         break Tremolo.h out from StdEffects module
         RealTimeSequencer::sendMsg() moved to Sequencer
         sending of sqncPLAYON/OFF msgs moved from RealTimeSequencer to Sequencer
         add Sequencer::sender
         Sequencer::sendMsg() renamed ::msgSynth()
         add Sequencer::msgAll()
         sqncRECORD msg renamed sqncRECON
         sqncOVER   msg renamed sqncRECOFF
         nix sqncSQUELCH
         add Voice( sqncPLAYON/OFF )
         AutoWah::lfo made public
         toStr() can display to varying decimal places (3 by default)
         toStr() handles negative values
         in Console module, add USE_DTOSTRF NUM_DEC_PLACES STR_BUFSZ
   1.05  add SequencerRAM, SequencerROM classes
         add DualOsc, FiltEnv classes
         add Sequencer::at(byte) ::atIdxBump() ::rewind()
         move ::load() ::read() ::write() from Sequencer to SequencerRAM
         nix Sequencer::sqnc
         Sequencer(']') issues a sqncSQUELCH to target
         nix call to reset() within Osc constructor
   1.04  add RealTimeSequencer, ClickTrack, ByteMenu classes
         RealTimeSequencer handles both NoteOn and NoteOff events
         add ClickTrack.h ClickTrack.cpp to library
         add ByteMenu.h to library
         break Commands.h out from Console_.h
         add sequencer messages to Commands.h
         Sequencer::tempo is in beats-per-minute (was jiffs-per-minute)
         Sequencer::jiffPerBeat becomes global constant
         jiffsPerBeat increased to 24 
         add symbolic note durations 
         RealTimeSequencer::ignoreKeyUp
         RealTimeSequencer::dynamics() concatenates rest on duration overflow
         MaxOctave reduced to 7 (from 15) so that octave field is 3 bits long
         StepProgrammer sets default noteValue to QUART_
         add StepProgrammer('Q'/'E'/'S') for setting note values
         nix target muting logic in Sequencer classes
         add sqncSQUELCH to Commands.h
         Voice handles sqncSQUELCH
         additions to KEYWORDS.TXT
   1.03  add WaveGen module
         add lofi versions of all drum samples
         add BUILD_166 define in Model.h
         *synth replaces *matrix, and is declared extern
         add WaveGen256, SawTooth, Square classes
         additions to KEYWORDS.TXT
   1.02  support for Non-Volatile Storage
         Sequencer class can read and write sequences to NVS
         add Arduino's EEPROM.h to project (circumvents Arduino linker bug)
         add writeNVS( addrNVS, value )
         add writeNVS( addrNVS, addrRAM, size )
         add readNVS( addrNVS )
         add readNVS( addrNVS, addrRAM, size )
         add Sequencer::read()    
         add Sequencer::write()   
         add Sequencer::load()  (loads sqnc from ROM)
         add Sequencer('D') (dumps sqnc to console as comma-delimited values)
         add Sequencer::length()
         add Sequencer::bufSize()
         move IMPLICIT_SEQUENCER to Model.h
         in Sequencer module, DEVELOPER replaces VERBOSE_INFO
         StepProgrammer::charEv() echoes '.' for '.' or <SPACE>
         StepProgrammer::evHandler( BUT1_PRESS ) calls ::charEv(.)
         Instrument::charEv() propagates transport commands
         blinkLed() immediately reverses pin state 
         ledState[] supercedes blinking[]
         add LED_BLINK define
         in System module, enabled renamed _enabled
         add audio::enabled() wrapper for _enabled
   1.01  add Drums module
         add NoiseOsc module (NoiseOsc and WhiteNoise classes)
         add SampleOsc class
         Sequencer() replaces StepSqnc()
         add Sequencer::targetMuting ::setTargetMuting() 
         add Sequencer::playing() ::ticksPerHalf
         Sequencer(?) prints total # jiffs if VERBOSE_INFO
         add Mode::execute()
         add Console::exeIn() ::ongoing() ::inMode() ::runModeWhile()
         bugfix: VoxSynth::dynamics() must call super::dynamics() to upd sqnc
         bugfix: Instrument('S') must check for null ::sqnc 
   1.00  Sequencer module replaces StepSqnc module 
         add Sequencer base class
         add IMPLICIT_SEQUENCER switch in Instrument module 
         add Instrument::sqnc
         add Instrument::dynamics()
         add Instrument::useSequencer()
         Sequencer::dynamics() replaces StepSqnc::cont()
         Sequencer('r') replaces StepSqnc('S')
         add Sequencer::start() ::stop() ::_pause_() wrappers for ::charEv([,],|)
         add Sequencer::record() - wrapper for 'r'
         Sequencer::ticksPerBeat renamed ::ticksPerJiff
         Sequencer::beatDC renamed jiffDC
         Sequencer::exeRec() descriminates keyDn records 
         Sequencer::setTempo() checks for maxTempo (in addition to minTempo)
         StepSqnc::sqnc[] becomes a ptr (buffer is malloced in constructor)
         StepSqnc() takes optional parameter specifying buffer size
         sequence buffer size is stored in sqnc[0]
         add StepProgrammer::noteValue, ::charEv('V')
         add ticksPerDyna constant in System module
         add key::setOctave()
         wavetable_named() macro replaces wave_descriptor() macro
         add wavetable() macro
         WaveOsc info checks for null name
         desWavTab::length typed as word (was unsigned long)
         Rand16::next() performs xor with LSFR_MASK on bit 0 clr (was on set)
         bugfix: StepProgrammer::evHandler() must skip KEY_UP events
         bugfix: StepProgrammer::evHandler() sets event octave prior to getKey
   0.99  nix QuadSynth::Voicing typedef
         move ::setVoicing() from QuadSynth to VoxSynth
         move ::setAttack/Decay/Release/Sustain() from QuadSynth to VoxSynth
         move ::ampEnv from StockVoice to Voice
         Voice::menu(C#) pushes ampMods 
         Voice::menu(D#) pushes pitchMods 
         BSFilter::menu has been shuffled
         add OneVoxSynth::menu() which overrides '#' with '0'
         TwoVoxPanSynth derives from TwoVoxSynth
         add graphical depictions of key mappings in ::menu() header comments
         bugfix: QuadSynth::noteOn() was not transposing
         bugfix: Bank() must set ::flags.MENU
   0.98  Voice becomes a formal "empty container" with no built-in controls
         add ControlChain, Factor, Factors, AmpMods, PitchMods classes
         add Voice::ampMods ::pitchMods ::addAmpMod() ::addPitchMod()
         add StockVoice class with built-in ::ampEnv and ::vibrato
         VoxSynth::newVox() returns a *StockVoice
         add Voice(A) - pushes ampMods
         add Voice(P) - pushes pitchMods
         Voice(E) pushes effects (was ampEnv)
         Voice(e) pushes ampEnv (was effects)
         Voice::release() releases ampMods and pitchMods
         remove Effect module from project
         EffectsLoop renamed Effects
         Envelope(!) unmutes self
         nix display of shortcut in Control::charEv( chrBrief )
   0.97  add OneVoxSynth, TwoVoxSynth, TwoVoxPanSynth classes
         break Pan module out from QuadSynth module
         nix QuadVoice class
         nix QuadSynth::newVox() 
         Voice::prompt() returns ptr to "v0", "v1", etc.
         in FadeLFO::charEv(t) "flags != DONE" typo changed to "flags |= DONE"
         bugfix: TermLFO::dynamics() returns on flags&DONE only if trav != 0
   0.96  global system keybrd is replaced by local instrument keybrd(s)
         local control of Instrument determined by ::keybrd.muted()
         StereoInstrument::outputs() renamed ::output()
         system always posts key events in octave 0
         remove octave state vars from Tuning class
         KeyBrd derives from Control
         nix KeyBrd::whichNote() ::position
         add KeyBrd::setTop/Bot/DefOct()
         add KeyBrd::chrEv(!)
         add KeyBrd::minOctave ::maxOctave ::defOctave ::octave
         add KeyBrd::upOctave() ::downOctave() ::getOctave() ::setOctave()
         nix Instrument::local ::charEv(+) ::charEv(-)
         Instrument::evHandler() inserts keybrd.octave in KEY_UP/DOWN events
         StepSqnc::subject renamed ::target
         SteqSqnc no longer eats 'k' event
         StepSqnc sets octave on for generated key events
         add obEvent.clean(), .setOctOn() .setOctOff() .octOn(), .setOctave()
         move obEvent.type from upper to lower nibble of hi byte
         add Instrument *StepProgrammer::target
         StepProgrammer::push() takes target argument
         StepProgrammer acquires octave from target
         StepProgrammer saves/restores target keybrd mute status
         StepProgrammer unmutes target keybrd on entry
         StepProgrammer sets event octave before passing to target
         add VoxSynth::charEv(#)
         add VoxSynth::menu(1) = '#'
         digitMode converts result to numeric value (-1 = aborted input)
         getDigit() returns numeric value of digit (-1 = aborted input)
         bugfix: InputMode::InputMode() now sets flag.MENU
   0.95  ConKeyBrd class renamed KeyBrd
         KeyBrd.cpp .h replace ConKeyBrd.cpp .h in library
         add Instrument::keybrd 
         add Instrument::charEv(k) -- pushes ::keybrd
         break DynaControl class out from Control class
         add super typedef to Control, TControl, Phonic, KeyBrd, Osc classes
         replace "Control" (properly, "TControl") with "super" in Envelope, LFO
   0.94  quiet reset capability for Synth replaces mute_at_reset logic
         add Control::flags.RSTMUTE
         add Synth::quiet_reset 
         add Synth::preset_loading
         add Synth::charEv(') 
         nix Synth::charEv(#) 
         nix Phonic::mute_at_reset
         move constructor bodies to within class declarations (saves space)
   0.93  Instrument::xpose supercedes Voice::xpose
         VoxSynth transposes notes before propagation to voices 
         nix META events
         nix Mode::flags.PLAYTHRU
         Mode::flags.MENU is off by default
         add Onboard.cpp to library
         key::transpose() moved to Onboard.cpp
         add Instrument::local
         add Instrument::charEv() for handling '+' '-' chrInfo
         add Instrument::menu() with F# = '-', G = 'x', G# = '+'
         add VoxSynth::setupVoices() ::newOsc() ::newVox()
         nix VoxSynth::regVox, registerVoice()
         break Console::stackEv() out from ::postKeyUp/Dn()
         Console::postBut() calls stackEv() on BUT0/1_TAP
         add "include System.h" to Mode.cpp to enable MONITOR_* defines -- WTF
         in infoULong() compile "Serial.print()" only if CONSOLE_OUTPUT
   0.92  add VoxSynth class
         merge XVoice into Voice 
         StereoInstrument::output(L,R) renamed ::outputs()
         StereoInstrument::outputs() copies left to right by default
         nix MonoSynth
   0.91  add Instrument class
         add Instrument module to library
         nix MonoPhonic class
   0.90  macros are executed synchronously
         support for nested macros 
         add Synth::welcome()
         ardutouch_setup() calls synth->setup, then reset(), then welcome() 
         nix Console::ongoing()
   0.89  system module no longer discriminates between mono and stereo synths
         Synth derives from StereoPhonic
         MonoSynth derives from Synth
         nix StereoSynth
         Control::amMute() renamed ::muted()
   0.88  bugfix: EffectsLoop constructor must set loop to NULL
   0.87  Voice freq changes and triggers are deferred to next dynamic update
         add Voice::pendFreq
         add Voice::flags.FREQ 
         add Voice::flags.TRIG
   0.86  add PCB_REV_C, PCB_REV_A defines
         add Event_Monitor example program
         add README.TXT
   0.85  Bank::charEv(?) lists each member on separate line
   0.84  add QuadSynth module to library
         in Synth.h, add "#include Console_.h" (avoids posiible compiler error)
   0.83  audioBufSz const defined in system.h instead of system.cpp
         nix BUFSZ 
   0.82  add bcklib.bat to library
         add grepfile.lst to library
   0.81  add XVoice class
         add key::transpose(char)
   0.80  bufsPerScan and scanDC are typed as bytes
         add display of numBufs to ardutouch_info()
   0.79  add ardutouch_info()
         add LIBRARY_VERSION
         BUFSZ increased to 17 from 16 (reduces real dynaRate from 163 to 153)
   0.78  remove interlaced dynamic updates
         BUFSZ increased to 16 from 10
         NUMBUFS reduced to 3 from 4
   0.77  add bufStats()
   0.76  add interlaced dynamic updates
         add Synth::_dynamics()
         add dynaReload, interlace statics in system module 
   0.75  bufsPerDyna and dynaRate are compile time constants
         bufsPerDyna and dynaDC are typed as bytes
   0.74  FastWaveOsc::aggEnd replaces ::aggStep
   0.73  add Console::getStr( const char*, char** )
         Console::getStr( const char * ) becomes private
   0.72  add lfoOnDepth command
         LFO::setDepth() issues lfoOnDepth
   0.71  add Synth::menu()
   0.70  add Envelope::getAttack() ::getDecay() ::getRelease() ::getSustain()
         add LFO::getDepth() ::getFreq()
   0.69  reduce system scanRate to 20.0 Hz (was 30.0 Hz)
   0.68  add Bank::select( byte )
         presets is declared extern in Synth.h
         remove Synth::load()
   0.67  add FastWaveOsc class
   0.66  Voice reset leaves global volume unchanged
   0.65  add key operator==
   0.64  add Rand16 class
   0.63  bugfix: bumping octave below 0 was wrapping to max octave
         upOctave(), downOctave() replace bumpOctave( char )
         Tuning::maxOctave reduced to 7 from 8
   0.62  LFO::evaluate() returns 1.0 - pos (previously returned pos)
         remove Tremolo::evaluate()
         remove WahLFO::evaluate()
   0.61  add Voice::charEv('O') -- "push oscillator"
   0.60  bugfix: allocating effects from the heap resulted in indeterminateness
         LPFilter and BSFilter constructors no longer perform a reset
         Effect constructor initializes ::next to NULL
   0.59  add Console::getULong()
         add Console::infoULong()
         additions to KEYWORDS.TXT
   0.58  add Console::newlntab()
         console_setup() calls console.newlntab() at start
   0.57  reset aesthetics: in console.setup() replace rtab with \r + space(SEAM)
   0.56  bugfix: Voice::setFreq() must check for instGlide == 0
   0.55  additions to KEYWORDS.TXT
   0.54  nix lastDouble
         getDouble() takes a pointer argument to location for return value
   0.53  Synth::mute_at_reset replaced by static Phonic::mute_at_reset  
         Voice(!) sets globVol based on mute_at_reset
         nix Voice::iniGlobVol()
   0.52  add MONITOR_RAM
         add freeRam()
         Mode::inform() displays cpu/freeRam if MONITOR_CPU/MONITOR_RAM
         nix Mode($)
   0.51  Model.h checks for declaration of one and only one runtime model
   0.50  system_setup() renamed ardutouch_setup()
         system_loop() renamed ardutouch_loop()
   0.49  remove Mode::onFocus()
         remove focus enumumerated type
         add focusPOP, focusPUSH, focusRESTORE "commands"
   0.48  PCB_REV_1 renamed PCB_REV_B
         not CLOCKWISE_POTS for PCB_REV_B (same as REV_A)
   0.47  additions to KEYWORDS.TXT
   0.46  bugfix: TControl('~') must set DONE flag
   0.45  BUFSZ define moved from System.cpp to Audio.h
         add AutoWah to StdEffects
         additions to KEYWORDS.TXT
   0.44  Voice::vibrato ::tremolo ::envAmp become public
         additions to KEYWORDS.TXT
   0.43  migrate Term/FadeLFO::flags.DONE to TControl
         TControl::trigger() checks flags.DONE and .LEGATO
         modifications to Envelope and TermLFO trigger logic
   0.42  space optimization in TControl::charEv(chrInfo/Brief)
   0.41  add Voice::useOsc() ::clearEffects() ::addEffect
         add EffectsLoop::clear()
   0.40  add Voice::release()
         add EffectsLoop::release()
         remove redundant check for amMute() in Envelope(chrRelease)
   0.39  add TControl::release()
         set flags.DONE on FadeLFO::charEv('~t)
         rename Envelope::release to ::relTime
   0.38  remove TControl::ready()
   0.37  add LFO::prompt()
   0.36  remove Filter abstract class
   0.35  LPFilter replaces XMFilter
   0.34  TrigLFO class renamed TermLFO
         add headers for all LFO class methods
         add headers for Vibrato and Tremolo class methods
         additions to KEYWORDS.TXT
   0.33  Voice propagates dynamic updates and triggers to the effects loop
         Effect derives from TControl
         add EffectsLoop::trigger() ::dynamics()
   0.32  add Voice::noteOff()
   0.31  Voice triggers are no longer deferred to next dynamics()
         remove Voice::pendNote ::flags.TRIG
         add Voice::noteOn() ::trigger()
         TControl::trigger() no longer executes dynamics() if ! ready()
   0.30  add Tuning::minOctave ::maxOctave ::defOctave
         system octave routines use masterTuning state vars
   0.29  add optional monitoring of cpu usage during render_audio()
         add MONITOR_CPU
         Mode('$') displays cpu usage
   0.28  bugfix: blinking[] is dimensioned by NumLEDS (was NumButs)
         LED routines check for valid input of LED #
   0.27  octave routines no longer in system namespace
   0.26  LED routines no longer in system namespace
         additions to KEYWORDS.TXT
   0.25  additions to KEYWORDS.TXT
   0.24  audioBufSz replaces audio::bufSz
         add placeholder KEYWORDS.TXT with keywords used in examples
   0.23  system_setup() enables audio after call to synth's setup() method
   0.22  add upper C = pin 26 for PCB_REV_1
         numKeys in System.cpp replaces maxKey in scanKeys()
   0.21  change comments to refer to left/right button (was top/bot)
   0.20  Osc::onFreq() renames Osc::calcState() 
   0.19  Osc::calcState() renames Osc::calcFreq()
   0.18  add virtual Voice::iniGlobVol()
   0.17  wave_descriptor() macro expands to *desc, name 
   0.16  add Osc::prompt() 
   0.15  Synth::load() no longer virtual
   0.14  Synth::setup() renames ::startup
   0.13  system_setup() calls synth's startup() method
   0.12  add Osc::Osc(), which performs a reset
   0.11  privatize Osc::detune ::calcEffFreq
   0.10  Osc::setFreq() no longer virtual
         nix WaveOsc::setFreq()
   0.09  Osc::calcFreq() renames ::compute
   0.08  Osc::modFreq() no longer virtual
         add WaveOsc::compute()
         Osc::extFactor renames ::instFactor
   0.07  add Osc('!')
         Voice('!') calls osc->reset()
   0.06  add virtual Osc::compute() ::instFreq
   0.05  Osc derives from TControl
         Voice::dynamics() calls osc->trigger/dynamics()
   0.04  nix Voice('O')
         WaveOsc( chrInLnfo ) prints waveform on 2nd line
   0.03  add chrInLnfo
         Voice( chrInfo ) calls osc->chrEv( chrInLnfo )
         nix WaveOsc( chrBrief )
         add WaveOsc/Osc( chrInLnfo )
         Voice('O') pushes oscillator
   0.02  Voice( chrInfo ) calls osc->brief(), not info
         add WaveOsc( chrBrief )
   0.01  1st internal version of ArduTouch library
         copy relevant modules from DuoPoly 2.05
         edit StdEffects.h to include types.h
         add ArduTouch.h
