--------------------------------------------------------------
Tuesday 19th February 2008 - wcnt-1.26.4

CHANGES:
    * LADSPA_PATH for ladspa based modules
      if the LADSPA_PATH variable is set then wcnt will use
      that as the location to find LADSPA plugins. Otherwise
      wcnt will use "/usr/local/lib/ladspa/:/usr/lib/ladspa".

    * ChangeLog
      removed listed changes prior to 1.26 releases.

FIXES:
    * default parameter value checking for pre-defined errors
      now works - added missing break statements in switch.

--------------------------------------------------------------
Monday 18th February 2008 - wcnt-1.26.4

CHANGES:

    * param_editor
      can now make adjustments to parameter values aswell as
      changing them entirely. for example:
          edit osc1 freq + 100
      will add 100 to the value already set for parameter freq
      in the module named osc1. subtraction, division, and
      multiplication are other options for doing this.

    * setpar namespace
      templatized functions. modified to allow param_editor
      relative edits by specification of operator between
      parameter name and value. ie edit osc1 freq + 10.

--------------------------------------------------------------
Wednesday 13th February 2008 - wcnt-1.26.3

FIXES:
    * synthfilereader.cc
      synth_file_reader data object stopped dead on
      encountering a second wcnt_exit module - which in some
      situations was what it should do. however, if the second
      wcnt_exit was not meant to be created it should have
      simply been ignored.

      fixed by moving checks elsewhere within synthfilereader
      class.

--------------------------------------------------------------
Tuesday 12th February 2008 - wcnt-1.26.3

CHANGES:
    * fader module
      changed out_trig to out_bar_trig to reflect the input
      names.

    * data object help commandline option
      removed display of data object definition during it's
      generation - should have done this before.

--------------------------------------------------------------
Thursday 7th February 2008 - wcnt-1.26.3

FIXES:
    * removed references to cosine_wave module which no longer
      exists - caused problems for --input-help <input_name>
      cmdline options.

--------------------------------------------------------------
Wednesday 6th February 2008 - wcnt-1.26.3

CHANGES:
    * removed bpm and time signature information from 'header'
      only the sample_rate must be specified now.

    * time_map
      because bpm and time signature data is no longer created
      as part of the header, the time_map now requires a
      meter and tempo added to the meter_map and bpm_map
      respectively.
      added validation of tempo - so that relative tempo
      changes won't take the tempo below or above the minimum
      or maximum allowed tempos.

FIXES:
    * jwmsynth no longer seg-faults when only a wcnt_exit
      module is created.

--------------------------------------------------------------
Monday 4th February 2008 - wcnt-1.26.2

CHANGES:
    * jwmsynth::run() no longer searches through the modlist
      for the wcnt_exit module... wcnt_exit::init() is
      friends with jwm_globals and sets exit bar and in bar
      members of jwm_globals - jwmsynth get's them from here.

    * synthmod base class has had the boolean members
      valid, and, groupable, etc, removed and replaced with
      an int member named flags which uses a new
      synthmod::enum - for use by linkedlist requiring a
      function object, or by more general usage with,
      for example:
      	synthmod::flag(SM_UNGROUPABLE)

    * #ifdef IO_DEBUG
      disabled checking of inputs being set for a module
      (it happened after validation i believe)
      #endif

    * #ifdef IO_PARANOIA
      conditionally defined as IO_PARANOIA some other stuff
      moaning about requesting setting of things without
      things within synthmod base class .cc (ie the virtual
      base class methods should never be called due to text
      file ui reader etc)
      #endif

FIXES:
    * dynamic
      was checking current vertex when it should have been
      checking the next for existence...

NOTES:
    * wcnt-1.26.2 is a ever so slightly slower than
      wcnt-1.26.1. this is because the combiner, switcher,
      spreader, mixer have been modified as mentioned
      yesterday.

--------------------------------------------------------------
Sunday 3rd February 2008 - wcnt-1.26.2

CHANGES:
    * state_gate_trig
      added out_not_trig output for when in_play_state yields
      off.

    * connectorlist
      new method, remake_connections. remakes the connections
      for a specific module and specific output, to different
      output.

    * combiner, switcher, spreader are no longer restricted
      to containing lists of wcnt_signal - as long as the
      modules added each contain an out_output output type
      everything is fine. also modified the array created
      from the list of modules to contain the output rather
      than the module( and then getting the output from the
      module during run() ).

    * mixer's list no longer restricted to containing mix_chan
      modules, provided the added modules each contain the
      out_left and out_right outputs.

NOTES:
    * wcnt_signal and mix_chan modules need only be created
      if user desires to use outputs other than out_output
      or out_left/out_right respectively.

--------------------------------------------------------------
Thursday 31st January 2008 - wcnt-1.26.1

NOTES:
    * getting ready to release this tonight...

FIXES:
    * switcher
      seg-fault caused when a single wcnt_signal was used
      more than once in same switcher.

--------------------------------------------------------------
Wednesday 30th January 2008

CHANGES:
    * wavfile_out
      modified this to take into account that it should behave
      in a similar fashion to the serial_wavfile_out if a)
      it's trig and count inputs connect to a trig_counter
      with counter wrapping on, and b) it is using
      snapshot_mode. if (a) but not (b) then the same file
      will just be continually over-written. Added MS to
      time information added to filename in snapshot mode.

    * trig_counter
      the count parameter now specifies how many times to
      count the triggers and output them. previously, it
      let through count-1 triggers.

--------------------------------------------------------------
Monday 28th January 2008

NOTES:
    * Debugging work - figuring out why some generated files
      sound different between this version and the previous
      version - besides the intentional differences.

CHANGES:
    * user_wave
      this sounded different - but due to a bug in previous
      versions of wcnt. fixed that.
      worked some more on the run() code. vertexs can now
      collide with each other...
      ... they always get processed in the same order but one
      might get modulated such that it moves behind another,
      these get dropped out - and dropped back in again later.
      added drop_check_range parameter - during tests I used
      a value of two (less, and the drop-check fails and
      nasty spikes occurr).

    * wave_phase (i'm not sure about this)
      
--------------------------------------------------------------
Thursday 24th January 2008

NOTES:
    * the templatization of the linkedlist class has created
      many problems and has needed a lot of work to sort them
      all out. so much work that i am infact still in the
      process of debugging the bastard.

      lastnight while working on wcnt i got distracted by my
      test .wc files and started working on sound instead and
      using the orbit module i kept on looking for that
      perfect sound...

      so today i took a break from debugging, and implimented
      the following...

    * there are now 81 modules within wcnt.

CHANGES:
    * square_wave module
      added rate parameter. has range between 0 and 1. using
      a rate of 1 gives the harsh digital square wave of old.
      a rate of around 0.5 adds some curvature, and very low
      rate values add more curvature. when the square wave
      runs, instead of instantly setting the output level
      (-1 or +1), it sets these as a target. the current
      output level is then processed as:
          output += (target - output) * rate
      the waveform therefor quickly accelerates toward the
      target and slows as it approaches - providing the
      curve. this was an idea from a few weeks ago based on
      something i did many years ago in a much more random
      fashion.

    * wavfile_out module
      added snapshot_mode parameter. when set to on, the
      filename has the current date and time added to it.
      so with snapshot_mode on, filename.wav will become
          filename-20070124-233237.wav
      so many times i have experimented with a .wc file trying
      to find a particular sound and consequently lost some
      good sounds - this new parameter means that even if the
      means to generate the sounds is lost (due to editing)
      the sounds themselves still remain. EXCELLENT!

    * sample_climb
      this is basically a sample and hold version of the rate
      modification of the squarewave - but more like sample
      and climb (to the sample at a given 'rate').

--------------------------------------------------------------
Friday 18th January 2008

NOTES:
    * regarding the conversion to a templatized linked_list
      class, this evening around 9pm was the first time the
      whole thing compiled. so far it will display module
      definitions via the commandline module help option - 
      but only if the module does not contain any dobj shit.

--------------------------------------------------------------
Thursday 17th January 2008

NOTES:
    * performance
      i noticed that after the recent additions of new modules
      that wcnt has been getting increasingly slow. decided
      to try and learn the STL and use <list> instead of my
      own primitive linkedlist class. tested both handling int
      data types and the STL list outperformed my own list
      like a Ferarri F40 racing a Model T Ford.

      so the STL list seemed without a doubt the way to go.
      i started first of all, within jwmsynth::run by
      moving the list of modules from the synthmodlist class
      into an STL list<synthmod*> but, when running wcnt from
      the commandline using the time command, the STL list
      was thousandths of a second slower.

      so i compared the performance of wcnt-1.26-pre2 (in dev)
      with an old version - wcnt-1.25.5 and the older version
      was infact faster. so deduced the decrease in speed in
      newer versions is due to the increase in virtual methods
      being used (by synthmod derived classes as new modules
      are added).

      in order to learn the STL i'd looked online, in the C++
      annotations (recommended btw) and in the src code, and
      decided it was rather complex - and my own linked list
      code just needed a little optimization (more scraping).

      eventually it dawned on me that the simplest way of
      stepping through the list of modules when running the
      generated synth would be to hold them in an array.

      again, i did the conversion just inside jwmsynth::run()
      and lo and behold! oh my! the processing time was
      halved! by gum old chap! this made me happy.

      one of the things i _had_ decided to do with the STL was
      for (initially) the synthmodlist to inherit
      list<synthmod*> and thus remove the generally redundant
      accessing methods which all classes using my linked_list
      had (because they used containment rather than
      inheriting it).

      so NOW, right NOW, as we speak, I am goddamit, in the
      process of re-writing most of the classes that use my
      linkedlist - NOT to use the STL, but to use a template
      version of my linkedlist, and to inherit it instead.

  **(snip)**

--------------------------------------------------------------
Sunday 13th January 2008

ADDITIONS:
    * group_controller module
      removes modules of specified group from the main
      synthmodlist and into a private synthmodlist. using two
      inputs (in_play_trig and in_stop_trig) the module
      decides if it should run the modules or not run them.

      in_play_trig ordinarily will connect to whatever
      triggers the adsr within the 'hijacked' group.
      in_stop_trig ordinarily connects to the out_off_trig
      output of the same adsr which is triggered by the same
      output as in_play_trig.

      there is nothing to prevent the Wrong Thing ;-)

      see examples/routed.wc for a demo.

CHANGES:
    * synthmod (module base class)
      added members set_empty_run(), has_empty_run(), and
      empty_run for modules with empty run() methods to easily
      let it be known they can be removed from the run list.

    * synthmodulelist
      new member method to remove modules from the list which
      have been grouped to the specified group name. creates
      and returns a new synthmodlist containing the grouped
      modules.
      
      two new member methods have been added, validate_modules
      and init_modules, see jwmsynth below for why.

    * jwmsynth
      code to validate and initialise the modules has migrated
      to synthmodlist so that a (planned) module can validate
      and initialise the modules it has removed from the main
      synthmodlist (see yesterdays notes regarding the planned
      'voice' module) without duplicating the code to do so..
      
--------------------------------------------------------------
Saturday 12th January 2008

NOTES:
    * polyphony
      Have worked out some ideas on how to create polyphony
      within wcnt. the very beginnings of this step begun
      from ideas developed while creating the trig_counter and
      trig_echo modules which aswell as outputing a trigger,
      also output a count.

      it is envisioned, that these two outputs will be used as
      a basis for polyphony. the out_count output will dictate
      which 'voice' is to be triggered.

      currently, the only module to use these outputs in this
      way is the trig_router (see below).

      the next step will be to create a 'voice' module (needs
      a less descriptive name?) which will, using a parameter
      specifying a group name, remove all the modules within
      that group from the main modulelist and add them to its
      own private modulelist.

      finally, create a polyphonic sequencer. also riffs may
      need to be altered, or a new polyphonic riff type
      created, but icrottomh.

ADDITIONS:
    * trig_router module
      a module which creates a number of wcnt_trigger modules
      and connects them to it's internal hidden trigger
      outputs. then using in_trig and in_count, determines
      which of the triggers will trigger.

FIXES:
    * removed module name setting for the newest non-ladspa
      modules to outside of the WITH_LADSPA conditional.

CHANGES:
    * trig_counter
      added play_state output, and wrap parameter.

    * removed call to synthmod::init from
      jwmsynth::validate_synth and created
      jwmsynth::init_synth instead - which is called
      immediately before jwmsynth::generate_synth

    * synthmodule (base class for all modules)
      added member methods and variable to remove (default)
      ability to be added to a group.

    * removed groupability from wcnt_exit, trig_router, and
      sequencer modules.

    * linkedlist
      scraped it about a little.

--------------------------------------------------------------
Friday 11th January 2008

FIXES:
    * sanity_checks
      the inputs/outputs/params checking failed to correctly
      ascertain when a module had failed the first or second
      test when the second or third test had passed.

    * constant_note
      changed member variable note from
      char* [jwm_init::note_array_size] to dynamic char** so
      it works as an output now.

    * commandline options: --input-help
      re-ordered code in main. has the disadvantage that some
      things are created unnecessarily in some instances...
      it's that or --input-help causing a segmentation fault.

ADDITIONS:
    * trig_echo module
      the trig echo module echos a trigger input to it's
      output. each successive instance of an echo outputs
      an increasing count, and a decreasing velocity, aswell
      as the echos of the trigger. the user specifies how many
      echos should occurr, and if the input trigger should be
      sent as output also.

    * inspector module
      has two inputs and a message parameter representing each
      of the input/output category/data types. one of the
      inputs is a trigger to tell the module that this is when
      the corresponding message and input value should be
      displayed. it is for inspecting the values coming from
      outputs ;)

    * trig_counter
      counts how many times it's in_trig triggers. the count
      parameter sets the maximum number of times it will allow
      the input to the trigger out_trig...
      ...added pre_count parameter to ignore the first few
      triggers, added out_not_trig to trigger when out_trig
      should not. and added in_reset_trig to reset the state
      of the counters.

CHANGES:
    * nonezero module
      ie the module whose outputs are used when an input is
      turned 'off'. added 'off' ability for inputs who expect
      a string (char*) - ie in_notename etc. the inspector
      module brought this about.

--------------------------------------------------------------
Wednesday 1st January 2008

CHANGES:
    * modifier module
      modifier module now works differently. the modifier has
      always been unclear as to what it's intentions are, but
      now, it takes two signals and creates a third which is
      some kind of modification of the two - rather than them
      just being mixed together.

    * adder, subtracter, modifier, and multiplier modules had
      previously, a pair of inputs named in_signal and
      in_modifier - these have now become in_signal1 and
      in_signal2.

ADDITIONS:
    * balance module
      the balance module takes two signals and creates a third
      which is a balance of the two. if both input signals are
      within -1.0 to +1.0 range, then the output will be
      within that range also.

--------------------------------------------------------------
Monday 31st December 2007

FIXES:
    * peak_detector
      fixed msg display for when in_signal > sig_range_hi to
      display upper bound instead of lower.

ADDITIONS:
    * --no-title commandline option
--------------------------------------------------------------
Sunday 30th December 2007

ADDITIONS:
    * constant_freq (module)
      From a single parameter - freq - the module outputs
      the frequency, and the phase step for that frequency

    * constant_note (module)
      The same as the constant_freq module, except it has a
      an extra output - out_notename, and a parameter for
      specifying a name of a note instead of frequency.

NOTES:
    * I really don't know why I have not thought of creating
      the constant_freq and constant_note modules before.
      There has been countless times when I really would have
      benefited from them.

CHANGES:
    * synthmodlist class has been updated to unlink the two
      new constant modules.

    * linkedlist::unlink_item now only sets current to the
      very first item in the list if the unlinked item was the
      first item in the list - otherwise current points to the
      item previous to the unlinked item.
      
--------------------------------------------------------------
Saturday 29th December 2007

NOTES:
    * removed the sine module created yesterday.

CHANGES:
    * removed sine_wave, and tri_wave modules. Replaced them
      with...

ADDITIONS:
    * wave module. four waveform types to choose from:
      one, sine, tri, and saw - and three more 0.0 ~ 1.0
      versions. the module is quick and simple to use. it is
      wave table based.

    * wave_phase module. this also has  the same  wave table
      types to choose from. this module has the features the
      old sine_wave and tri_wave modules had. you can have
      a phase step from a clock running at a different
      frequency to where the phase trig comes from. there is
      also shaping functionality which requires it's own
      phase_step input, and, the shaping can be sync'd with
      the primary phase_trigger. a further parameter not found
      in the old sinewave and triwave modules is the
      invert_alt parameter which when on means every other
      'phase' is inverted. works much better than the old
      modules.

--------------------------------------------------------------
Friday 28th December 2007

ADDITIONS:
    * sine module
      This is a stripped down version of the sine_wave module.
      It uses a lookup table, with code derived from Richard
      W.E. Furse's sine plugin from the Computer Music Toolkit
      (CMT) LADSPA plugin library.

CHANGES:
    * Renamed all deg_size inputs, outputs, and parameters to
      phase_step, which is more standard, and also removes the
      reference to degrees... which I might change the inputs
      and outputs to pass radians instead of degrees so that
      the conversion from degrees to radians is no longer
      required within modules with in_phase_step inputs.

    * Code within the dc_filter and rms modules now does the
      calculations in a sensible manner rather than in a very
      slow and brainless stupid way. Harsh, but true.

NOTES:
    * The sine module is only marginally faster than the
      sine_wave module. The benefits don't really amount to
      much until complex wcnt synths are created, and then its
      only shaving a few seconds off the time. I'm assuming
      it would be faster if wcnt did not do so many virtual
      function calls - ie 1 call per module for every sample
      processed - but that will not change.

--------------------------------------------------------------
Thursday 27th December 2007

NOTES:
    * Still in the process of removing module help out of the
      compiled program and into text files...
    * Been playing around with wcnt too much...

FIXES:
    * synthfilereader::skip_remarks only detected EOF within a
      remark (which surely, thinking about it, is impossible).
      it now detects EOF properly.

    * consequently, when an input_editor or param_editor
      definition had a missing editlist (causing EOF) wcnt no
      longer crashes. Note: EOF is unavoidable when the
      terminating editlist (of the edits) is missing - due to
      the nature of the params the editlist consists of.

    * comment processing was handled incorrectly. comments
      cannot any longer be created with just a single /
      character.

    * minor memory leaks fixed in duplicate_module methods of
      combiner, spreader, stereo_mixer, switcher, and
      trig_switcher modules. 

    * fixed segfault occurring when EOF occurred unexpectedly
      in a circumstance (outside of skip_remarks or
      read_command) which i've almost certainly immediately
      forgotten.

CHANGES:
    * (experimental) added reflect parameter to sine_wave
      module. this does nothing under normal circumstances,
      but when phase_cycles is not set to 1.0, it 'reflects'
      the waveform (negating and travelling backwards) when
      reflect set to on.

    * added start_bar parameter to sequencer. using this, you
      may instruct the sequencer to start at whatever bar you
      like. good for when you quickly want to hear a new riff
      added at the end of a sequence.

NOTES:
    * start_bar remains in sequencer despite me thinking it
      should be within the time_map. having it in the
      sequencer is less restrictive i think, and, i might
      change the time_map to also use a start_bar parameter.
      this could require several changes in a number of
      modules - and,,,, well,,,, you can't expect miracles.

--------------------------------------------------------------
Sunday 16th December 2007

NOTES:
    * The orbit module's output differed because one version
      of wcnt I tried it with was compiled with -ffast_math
      while this version was not. The -ffast_math is what
      causes the problem, probably better off without it.

CHANGES:
    * Begun writing module help text to display along with the
      module definition when requested from the command line.
      Currently this help text is part of the executable, maybe
      it should be in text files for example in ~/.wcnt_help ?

--------------------------------------------------------------
Saturday 15th December 2007

NOTES:
    * Should be out Christmas shopping...

    * Is the outputlist only used (when asked from the command
      line) to display a module definition? --see orbit fix.

BUGS:
    * I noticed a while ago that the output of orbit.wc
      differed between this version and the wcnt-1.26-test
      version - which I should say are exactly the same. So I
      create a .wc file with only three modules, one of which
      is the orbit module. I use this wcnt and wcnt-1.26-test
      wcnt both with verbose so the orbit::init test results
      display.

CHANGES:
    * Created tests for checking modules inputs/outputs and
      params.

    * Added extra methods to fixstrparam, to get a count of
      substrings, and to get a substring from an index no.

FIXES:
    * Discovered on_off_trig::get_out was not returning
      out_attack_state or out_release_state.

    * orbit module was returning it's out_x and out_y outputs
      despite the outputs having not been added to the output
      list. Which confused me slightly.

--------------------------------------------------------------
Friday 14th December 2007

TODO:
    * Write conditionally compiled testing code. Something to
      set and get inputs and parameters to make sure they are
      referenced correctly within each module and data object.
      Write code to spot unused inputs/outputs/params.

NOTES:
    * Yesterday I got sidetracked writing some code based on
      the collumnize function, but to collumnize C++ code and
      for it to still compile. This required checking for
      quotes etc.

    * Tonight I can't remember what else there is to do. I
      *know* there is something, somewhere, that I put to the
      back of my mind for when I had finished whatever it was
      I was doing when I thought of it, but I can't remember
      whatever it was that I should be going back to. Lots of
      late nights coding. I half asleep at work, am nearly
      always late. I wake up when I get home - when I need to
      be awake... Such is the life of a hospital porter.

    * I'm starting to learn a few more things about gdb now.
      Things I've never tried before like conditional breaks
      and watches, small things. Which reminds me, I need to
      do more memory leak testing for various things.

    * I've spent a lot longer on this version and done more
      to it than I planned to when I half released the
      1.26-testing version. The way it's going seems to be
      heading toward, or preparing the way for the new port
      class to handle option input/param pairs and groups.
      Things tidied up - not everything. Certainly
      re-aquainting myself very well with the code I'd
      written.

CHANGES:
    * Created collumnize function such that when wcnt is asked
      from the command line to display a list of types (such
      as modules, inputs, data objects) the list is sorted
      alphabetically into collumns.

FIXES:
    * The memory leak when using
          synthfilereader::set_wc_filename
      was fixed several days ago now. Was not actually caused
      by set_wc_filename, but by synthfilereader::open_file()
      causing set_wc_filename to inadvertantly copy using
      src == dest.

--------------------------------------------------------------
Thursday 13th December 2007

CHANGES:
    * Finished updating header files, and changing access of
      certain content to be handled via jwm_globals.

    * Removed the creation of the ladspa_loader and
      synthmodlist classes from jwm_globals and instead have
      them created within main(). However, they are still
      accessed via jwm_globals. There was a problem with
      dlclose when the ladspa_loader class was created/deleted
      within an object (jwm_globals) at global scope. - and all
      synthmodules must be deleted before ladspa_loader.

    * Removed commandline processing from jwmsynth and created
      cmdline class with improved command line handling and
      message display. Still needs some work on the logic of
      it's functioning. Some options when invoked require
      modules or data objects to be created and one option
      requires a .wc file to be read - this latter option:
      the workings of - was formlerly within jwmsynth...

    * Some new command line options:
      --dont-run
      --help
      --longhelp
      --about

    * Settings like --verbose and --dont-run are accessible to
      modules and data objects via jwm_globals (jwmsynth will
      simply _not_ run() modules when --dont-run is used).

--------------------------------------------------------------
Sunday 9th December 2007

CHANGES:
    * Renamed globals.h to jwm_globals.h. Created jwm_globals
      class. Creates instance named jwm. This used instead of
      jwm namespace. This is because the classes created,
      (formerly by jwmsynth) need to be created in the correct
      order.

    * Removing includes from header files not required for
      declarations. Using forward declarations where possible,
      and including in src files only those includes required
      for compilation.

NOTES:
   * This process to achieve the above changes is also quite
     tedious and slow going. It has to be done.

--------------------------------------------------------------
Saturday 8th December 2007

NOTES:
    * This reorganization is proving very very very tedious.
      It's at times like this I wish I knew how to use grep,
      but I can't help thinking that much of what needs doing
      is a manual job... Whatever. Tediumus Extremus.

CHANGES:
    * Removing static data and methods from dobj, now. It was
      mostly the same as that which appeared in synthmod. Into
      globals jwm namespace it goes...

    * Tidying up the very silly things going on in some of the
      set_ and get_ methods...

--------------------------------------------------------------
Friday 7th December 2007

CHANGES:
    * Removing static data from synthmod... Or beginning to.
      I never really liked how it looked in synthmod...
      The data, along with the methods to access it is being
      moved to globals.h & globals.cc. The classes are no
      longer pointers, but returned as references from
      functions with static data...
      synthmod class should hopefully look a little more like
      how it should - less cluttered.

    * Turning synthmod virtual functions for getting inputs,
      parameters and outputs to const. Again, this is tricky
      because the compiler does not warn that the non const
      versions (declared in derived classes) are not the
      right ones...

    * Removing (mostly 99%) unused non-generic methods for
      setting and getting inputs/parameters/outputs (ie
      specific set & get methods for specific parameters,
      inputs, and outputs). This is because the generic
      methods are (mostly) the only methods used (ie the ones
      which pass void* data and paramnames, inputnames, and
      outputnames types).

    * Renamed PAR_TYPE enumerations so they no longer begin
      with PAR_ (ie paramnames::PAR_LEVEL becomes
      paramnames::LEVEL). Renamed synthmod::SYNTH_MOD_TYPE
      enumerations to no longer begin with MOD_.

    * Changed synthmod's virtual get_input, get_output and
      get_param methods to const... Slowly changing derived
      classes...

    * Removed number_id member from synthmod, it has always
      been unused.

    * Removing counts of specific module types. The counts
      were used to initialise a particular modules's number_id
      member - which was never used for anything except
      slightly variating certain error messages.

--------------------------------------------------------------
Thursday 6th December 2007

CHANGES:
    * Changed class structure of inputnames, outputnames,
      paramnames, dobjnames, synthmodnames, and iocat
      (formerly iocat_names). These now include a privately
      declared struct to incorporate the name, iocat (for
      input/output/param names) and the type (enum). storing
      the enum is a small waste of memory but it helps keep
      things clear and allows a check (conditional #DEFINE)
      to take place to help maintain (for sanity) the correct
      order of indices and names (getting these mixed up would
      cause trouble).
      Within the .cc files for these classes, the layout of
      setting the name to the type is now much easier to
      read. Lastly, the member functions for these classes
      are now const.

    * the IOCAT (enum) type is now placed within the iocat
      class and the IOCAT enumerations no longer begin with
      "CAT_". (ie CAT_DOUBLE is now referred to as
      iocat::DOUBLE).

    * Am generally going const crazy...

--------------------------------------------------------------
Saturday 1st December 2007

CHANGES:
    * Removed lp_average and hp_average filters. These were
      the basic implimentations of the original lp_filter and
      hp_filter modules. Instead of a frequency, the number of
      samples to average was specified. No modulation (the
      filters click when modulated). These filters did not
      appear in wcnt-1.25, and were just ideas.

FIXES:
    * Removed blank paramnames which were laying about from
      testing ideas - these caused segmentation faults.

    * Some of the new LADSPA interfacing modules were not
      validating all of their parameters. They are now.

--------------------------------------------------------------
Friday 31st November 2007

ADDITIONS:
    * adsr_scaler - data object - scales the time lengths of
      the adsr envelope within an adsr. very basic: you specify
      the adsr module to operate on, and then individual amounts
      to scale the attack, decay, and release sections.

CHANGES:
    * Sure, there's been some, somewhere.

NOTES:
    * Added other modules which interface with LADSPA plugins.

--------------------------------------------------------------
Wednesday 20th November 2007

ADDITIONS:
    * LADSPA - very early stages here. I'm taking the easy
      route, there is no LADSPA module to handle _any_ LADSPA
      plugin. I'm selecting plugins I consider important and
      then hardcoding them within specialised modules...

    * glame_butterworth is a hardcoded LADSPA plugin module
      implimenting the GLAME butterworth high and low pass
      filters. (But not the x-over filter from the same lib
      because it has a different number of ports).

CHANGES:
    * added extra check for module validity after the call to
      synthmod::init() in jwmsynth. this because LADSPA 
      modules instantiate the LADSPA plugin within their init
      method.

NOTES:
     I've rehashed the plugin loading code by Richard Furse
     from the LADSPA SDK, into a simple C++ class.

--------------------------------------------------------------
Tuesday 20th November 2007

It's been a long time. I was beginning to think I'd never code
on wcnt ever again (yeah right, as if).

CHANGES:
    * now using libsndfile for file input/output. so that...

    * some inputs/outputs which were previously 16bit, are now
      double precision floating point. other inputs/outputs
      which were 16bit are gone altogether.

    * in other words all audio signals are around the range of
      -1.0 to +1.0 instead of some being in the 16bit integer
      range of -32767 to +32767.

    * orbit module: fractal orbits for modulating purposes.
      nice.

    * some other silly little modules barely worth the hassle
      which actually i coded a few months prior to this.

--------------------------------------------------------------
*************** CHANGES PRIOR TO 1.26 REMOVED ****************
--------------------------------------------------------------
