soon
* resolve duplicate file ftw.c (in both component/ and gdam123/)
* link gdam-launcher to gdam? (--simple, auto-launch server with safe settings)
* remove plot stuff
* fix skin/foreign/xmmsvis/Makefile.am to:
  - not hardcode -DXFwhatever, or the path to X11R6/lib, or require xmms
* gdaminstrument/gdammidiinstrument
* note evolver
* xmms input
* cache on disk, related virtualizations
* device reopening
* --rt-fork (works for oss, need to add alsa support)
* --unix-domain
* reading wav files in a separate thread
* echo buffer resizing smartness
* use beat calc as turntable for song playback while loading
* when song is cached by beatcalculator, causes large dropouts at very end.
* dispatch.log => cli script [w/ timing data?]
* async wav file reader implementation
* external => process
* spin-release-to-end-of-buffer [cf email from j. hall]
* gdam_buffer_write_one, gdam_buffer_read_one should use GIOError as rv.
* mention other dependencies - wget, jadetex, nc

needs testing soon:
* saving wav files in a separate thread [gdamexternalrecorderhelper]

goals for next release:
* ogg / flac support
* generic file source, play mp3 / wav / ogg transparently

1.0:
* alternate sampling rates
* mixskin
* pretty skins
* i18n

*  finish unix credentials
*  client-server version/feature negotiations
*  make device plugins be more standard (using gdam_plugin_get_type_by_name).
*  .pid file cleanup on exit
*  some vaguely secure authenticator
*  finish proposal debian policy change for plugins
*  something deadly from client if device open fails
*  fix up stop/start semantics w/ gdasxmmsvisfilter, somehow....

Dave:
*  abstract file-descriptor/signal/idle/busy usage to allow
   usage of gsk/glib instead of gtk/glib (in particular,
   the usage of the gsk mainloop).
   this will allow use of kqueue under bsd/non-threads.
*  fader discontinuities on pattern change
*  bender seg faults on certain position changes 
                                  (especially... multiple zero-speed pairs)
*  scrub discontinuities
*  respeed sounds awful on rate change
*  flange responds wildly to variation of parameters
*  limiter produces a lot of silence on loud sounds and low limit
*  gdasvibrato seg fault:
** WARNING **: bogus eof event in mixer  [this may be from much earlier]
** ERROR **: file gdasvibrato.c: line 196 (gdas_vibrato_read): assertion failed: (dist64 >= 0)

*  server debugging - print out all sources and buffers to look for
   unused/floating ones
*  perl-xs interface bug with timers, both oneshot and repeated
   - simpletest exhibits
*  pixlabel - fill empty space with _space_ character rather than deferring
*  consider destroy / finalize distinction
*  decongestive server requests for visualization filters 
*  debug cli's dump command.
*  hi-quality gdamresample mode
*  GdamMixSkin
      - beat lines
*  beat line guesser from beats
*  scrub-offset
*  get rid of gdam_connection_push() et al in server
*  if we try to `run_deferred' from a deferred handler,
   it should be a flag to `go again'.
*  general mechanism for lists of things in skins at runtime
   eg list of filters in builder, list of devices in device-switcher
*  make GdamMicrophone [component] autoselect whether to use duplex
   [GdamMicrophoneOss on server] or another device [GdamMicrophone on server]
*  bender
     * bender bend-by-[relative-]position
     * mode w/ smooth resample changes
	*  some other smoothing motion strategy
	*  bender fade on position seek, instead of flat average...
*  buffer scratching source.

Portability:
*  alternate implementations in the following files for systems w/o poll()
     *  gdamrtcat
     *  gdamsendfile
     *  gdamchannel

Design:
*  a source should be able to return 0 if it is not ready-to-read.
*  should gdam_arg_set be allowed if set function null?? (for hooks).

Test Code:
*  test code for the sources
*  add more server-crashing test code
*  complete test-gdamarg.c to test all of gdamarg.c
*  read source in large chunks (bender occasionally causes crashes with
   large reads, ie 50kB)

Planned Sources, Filters:
*  time-varying fir filter
*  pitch-shift trivial overlay-add style
*  Interpolating vibrato.
*  Brass instrument. 
*  feedback should have "don't enforce delay" mode
*  tee source
*  .VOC, .SND etc

NEEDS TESTING:
*  Missing module dependency file.  *BROKEN!!* (gdam-launcher continues to load)
*  ID3v2 tags from mp3 parser.
*  producer queue queue_list argument
*  test ppc <-> intel communication
*  trigger broken???

MacOSX:
* search path for config file, ladspa plugins, etc should include PREFIX
* help files are also absent
* aiff support
* use friendly installer
* check for unstable filters
* disable unstable features by default
* save various --define options in history

LadspaPluginMaker:
* ladspapluginmaker - selectively export controls
* we don't handle control nodes w/ spaces in names
* control nodes non-functional... compiles and gives slider, but have no effect.

Ladspa:
* save control values as preset
* save as default preset
* search for replacement skin in standard path
* ladspa plugins into box/dropdown list.
* ladspa plugin default parameters not set in gui (read from control port?)
* grope for midi control with ladspa parameters?  we can already assign midi
  bindings via an xml file, but the grope handlers in skin/gdaminputselector.c
  only support arg hooks.  then mininetwork node parameters should be
  assignable and gropeable

Website:
* pages for users, hardware device binding files, mininet filters
* encourage contributions of above

Mininet:
* mode which displays all control node, sort of a ladspa preview
* mininet: when loading, don't assume in->out pipe... explicity save
  input->output pipe if it exists
* save position of input / output nodes
*  mininet icons - (band-pass)
*  mininet waveform fequency (and others?) from beatinfo

Sequencer:
* pattern names, local buffer names.  patterns and local buffers in
  lists w/o bounded length.
* define 'swing' for a rhythm: for each eighth note in a beat, define
  the swing location as a percent of the beat, ie 0.125 would be straight.
  also look at how 'groove files' are produced and exported in cubase etc.
* should be able sample any one local buffer and use start / length
  of individual events rather than local buffers
* sort by length / start, as percent of original
* riffs should play as sequences, free-play riffs
* sequencer reports device latency... add to source latency to 
  automatically determine in-time compensation
* use the above to implement inherit-phase-and-tempo-from-tapping
* add-in-time w/ overwrite... existing elements are only 
  removed if there is a new element before and after it.
* drag on one axis only
* use GdasMix to render sequences
* copy sample should inherit rate and volume
* disable vertical zoom/pan when appropriate
* sequencer skin redraw doesn't double-buffer properly
* sequencer toolbar: 
     * fill end-to-end, 
     * tile to even beat w/spaces
     * tile to even beat, stretch to fill
     * stamp (sequences converted and applied)
* individual lengths for each pattern??  auto-tile of partial patterns?
* element can be: any source... for now: simple element, pattern, or sequence
* sequencer file name in window title
* sequencer: replace pattern_number with multiple lists of elements??
* need to scale sequencer's current position when changing tempo/length
* temporary grouping of patterns (right-click toggles in-group for each?)
* double sequence by copying first half into second
* scale sequence - change pitch and length so breaks are preserved
* above similar to "element lengths is in beats" option
* use local rate when calculating dislayed length

Sampler:
* export hits as wav files
* fix up hand correction of beat points

Bender:
* jump to nearest beat / last beat / next beat while rubbing
* use above to free-play sample on the fly?
* passthrough volume (rub one beat while song plays underneath)
* mark a spot and temporarily return to it, sort of on-the-fly free play
  of a subsample
* implement riffs
* use fader x/y plot to implement ttl editor
* match tempo, used to transition songs with very different bpm
* client-side bend-by-position mode
* implement seek/nudge via bender
* add bender to turntable, use to minimize mp3 restarts
* rub forever
* timed seeks, or bend, which accomplishes juggling ala 'doomsday.mp3'
* option to snap back to nearest even beat on release

Beat Calculator:
* cache fft, other meter output for beatcalc view.
* beat calc: always include fader when playing, so clicks can be added if bpm
  is set.
* scroll wheel on beatcalc display (or horizontal pan) should zoom
* beatcalc should indicate that it is loading a song

Fader:
*  fader: option to take a time-normalized array (0-1);
*  fader: use args!
*  eight-stage automated toggle for crossfade via matched faders (ie multiplex)
*  make bpm match beat_factor when synching fade array

Geoff:
* design: should server args to seconds rather than samples?
* scrolling waveform filter 
  * merge with spectrumscroll into generic scrollingprofile?
  * similar (or same) for non-scrolling meters?
* spinning drumbeat producer/filter ala nia
* mathfunction skin
* when turntable hits "inner groove" and you click position slider, should play
* display zero crossings in buffer editor, snap to zero crossings
* problem with processing selections beyond range of sample (in skin)?
* figure out why we leak mpg123 processes
* dont-ask-me-again on close prompt
* option to duplicate cachebuffer
* when saving cachebuffers, update description with buffer name
* implement alternative respeed, smooth stalling, etc. using bender
* grope for press/trigger/toggle not just ranges
* some sort of generic method for starting a source at a certain time
  * use above to do back-reading-bender
  * use above to make start-in-sync a single step (currently start-then-sync)
* bender should read() from child to accomodate seeks ahead of current time
  (as it does when rate > 100%)
* tool to calculate empirical latency by having user tap in time w/ metronome
* alt-tab cycles through skin windows
* change speaker/headphones to  L / R when using split-stereo mode
* alsa microphone input
* a way to automatically connect models together by walking glade
  widget tree??  (would allow users to make compound skins w/o handler hacking)
* deprecate gdam_skin_arg_int: et al in favor of gdam_skin_arg:
* it would be nice if we could use dial-style mouse bindings on a label
* option to compress when saving wav files, so they don't clip.
* reorder -I args to ensure that local headers are found before installed
  headers when building.  (necessary?  fink build had problems like this) 
* for sequencer overwrite, mute all eligible elements on note on, on note
  off get time them delete overwritten and unmute remaining elements
* use 'file' to look at magic bytes and identify files w/o extensions
* make macro for lori's glaze filter
* split GdamGenericInstrument from GdamSequencer, use function pointers
  for generating source trees and for recording samples which have been played
  (this way the instrument stuff can be re-used with new mix-based sequencer)
* seq local buffer display should do beat detection, when y axis is start or
  length, have option to snap to beat markers
* use recycle capability to break a sample in the sequencer, into its
  constituent parts.
* use if_defined:midi_control for midi control buttons
* gui config widget which controls all known if_defines with toggles
* parse --define !blah on command line
* buffer_editor: edit left and right channels seperately in split stereo mode
* gate which can dynamically adjust threshold to maintain a certain
  target % of kill vs pass
* bender: if you set changes with a jump but no rate it will stall (observed
  while bending by position)
* bender but uses cachebuffer rather than internal backbuffer
* use above for sequencer elements which are scratches and rubs
* sequencer doesn't add w/ correct length when sorting by length
* sequencer should have 'soundobjects' (sequence, pattern, hit, loop, mp3 etc)
  with properties (looped playback, start point)
* for binding file parsing, keep a context so things like midi channel
  can be set once.  allow xml to #include a different binding file,
  reduce duplication.
* work on gate: get rid of clicks (derive from gdasgain for smoothing?)
* get rid of simple skin classes (which have no handlers or args or member
  variables) in favor of a GdamSkin???
* give turntable playlist window play / sync / cue buttons
* playlist / songdb folders ala soundjam
* a playlist-centric playback skin, perhaps 4 compact turntables embedded
  into songdb, each turntable has one song selected in its color
* --debug doesn't work at the end of the command line
* why both gdaminputselector.c and plugins/gdammidiselector.c ???
* include input.devices file, generate server.config and devices file for
  target platform at compilation.
* all registered input devices into dropdown list in midi selector
* check type mismatch at skin handler register
* bend which uses passthrough volume to make copy, speed it up to 
  double speed over an even measure, then loop.  ie bubbling 'freakon' remix
* right-click context menu in beat calc (up,down,newrange,)
* presets?  use presets to abstract controls and value from input events
  in binding files, i.e. cz101-fadeecho and psaux-fadeecho
* generic visualization of buffered filters and wavetable producers
* position indicator drawn over waveform display
* CRASH if beatcalc closed while working 
* above related to warnings of null beat list?
* arg -> label/window title/status bar binding
* gdam_skin_warning tries skin->waring_widget (which uses above) to report 
* save gdam version in root of all xml and other files (mininet filters,
  songdb, sequences, saved states etc.)
* create ~/.gdam/ directory
* include mininet filters in distribution
* for 15-band eq, adjacent vertical sliders which allow user to trace an eq
  response curve
* external/proxy ready-to-read off?? (observed when moving to next song on
  macosx, which has slow startup time)
* minimize mpg123 restarts... smart nudge for any source, in proxy, or via bend
  send 'nudge' through filter stack??
* turntable (others) should connect to song's 'beatinfo_changed' signal
* loop part of a buffer in wavetable
* common code for log/exp/inverted/etc ranges in midi, skin, ladspa?
* use configure to comment/uncomment server.config as appropriate
* builder should be a filter!
* same hotkeys on bluetone / regular wheels p,; in particular
* dropdown list <=> arg string binding (for mode, etc)
*  things for history: 
  *  position, size, sorting, visibility etc in songsel
  *  path for load/save sequence
*  preview for sample picker - gives info (length, guessed tempo) and playback
*  buffer manager change buffer description on save?
*  pixscrollbar should have an 'insensitive' mode,
*  sync preview should be insensitive when no synch is being done
*  most recent input event in device selector status bar
*  double array arg for bend,fader,etc input bindings.
*  samples -> seconds in client code
*  less reliance on mouse!  (song selection, drag-n-drop alternative for tempo)
*  large targets for drag-n-drop!
*  gain in songdb
*  DOC: disable tooltips
*  close extra windows on samplingsequencer destroy
*  more stuff into rc file: mp3 buffer size, mouse button bindings
*  cubase sampler skin
*  debugging args in clients
*  turntable should play independently of whether a song is loaded
*  window which contains aligned track displays for each turntable
*  odd behavior with non-one-to-one filters disabled in builder
*  generalize position request... server function which emits arg value at
   timed intervals
*  datacollection source which passes input through, stopping every
   so many samples to get an arg value from its parent and emit it.  Used to
   collect fft, level, and other data.
*  define midi when file sourced etc, not just when selector launched
*  cleanup input->signal chain: for no-name signals, attach to and emit signals
   on an invisible object?? (equialent of clicked) for special named signals,
   attach to / emit on skin
*  gdamdebug: no get method for @1 in GdamFader.
*  way to impose a length on any source
*  sample picker close on cancel
*  feedback filter - filter feedback loop but not original source.
*  modulation depth
*  tooltips disappear instantly on many of our custom gtk widgets.
*  packaging: dev should be architecture independent, right?
*  resolve bindingfile/skinbindingfile duplication
*  widget to drive any parameter in time.
*  clever catch-up on midi reassign
*  restore onepiece-turntable.xml to time of last gqmpeg change
*  missing GdamSplineMapSkin ??
*  autogen.sh needs to be run twice on a clean copy of cvs source
*  debug xmms visualization plugins.
*  more crashproof - incorrect number of args in gtkpixbutton => seg fault 
   before fix, skin creation failure wasn't handled well.
*  cache preview?? One-step cache create/play method??
*  songinfo_changed signal in songdb?? (more efficient than db_changed)
*  two-direction position control on scrub 
*  tapping should have mode to use ``beat_times'' array.
*  feedback snag buffer, input gain  (input/output crossfade?)
*  decide what to do about gdamsonginfo/gdambeatinfo code duplication.
   (daveb:  i recommend combining them into GdamSongInfo where filename may
   be NULL).

BUGS
*  server shouldn't die if it cannot open device (only with certain device..) 
*  recorder: it would be nice if we didn't have to
   copy/grab the buffer BEFORE stopping it.
*  miscalculated song lengths?? (/music/pressure funk/)
*  prevent double-connect to single-input mininet nodes
*  echo base snag buffer should set beat info (bpm at least)
*  test filters beneath feedback (resample causes problems) and feedback itself

  XML BUGS
*  spatial stereo position not restored from xml
*  "playing" arg true can't be loaded from xml (not ready to play on startup)
*  wavetable "mode" arg loading (buffer manager not initialized) from xml
*  song length not loaded from turntable xml (necessary?  producer should
		maybe update length when its song is set... or is this missed?)
*  turntable beat factor not loaded from xml
*  beat calculator loses viewport on load
*  error messages when loading resample, respeed (functional, though) from xml
*  fader loops mode from xml???
*  saving of input and output positions in mininet.
*  save topwidget / window position and size

  MISC MINOR CRAP AND IDEAS
*  "hold on hands-off" mode for rangefinder (zero on hands off mode?)
*  are midi input files needed for /dev/midi??
*  file selector in db builder?  db builder into songsel?
*  gain to counter saturation volume drop in distortion?
*  smooth flange frequency??
*  check num_handler_names before derefing handler names in connect_func 
*  bender change backbuffer size to accommodate stall
*  add turntable gain level  to songdb
*  bend which results in nudge of even beats (and doesn't contribute to
      offset from mark??)
*  bend by delta pitch
*  seek within bend (rate=0,time=offset)
*  tuning bender
*  spin which pauses input source and restores it in beat
*  export a sequence as a wav file
*  use mathfunction for input bindings

  BIG FEATURES.
*  graphical display of equalizer freq response
*  songdb mySQL interface?

Miscellaneous external:
*  gdamdsp

Design:
*  usage of gdamtee source
*  clean up autogeneration of the various .xpms in the distribution

Both:
*  help for: queue, builder, feedback, beat synching
*  save midi patch names

Maybe:
*  Isolate sample manipulating code in server to make
   pipes of other sample types more convenient
*  leave fragment size unchanged by default
