FIXMES:
- fix bse_gettext()
- piano roll/align events: does insert notes with wrong cursor
- event roll: align events: outline colors don't honour skin colorization
- add author and license to procedure execution dialog
- fix repeat not working if left/right exchanged
- create one canonical place for supported sample formats and keep that updated
- document options: :filename, :rgb, :hex
- make sample editor play stereo
- allow inverted synth-done (i.e. suitable for gate connecitons)
- let the ADSR provide Gate-Out
- default-initialize authors field of objects with user name
- add default-settings config preference (authors, license)
- evaluate elimination of seqid
- implement auto-save feature
- undo across midi file import is broken
- implement (GUI for) locked properties
- add clone tool for csynths
- fix undo for: BseDataPocket
- BseCategories need to provide an untranslated version (for menu paths)
- get rid of root_category in idl files once BseCategories has an untranslated version
- get rid of hardcoded server id (1) by means of an object-less procedure
- closing an app window stops playing songs, even if alternative views exist
- bsedefs.h should define _() only for BSE_COMPILATION
- fix procbrowser
- fix rack editor
- fix BseSong::denominator SpinButton arrows not working
- remove bstrack*.[hc] cruft, old parasites and data pocket
- allow parasite object links only within tree
- queue action updates upon grouped action execution 
- introduce gxk_action_group_select()-freeze/thaw to surround select/exec pair
- auto-connect viewable-changed to gadget notebooks
- add one-shot property to gxk-gadget-factories
- remove/rename test-string.bse
- introduce Volume() pspec type in idl files that the GUI can provide a dB slider for
- fix syndrum parameter scale
- upon project playback-stop, discard all pending events (at least note-on+note-off) on its midi receiver
- add piano roll scripts and offer those in pianoroll button3 menu
- registering the same procedure twice triggers a g_warning()
- add new test song containing a wave track so the internal wave csynth is properly testet
- File/Open should merge if issued on an empty project
- move non-infrastructure synthesis modules out of the core into plugins/
- if Track::Synth is NULL, disconnect post-process-subsynth from track-context-merger
- add Solo propety to tracks
- add Volume property to tracks
- fix numerator/denomiator settings in songs
- fix glue gc assertion after sfi_glue_describe_proc("")
- add frequency splitter/multiplier module (plus cent-wise detune?)
- add frequency output module, offering bpm, 1/1 1/4 1/3 notes frequencies
- add sfisclock.h to sfi.h
- <mg> quick rfe based on 0.5.3: implement multiple selection in the wave loader file selector and have an add button that does not close the dialog
- fixup filemenu/dialog for WAVE recording
- fix initial_granule in gslvorbis-cutter.c wrg page flushing
- rename gsl_strerror()
- get rid of bse_procedure_execvl
- get rid of super->mod_time
- don't always rebuild lib-list [Rebuild]-button
- fix name of BSE_SNET_FLAG_USER_SYNTH
- fix BST_OP_PROJECT_SAVE
- register drivers with categories
- fix gsl wave osc
- nuke SFI memblocks, malloc() is good enough
- master tune slider in preferences (kammer ton)
- bsemididevice-oss throws warnings when compiled without midi support
- MidiEvent (serialization)
- add IDs to part links in tracks
- registering the same script function twice triggers GType assertion
- fix uses of gsl_engine_tick_stamp_from_systime() in bstwaveeditor.c
- cleanup helper/util code in sfitype.h
- song->master volume doesn't affect anything
- fix and canonify decibell naming everywhere
- sample chunk display should show note names not only midi notes
- support [-- Raw --- (big/little) (c=2) (mix=44100) (8/12/16/32) ---] box in wave loader dialog
- fix the word "tact" vs. measure
- need tact number entry widget
- fade in/out of samples in sample editor
- wave editor: provide transpose spinner for wave preview
- gslwaveosc resp. gslwavechunk occasionally segfaults on ping-pong loops

DOCS:
- add text about MIDI realtime synthesis via external MIDI devices to beast overview paper
- rewrite bse-categories.txt as .texi and add to /Help menu
- add tag to load/play bse files
- add QuickStart section on wave selection
- add QuickStart section on postprocessing effects
- add QuickStart section on piano roll usage, esp. copy+pasting
- add QuickStart-Samples docs once we support sample editing [timj]
- report mising underline to havoc, alper has a tsmview example in
  Re: uref macro, document font Date: Thu, 5 Dec 2002 00:23:38 +0200
- what kind of texi macros should be used to markup manual page contents?
  could WRITING.3 have a set of default macros showing this? [alper]
- allow commas in @refBlurb{}, respectively Info BLURB = ","; texts [alper]

TODO:
- Main: make beast recognize and view .markup files from the command line
- DocBrowser: pressing browsing hotkeys in release-notes dialog does stuff
- DocBrowser: Ctrl+'+' and Ctrl+'-' should change font sizes in doc browser
- DocBrowser: update /Help index to cover new docs
- DocBrowser: implement Playback facility in doc browser for .bse file links
- DocBrowser: try implementing some kind of table layout
- PatternEditor: load default keytable
- PatternEditor: implement last tick spinner
- PatternEditor: implement length and offset columns
- PatternEditor: allow inserting notes of different lengths
- PatternEditor: Ctrl+I (interpolate) should interpolate values between start and end of a selection,
  regardless whether the selected column is a note or event
- PatternEditor: Ctrl+R (random) should insert random notes or events
- PatternEditor: transpose script (up and down by semitone, so that we can use an accelerator)
- PatternEditor: background colors should be different (darker) every 4 and every 16 steps (maybe
  depending on measure)
- PatternEditor: selection, cut, copy, paste
- PatternEditor: marker for play position
- PatternEditor: play notes when inserted (also a piano roll TODO item); should be optional
- PatternEditor: channel based muting
- PatternEditor: allow combining multiple pattern editors (i.e. editing multiple parts which are
  played synchronously) spawned across multiple tracks - GUI idea: once selection in the track roll
  widget is implemented: select multiple parts, use right-mouse-button-menu, select pattern editor:
  combined view of those parts is opened
- App: closing the BEAST window should ask (close/save/abort) for unsaved changes
- App: file->save as should change the file name in the title bar
- Project: file open on an unmodified project should not open a new project window but
  reuse the existing one
- TrackRoll: implement copying of parts
- TrackRoll: implement selection and copy and paste of parts
- let bst_key_combo_popup() display currently pressed modifiers
- let bst_key_combo_popup() tell the user to press a mouse button to abort
- CPU monitoring
- add facility to record MIDI control events
- implement an object clippboard
- add script to re-quantize piano-roll selections
- freeverb bypass toggle
- add "bypass" option to audio output channels
- virtual MIDI keyboard
- fix tracks used only as modulation input (party-monster.bse)
- piano and track roll scrolling implemented with secondary scrollbar
- piano roll dialog gains partlink property editor
- implement humanizer note offsetting in sequencer, let the user specify randomization range
- support loading of Effects from Effect Library directory from a button in the router/rackview display
- add "Insert Property" menu to rack view which lists all objects and their proeprties hirachically
- object tree backbone/trunk/tribe type for project, server and workbench
- item_get_toplevel() function for toplevel parent quries
- proxies get exported: if toplevel->use_count>0
- backbones exist only if they have a use_count
- forcefull alive keeping of objects if they have a use_count
- how export proxies of parents that don't have a use_count and are no backbones?
- recode hpack and vpack uses
- emulate ref_count+::destroy semantics with use_count+::release? ala:
  - use_count prevents ::release emission
  - ::release on containers removes children
- implement remote use-count collection
- complete and intergrate piano-script
* eliminate everything that fgrep -i fixme/hack reveals
* move mix_freq and recording_freq into datahandle
* fix reversed data handle wrg n_channels
: propagate mtime changes through cascaded data handles (e.g. for dcache)
: gsldatacache.c: nuke blocks upon reopen if mtime changed
: clone handle caller must be fetched from stack

PianoRoll:
- implement HFlip selection script
- play notes when inserted into piano roll
- change piano roll dialog wrg GDK_Escape (ala trackroll)?
- cleanup piano tick bar
- portamento-to-note in piano roll? probably need special effects
- add to piano roll dialog:
  part-link properties:
  - loop-count
  - length (tact-entry)
  - part coment
  this fixes tact-kind queries for piano roll editing
  and song position pointer placement
- hotkey in piano roll to replay project
- hscrollbar resizable (like cubase) or last-tick + 1 tact
- ctrl+move should copy (DND style modifier)
- tooltip follows mouse and shows current note/tact
- hotkey fuer play song
- play notes upon insert (click on piano roll window)
- ctrl/shift modifiers for selection
- fix hscrollbar  (BsePart end position implementation)
- select loop for playback during editing

Snet Router:
- ctrl+move should clone objects (DND style modifier) 
- support selections for group moves
- add property editor dialog which contains intersection of properties from selected objects
- middle mouse button on canvas background should scroll

Grouping multiple Modules in Synth Router:
1. copy selected modules to a new CSynth
2. delete selected modules
3. add SubSynth instead of selected modules, which uses the new CSynth

TrackView:
- resizable scrollbar
- context menu with delete, move, insert (double click inserts?)

SClock:
- incremental sort for median
- calc non-linear slope in one go
- new clock type that switches to linear once >QUEUE_LENGTH

General BSE:
- object tree backbone/trunk/tribe type for project, server and workbench (treeroot storageroot)
- item_get_toplevel() function for toplevel parent queries
- level-o-meter visualizer at links (adjustable?)
  needs linear (red >1) and logarithmic display
- frequency shifter/multiplier (*2 etc.)
- fix fine-tune settings (from gsl)
- replace gsl_signal_exp2() with gsl_approx_exp2() and audio test result
- provide proper dB functions in GSL
- adjust stepping and type for all percentage settings
- alive keeping for waves which are removed, but whose index is in use?
- loading (restore) may only work when not playing (to keep consistency
  and avoid lock contentions during playback)
- during playback the instrument set needs to be fixed on a song  
- BSE_SOURCE_GET_CLASS (source)->remove_input() add GslTrans* so clear_input removes really in batches
- add pre-amplification (0..1) to freeverb for clip prevention
- fix scanner error messages for deferred channel resolution to include the *correct* line number
- fix update_suspension_state() recursion for ordinary cycles
- replace Balance settings with 3d room position?
- BseSubInstrument contains pixel artefact
BseWaveChunk:
  if (pos > wchunk->tail.end)                                   /* outside wave boundaries */
    {
      iter->lbound = 0;
      iter->rel_pos = wchunk->n_pad_values;
      iter->ubound = iter->rel_pos + MIN (STATIC_ZERO_SIZE - 2 * wchunk->n_pad_values, pos - wchunk->tail.end);
      if (PRINT_DEBUG_INFO)
        g_print ("PHASE_UNDEF, post-tail %ld %ld %ld\n", iter->lbound, iter->rel_pos, iter->ubound);
      return PHASE_UNDEF (wchunk);
    }
  the "pos - wchunk->tail.end" is wrong for direction=+1, should be checked only for direction=-1 and
  then affect lbound
* wavechunk, fill-block:
  wpos.loop_count = loop_count;
  dnode = gsl_data_cache_ref_node (wchunk->dcache, 0, TRUE);
  s/0/wpos.pos/ or offset
- notifier wakeup is disabled in bsemidireceiver.c
  ('cause gsl_thread_main needs to be replaced by bse_main_thred() or somesuch)

OPTIMIZATIONS:
- optimize BseBalance process()

GUI features:
- entry focus watcher: for property editing entries, do:
  ::focus_in   - set changed_flag=0
  ::changed    - set changed_flag=1
  _apply_value - set changed_flag=0
  ::focus_out  - only re-apply value if changed_flag!=0
- XFrames should highlight like buttons in EDIT mode?
- Module Menu: add EDIT
- part editor needs play position
- track editor needs play position
- Modul BseTranspose, inputs: frequency, outputs: frequency, property: semitones
- part-view: double click on list items should fire up editor
- BstToolbar, drop-down selections work only after button release
- support GUI info about what PCM device is opened r/w and about midi devices (some have just PCM)
- fix data cache seeks to skip the -64 byte offset at block boundaries

Effects:
* BLIT, band-limited impulse train oscillator
- device monitor latency setting should be persistent in .bserc
- implement filters from http://www.harmony-central.com/Computer/Programming/Audio-EQ-Cookbook.txt
  (main source for http://zynaddsubfx.sourceforge.net)

GSL:
  * sample loader currently hard codes 440.0 for osc_freq
    Person        S T
75- [stw]         2 9 LP -> LP transforms or zero/poles
76- [stw]         1 8 3-stage joining FFT code
76- [stw]         4   /usr/share/doc/sfftw-dev/README.hacks
76- [stw]         1 7 FFT L-case optimiaztions
  - [stw]         5 1 .PAT loader (move)
74- [stw/timj]    6 5 filter evaluate function (to draw graph)
  - [stw/timj]      9 port plugins listed in plugins/Makefile.am:UNPORTED
  - [stw/timj]    6 3 1) OscTableEntry sizes (wave_table_size ())
  - [stw/timj]    7 3 2) development of gsl_osc_table_create() frequencies
  - [stw/timj]    4 4 3) PWM scaling
  - [stw/timj]    6 6 Filter boundary conditions?
                    Also, need 2stage filters with way smaller errors
                    Filter: Oppenheim Schaefer page.441 2stage filters implementation
                        (2stage pair finding by single (zero, pole) pair plus
                        conj. complex pair)
  - [timj]        9   Buffered data handles for coarse seek
  - [timj]        8   WaveOsc: prop for stereo channel
  - [timj]        2 9 API for lp/hp/bp/bs generation from array of roots and poles
                      (requires zero and poles with ->im != 0 to occour in
                      conjugated complex pairs)
  - [timj]        6   in API and docs, s/roots/zeros/
  - [timj]        4   gsltests: change freq input, so that [0..1] => [0..pi]
  - [timj]        5   gsltest: swap epsilon and steepness params for t2* filters
  - [timj]        7 6 Async DCache read-ahead thread creation

sfidl:
  - remove cTypeField() from cbase
  - typeArg(), typeField(), typeRet() and typeArray() in sfidl-cbase.[hc]*
    must throw an assertion for unknown types
  - typeArg(), typeField(), typeRet() and typeArray() in sfidl-cbase.[hc]*
    should be moved into the non-base class that needs them (i.e. out of
    cbase)
  - sfidl-manual.texi: complete the documentation
80- handle Procedure {} namespace in namespacehelper
85- rename nspace.printableForm() to something that expresses namespace relativity
  - bse-plugin-generator: Effect->Property structure copies don't work for strings (merely a pointer copy)
    (at least SfiRec will probably not do a deep copy)
  - reenable signals in bseprocidl
  - error "bseamplifier.idl:71: error: double definition of 'Bse::Amplifier' as same type" should
    indicate where the previous definition was
  - support Neutral choice values, currently hardcoded for BseErrorType in bseprocidl
  - choice type should have validation function
  - handle non-validated sequences and records in generation code (things
    can be demarshalled in non-validated form after incompatible changes)
90- finish Sfidl::CodeGenerator::rename (relative naming)
  parser:
  - sfidl-parser.cc: property keyword should be nuked
  - clean up enum code to use ChoiceValue value or sequentialValue, without
    doing computations
  extensions:
  - signals should be specified in idl files (and have to be documentable)
  - sfidl --output=foo.cc should be implemented
  code generation:
    - extra namespace for C++ client code
  C language binding:
    - NULL pointer handling is broken
  C++ language binding:
    - defaults for records (should be fetched remotely ; missing type blurb)
      what's "remotely" for types generated by an in-thread host binding though?
    - serialization: can we _really_ only use a template thing?
65     => reorganization of the createTypeCode function
    - should objects _really_ be values?
    - bindings lack testing.
    - records in bseprocidl: how can we figure out the type?
    - dynamic invocation interface missing in C++ binding (properties, methods)
    - later: introduce iterators into sequences
66  - createTypeCode refactoring
      funcFromValue, funcToValue,
      codeVCallArgs
    - should we have toplevel (unnamespaced) symbols?
    - should we have a "using Bse::Standard" (as opposed to "using namespace Bse")?

bseprocidl:
  - doesn't really work when it comes to implementing _some_ objects yourself
  - should output lower case vars (Info help instead of Info HELP)

STEFAN TODO:
  - BseServer::bse-preferences should be of type Bse::GConfig instead of Sfi::Rec
  - bseplugin.c doesn't use libtool properly ; probably gmodule should be ported to
    libtool
70- Bse::MidiEvent: should be wire-passable
  - Makefile.plugins doesn't get regenerated properly
82- C++ Classes _need_(!) documentation (i.e. Sfi::FBlock, Sfi::String)
  - add a dependancy to $SFIDL for beast-gtk/bstrecords.idl
  - rename bindings to client and core (instead of interface and implementation)
  - port arts driver from csl to port-audio
  - write port-audio driver for beast
81- freeverb parameters are broken (it _says_ dB, but it definitely _is not_
    dB)
81- compressor gui: http://www.samsonwireless.net/store/product.asp?sku=EM.CLX-440&nav=m
81- migrate artscompressor threshold/output to dB (keep compat code)

vim:set ts=8 sts=2 sw=2:
