DIN Is Noise 54:

  NEW in DIN54:

  /* 
    Drones Per Launch and Launches Per Minute for drone launchers 
      Until DIN53.1 you could launch only 1 drone per launch.
      In DIN54, you can launch a bunch of drones every launch with
      launches per minute.
      
      Change drones per launch / launches per minute of an existing 
      launcher from Menu > Drone Params > Motion > Drones Per Launch or 
      Menu > Drone Params > Motion > Launches Per Minute 

      for new launcher set in defaults:
      
      Menu > Drone Params > Defaults > Drones Per Launch 
        default = 1
      Menu > Drone Params > Defaults > Launches Per Minute
        default = 60

      Tip:

        When there are many drones launched every launch, they will all launch
        along the direction (of velocity) of the launcher.  Their trajectory will 
        therefore overlap, turn on Menu > Drone Params > Defaults > Velocity | Randomize 
        to randomize their launch directions
  /*

  /* 
    drone velocity modulation:
      affects all launched drones
      specify how amount of velocity (actually the speed!) changes from birth to death of a drone
        default is constant ie no change from velocity (ie the speed) at birth
          this is the behaviour in DIN53.1

      edit the change curve from Menu > Editors > Drone velocity modulation
  /*
  /* 
    in Gravity widget:
      Size: 
          if turned ON, gravity size continuously expands or contracts to Mouse or 
          (1st selected) Drone position !warning! Big gravity sizes can move drones 
          fast to max volume and get loud!

      To Screen + : puts base of gravity vector to the center of the screen
      To drones + : puts base of gravity vector to the center (magenta arrow) of selected drones.
        To drone  : puts base of gravity vector to the (first) selected drone. 
  /*

  /* save/load color sliders /*

  + draw gravity vector when UI is off 
  * draw drone trails even if drones are off visible note / pitch ranges
  ! fixed: drones bounced only once irrespective of Menu > Drone Params > Defaults > Bounces parameter !
    ! bug introduced in DIN53 :( !
  ! fixed: potential (null pointer) crash when turning UI on/off from microtonal keyboard !
  ! fixed: sudden increase in loudness (sorry!) when frozen drones are deleted but then 
           thawed, frozen and deleted again and again !
  ! fixed: restore oscilloscope display state when UI is turned off and on !
  ! fixed: timing (introduced in DIN53.1 due to change of alarm.cc/h) of auto split / delete boxes in mondrian !
  ! fixed: deleted drones not de-selected !

DIN Is Noise 53.1:
  ! fixed : runaway launch of drones when Drone Params > Defaults > Generations 
            is > 1 (higher the value worse the outcome!) and Drones Per Minute = 0 
            due to wrong initialisation of this drone parameter after DIN restart / 
            reload

  Update ASAP to DIN53.1
DIN Is Noise 53:

  /*  new in DIN53:

        launched drones launch drones that launch drones that launch drones....!

          use Drone Params > Defaults > Generations to set the number of times this can happen

            if Generations = 1,  A drone launcher launches drones (@ a Drones Per Minute) 
            that die at the end of their lifetimes. This is default and the only behaviour until DIN 52.
            if Generations = 2, A drone launcher launches drones that launch drones.
            if Generations = 3, A drone launcher launches drones that launch drones that 
            launch drones too. 
            if Generations = 4, 5, 6, ... this quickly escalates into a population explosion of drones; 
            lots of drones birthing lots of drones, living their life out and waiting to die can get 
            very loud (especially if the Compressor isnt ON), slow down DIN and maybe even your computer 
            beyond rescue. Be careful! :)

            Ways to prevent this population explosion are: keep Generatons low (Menu > Drone Params 
            > Defaults), keep Drones Per Minute (DPM) and Lifetime on the original 
            launcher low (Select drone launcher and adjust values from Menu > Drone Params > Motion) and
            keep the Fall time low (the fade-out time for drone after being killed, from Menu > Drone 
            Params > Defaults)

            The launched drones take the DPM and Lifetime of their parent so editing carefully the 
            parameters of the original launcher is important.

  /*  new default Drones Per Minute (DPM) on a drone launcher (Menu > Drone Params > Defaults). Assigns a 
      DPM when making a drone launcher.  Turn on ~ to assign a DPM at random.

  * re: Auto rotation of drone velocity/acceleration vectors: 
      changed Degrees Per Second to Degrees Per Tick

  /* re: Menu > Drone Params > Defaults > Bounces
      when set to 0, launched drones dont bounce off the bottom of the microtonal keyboard 
        but are killed immediately (behaviour until DIN 52)
      when set to -1, drones dont bounce off the bottom of the microtonal keyboard at all:
        but they are not killed either, they just live their life(time) out

  /* gravity base and tip dont move ie stay fixed as you scroll the microtonal keyboard in DIN53. 
     this is because gravity is now in 'object space' along with the drones and microtonal ranges. 
     until DIN52, gravity was in 'UI space' along with UI controls. 

  * repositioned drone arrow UI elements

  ! fixed : DIN not quitting when frozen drones present !
  ! fixed : change size of gravity vector when its modulating !

DIN Is Noise 52:

  \ walked back some changes introduced in DIN 51
    \ the drone tracked by gravity does not change when the selection changes
  \ renamed drone arrow parameter called Head to Neck 

  /* new gravity size modulation for DIN 52

      change the size (aka strength/magnitude) of gravity vector over bpm:
        on the gravity widget, turn on Modulate
          bpm = speed of gravity size modulation
          depth = how far to 0 gravity drops
            depth = 1, goes all the way to 0 and back in 1 beat
            depth = 0.5, goes from starting size to half size and back in 1 beat
            depth = 0, no size modulation ie size does not change at all
            default depth = 1
          
          set an initial size using gravity presets or click on Change Size 
          and move the mouse up or down. keep Modulate off when doing this.

          click Edit to edit the size modulation curve for interesting fx.
  /*

  + press q to toggle drone wanding when Menu > Drone Tools > Wand is selected
    ! was always in Add drone mode until DIN 51.x
  + optional tracking of drones when connecting them with Menu > Drone Tools > Connect
    + enable / disable @ Menu > Drone Tools > Track
    + if enabled on connection: drone 1 points to drone 2 points to drone 3 and so on
    + if disabled on disconnection: selected drones stop tracking any other drone
  + select drone on creation 
    + Menu > Drone Params > Defaults > Select on Creation
    + drone is not selected by default
    + useful for looking at pitch/volume info of launched drones as they fly past
  + white = noise interpolator curve
    @ Menu > Editors > Noise Interpolator
  + white = drone that makes noise
    \ was grayscale in DIN 51.x
  + color of velocity vector of drone = color of drone
    \ was green in DIN51.x
  + constrain magnitude of drone velocity +/ acceleration to be > 0
    + click on 0 checkbutton on the Menu > Drone Params > Motion > Velocity or Acceleration to toggle
      + if enabled, magnitude of velocity +/ acceleration will always be > 0
      + if disabled, magnitude of velocity +/ acceleration can go < 0 ie will reverse movement or
        orbiting
  + browsed drone marker color is color of the browsed drone
    \ was green in DIN51.x
  * improved drone arrow drawing
  * improved note/frequency labeling on microtonal ranges
  * improved 'with left/center/right fixed' menu item on Menu > Ranges
  * new default volume distribution curve to have value increase (linearly) 
    after 100% instead of staying at 100%. upto 200% now.
  * improved drone > < noise progress display
  <> moved (and renamed) Menu > Drone Params > Move under Gravity to Menu > Drone Tools > Balloon
      still does the same thing:
        releases (like gas balloons :) anchored drones
          these are now launched drones and die at the end of their lifetimes.
  <> moved Snap drones to notes / Position affects velocity from Menu > Drone Params > Motion to 
     Menu > Drone Tools
  <> moved Bounces, rebound Speed% and drone bounce behaviour from Menu > Drone Params > Motion to 
     Menu > Drone Params > Defaults as they apply equally to all launched drones
  * replaced drone Rise Time Min and Max spinners with a Rise time spinner
    + turn on ~ to generate a random rise time (default is 50% to 100% of Rise time) on drone creation 
      + change range of randomness by editing %~ field
  * replaced drone Fall Time Min and Max spinners with a Fall time spinner
    + turn on ~ to generate a random fall time (default is 50% to 100% of Fall time) on drone removal 
      + change range of randomness by editing %~ field
  + drones can bounce ahead, back or ahead/back
  + can select drones while voice phrasor plays
  + reinstated (from din-5.2.1 release!) a form of indian notation for notes
    + from Settings screen, choose notation = indian
  + a launched drone lifetime = lifetime of launcher or if ~ is active on Menu > Drone Params > Defaults > Lifetime
    a randomisation based on ~% of the lifetime of the launcher

  ! fixed bug when setting snap left/right values
  ! fixed mouse wheel scrolling of UI when hovering over label widget
  ! gravity continues tracking drone as its moved around or when scrolling microtonal keyboard

DIN Is Noise 51.1:

  * improved DIN font *
  ! fixed drone arrow defaults save/load !

DIN Is Noise 51:

   + drone is anchored or launched on creation
      anchored means stays fixed at the place of creation
      launched means 'flies' off based on its velocity and prevailing gravity
        try with Menu > Drone Tools > Add / Wand
      set at Menu > Drone Params > Defaults

  + set velocity +/ acceleration vectors of drones to presets via Menu > Drone Params > Motion > Set velocity/acceleration
    + presets are +ve or -ve vertical, horizontal, velocity, acceleration and zero

  + auto flip (clock < > anti-clock) auto rotating velocity/acceleration vectors every some degrees
    + via Menu > Drone Params > Auto flip > Set / Unset / Toggle
    + default 'every some degrees' is 90 degrees

  + gravity
    + presets for gravity vector
       0, left, right, up and down
    + gravity tracks mouse position
      + click Gravity > Mouse
    + gravity tracks the first among selected drones
      + click Gravity > Drone
        ! as drone selection changes, gravity may track a different drone !
      - removed Menu Drone Params > Track gravity

  + mesh polygon filling per drone color

  * color of a launched drone is same as color of the launcher
    * try changing color of the launcher as drones are launched

  * changed color of velocity/acceleration vectors to move away from green (used for selection) and red (used for errors)
    * cyan = color of velocity vector of all drones
    * (reddish) magenta = color of acceleration vector of all drones 

  * changed arrow visualisation of velocity +/ acceleration vector of all drones
    * Head 
      * edit the position of the arrow tip
        * can go 'above' the vector tip ie > 1.0
        * can go 'below' the drone location ie < 0.0
        * can be on the body ie 0 <= tip <= 1.0
    * Shoulder Position 
      * edit position of the arrow's shoulder tips
    * Shoulder Width
      * edit width of the arrow's shoulder
    + Cap or Decap the arrow

  + set default arrow head, shoulder position and width, cap from Menu > Drone Params > Defaults
    + used when adding & wanding drones
    + change existing drone's velocity/acceleration vector arrow params via Menu > Drone Params > Visual

  + improved geometric chuck
    + on a chuck with N drones, the first N - 1 drones have trail set to 0
      + the last drone has trail set to 10000
    + toggle auto reset trails
      + Menu > Drone Params > Chuck > Auto reset trails
    + 2 changes above aid visualisation and experimentation instead of manual trail 
      resize/reset every time after changing a chuck param
    + toggle chuck outline
      + click Menu > Drone Params > Chuck > Draw chuck outline
      + aids screenshotting 
    + chuck outline drawn per drone color

  * default scale/rotate drones center to microtonal keyboard center

  * default selected range to C Eb

  + mouse wheel on microtonal keyboard to scroll along horizontal
    + press SHIFT and scroll to scroll along vertical

  * short form of echo command is .

  * improved bpm handling of drone pendulums and meshes

  * improved drone trail handling/display

  * close menu after setting modulation direction

  ! fixed bug in zoom of curve editor when mouse slider is active !
  ! fixed draw crosshairs on drone mesh preview !

DIN Is Noise 50.2 :

  :( fixed bug in drone modulation editor introduced in DIN 50 :)
  + set velocity/acceleration vector of drone(s) to vertical, horizontal, -velocity, -acceleration
  * UI dialog position improvements

DIN Is Noise 50.1 :

  :( fixed wrong Velocity and Acceleration directions on Auto Rotate :)
  :( fixed range modulation width/height spinner bug introduced in DIN50 :)
  * improved item list handling

DIN Is Noise 50:

  /* Wand drones into existense using Drone Tools > Wand

    /* tool toggles between Add and Wand modes

    /* In Add mode (the only mode until DIN49.1), you add a new drone by 
       left clicking on the microtonal keyboard. You click and drag to 
       'spray' new drones.

    /* In Wand mode (new in DIN 50), you simply wave the mouse to add drones on 
       the microtonal keyboard. Use the Wand distance (Drone Params > Defaults)
       to control how close or spaced out the drones are to each other.

  /* new Drone Params > Defaults tab to set defaults for some drone parameters:

    /* wand distance - distance to move the mouse before DIN adds a drone in Wand mode.

      ! smaller distance means drones are created close together
      ! larger distance means drones are more spaced out

    /* type of drones wanded/added:

      1. immortal - drone forever until deleted << default and the only type until DIN49.1
      2. mortal - die after their lifetime << drones launched from another drone are this type
      3. reincarnate - die after their lifetime only to be (re)born immediately! << new to DIN 50!

    -> type of sound made by drones:

      -> moved from Drone > Tools in DIN 49.1
      -> drones a pitch/volume
      -> noise @ pitch/volume

    -> Drone rise (min, max), fall (min, max), lifetime and handle size.
      -> rise, fall times moved here from Settings screen

  /* Drone Tools > Immortalize to make drones immortal
  /* Drone Tools > Mortalize to kill drones after their lifetime
  /* Drone Tools > Reincarnate - drones rebirth after their death, immediately!

  /* Auto rotate Velocity or Acceleration or Both of selected drones from
     Drone Params > Motion tab
     /* @ RPM
     /* Clockwise or Anti-clockwise
     /* Start, Stop or Toggle

  /* Set AM and FM directions to 
    /* Vertical, Horizontal, Velocity or Acceleration
    /* Until DIN 49.1:
      /* AM direction = Vertical
      /* FM direction = Horizontal

    ! 
      interesting fx possible via auto rotating velocity +/ acceleration and using them 
      as modulation directions. also interesting to launch drones from auto rotating 
      velocities.
    !

  /* 
    DIN 50 introduces a virtual geometric chuck inspired by the geometric chuck, 
    a drawing machine from the 19th century! DIN's chuck, made with a bunch
    of drones, not only draws (via drone trails) but also sounds notes 
    (via snapping), drones or noises!

    To begin, select a bunch of drones and
      choose Drone Tools > Chuck 
        DIN creates a geometric chuck with these drones
          Minimum 2 drones 
          Good start = 3 drones
          Each drone rotates about the other
          1st drone is central, rotates about nothing, so stays still
            You can move this drone around and move the whole chuck
              The 2nd drone rotates about the 1st,
                The 3rd drone rotates about the 2nd,
                  and so on

          Browse the selected drones of the chuck with Drone Tools > Browse drone 
          or press <- and -> to select a drone in the chuck and 

          Adjust the speed at which this drone rotates about the other 
          (Drone Params > Chuck > Speed), the distance at which it rotates
          (Drone Params > Chuck > Length), flip the direction of rotation 
          (anti-clockwise < > clockwise) (Drone Params > Flip), pause/go 
          (Drone Params > Chuck > Toggle) the rotation and draw a trail
          (Drone Params > Chuck > Trail length). Recommend trail on the last 
          drone of a chuck to make drawing like the real geometric chuck

          Set Angle per turn to speed up (large angle) or slow down (small angle) the rotation
          of all the drones of (all) chuck(s).

          The drones of the chuck sound the pitch/volume they are on the microtonal keyboard.
          You can mute/unmute any / all of the drones of the chuck.
            Drone Tools > Mute, Drone Tools > Unmute
          You can convert any / all of the chuck's drones to noise (Drone Tools > Drone > Noise) or
          vice-versa.
            Drone Tools > Drone 2 Noise, Drone Tools > Noise 2 Drone
          You can snap drones of the chuck to sound notes
            Drone Params > Motion > Snap drones to notes > Set

  *\

  + stop drone decay (and death) if frozen
  + retime decay time of deleted drone(s) if you select drone(s) and delete again

  * change FM depth (like AM depth) by moving along vertical on mouse slider
    * moved along horizontal until DIN 49.1
  * change FM bpm (like AM bpm) by moving along vertical on mouse slider
    * moved along horizontal until DIN 49.1
  * helps with moving drones along circular paths at different speeds
  * improved value spinner UI
  * improved find_nearest_note (..) performance
  * improved drone trail performance
  * improved console text & value display
  
DIN Is Noise 49.1:

  ! fixed : crash from 'delays' editor when menu toggled and plugin browser fold toggled !
  /* multiple channel MIDI support 
  
DIN Is Noise 49:

  /* position (instead of modulation until DIN48) affects velocity vector of drones

  /* Set center for rotation and scaling of drones:

    Menu > Drone Tools > Auto Center uses average center of selected drones
    Choose Menu > Drone Tools > Set to mouse and Click on it to set center to 
    point under mouse cursor. Click to stop.
      You can also click and just move the magenta cross that marks the center
      
  on mouse slider:

  /* warp mouse position when rolling wheel
  /* press / to toggle warp mouse at boundary

  * improved the drone selector / drone mesh/pendulum preview on microtonal keyboard

  * show hz/vol for selected drones only (instead of all drones until DIN48)

  ! fixed: flip (using ` key shortcut) between instruments loads the correct editors !

  EXPERIMENTAL:

  /*  when scaling or rotating drones, change scale or angle increments using mouse slider (see
      DIN 48 CHANGELOG below for how to do this) to change scaling +/ rotation 'speed'
  

DIN Is Noise 48:

  /*  create drone pendulum based on number of drones instead of spacing

  /* convert selected pitched drones to noising drones and vice-versa.
    + CTRL + . to convert selected pitched drones to noising drones
      or Menu >> Drone Tools >> Drone > Noise
    + CTRL + , to convert selected noising drones to pitched drones
      or Menu >> Drone Tools >> Noise > Drone

  /* mute and unmute selected drones
    + SHIFT + , to mute selected drones or Menu > Drone tools > Mute
    + SHIFT + . to unmute selected drones or Menu > Drone tools > Unmute

  /* Zero and Reset gravity from Gravity widget

  /* Zero velocity of drones

  /* Start and End angles for geometry > sound plugins on curve editor
    + ie., Circler, Rose_Milker and Lissajous
      + you can now turn a part - an arc - of rose and lissajous curves into waveforms/envelopes/modulators! 
    + Phase for Spiraler
      + End angle found from Turns

  /* Start, End points in Countries plugin on curve editors
    
    + turn 'arc' of a 'country polygon' into waveform/envelope/modulator

  /* set Phase of each harmonic in Sine_Mixer

    + press g to toggle between harmonics and phase 'levels'
    + Phase levels is blue
      + goes from 0 deg (bottom) to 360 deg (top)

  /* press f to toggle paint harmonics (or phase) in Sine_Mixer

  /* overlay last screen (instrument or editor) on curve editor

  /* !EXPERIMENTAL! mouse slider increment scaling
    
    When using mouse slider:

      press , to set increment to 1/N of original increment
      press . to set increment to Nx of original increment
      press 1,2,3...9 sets N = 1,2,3...9
      press 0 to set N = 10
      default N = 10

  /* if selected drones exist, set initial menu tab to Drone Params on microtonal keyboard

  * ` to flip to last screen
      * flip between editors
      * flip between instruments

  * improved curve editor
    * curve samples display, curve component picker, cursor display

  * improved auto splitting 'box that has a ball' in Mondrian
    * results in better trapping of ball(s) in box(es) :)

  ! fixed dont warp mouse when mouse slider activation aborted !
  ! fixed add/remove gravity widget on menu toggle !
  ! fixed load/save of launched drones !
  ! fixed reset velocity & gravity !
  ! fixed crash when clearing all harmonic bookmarks and moving sine mixer !
  ! fixed name of radius curve in spiraler plugin !
  ! fixed drones per minute as float instead of int !
  ! removed release location from the title bar as COVID-19 has grounded me in Chennai, India :( !

DIN Is Noise 47.1 @ Chennai, India
  * improved Spinner UI control
  ! removed 2 sets of log messages that may affect performance !
DIN Is Noise 47 @ Chennai, India
  + Menu > Drone Params now split into 3 tabs:
    + Modulation:
      + has controls to edit drone modulation parameters like AM/FM depth, BPM
    + Visual:
      + has controls to edit drone trail length, handle size, 
        connection stiffness (see below), colors (see below) etc
    + Motion:
      + controls to edit drone parameters like velocity, acceleration,
        drones per minute, lifetime etc

  + On the mouse slider
    + when you can slide both horizontally and vertically:
      + press SHIFT to slide just vertically
      + press CTRL to slide just horizontally

  /* connect and disconnect drones
    + Workflow:
      + select a bunch of drones (eg., Menu > Drone Tools > Select all drones)
      + Menu > Drone Tools > Connect
        + DIN connects drones in selection order
          + points one drone to next
            + last drone points in the direction second last drone points

            + To select drones in desired order, select drones one at a time by 
              click+moving a box around a drone and use SHIFT / CTRL keys while 
              selecting to add to existing selection or remove a drone from selection

        + Steps @ 1 connects drones successively, this is default
          Steps @ 2 connects alternate drones
          Steps @ 1 2 does both
            try other steps sequences:
              eg., 1 3 5 OR 1 2 4 etc
              !note! separate steps with SPACE not comma

      + Just select a drone and move (Menu > Drone Tools > Move) and all the 
        connected drones move to keep their original distance on connection.

          'But then one lizard (or iguana) moved, and all moved'
            - VS Naipaul, Among the Believers

        + Use Connection Stiffness parameter to control the 'elasticity' of 
          the connections (Menu > Drone Params > Visual)
            + This is a global parameter, affects all connections among all drones
      + Menu > Drone Tools > Disconnect to disconnect the connected drones
        + Select a drone in the middle of a chain and disconnect splits the chain in two
        + Select the 'head' drones of two different chains and connect to merge the two 
          chains into one

  /*  new curve & curve editor to sculpt amplitude (aka depth) & bpm of 
      drone pendulum's drones
    + access using Menu > Editors > Drone Pendulum
    + edit curves even after creating drone pendulums! 
      + affects drone pendulums selected drones belong to 
      + use Menu > Overlay Instrument on the editor to see the effects of the 
        edits while making them.

  /* new color sliders to set the color of selected drones
    + 2 sets of 3 sliders (1 for Red, Green and Blue).
      + Top set called Top
      + Bottom set called Bottom
      + Select some drones and
        + change color to Top to set color of all selected drones to the RGB of Top sliders
        + change color to Bottom to set color of all selected drones to RGB of Bottom sliders
        + change color to Blend to set color of all selected drones to RGB blended from Top to Bottom sliders
          + first selected drone color is from the Top sliders
          + last selected drone is from the Bottom sliders
          + other drones take inbetween colors

          + To select drones in desired order, select drones one at a time by click+moving a box 
            around a drone and use SHIFT / CTRL keys while selecting to add or remove drone to an 
            existing selection

        + change color to Random to set random colors on all selected drones
          + not truly random but a random color between RGB of Top and Bottom sliders
            + useful as colors are random but still from a certain part of the spectrum

      + If drones are noise, their color is grayscale, derived from just the Red channel of Top 
        and/or/both Bottom sliders, based on the chosen scheme.
      + If you edit a color slider, DIN hides the menu so you can see the edits better, hit ESC or click on Close 
        to finish/abort

  /* abort octave shift
    + useful to take the key note away from 'piano notes' into 'weird' pitches yet still have 'scales' based on
      this new key 'note'.
        + without Abort this was still possible by editing the octave shift curve 
          (Menu > Editors > Octave Shift)
    + to set the key back to a note, goto Settings screen and use the Key spinner
    + click Menu > Misc > Abort on Microtonal-Keyboard, Mondrian and Binaural Drones instruments
      + or press SHIFT + ESC
    + click Abort button on Keyboard-Keyboard 
      + or press n

  /* edit arrow width, depth for each drone
    + until DIN46, this was global
    + very useful for snake/centepede like visualisations of connected drones 

  * scale drones
    * press CTRL to scale along horizontal
    * press SHIFT to scale along vertical

  + moved Scale, Rotate drones to join Move in Menu > Drone Tools
  + SHIFT + e to scale selected drones
  + CTRL + e to rotate selected drones

  + press ` to flip between current instrument and last used curve editor

  + detach Spinners from Menu when using the < and > buttons to decrease/increase values

  * Optimised GUI controls
    * field, spinner etc

  \0/ fixed crash when browsing waveforms on keyboard-keyboard
  \0/ fixed search field in countries
  \0/ fixed value field in number for bits of char

DIN Is Noise 46.2 @ Chennai, India
  * optimised GUI controls a bit
  * improved mirroring curve about horizontal, vertical axes
    + new horizontal, vertical local axes
  + new seed curves in fractaliser plugin
  ! fixed bug in identifying and setting audio devices !
    ! introduced in DIN 46 :( !
DIN Is Noise 46, 46.1 @ Chennai, India
  !+! what is fixed when modulating microtonal range?:
        + left, right or center
  !+! voice is voice or noise on microtonal keyboard
      + voice intones the pitch under mouse cursor
        + volume of voice is mouse's height above the bottom of the microtonal keyboard
      + noise makes noise with frequency content related to pitch under cursor
        + volume of noise is mouse's height above the bottom of the microtonal keyboard
  !+! presets for superformula geometry > waveform/envelope/modulation curve plugin
    + Click on Browse on Superformula page on a curve editor
      + Mouse wheel or move up and down to browse the shapes
        + Apply or Auto Apply
  + toggle draw mesh outline
  + improved scale/rotate drones
  + improved selection of point modulators
  + improved selection of sine mixer bookmarks
  ! fixed modulate checkbutton set when Menu > Ranges > Toggle !
  ! fixed window resize throws off mouse cursor on microtonal keyboard !
  /!/ zooming curve editor when mouse captures are paused does not update visual !

DIN Is Noise 45 @ Chennai, India
  ! fixed internal bug in noise generator !
    + results in improved noise :)
  + keys can trigger notes or noise on keyboard-keyboard
    + ie keys from computer keyboard or MIDI keyboard
    + press ENTER to toggle
  - removed black/white notes display from MIDI keyboard input
    + colored notes displayed instead
  + balls can trigger notes or noise in Mondrian
    + Select balls 
      + and Menu > Balls Triggers Note <> Ball Triggers Noise
      + or press ENTER
      + if there is no selection, all balls will trigger note (default)or noise 

DIN Is Noise 44 @ Chennai, India

  !+! new noise generator in DIN Is Noise!
    + using drone UI
    + choose if a drone drones a pitch or makes noise
      + Menu > Drone Tools > Drone is Drone OR Drone is Noise
        + OR SHIFT + q
      + when a drone makes noise:
        + a low frequency 'drone' makes low frequency noise
        + a high frequency 'drone' makes high frequency noise
        + manipulate drones ie move, modulate, launch, orbit to
          manipulate noises!
        + choose Menu > Editors > Noise Interpolator to
          + edit the noise sample interpolator curve
        
  + use drone pendulum's parameters to turn rows and/or columns
    of a drone mesh into drone pendulums! :)
      + works best when you make all drones of the mesh at the same time
        + so set In seconds to 0
        + and make drones in:
          + ascending or descending rows
          + ascending or descending columns
      + apply to AM BPM and/or FM BPM to turn rows and/or columns of drone
        mesh as drone pendulums!
  
  + flip button to flip start/end bpm of drones in drone pendulum

  + harmonic bookmarks on Sine Mixer
    + click on + to bookmark selected harmonics
    + click on - to delete selected bookmarks
    + click on x to delete all bookmarks
    + click bookmark to select harmonics linked to it
      + SHIFT click to select more bookmarks

  + DIN switches menu to:
    + Drone Params when drones selected
    + Voice when Voice is enabled
    + Ranges when a range is selected

  + new microtonal keyboard shortcuts:
    + SHIFT + f selects range under cursor
    + CTRL + f to switch between change note to note and change note by octave
    + CTRL + v to change both notes (to another note or by octave) of current range
    + CTRL + g to change left note (to another note or by octave) of current range
    + CTRL + h to change right note (to another note or by octave) of current range
    + SHIFT + b to change height of current range
    + CTRL + b to change height of entire microtonal keyboard

  + rearranged menu items on Drone Params
    + brought drone AM depth and FM depth together
    + brought drone AM BPM and FM BPM together
    + moved Rotate and Scale drones to Drone Params tab from Drone Tools tab

  + new ~ checkbutton on all spinners to toggle random increment
    + click > on spinner to edit random increment 
      + in field after ~ label
      + default is -100% to 100% of steady increment ie value in +- field

  + press ESC to abort active octave shift on current instrument

  + press g to toggle draw cursor guide on curve editors
    + useful for aligning curve components
    + activate with keyboard shortcut only, may appear on menu in future

  * improved turn and speed ball operator on Mondrian
    + using new noise / random algorithm!

  * improved bezier curve generation

  * improved expression evaluation in numeric fields

  * improved warper default curves

  * improved waveforms library

  ! fixed bug: DIN may crash when deleting a vertex of curve that has point modulation !
  ! fixed bug: make absolute values of a binaural pair available for editing 
               when selection changed from multiple pairs to one pair. !
  ! fixed bug: num pad + and - to change slit size on Mondrian !
  ! fixed bug: non decaying notes when ball volume < 0 on Mondrian !
  ! fixed bug: in display of Selected Range number on Microtonal Keyboard!
  ! fixed bug: reposition drones when left note of first range, right note of last range changed !
  ! fixed bug: in 2600 patch !
  ! fixed typo: paris instead of pairs in binaural drones instrument !

DIN Is Noise 43 @ Chennai, India
  + move groups of harmonics on sine mixer
    + shift + click harmonic on sine mixer to select / deselect
    + moving one of the selected harmonics moves all the selected harmonics
      'But then one lizard (or iguana) moved, and all moved'
        - VS Naipaul, Among the Believers
      + but shift when moving moves just the selected harmonic
    + all, none, invert buttons for gross selection
  + resize phrase position slider
    + DIN saves/reloads slider 
  + change both notes of selected range using mouse slider
    + Use Menu > Ranges > Change note? > Both
  - removed Change Left note, Change Right note menu items in Menu > Ranges
    + replaced with Change note? Left Right Both menu items
  + scrub / scratch point modulations
    + click on Scrub and move up or down
  + Sync on Point Modulator
    + workflow is
      + select modulations
        + pause
        + sync
        + play
  + voice volume minimum can be < 0 [voice waveform flips]
  + spinner to set absolute drone master volume
    + drone master volume can be < 0 [drone waveform flips]
  - removed mute drones button
      * just spin drone master volume to 0 
  + save/load auto apply state on sine mixer
  + save/load drone selection state
  + save/load drone frozen state 
  + save/load plugins fold state for each curve editor
  + save/load auto select launched drones flag
  + turn on/off UI in all screens, not just in instruments
    * optimised
  + click repeat of Apply button and key repeat of shortcut r for continous apply
    of plugin output to curve
    + useful/interesting when point modulating custom sin/cos/radius curves etc
  + drones per minute is floating point instead of integer
  * improved phrase handling for voice on microtonal keyboard
  * improved plugin browser on curve editors
  * changed default drone handle size to 3
  ! fixed bug: turning on/off ui on point modulator may crash DIN42 !
  ! fixed bug: pressing shift/ctrl effected selection box when not previewing mesh !
  ! fixed bug: changing parameters on Number plugin didnt update preview !
  ! fixed bug: frozen drones saved to disk thawed on reload !
  ! fixed bug: didnt save/load turns on spiraler !
  ! fixed bug: rotate/scale of drones happened in UI loop, now moved to audio loop !
  ! fixed bug: stopped gravity editing when menu displayed !

DIN Is Noise 42 @ Chennai, India
  Dedicated to Dad, Mr Narasimhan Sampath [06-10-1943 >> 16-04-2019]
  +++ Point Modulator on all curve editors, new for DIN42 +++
    + modulate any point on any bezier curve along horizontal (ie X) and 
      vertical (ie Y) axis over BPM
      + eg., when done on a waveform, leads to timbral modulation, look @ the FFT :)
          + try on shapeforms too!
          + try on decays, delay feedback and volumes, pitch and range modulation 
            curves etc etc!
    + to modulate, click on the + button on the Point Modulator panel
      + now pick a point on curve (any vertex or tangent) to modulate
        + DIN draws a dotted line joining a state button to the point on curve
          + nothing is modulating yet
        + change X depth to modulate the point along horizontal axis over BPM
          + the point should start moving along the horizontal
        + change Y depth to modulate the point along vertical axis over BPM
        + change X BPM and Y BPM to change the rate ie speed of modulation of the point
        + when more than one point is modulating,
          + click on None to deselect all modulating points
          + click on a point's state button to change modulation params for just that point.
            + use the X depth/BPM, Y depth/BPM spinners to change the params
          + use All, None and Invert to select more than one state button and thus more than
            one point.
            + use the X depth/BPM, Y depth/BPM spinners to change params for selected points 
    + press play button to toggle point modulation of selected points
    + press kill button to kill point modulations of selected points
    + point modulations are saved [and loaded] to [from] disk :)

  +++ Captures - mouse capture panel on all curve editors, new for DIN42 +++
    + play, pause and kill captures
    + To record a mouse capture, position mouse on the curve item
      that you want to assign the mouse capture, choose Menu > Mouse capture > Start,
      move mouse as you please and click or ESC to finish.
    + To assign the mouse capture, choose Menu > Mouse capture > Assign and pick
      the curve item to assign the mouse capture.  You can assign the same mouse
      capture to other items by repeating the same.
    + mouse capture is *not* saved to disk [maybe in a future release]

  + Overlay pitch and volume distrubution on microtonal-keyboard:
    + Menu > Misc > Overlay pitch distribution
    + Menu > Misc > Overlay volume distribution
    + Pixels Per Level
      + more pixels, less acurate rendering of distribution but faster
      + less pixels, more accurate rendering of distribution but slower
      + Default is 5 pixels
  + Mirror whole curve or curve vertex/tangent about Horizontal and Vertical axis
  + Swap 2 curves [experimental, only works on editors with 2 curves]
  - removed Close button from Menu

DIN Is Noise 41 @ Chennai, India
  +++ non-linear pitch and volume distributon on all microtonal-keybard ranges +++
    ! until DIN 40, pitch increased steadily from left note to right note on all 
      microtonal ranges !
    ! until DIN 40, volume increased steadily from the bottom to the top on all 
      microtonal ranges !
    + in DIN 41, edit the pitch distribution curve to non-linearly change the pitch 
      when going left to right in a microtonal range. 
        + Menu > Editors > Range Pitch & Volume
    + in DIN 41, edit the volume distribution curve to non-linearly change the volume 
      when going from bottom to top of a microtonal range.
        + Menu > Editors > Range Pitch & Volume
    + Voice and Drones all pick up changes to range width+height, range pitch+volume curves
    + Press INSERT on microtonal-keyboard to toggle overlay of volume distribution
    + Press END on microtonal-keyboard to toggle overlay of pitch distribution

  +++ drone pendulum +++
    + inspired by wave pendulum toy/experiment from physics
    + Menu > Drone Tools > Create drone pendulum
      + click and drag a box to create drone pendulum
      + spacing determines the number of drones made along orientation
        + low spacing = large number of drones
          high spacing = small number of drones
      + orientation
        + vertical
          + frequency changes more than volume
            + change FM depth, bpm for interest
        + horizontal
          + volume changes more than frequency
            + change AM depth, bpm for interest

  + press SHIFT or CTRL to square the selection box
    + SHIFT chooses lesser of width or height
    + CTRL chooses greater of width or height to square mesh
    + squaring useful when creating mesh and drone pendulums
  
  + ESC or Right click from Settings screen to come back to previuos screen 

  - removed F8 = mouse capture assign and F9 = mouse capture delete
    - Please use Menu > Tools > Mouse capture > Assign or Delete

  ! FIXED: curve picker display !
  ! FIXED: menu items on curve editor !

DIN Is Noise 40 @ Chennai, India.
  + Wrap checkbutton on Sine Mixer to toggle wrapping of harmonics when sliding them
      - always wrapped harmonics until DIN 39

  + defered creation of drones of the drone mesh
    - all drones were created at the same time until DIN 39
    + affects their phase so affects their visual modulation 
      + visible and audible when you do FM / AM
    + different creation schemes:
      + ascending/descending rows and columns, random, nearest/farthest from various
        end points, random and custom point 

  + set width and height of all microtonal ranges by sculpting curves range-width 
    and range-height in the new Range Width & Height editor
    + invoke editor with Menu > Editors > Range Width & Height
      + useful to overlay the microtonal keyboard when on the editor
        + press o or Menu > Tools > Overlay Instrument
    + sculpting the curves is another way to do mircotonal range modulation :)
      ! automate by assigning mouse capture to points !

  + randomize increment on a value spinner:
    + click on right arrow beside the value field to reveal ~ checkbutton
      + turn increment randomization on/off by clicking on the ~ checkbutton 
        + default randomisation of increment is -100% to 100% ie no 
          increment at all to twice the increment
            + change this value in the field to change the randomisation 
              eg., 0 100 means increment to twice the increment

  + direction indicators on mouse slider
    + move along indicated directions to change parameter

  + new checkbox Overlay Instrument on all curve editors
    + overlays the current instrument on the curve editor

  * changed widgets on the keyboard-keyboard:
    * voices attack time, decay time 

  * can now constrain drone scaling (Menu > Drone Tools > Scale) to horizontal or vertical axis.
    * default is uniform scaling along both horizontal and vertical axes
    * press SHIFT to scale selected drones along horizontal only
    * press CTRL to scale selected drones along vertical only

  ! FIXED set drone master volume increment to 0.1 !
  ! FIXED countries plugin preview !
  ! FIXED drone mesh preview display !
  ! FIXED fold arrow button color on oscilloscope !
  ! FIXED no pitch/volume display when cursor on widgets on microtonal keyboard !

DIN Is Noise 39 @ Chennai, India.
  + change left or right note of the current microtonal range
    + change to another note of the scale or any note in tuning
    + using Menu > Ranges > Change left note
    + using Menu > Ranges > Change right note
    + use range picker to pick the microtonal range
  + browse selected drones to pick one 
    + DIN hilites picked drone with green cross hairs
    + press LEFT ARROW to pick previous drone
    + press RIGHT ARROW to pick next drone
    + when you reach the end, DIN picks all drones in the original selection.
      + can keep browsing if you like
    + you can apply any drone operation to this picked drone 
      eg., launch/stop launch drones from this drone and so on.
    + aliter Menu > Drone Tools > Browse Drone
  + snap selected drones to notes
    ! DIN snapped all drones to notes until version 38a !
    + allows for some drones to snap to notes and others to roam free
    + select a bunch of drones and
      + k to toggle snap drones to notes
      + SHIFT + k to snap drones to notes
      + CTRL + k to unsnap drones from notes
      + aliter Menu > Drone Params > Snap drones to notes
        + Set, Unset and Toggle
    + use Snap Left and Snap Right to determine how drone snaps to left or
      right note of the microtonal range:
        + eg., if Snap Left = 0.25 and Snap Right = 0.75 drone snaps to left note
        if the drone is in first 25% of microtonal range's width, snaps to the right 
        note if its beyond 75% of the microtonal range's width. 
        + eg., if Snap Left = 0.5 and Snap Right = 0.5 too, drone snaps to left note
        for the first 50% of the microtonal range's width and then snaps to the right
        note for the remaining 50% of the microtonal range's width ie the drone always
        snaps to a note.
  + modulation now affects velocity vector of selected drones 
    + select a bunch of drones and
      + v to toggle
      + SHIFT + v to let modulation affect velocity vector of selected drones
      + CTRL + v to not let modulation affect velocity vector of selected drones
      + aliter Menu > Drone Params > Modulation Affects Velocity
        + Set, Unset and Toggle
  + added Curve Mix Samples to specify Curve Mix Time in samples
    + allows for very small curve mix times
    + changing this value changes Curve Mix Time and vice-versa.
    + also changes when sample rate changes
  + turns is now floating point (was integer) in spiraler
    + allows for both partial and complete turns eg., 1, 1.25, 1.5, 1.75, 2 turns.
  + press l to toggle label vertices on any curve editor
  + RPM increment is 1.0 on curve editor
  * default Curve Mix Time is now 1 seconds
  * improved Mirror style of snap drones to notes
  * improved drone pitch / volume tagging
  ! OPTIMISED plugins circler, rose milker, spiraler, sine mixer, lissajous !
  ! FIXED select attractors from any selection of drones !
  ! FIXED Record and Clear Phrase in Menu > Voice !
  ! FIXED labeling of notes on Mondrian when tuning changes !
  ! FIXED Drone Master Volume display !
  ! FIXED Gravity tracks snapped x of drone instead of absolute x of drone !
  ! FIXED default modulation width for all ranges is 0 !

DIN Is Noise 38a @ Chennai, India:
  ! fixed pitch/volume of suitable drones when range left, right or 
    height is changed

DIN Is Noise 38 @ Chennai, India
  * plugins window on curve editors folded on DIN start.
  + snap drones to notes styles:
    + free - any value on snap left, right
    + lock - snap left equals snap right
    + mirror -
      + if snap left = i, then snap right = 1 - i
        eg., snap left = 0.25, snap right = 0.75
  + cosmetics: edit drone arrow depth and width.
  + full microtonal range modulation on microtonal-keyboard
    + modulate width and height of a microtonal range over BPM.
    + start/stop/pause-resume/toggle of modulation
    + affects voice and drones
      + because the pitch/volume the voice and drones point to modulates
  + edit height of every microtonal range
    + or edit height of all ranges
  + set curve mixing time to audio buffer time on Settings screen.
  + shift + i on mondrian toggles label pitch/volume of notes

DIN Is Noise 37a @ Chennai, India on September 21, 2018:
  on microtonal-keyboard:
    + SHIFT + l to select all drone launchers
    + SHIFT + j to show/hide pitch volume info of drones
    -> moved some menu items from Drone Tools to Drone Params
    -> moved some menu items from Drone Params to Drone Tools
    + modulation affects velocity vector checkbox
    + 2 styles of bounce for drones reaching the bottom of the microtonal keyboard:
      + forward - like a bouncing ball
      + back - inspired by alpha particles - Search Rutherford Scattering on Wikipedia.
    + save/restore of snap to notes
    + reset selected drones' velocity vector to vertical
    + reset gravity vector
      + to pointing down
      + optionally keep last size
    ! fixed adjust range left / right / both to respect limits !
    ! fixed divide by 0 bug on bouncing drones !
  + taller levels on Sine Mixer plugin for finer control of harmonics levels
  * moved FFT display to lower corner of waveform editors
  * improved the bezier curve solvers
  + DIN uptime listed in log

DIN Is Noise 36 @ Chennai, India
  + Sync button on settings screen sets same L and R delay times 
  + settings screen now on curve editors too
  + mouse wheel on value field of a spinner increments / decrements value
  + velocity heading faces direction of modulation when drone isnt tracking, orbiting
  + adjust board height, range left, right & both using mouse slider from Menu > Misc
    or moving under gravity
  + << or >> to shift harmonics on sine mixer. results in apply
  + change height of sine mixer by moving the little button to the right of all harmonics
    + allows for finer change of harmonic level
  + adjust amount that snaps drone to the left or right note of microtonal range
    + default snap to left is 0.5
      + ie drone snaps to left note if its at <= 0.5 of the range
    + default snap right is 0.5
      + ie drone snaps to right note if its at >= 0.5 of the range
  ! fixed +- position on spinner ui control
  ! fixed voice, delay, gater buttons response when clicked during fade in/out
  ! fixed drone response when deleted but is actually fading in 
  * rearranged menu items: am depth/bpm and fm depth/bpm on Voice and Drone Params, 
    velocity/rotate-velocity/acceleration on Drone Tools

DIN Is Noise 35 @ Chennai, India
  + Major expansion to Binaural drones instrument
    + See new docs at https://dinisnoise.org/docs/ for details
  + binaural drones now saved with their phase at exit to reproduce sound on restart.
  ! fixed crash when ball deleted and auto split box wants to split box that had deleted ball
  ! fixed memory leak when a binaural drone pair was removed
  * mark if L or R channel is stronger on oscilloscope with a @

DIN Is Noise 34 @ Chennai, India
  + Pick a box that has a ball to:
    + Auto split box,
      + can be used to trap a bouncing ball
    + Auto delete box
  * Slit operations 
    NEW! F11 to Remove slits on a box that has a ball
    NEW! F12 to Remove all slits
  + Label pitch and volume on:
    + Mondrian
    + Microtonal-Keyboard:
      * click on i to label pitch/volume on the board and cursor
      + click on j to label pitch/volume of the drones
  + Change Drone Rise (attack) and fall (decay) times:
    + When drone is made or launched:
      + A rise ie attack time is randomly chosen between Drone Min Rise Time 
        and Drone Max Rise time.
    + When a drone is deleted or killed:
      + A fall time is randomly chosen between Drone Min Fall Time 
        and Drone Max Fall time.
    + Change times on the Settings screen
  ! fixed ie disabled moving the oscilloscope when menu is showing

DIN Is Noise 33 @ Chennai, India

+ 5th ball operation :)
  + Transform
    + transforms a ball into an another type of ball or a random type
      + so a bouncer can become 
        + a healer
        + a wrecker or
        + a random type ie remain a bouncer, become a healer or a wrecker
      + a wrecker can become
        + a healer
        + a bouncer or
        + a random type ie remain a wrecker, become a healer or a bouncer
      + and a healer can be come
        + a wrecker
        + a bouncer or
        + a random type ie remain a healer, become a wrecker or a bouncer
      + the transform rules are global ie same for all balls
    + does it Every few seconds
+ Mouse wheel to scroll menu items

DIN Is Noise 32 @ Palazzolo Acreide, Italy

+ 4 new ball operations in the Mondrian instrument

  + Apply per ball
    + eg., different balls, different operations

  + Turn
    + randomly turns a ball clockwise or anti-clockwise by some degrees
    + does it Every few seconds
    + Clockwise is max degrees the ball will turn clockwise
    + Anti-clockwise is max degrees the ball will turn anti-clockwise 
    + Sync keeps Clockwise and Anti-clockwise same for turning equally likely in both directions

  + Speed
    + randomly speeds up or slows down a ball
    + does it Every few seconds
    + Brake = how much to slow down each time
    + Accelerate = how much to speed up each time
    + Sync keeps Brake and Accelerate same for equally likely speed changes

  + Teleport
    + randomly moves the position of a ball by some distance
    + does it Every few seconds
    + upto a Maximum distance

  + Clone
    + clones the selected ball 
    + Offsets it away from the parent
    + Every few seconds
    + upto Max Clones
    + when turned on, Clone can clone too 
      + careful, because clone's clone will clone too
        + and its clone will clone too
          + and on
            + and on
              + and on!
    + Max balls keeps cloning under control
      + Or select all balls, wait for the new clones to appear and delete selection.
        + this leaves just the new clones
          + but labor intensive :)

  ! Use Turn and Speed together to make insect / worm like crawling movements :)
    + "Go to the ant, thou sluggard; consider her ways, and be wise.."
      +  Proverbs 6:6-8, The Bible.

! Fixed bug on auto-split box which created full boxes instead of splitting the box when no notes are available to split on.

+ Turn On / Off drawing of ball Position, Heading and Trails

+ Theming of GUI possible by editing globals file
  + on Windows its factory/globals
  + on GNU/Linux its usually /usr/local/share/din/factory/globals
  + on Apple Mac OS X its Applications/DIN Is Noise.app/Contents/Mac OS X/factory/globals

+ PREFIX variable on GNU/Linux allows correct installation on directories other than /usr/local

! DIN Is Noise 31 @ Chennai, India

  ! RELEASE WITHDRAWN, USE DIN Is Noise 32 !

  + 3 new ball operations

    + Apply per ball
      + eg., different operations on different balls 

    + Turn
      + randomly turns a ball clockwise or anti-clockwise by some degrees
      + does it Every few seconds
      + Clockwise is max degrees the ball will turn clockwise
      + Anti-clockwise is max degrees the ball will turn anti-clockwise 
      + Sync to keep Clockwise and Anti-clockwise same to turn equally likely in both directions

    + Speed
      + randomly speeds up or slows down a ball
      + does it Every few seconds
      + Brake + how much to slow down each time
      + Accelerate + how much to speed up each time
      + Sync to keep Brake and Accelerate same for equally likely speed changes

    ! Use Turn and Speed together to make ant / worm like crawling movements :)
      + "Go to the ant, thou sluggard; consider her ways, and be wise.."
          - Proverbs 6:6-8, The Bible.

    + Teleport
      + randomly moves the position of a ball by some distance
        + does it Every few seconds
        + upto a Maximum distance

  + Turn On / Off drawing of ball Position, Heading and Trails

  + Theming of GUI possible by editing globals file
      + on Windows its factory/globals
      + on GNU/Linux its /usr/local/share/din/factory/globals
      + on Apple Mac OS X its Applications/DIN Is Noise.app/Contents/Mac OS X/factory/globals

- DIN Is Noise 30
  + auto split boxes in mondrian
  + auto delete boxes in mondrian
  + can do both at the same time
  + browse selected balls using arrow keys

  * optimised note and N x N grid creation on Mondrian
    * one box per frame
  * optimised delete all boxes
    * one box delete per frame

  + warper plugin maps bounding box of input curve to target
    + instead of mapping on XY space to another
      + works better for classical as well as shapeforms

  * 9, 0 to decrease/increase points of note polygon
  * SHIFT + 9, 0 to decrease/increase radius of note polygon

  + sine/cosine editor has plugin support

  * reorganised countries 
  * reorganised waveforms library

  + can make install on GNU/Linux

- DIN Is Noise 29 is Free Software
  - under GPL 2.0 for GNU/Linux
  - released in Chennai, India on September 8, 2017

  * Please dont use this code to build binaries for Windows or Mac OS X *
  * I sell licenses for those binaries to barely support myself *
  * Please consider funding my independent work on DIN Is Noise > http://dinisnoise.org/fundin/ *

- !fixed crash! when moving whole curve on the curve editor
  - introduced in DIN28. not in earlier versions.
- !new! mouse slider 
  - activate by just clicking on a spinner's name.
    - most spinners everywhere qualify:
      - menu, plugins 
        - even settings screen
          - try changing the key note while making sounds on your chosen instrument :)
            - works well on Microtonal Keyboard & Mondrian
      - note: some spinners are disabled, nothing happens when you click them.
  - change the value of the spinner by simply moving the mouse along the mapped axis: X or Y [can be both too, see below]
  - you can attach multiple spinners to the mouse slider and change the value of multiple parameters at the same time!
    - just shift+click to add a spinner to the mouse slider
      - shift+clicking doesnt activate the mouse slider yet.
    - the attached spinner turns green
    - detach the already attached spinner by shift+clicking on it again.
      - the detached spinner reverts to red
    - to launch the slider just click ie dont press shift on the last spinner
    - with multiple spinners on the mouse slider, movement along both X and Y can change the values of appropriately mapped spinners.
    - to stop the mouse slider just click or press ESC.
    - changing the axis assigned to a spinner is not possible in this release 
  - things to try:
    - make a group of drones
    - select
      - FM and AM depth spinners or
      - FM and AM BPM spinners
      - or all of them at the same time :)
      - FM mapped to X
      - AM mapped to Y
      - move along X, Y to do visual drone FM, AM!
    - select these drones and launch drones from them: Menu > Drone tools >Launch
    - select Change velocity and Rotate velocity spinners
      - move along X to rotate velocity
      - move along Y to increase/decrease velocity
      - loud crazy action :)
    - play with drone life times:
      - Menu > Drone tools > Select launchers
      - Menu > Drone parameters > Change lifetime
        - move in X!

August 1, 2017:

! Released DIN Is Noise 28 as Free Software !

+ freeze / thaw moving drones

  - j to freeze/thaw selected moving drones
    - or Menu > Drone Tools > Freeze, Menu > Drone Tools > Thaw
    - tip: try on visually modulating drones, combine with k ie snap drones to notes :)
  - shift + h to toggle auto-select launched drones 
    - for easy freeze/thaw of launched drones
    - tip: select the launchers first (Menu > Drone Tools > Select launchers) and then shift + h.
    - possible from menu too.

+ animated slits in Mondrian
  - select slits
    - g to toggle selection target between balls and slits
      - or from menu, change Selection Target
    - other selection short cuts same as short cuts for ball selection
      - l - to select all slits
      - k - to select slits of box
      - i  - to invert selected slits
      - n - to clear selection
      - when no slits are selected and an operation requires a slit [say, toggle animation or change slit open/close time], DIN selects slit under cursor.
      - all possible from menu
  - animate slits
    - h to toggle animation
    - INSERT / DELETE keys to decrease/increase slit open/close time
    - all possible from menu too.

* keyboard shortcut changes to microtonal-keyboard
  - l, i targets drones on microtonal-keyboard just like l, i targets balls or slits in Mondrian. 
  - l to select all drones
    - l was orbit selected drones
      - now its F4
  - i to invert selected drones
    - i was pitch/volume info display 
      - now its shift + i
      - or click i on bottom of microtonal-keyboard
  - j to toggle freeze/thaw selected moving drones
    - or Menu > Drone Tools > Freeze, Menu > Drone Tools > Thaw
  - k to snap drones to notes
    - was Show Anchors, now from Menu > Drone Parameters only

* just click + move mouse not drag to edit vertex/tangent in curve editors

* just click + move mouse not drag on all sliders and sine mixer levels

* fixed ball color due to Mondrian > Menu > Clear Modulations

* click + move mouse not drag to move blue triangle to set sustain on keyboard-keyboard attack

* rearranged microtonal-keyboard menu
  - new Voice menu
  - new Drone_Tools menu
  - new Drone_Parameters menu
  - new select launchers command on menu to select drone launchers

+ vanity command uptime to print the amount of time that DIN has been running
  - eg., 1 hour 29 minutes 58 seconds

+ new patch called harmonics to animate harmonics of sine mixer
  - load-patch harmonics
  - set harmonics {0 1 2 3} ;# first 4 harmonics will be animated
    - set harmonics [get-nums 0 19] ;# all harmonics
    - set harmonics [get-nums 1 19 2] ;# odd harmonics
    - set harmonics [get-nums 0 19 2] ;# even harmonics
  - set duration 0.1 ;# 1/10th of second
  - set amount 0.01 ;# amount to animate each chosen harmonic every duration
  - set anim 1 ;# 1 - start anim, 0 - stop anim
  - MIDI sliders 1-20 assigned to 20 harmonics 

+ set-var location { @ Place, Country}
  - eg., set-var location { @ Chennai, India}
  - eg., set-var location { @ Medellin, Colombia}

------------------------------------------------------------------------------

March 24, 2017:
  + Released DIN Is Noise 27 as Free Software
  + Release notes: https://workflowy.com/s/JbPNTNeifj
December 25, 2016:
  + Released DIN Is Noise 26 as Free Software.
  + Full list of changes coming soon.
September 13, 2016:
  + Released DIN Is Noise 25 as Free Software
  + See release notes for DIN Is Noise:
    https://workflowy.com/s/JbPNTNeifj
November 22, 2015:
  + Released DIN Is Noise 10 as Free Software
....
....
....
May 16, 2013:
  + 'i'm still evaluating.'
  + correct update of show pitch/volume on microtonal-keyboard checkbox
  + L delay duration field to change left channel delay duration
  + R delay duration field to change right channel delay duration
April 6, 2013:
  + added a button to fold/unfold the console
  - removed keyboard shortcuts for changing attack_time, decay_time
  ! parameters are always visible on the keyboard-keyboard

March 6, 2013:
!!! wip din-5.0 !!!
FIX order of init of variables
FIX decay_start_volume init on keyboard-keyboard
NEW authors_note as eval notice
FIX remove inital mesgs to console from din.cc

October 1, 2012:
!!! din-4.3 !!!
!!! factory reset required for upgrade from *any* version:
    see http://dinisnoise.org/faq/#factory !!!

NEW filled_button - a button that is filled with some color (part of
    GUI library) - used on parameter sliders (see below)
NEW created parameters dialog for keyboard-keyboard. visually edit
    attack time, decay time, pitch bend & note volume!

    to operate slider, left-click on the slider and mouse-move to
    change value
NEW right-click on parameters titlebar and mouse-move to move the dialog.
    right-click again to drop!
NEW min/max dialog for editing parameter limits.
    click on the filled button at the left of a parameter slider to
    show/hide min/max dialog
NEW set-var commands for din variables attack_time, decay_time,
    pitch_bend and note_volume also updates the GUI.
    eg., set-var attack_time 0.15 ;# updates attack_time slider
         set-var decay_time 5 ;# updates decay_time slider
         set-var pitch_bend 50 ;# updates the pitch_bend slider
NEW on exit, din waits until all launched keyboard-keyboard notes have faded out
NEW tweaked parameters of keyboard-keyboard and gave better defaults.
BUG resize screen and parameters dialog may disappear; workaround:
    resize to last good size.
FIX click or ALT+F4 on window close button doesnt quit din. must quit
    thru ESC, ESC again.

September 25, 2012:
!!! din-4.2.1
!!! factory reset required for upgrade from *any* version: see http://dinisnoise.org/faq/#factory !!!
FIX phrasor continues playing on microtonal-keyboard when instrument is keyboard-keyboard
September 21, 2012:
  !!! din-4.2
  !!! factory reset required for upgrade from *any* version:
      see http://dinisnoise.org/faq/#factory !!!
  NEW voice, gater & delay fade in/out at start, during operation & at exit.
  NEW auto-fold the console during verbose parameter change (FM/AM depth/bpm etc)
  *** tweaked the compressor & delay feedback/volume curves for better defaults
September 18, 2012:
  !!! din 4.1 !!!
  !!! factory reset required for upgrade from *any* version:
      see http://dinisnoise.org/faq/#factory !!!
  NEW Compressor checkbox on microtonal-keyboard & keyboard-keyboard
  NEW show names of donors to the DIN is Noise project on the ticker

September 2, 2012:
  !!! wip: 4.1 !!!
  FIX font definition with y > 0 for correct positioning of ui elements like buttons, checkboxes etc.
  FIX pushed the ticker down to the bottom
  FIX start resolution is 800 x 600 instead of 640 x 480. done in 4.0, forgot to note in CHANGELOG
August 31, 2012:
  !!! din-4.0 !!!
  NEW Donate button and a ticker message - sorry folks, lost my patronage and my situation is dire :(
  FIX click and release on button triggers click on the button instead of just click
August 30, 2012:
  !!! wip: din-4.0 !!!
  NEW drones fade in and out on din load/exit!
  NEW drones fade in on creation!
  NEW drones fade out on delete!
  NEW visually move the sustain on attack editor on keyboard-keyboard
  NEW sustain saved with attack curve library
  FIX proper onion skin toggling on all editors
August 8, 2012:
  !!! wip: din-4.0 !!!
  FIX notes that were bent stay bent when new note is launched
  NEW save/reload mouse position on keyboard-keyboard for better mouse based pitch bending
  NEW save/reload of number of trail points & handle size of all drones
May 14, 2012:
  !!! wip: din-3.6 |||
  FIX data files stored in /usr/local/share/din instead of /usr/local/var/din
  NEW change the trail size of each drone (+ and -), selected drones or all drones
  NEW change size of a drone (9 & 0), selected drones or all drones
May 08, 2012:
  !!! din-3.5 !!!
  +++ save/load variable delta_bpm
  *** INTERNAL: moved SAMPLE_DURATION calculation to audio_out::set_sample_rate
  *** INTERNAL: revised console.h/.cc
  *** INTERNAL/FIX?: moved console text color constants to main.cc
  FIX MIDI connnected to MIDI connected in audio.cc - thanks Ian Morrison
  NEW drone trails! press + and - on microtonal-keyboard to increase & decrease trail length
  NEW drone handle size - press 9, 0 on microtonal-keyboard
  NEW press o on curve editor to overlay din microtonal-keyboard or keyboard-keyboard on the curve editor
        useful for editing drone modulation curves and watching the drone modulation shapes change
  FIX memory leak on keyboard-keyboard when fully decayed notes are removed
  NEW mouse driven pitch bend on keyboard-keyboard! move mouse either side
      of dotted vertical line to pitch bend.  pitch bend applies to
      all notes. to zero pitch bend bring mouse back to the dotted
      line.  change pitch bend amount from command mode:
          set-var pitch_bend 100 ;# upto 100 hz
          sv pb 100 ;# short form

      mouse driven pitch bend overrides MIDI driven pitch bend. use one or the other :)

  NEW variable trail_length for drone trail lengths:
        set-var trail_length 10 ;# trail has 10 points
        sv tl 10 ;# short form

      can also be set from the ui as listed above
  NEW din.desktop and din.png files to help packagers (look in ~/.din/data)

April 17, 2012:
  !!!!  din-3.0 !!!!
  !!!!  factory reset required for upgrade from *any* version: see
        http://dinisnoise.org/faq/#factory !!!!
        +++ visual drone modulation +++
          +++ j - toggle modulation target: voice or drones
          +++ y, u - decrease/increase FM depth of selected drones or all drones
                     or the lead voice when there are no drones.
          +++ r, t - decrease/increase AM depth of selected drones or all drones
                     or the lead voice when there are no drones.
          +++ F7, F8 -  decrease/increase FM bpm of selected drones or all drones
                        or the lead voice when there are no drones.
          +++ F9, F10 - decrease/increase FM bpm of selected drones or all drones
                        or the lead voice when there are no drones.
          +++ press 3 on microtonal-keyboard to edit the drone modulation curves
              pink for AM
              cyan for FM
          +++ automagically save and load modulation on drones
        +++ k - toggle drone anchor drawing
        +++ smoother increase / decrease of drone master volume

March 4, 2012:
  !!!!  din-2.0 !!!!
  !!!!  factory reset required for upgrade from *any* version: see
        http://dinisnoise.org/faq/#factory !!!!
  +++:  quantise bezier curve pattern generated by morse-code
        command to n beats:

          morse-code sos ;# quantise to 1 beat (default)
          morse-code sos 2.5 ;# quantise to 2 and half beats
          mc sos 3 ;# short form; quantise to 3 beats

          ;# the bezier curve pattern is on copy curve
          ;# just paste (LCTRL + v) on any curve in any curve editor
  +++:  detect when a MIDI device connects or disconnects with din
  +++:  press keys on the MIDI keyboard and launch notes. support from
        C-1 (MIDI note on # = 0) to G9 (MIDI note on # = 127).
  +++:  support for retuning intervals, velocity curves and pitch
        bending.
  fix:  fixed decay failure when note volume at start of decay is -ve

February 11, 2012:
  !!!!  din-1.9.5 !!!!
  !!!!  factory reset required for upgrade from *any* version: see
        http://dinisnoise.org/faq/#factory !!!!
  fix:  shoot of volume when sustain is larger than x value of last vertex on attack
        curve!
  +++:  add new variable auto_connect_outputs to control if din will
        auto connect its output to system audio outputs.  yes by default.

          set-var auto_connect_outputs 1 ;# auto connects next time din starts
          sv aco 0 ;# short form; disables auto connect
  ***:  reworked (yet again) the result handling of Tcl interpreter

January 15, 2012:
  !!!! din-1.9.4 !!!!
  ***: changed curve-value command to retain existing x or y values of a vertex or tangent position.
  ***: rewrote the result handling of Tcl interpreter
December 22, 2011:
  !!!! din-1.9.3 !!!!
  !!!!  factory reset required for upgrade from *any* version: see
        http://dinisnoise.org/faq/#factory !!!!
  +++:  new changer patch to automagically change the key of din every
        n seconds
  fix:  fixed Bus Error / Segmentation fault due to bad result clearing
        in the  Tcl interpreter.
December 08, 2011
  !!!!  din-1.9.2 !!!!
  !!!!  factory reset required for upgrade from *any* version: see
        http://dinisnoise.org/faq/#factory !!!!
  fix:  size of boxes in keyboard-keyboard is constant irrespective of
        note volume
  +++:  added new variable delta_time
          set-var delta_time 0.1 ;# 1/10 sec delta
        delta_time is used for changing attack and decay time thru their
        keyboard short cuts ie attack time & decay time change in
        delta_time steps.

November 27, 2011:
  !!!! din-1.9.1 !!!!
  !!!! factory reset required for upgrade from *any* version: see http://dinisnoise.org/faq/#factory !!!!
  fix: version number on title bar matches version number of din.
  fix: immediately insert vertex when there is only one curve in a curve editor
  fix: immediately draw scratch curve when there is only one curve in a curve editor
  fix: doesnt enter command mode when ALT + TAB is pressed
  ***: changed name of din board to microtonal-keyboard
  +++: new keyboard short cuts for attack time & decay time on keyboard-keyboard
  +++: f11, f12 to change octave shift bpm on microtonal keyboard & keyboard-keyboard
  +++: SPACE to toggle delay on keyboard-keyboard
  ***: changed waveform of keyboard-keyboard from sine to the waveform on microtonal-keyboard.
  ***: LALT -> SPACE on sine composer to avoid clash with ALT + TAB
November 16, 2011:
  !!!! din-1.9 !!!!
  !!!! factory reset required for upgrade from *any* version: see http://dinisnoise.org/faq/#factory !!!!
  fix: disabled exit Tcl command that quits & crashes din
  fix: disabled application of sine harmonic composer output to non waveforms (ie gater patterns, fm/am patterns etc)
  +++: added 33 new Bezier curve waveforms to the waveforms library
  +++: added display of Fast Fourier Transform (FFT) of Bezier curve waveforms
  +++: added display of samples for 2 cycles of a waveform at a particular pitch
  ***: labelled the octave shift patterns & added a new octave shift pattern (snap-4th)
  ***: can now toggle sine harmonic composer, fft and samples display (see curve_editor.hlp) on waveform editors
November 6, 2011:
  !!!! din-1.8.6 !!!!
  !!!! factory reset required for upgrade from *any* version: see http://dinisnoise.org/faq/#factory !!!!
  fix: saved & restored note-volume
  +++: separate waveform (ie oscillator) for voice on din board & voices on keyboard-keyboard
  +++: added new waveforms to library. beziered pulse (with different duty cycles) & saw waveforms
  +++: added attack & decay patterns library
  +++: midi clock sync & midi start messages syncs bpm components
  ***: optimised solver (see solver.cc)
October 29, 2011:
  !!! din-1.8.5.0 !!!
  !!! factory reset required for upgrade from *any* version: see http://dinisnoise.org/faq/#factory !!!
  +++ keyboard-keyboard
    press a key to play a note
      keys of the computer keyboard mapped to notes of the scale over a
      range of 3 octaves
  *** reassigned curve editors for keyboard-keyboard
  !fix! bezier curve solver returns upper y when slope is infinity (returned lower y prior)
October 5, 2011:
  !!! din-1.8 !!!
  !!! factory reset required for upgrade from *any* version: see http://dinisnoise.org/faq/#factory !!!
  *** optimised visible range calculation when scrolling on din board
  +++ added shrutis.tuning -- divides the octave into 22 intervals
      based on the Indian classical music tradition.
        tuning set shruti ;# load shruti tuning
  +++ color coded text messages to the terminal.
  --- removed unlimited resonators due to complexity in editing & management;
      now there is only 1 oscillator ie waveform to voice the lead sound.
  --- removed channels response due to complexity in editing & management
      volume of waveform is determined by height of the mouse in playing area -
      @bottom volume is 0; @top volume is wave_volume (see variable wave_volume below)
  +++ added variable wave_volume to set waveform volume ie oscillator volume:
    set-var wave_volume 0 ;# mutes voice (also by pressing SPACE on din board)
    set-var wave_volume 1 ;# max volume - will be *very* loud
    set-var wave_volume 0.125 ;# default volume
    set-var wave_volume 2.8 ;# crazy volume accepted (ie not clipped)
    set-var wave_volume -1 ;# negative volume accepted but will invert waveform
  --- removed strength & channel editors due to removal of resonators & channels response concepts.
  *** changed curve editor assignments due to removal of above editors
      press F1 on din board to see new assignments
  --- removed stereo gaters due to complexity in editing & management.
      now there is just 1 gater (called gr) applied to L & R
  *** the lead voice is now mono
  *** the drones have always been mono
  *** the delays remain stereo
September 8, 2011:
  !!! din-1.7.3 !!!
  !fix! segfault due to undefined order of initialisation of global variables on some versions of g++.
August 23, 2011:
  !!! din-1.7.2 !!!
  *** revamped start-end patch to support multiple MIDI #CC assignments
    *** in command mode, type help start-end or read the file ~/.din/start-end.help.tcl for complete information.
August 19, 2011:
  !!! din-1.7.1 !!!
  !!! factory reset required for upgrade from *any* version: see http://dinisnoise.org/faq/#factory !!!
  +++ parameter limit labelling on all curve editors
  +++ beat/value marker with realtime update on all beat/value editors (gater, modulation & octave_shift)
  *** improved default octave shift pattern
  !fix! recompute visible ranges after resizing a range
August 17, 20011:
  !!! din-1.7 !!!
  !!! factory reset required for upgrade from *any* version: see http://dinisnoise.org/faq/#factory !!!
  *** din audio output range is 0.1 Hz to infinity Hz.
  +++ num-octaves command
    num-octaves 4 ;# span current scale to 4 octaves
    num-octaves 28 ;# span current scale to 28 octaves
    preserves  existing drones & range size mods
  +++ current octave labelling
  +++ cursor info mod (absolute volume printed at all times instead of 0 under playing area and 1 above playing area)
  +++ key note colored green on all octaves
  +++ save/reload drone phases

July 26, 2011:
  !!! din-1.6.6 !!!
  !!! factory reset required if upgrading: see http://dinisnoise.org/faq/#factory !!!
  !fix! more accurate selection of drones (inbox selection instead of radial selection)
  +++ new variable delta_bpm (or dbpm); gater bpm changes by delta_bpm for each f9/f10
    eg., set-var delta_bpm 5 ;# increases/decreases bpm by 5 beats for gaters, am, fm & octave shift modules
  +++ new variable drone_handle_size (or dhs)
    eg., set-var drone_handle_size 14 ;# default is 7; doubles the size of the drone handles
  *** f9/f10 - decreases/increases both gaters bpm at the same time.
    *** lshift + f9/f10 - decreases/increases left gater bpm ie gl
    *** lctrl + f9/f10 - decreases/increases right gater bpm ie gl
  *** improved handling of gater bpm change and fm/am depth change
July 20, 2011:
  !!! din-1.6.5 !!!
  !!! factory reset required if upgrading: see http://dinisnoise.org/faq/#factory !!!
  !fix! segmentation fault when opening window on ATI/Intel graphics cards
  *** sine -> waveform key shortcut changed to left_alt instead of right_control
July 3, 2011:
  !!! din-1.6.4 !!!
  --- removed dependency on SDL
  +++ optimised mouse, keyboard & OpenGL handling using Xlib. din is now an X11 application.
  *** restored drone master volume to default instead of 0 ie quiet
June 11, 2011:
  !!! din-1.6.3 !!!
  !!! factory reset required if upgrading: see http://dinisnoise.org/faq/#factory !!!
  *** optimised mouse capture
  --- removed FFT on waveform; no dependency on FFTWF library anymore
  *** faster startup (no FFT wisdom calculation) & performance (no FFT calculation waveform edit/change)
  !fix! clear drones when scale changes
May 28, 2011:
  !!! din-1.6.2 !!!
  !!! factory reset required if upgrading !!!
  *** silence drones when drones loaded to avoid shock volume change.
  *** fixed volume variable to go from 0 to 1 instead of 0 to 0.99xxx
  *** added interval check (clamps to 1 to 2) in tone ranges
  +++ 2600.patch.tcl : google insight banned words -> morse code -> music.
  --- removed superfluous feedback/volume setting from delay.cc/h code
  !fix! drones not resizing/repositioning when range size changed with LCTRL + mouse move
  *** reordered keyboard handling in din::handle_input (..)
May 16, 2011:
  !!! din-1.6.1 !!!
    !!! factory reset required !!!
    +++ new volume variable accesible in Tcl interpreter; goes from 0 to 1
      *** changed start-end.patch.tcl to allow use of mouse or midi slider to go from start/end and apply command
      +++ added drone_master_volume to possibilities for going start->end
    +++ cursor info display shows frequency & volume
    +++ show_frequency variable change to show_cursor_info
    +++ din irc bot video
May 9, 2011:
  !!! din-1.6 !!!
  +++ new patch start-end to go from a start to end value and execute a command for each inbetween value
    +++ see start-end.patch.tcl & start-end.help.tcl for more information
May 1, 2011:
  !!! din-1.5.9 !!!
  --- gaters command. gaters state stored in din_info
  *** oscilloscope colors saved on exit
  *** renamed short name of some commands
April 17, 2011:
  !!! din-1.5.8.0 !!!
    +++ get-beat <list of components> [all|first|last]
      +++ get-beat fm all returns current beat, first beat and last beat of fm
      +++ get-beat am first returns first beat of am
    *** frequency display switches correctly between phrasor cursor & mouse cursor
    *** lop alias load-patch, lp alias list-patches & asd alias assign-drones in droner
    +++ [ & ] keys for decreasing, increasing phrasor jog
    +++ i to toggle display of frequencies on notes & under mouse cursor

April 6, 2011:

  !!! din-1.5.7 !!!
  +++ timenow variable contains time elapsed in seconds from din start
  +++ loop procedure to run user defined Tcl code at every din loop
    proc loop {} {
      ;# this runs every din loop
      echo $timenow ;# just print number of seconds elapsed since din start on console
    }
  +++ list-patches command to list patches
  +++ load-patch command to load a patch
  +++ picth intervals as vars eg., $1, $2b, $3b, $3, $4, $5b, $5, $6b $6, $7b, $7 & $8
  +++ piano notes as vars eg., $C, $Db $D, $Eb, $E, $F, $Gb, $G, $Ab $A, $Bb $B. $C is 261.626, $A is 440
  *** doesnt select sine composer and/or fft levels on curve editor when curve edit is in progress
  +++ documentation for most of din commands

April 1, 2011:
  !!! din-1.5.6 !!!
  *** completely optimised for JACK instead of compatibility with both OSS and JACK.
    *** see revision 2201 at http://code.google.com/p/din/source/detail?r=2201 for more information.
March 29, 2011:
  !!! din-1.5.5 !!!
  *** octave shift is faster (we shift once every audio out like before but we dont find shifts per sample) and more accurate (no floating point drift)
  *** the beat of fm, am, gaters always progresses (am_vol/am_depth/fm_depth & mouse height determines their use in sound)
  *** changed octave_shift curve name from octave_shift to os for easier handling on the command line
  +++ added 2 patterns to octave shift library
  !fix! fixed bug in solver::operator (float x) --> (see din-1.5.5/src/solver.cc)

March 28, 2011:
  !!! din-1.5.4 !!!
  +++ added variable jog for phrasor jogging
    +++ set-var jog 3 ;# default jog
    +++ set-var jog 30 ;# warp speed jog!
    +++ sv j 30 ;# short form
    +++ get-var jog ;# returns jog value
    +++ gv j ;# short form
  +++ left_alt + enter resets taptarget bpms ie equivalent to command set-now $taptarget 0 --> used to match beat of external sounds
  +++ added configure.ac check for tcl.h in addition to tcl8.5/tcl.h
  *** optimised beat2value.cc/h that drives the gaters, fm, am & os
  *** bot is insecure to allow full remote operation of din.
    *** bot will connect to password protected irc channels only.
    !!! use it among friends. not enemies !!!
    *** bot always connects at your command (see din-1.5.4/src/bot.cc & din-1.5.4/include/bot.h)

March 25, 2011:
  !!! din-1.5.3 !!!
  *** factory reset required, see http://dinisnoise.org/faq/
  !fix! fixed compressor response when input audio sample hits xmax boundary - stays at max instead of going to min
  !fix! get-drone command and ~/.din/droner.tcl
  +++ display name of jack connection on din title bar
  +++ new variable show_frequency to toggle frequency display under mouse and frequencies of notes of the scale
    +++ set-var show_frequency 1 ;# displays frequency under mouse & frequency of all notes in all the octaves
    +++ set-var show_frequency 0 ;# hides frequency under mouse & frequency of all notes in all the octaves
    +++ set-var sf 1 ;# sf is short for show_frequency
    +++ sv sf 0 ;# sv is short for set-var; sf is short for show_frequency
    +++ din saves show_frequency state when it quits and restores it when you start din again
  *** tweaked ~/.din/scoper.tcl to allow easy entry of midi slider/knob values
  *** documented ~/.din/2600.tcl
  --- oss midi support & other unused procs in ~/.din/init.tcl

March 20, 2011:
  !!! din-1.5.2 !!!
  *** factory reset required, see http://dinisnoise.org/faq/
  +++ can specify number of samples used to construct the profile curve in sine harmonic composer (was 100 samples).
    +++ set-var num_sine_samples OR nss, get-var num_sine_samples ORR nss
    +++ ' and \ keys in waveform editor to decrease/increase num_sine_samples 1 at a time
    *** use large number of samples to accurately profile a curve that has large number of harmonics
    *** experiment with num_sine_samples to change timbre
  +++ save/load vertex labelling on curve editors
March 14, 2011:
  !!! din-1.5.1 !!!
  *** factory reset required, see http://dinisnoise.org/faq/
  +++ constant size vertex/tangent handles in all editors
    +++ initial handle size specified in ~/.din/globals
  +++ vertex labelling in all editors
    +++ press l in an editor (but *not* on a curve vertex/tangent cos thats for making curve linear) to toggle
  +++ scales can have an unlimited number (previously 16) of notes, hence an unlimited number of ranges (previously 64)
    !!! din remains a 3 octave instrument !!!
  *** set-bpm <list of components> <list of bpms>, get-bpm <list of components>
  +++ set-now <list of components> <list of nows>, get-now <list of components>
  +++ get-drone selected, set-drone <list of drones> <list of volumes>
    *** droner.tcl to support microtonal chord progressions via MIDI
  --- removed mouse interpolation
  --- reinstated original subdivision for curve generation as new subdivision scheme
      introed in din-1.5 doesnt work for octave shift (will revisit)
  +++ delete-disabled-resonators command updated to allow all resonators to be deleted
  *** optimised resonator picking and disable/enable/enable all
  --- removed curve_editor::randomise (..) and rnd_miny_maxy --> unused feature
  !bug! deleteing all resonators when mouse capture is applied crashes din (segmentation fault)
  !bug! unpredictable curve loss when moving curve in strength editor (segmentation fault on quit)
February 15, 2011:
  !!!! din-1.5 release !!!!
  !fix! mirroring tangents caused 1st subdivided point to lie on the curve so no further subdivision hence no profile.
  !fix! midi ring buffer deallocation in audio::alloc
  +++ mouse x, y interpolation for click/tick/glitch free sound on long periods
  +++ midi-pitch-bend, midi-program-change support (thanks Peter Nelson - http://fuzzle.org/~petern/)
  +++ experimental get-selection command to get selected items from current curve editor
  +++ can create, edit and remove drones while phrasor is playing a phrase
    +++ tonex, toney for finding tone on din board
  *** midi_cc -> midi-cc, midi_note_on -> midi-note-on, midi_note_off -> midi-note-off, midi_clock -> midi-clock, midi_start -> midi-start
    *** changed scoper.tcl, midimap.tcl, 2600.tcl
  --- removed curve_editor::scale ()
  +++ <cstdlib> to bot.cc
  +++ add sample_rate change callback.
  +++ add buffer_size change callback altho we dont support buffer size change in din. would require a restart.
  *** optimised malloc in JACK MIDI.
February 9, 2011
  !!!! release: din-1.4.3 !!!!
  !!!! factory reset required. see http://dinisnoise.org/faq/ for more information.
  !++! fps, usleep vars to bring down CPU usage (thanks Peter Nelson - http://fuzzle.org/~petern/)
  !++! full JACK MIDI support (thanks Peter Nelson - http://fuzzle.org/~petern/)
  !--! jettisoned RtMidi support -> tagged in svn for din-OSS use.
  !--! no requirement of alsa sound library hence din is fully cross-platform. porters rejoice!
  +++ <space> to mute/unmute resonators @ din board.
  +++ marked the low (1-, 2b-, 2-, 3b-, 3- etc) & high octave (1+, 2b+, 2+, 3b+, 3+ etc) on din tone board
  +++ changed set-bpm command to accept multiple bpm targets and values
  +++ changed get-bpm command to print bpms of multiple bpm targets
  +++ changed set-var command to accept multiple vars and values
  +++ changed get-var to print values of multiple vars
  +++ undo-redo on curve editors does undo-redo of window position too
  +++ save-restore exact din board position, oscilloscope position
    +++ better default view of din board showing key note when launched for 1st time
  +++ new vars zoom & pan added to control zoom and pan variables in curve_editor
  +++ scroll, zoom & pan now loaded from settings.tcl instead of din_info
  *** midimap.tcl sourced in init.tcl for default midi_cc, midi_note_on/off, midi_clock & midi_start
  *** tweak of handle sizes in curve editors for easier editing for new user
  !fix! load-resonators doesnt fail when resonators file doesnt exist
  !fix! default resonator strength is simple linear curve instead of bezier curve for easier initial editing.
  !fix! tangents dont mirror by default in drone editor
January 27, 2011:
  ++ add resonator with <left shift> + r in strength editor.
  -- removed resonator::MAX_RESONATORS - add as many resonators as you like
  ++ delete-disabled-resonators Tcl command
  ++ new hires clock
  ** mark curve segments in curve_editor
  ** list_resonators -> ls-resonators command name change
  ** editor name change: morse_code -> morse-code
  !fix! add drone clears selected drones
  !fix! oscilloscope not selected when selecting drones
  !fix! configure.ac now checks for OpenGL, Tcl, libircclient & libasound2
January 21, 2011:
  !! release: 1.4.1 !!
  ++ ultra drone editing - multiple drone creation, moving around the board and delete
  ++ infinite volumes - change height of the keyboard to get as many volume levels as you like.
  ++ integrated jack/oss into same code base
January 14, 2011:
  * infinite volumes - change the height of the infinite keyboard to get as many volume levels as you like
January 13, 2011:
  * integrating jack/oss api in same code base
January 10, 2011:
  * din-1.4 : first release into the wild
  * fast multi bezier curve (ie multi_curve) solver with infinite points and bezier curves
  * WIP: new website design @ dinisnoise.org
December 30, 2010:
  * bot uses safe interpreter when connected to irc channel
December 29, 2010:
  * esc 2 times from din board to quit din -- waits for ESC_WAIT (1.25 seconds between ESC presses).
  * fixed oscillator_strength marker display, default globals tuning file spec and default din_info
December 28, 2010:
  * set_bpm --> set-bpm and other commands names changed. no underscore, use hypen instead to separate command words in a command name - easy to type.
  + added equivalent help files
December 27, 2010:
  * fixed key repeat speed bug when MIDI is on
  * tweaked the jag font
  * WIP: infinite curve points, infinite resonators ---> not adequately tested; @alejo: dont package
December 16, 2010:
  * help.tcl, set_text_color to set console text color, faster command lookup from command list
December 15, 2010:
  * help for commands is via help.tcl script -- we will use this script to also produce command reference documentation
  at dinisnoise.org soon.
December 11, 2010:
  * bot:
      * disabled exec command from Tcl interpreter when bot connects to irc. exec enabled again when bot disconnects.
      * new disconnect subcommand with custom disconnect message. eg., bot disconnect message
  * key: command changed to print nearest note name (eg., key note) & value (eg., key value).
  * scale: new scale command. list, get, set, add, remove & find are subcommands. eg., scale set major
  * tuning: new tuning command. list, set & get are subcommands. eg., tuning set et
  * bpm: new bpm command. list, set, get, reset, style (set & get subcommands) are subcommands. eg., bpm set fm 240
  * delay: new delay command. set, get are subcommands. list coming soon. delay set {l r} 5000 ;# sets delay time of both channel to 5 seconds.
  * taptarget variable to control what component (gl gr fm am or os) gets affected when tap bpm is used. eg., set taptarget {gl gr}
  * console: stays in command mode when TAB pressed until ESC or TAB is pressed again.  used to leave command mode when ENTER was pressed.
  * BUGFIX: delay haywire fix when delay time is 1 second ie 1000 msecs.

November 30, 2010:
  * bot input/output is queued and processed in input loop
  * |BUG| fix multi line output of commands to IRC. no lines sent.
November 24, 2010:
  * tonic limited to 40 to max_frequency possible in given sample rate
  * display key and completion of octave shift --> since octave shift is general we call it modulating up/down instead of octave up/down.
October 11, 2010:
  @oss:
  !!!after 4 years figure out that ive been calculating everything in the audio thread. so no matter how fast a processor we have, calculations cant be performed faster than
  the rate at which the audio thread is called. fixed this at least now. this opens the way for the power of multi-core processors & GPUs.!!!
  ***tcl interp back in main thread***
  ---removed command scheduling in console as tcl interp is back in main thread ---
  ***viewport struct changed, creates default or restores last viewport on constructor ***
  ***audio_out::write changed to accept audio buffer to read for writing from main thread ***
  ++++++
  concept of a bunch of audio buffers in main thread that is filled continously one after another.
  give a written buffer when audio thread wants one. important to keep a good number of audio buffers but not too many
  so that main thread is not writing the same buffer the audio thread wants to read.  if all buffers are written
  but none read so far, main thread will stop writing anymore and wait for audio thread to read some.
  ++++
  ***better commenting and messages on shell console***
September 29, 2010:
  @@@ sort of back in the groove again.
  @@@ wip though as trying to have 1 Tcl interpreter in audio thread for accessing samples later
  [!!!] FIXED resizing window
  [!!!] FIXED abrupt level change when moving from editors back to board
  [+++] can continue to play with the mouse when in command mode. tracks cursor in editors.
September 12, 2010:
  +++ get_scope/set_scope, get_drone/set_drone and scoper.tcl, droner.tcl
August 05, 2010:
  [***/+++]: midi command fleshed out with list, open, close options.
  [+++]: midiopenall, midicloseall tcl cmds available for one-shot open/close of midi input devices
  [+++]: midimapper.tcl - displays midi output on console. to invoke issue command: scr midimapper
August 03, 2010:
  [mod] param value messages on the console
  [bug] segfault on load_scale of bhoopali - couldnt recreate!
July 31, 2010:
  *** back to working on font again
      ***changed set_font_size to change cell size, char spacing & headroom
      ***get_font_size simply prints 4 numbers
      ***created help files of set_font_size & get_font_size
      ***changed save_settings.tcl to include font size params so we dont save them in the font file itself. this is good.
July 30, 2010:
  !+++! tap bpm, set taptarget {gl gr fm am os}. change taptarget to change whose bpm is affected.
        eg, set taptarget {fm am os} only sets fm, am & octave shift bpm to tapbpm.
July 28, 2010:
  *** worked on timing of keypress (keypressedd(..) in input.h)
July 27, 2010:
  !fix! western notation display didnt update correctly when key was set to a numeric value.
  !fix! no overwriting of console command line
  +++ wrap around of console command history
  +++ notation saved into settings.tcl
  +++ ~/.din/init.tcl for custom Tcl scripts to be loaded at startup.
  +++ set_kb_layout/kbl <layout> command. kbl us sets to us layout. kbl uk sets uk layout.
July 23, 2010:
  !!!check b4 din workshop at usurp gallery, london
  *** will try to make a live cd with this version
  +++ new sound patterns added (one, one-lr, two, two-1, three, many)
July 19, 2010:
  !!!+++ experimental MIDI support using modified RtMidi library
  !!!source ~/.din/midi.tcl after install; turn on gaters and move any sliders u have to change the gater bpm
  !!!set min 0; set max 240; set which g ;# set which fm will change fm bpm.
July 18, 2010:
  * Happy birthday to self! jag turns 35. a hub. a dad. not a millionaire. Only want to do what I do now at 40 - maybe also want to be more famous and print money.
  *** phrasor optimisation, draw a red marker to id phrase start during a recording so its easy to finish at that point,
  *** phrasor playback starts at beginning of last recorded phrase
  !!! bug fix in phrasor when pausing doesnt leave mouse at the right note, these bugs introed because we move from absolute to relative mouse calculation
  !!! bug fix no jump of mouse when phrasor is playing and u leave board to the editors and come back.
  !!! test required.
July 15, 2010:
  * changed name of waveform from noname to wave in file data/one - the one resonator file
  * removed key get from key command its available as getv key
July 14, 2010:
  +++set_curve_editor, get_curve_editor to place different curve editors on different screens.
July 11, 2010:
  +++!!! din-1.1.2 - jack, oss (branch) support updated.
  +++ delay feedback, volume curves, only time is value
  *** fixed undo/redo/copy/paste bug on multi_curve
  *** fixed morse code trailing spacings and morse code is now on copy curve to paste
  +++ save_settings.tcl to save settings into ~/.din/settings.tcl which is loaded on next din start

June 03, 2010:
  * din-1.1 RC.
  * cleaned up documentation
  * sa command is gone. tonic/key is substitute.
May 31, 2010:
  +++ Tcl interpreter is the din command line.
  +++ Oscilloscope fully moveable and resizeable.
  +++ message announcing current curve editor
  *** fixed note marking in strength editor
  !!! Oscilloscope drawing optimised with single call to glDrawArrays instead of glBegin() ..glVertex3f..glEnd ()
May 18, 2010:
  *** Tcl/Tk integration getting mature
  !+++! experimental linebreaking and wordwrap added to console - disabled by default
  +++ new variable sa so can do gv sa
  --- removing tcl command - no longer required as Tcl/Tk interpeter is the din command line

May 15, 2010:

  !+++! experimental tcl/tk integration.
    +++ new tcl command - syntax tcl <tcl_command>
    * this will let us script din with tcl and also make custom uis using tk.
    +++ sa.tcl. to bring up ui, do tcl source ~/.din/sa.tcl

  *** mouse capture replay doesnt warp the mouse, draws a cross indicating playback position.

May 13, 2010:
  +++ morse code -> bezier curve -> waveform/am/fm/gaters/octave_shift
    *** editable beizer curve based patterns for dot, dash, inner spacing, letter spacing and word spacing.

May 5, 2010:
  +++!!!*** jack is now trunk
  +++!!!*** oss is a branch https://din.googlecode.com/svn/branches/oss
  *** oss is faster than jack but allows no collaboration.
  +++ oscilloscope is back on jack
  *** major renames of many files in din/data
  *** optimised keyboard handling in curve_editor.cc/h, din.cc/h
  *** new gater patterns, new octave shift patterns, tastier defaults
April 27, 2010:
  !!! experimental jack support
  +++ autoconnect to system:playback_1 and system:playback_2 ports to start playing audio
April 26, 2010:
  *** optimised keyboard handling
April 25, 2010:
  +++drones can be created to any tone. can be snapped to a note.
  +++gaters on/off command
  +++snap_drones var to setv/getv commands
      sv snap_drones 0 or 1
      gv snap_drones
  +++reenabled the drone editor
April 23, 2010:
  rc 1.0.6
  ++sa/key display on pressing ;
  --drones are synced only on startup
  **pfx changed to p in bot command
April 22, 2010:
  prepping for version 1.0.6
  +++bot::setset()
  +++tests if bot is running when outputing mesg with it
  ***gate->g, gate-l->gl, gate-r->gr, all->a in set_bpm, get_bpm, set_style, get_style commands
April 18, 2010:
  prepping for version 1.0.6.
    +octave shift with controllable bpm and progress curve.
    +octave shift editor (press 7)
    +octave_shift.lib - library of octave shift progress curves.
    *libircclient expected at /usr/lib/ and /usr/include/libircclient - need to change this to use pkg-config.
April 15, 2010:
  * check b4 openlab opennight #4
  * reworked solver so that custom min and max handlers can be used to get looping (in waveform) but ping-pong (in gaters, fm, am)
      * inlined these functions but if they were not inlined then maybe slightly slower (nanoseconds? microseconds? testing needed)
  * default is ping-pong on gaters, fm, am
April 12, 2010:
  ---removed multi_curve copy constructor and operator=, color and name restored after default copy.
  ***chrono uses <ctime> ie CLOCKS_PER_SEC and clock() for timing instead of sample based timing. can therefore use it for non-audio timing.
  ***mouse command changed for relative mouse movement instead of absolute positioning. making it selectable is a better goal.
  !!!removed otransmit code in osc.cc and osc(..) removes timers as timer struct removed from chrono.h/cc. no problem for osc recieve.
  ***using SDLK keycodes in curve library handling in curve_editor.
  !!!fixed bug in osc due to stringstream/tokenizer mixup.
April 5, 2010:
  +++get_font_size command
  +++xsize and ysize are cell width and cell height for font can be set independently
  ***updated set_font_size command to handle xsize and ysize
  xxxhopefully fixed the font save bug - was writing a null character b4.
  ***updated cell_size code to prevent squash/stretch of font when varying its xsize and ysize***
April 3, 2010:
  +++tokenizer.cc/.h - ditching stringstream
  !!!font size bug still persists - do not use set_font_size command!!!
  +++ircu.patch - patch for ircu irc server ircd undernet to allow messages to flood the channel
  so that din can send and receive data freely without any limits.
march 31, 2010:
  +++varun: happy birthday.
  ***+++ irc bot cleaned up, with doc
  ***fixed (assuming strongly) kerning and font size bug
  ---all .hlp files from data
march 25, 2010:
  +++ added doc directory. will move all help files here in the future.
      but its not ready yet. so we use help files in data.
  +++ added mouse <x> <y> command, untested but no harm if not used.
  +++ octave shift shortcuts changed to z and x due to keymap issue on non english keyboards. need to check this.
march 23, 2010:
  $$$ work in progress: 1.0.5.1
  *** enhanced sa command to apply octave modifiers to values not just note names. mouse warp toggle added too.
  +++ added octave shift short cut [].
  +++ brought am, fm, gate-l, gate-r parameters as keyboard shortcuts
  +++ FIXED BUG: creating a drone outside the ranges didnt create the drone on the correct note.
  *** using keycodes instead of characters ie SDLK_SLASH instead of / character to check slash so
      that it works on all keyboards.
  --- replaced din_help.txt with din.hlp.
march 20, 2010:
  $$$ release 1.0.4.1.
  *** if no audio, din continues to work. can edit resonators and drones.
  *** better selection of drones.
  +++ aout command to control OSS audio parameters. can also edit ~/.din/audio_prefs.
march 16, 2010:
  !!!+++ ditched portaudio and moved to oss. portaudio was using oss anyway. with direct oss can set many audio buffer parameters.+++!!!
  !!!testing required on this oss port!!!
march 12, 2010:
  ** made basic install of din easy such that its a gateway to explore more complex features of din.
  +++ allow din board height to be changed allowing finer or coarser volume control.
march 08, 2010:
  + sine wave -> bezier curve: export sine wave generated with the sine_mixer as a bezier waveform. 100 vertices with folded tangents generated. a ui/command to  reduce/control number of generated points desired.
  + bezier curve -> sine wave: import fft levels of a bezier waveform into sine levels and alter the drawn sine wave. only partially correct as it doesnt import phase information from the fft. works when phase is 0.
  + clear/erase harmonic by pressing 'c' over sine levels.
  ! use resonator names from file instead of resetting to default name/numbering.
  + current curve editor var in uis_t to keep track of the current curve editor so we can run curve commands on the console.
  + curve_name command to set the curve name. possible due to previous feature.
  * worked on resonators in file: resonators, one
december 18, 2009:
  ** bug fixed: pan and zoom with shift+a/d and shift+q/e
november 20, 2009:
  assigned curve names, save and load curve names when curves are loaded. default name is noname.
  fixed bug: can change resolution of curves in modulation and gater editors.
november 13, 2009:
  mouse position saved and restored on din board
    TODO: but must be done for all ui screens and must also restore window position
november 11, 2009:
  console rollup state saved/restored
  removed numeric notation of ranges as it doesnt work for keys other than C. will revisit later.
november 9, 2009:
  removed set_bg command - no range color filling, just plain looking ui. its the sound we are after.
  notation support: indian (S r etc), western (C C# etc) and numeric (1 2b etc)
  optimised solver.h/cc again to return last result when y cannot be solved for given x.
  FIXED BUG: In console, if you clear text (press backspace), and rollup console - crash
  fixed colors used for drawing ranges, phrasor position and drone makers
november 4, 2009:
  *** cleaned up the trunk
  !!! optimised the configure.ac and Makefile.am
  +++ BUGS
october 15, 2009:
  ***marked position of phrasor when paused
october 14, 2009:
  +++get_kern command to get character kerning in the font.
  +++added {}`| characters to the font
october 10, 2009:
  !!!!++++multicore support added
  +++xset m 0 0 to reset mouse to zero acceleration and threshold when
     din, and restore upon exit.
october 9, 2009:
  !!! fixed ranga backdrop drawing bug
  +++ added support for audio out via alsa dmix so that you could play
      an audio clip in the background and play din over it.
  *** preparing for release of din. version 1.
may 7, 2009:
  +++fft.cc, fft.h - separated fft engine from curve editor
  ***worked on the resonators
may 6, 2009:
  +++ added ability to move the mouse in curve editors with the keyboard
  +++ vary the pan and zoom speeds
