FIXMES:
- 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
- compressor gui: http://www.samsonwireless.net/store/product.asp?sku=EM.CLX-440&nav=m
- migrate artscompressor threshold/output to dB (keep compat code)
- 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
- fix engine deinitialization warning in bseserver.c
- match enum names on word boundaries only
- 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
- RackEditor covers are broken for rack-items close to right table boundary
- 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
- collect flow jobs from unscheduled nodes, i.e. call
  collect_trash_timed_jobs_L() not only from _engine_push_processed_node()

DOCS:
- pressing browsing hotkeys in release-notes dialog does stuff
- Ctrl+'+' and Ctrl+'-' should change font sizes in doc browser
- update /Help index to cover new docs
- add bse-categories.txt to /Help menu (probably rewrite to .texi)
- add tag to load/play bse files
- add QuickStart section on wave selection
- add QuickStart section on postprocessing effects
- make beast recognize and view .markup files from the command line
- add QuickStart section on piano roll usage, esp. copy+pasting
- implement Playback facility in doc browser for .bse file links
- try implementing some kind of table layout for tsmview [timj]
- 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]

Stefan Gui TODOs (priorities: 9=high, 0=low):
8 - closing the BEAST window should ask (close/save/abort) if unsaved changes are
    in the project
7 - file->save as should change the file name in the title bar
6 - file open on an unmodified project should not open a new project window but
    reuse the existing one
5 - implement copying of parts
4 - implement selection and copy and paste of parts in the strack roll

TODO:
- 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)
- delay class destruction and plugin unloading through async handlers (slight timeout)
- piano and track roll scrolling implemented with secondary scrollbar
- piano roll dialog gains partlink property editor
- item links: (where (link 3 "TrackLink::LinkTrack::Cool"))
              (where (3 "tree:sopidgsdf:sdggsdf"))
              (where (link 3 "tree::sopidgsdf::sdggsdf"))
- prop flag: SFI_PARAM_SKIP_DEFAULT
- implement humanizer scheme script that offsets notes by a few random ticks
- add text about MIDI realtime synthesis via external MIDI devices to beast overview paper
- 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()

GSL:
* sample loader currently hard codes 440.0 for osc_freq
  Person        S T
- [stw]         2 9 LP -> LP transforms or zero/poles
- [stw]         1 8 3-stage joining FFT code
- [stw]         4   /usr/share/doc/sfftw-dev/README.hacks
- [stw]         1 7 FFT L-case optimiaztions
- [stw]         5 1 .PAT loader (move)
- [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
- [stw/timj]    6 5 filter evaluate function (to draw graph)

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)

sfidl:
90- bse-plugin-generator: Effect->Property structure copies don't work for strings (merely a pointer copy)
85- support records and sequences in bse-plugin-generator and bseprocidl
60- bse.idl defines bseamplifier, for which there is an idl file
    (touch bseamplifier.idl; make breaks)
59- Const lookups don't honour namespacing
59- namespace prefixing in ParamHints doesn't work:
    namespace Dav {
    Num x = (::Bse::STANDARD);
    Num y = (Bse::STANDARD);
    Num z = (::STANDARD);
    };
58- namespace using doesn't work:
    namespace Dav {
    using namespace Bse;
    Num x = (STANDARD);
    };
51- reenable signals in bseprocidl
50- error "bseamplifier.idl:71: error: double definition of 'Bse::Amplifier' as same type" should
    indicate where the previous definition was
49- support N/A 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)
  - sfidl-parser.cc: property keyword should be nuked
  - sfidl-parser.cc: choices i18n
  - install sfidl
  extensions:
30- choices need support for icons per value
30- choices need support for tooltips per value
20- signals should be specified in idl files (and have to be documentable)
  - beautify procedure skeletons
  - sfidl --output=foo.cc should be implemented
  code generation:
    - extra namespace for C++ client code
    - restructure name generation to example-based output:
      foo-bar, foo_bar, fooBar, FOO_BAR, FooBar
  C language binding:
99  - review Rec primitive types
    - NULL pointer handling is broken
  Qt language binding:
05  - everything
  C++ language binding:
    - defaults for records (should be fetched remotely ; missing type blurb)
    - serialization: can we _really_ only use a template thing?
      => reorganization of the createTypeCode function
    - should objects _really_ be values?
    - bse-plugin-generator as extra binary?
      => should be sfidl --module
    - bindings miss testing.
    - set bse-preferences BSE::GConfig property.
    - records in bseprocidl: how can we figure out the type?
    - dynamic invocation interface missing in C++ binding (properties, methods)
    - later: introduce iterators into sequences
    - port arts driver from csl to port-audio
    - write port-audio driver for beast
    - optional conversion routines C++ -> C (and back)
    - introducting CodeGeneratorCxxBase
    - createTypeCode refactoring
      typeArg
      typeField
      typeReturn
      typeArray
      funcFromValue, funcToValue,
      funcCopy, funcFree, funcNew,
      codeVCallArgs

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

other stuff:
  - bseplugin.c doesn't use libtool properly ; probably gmodule should be ported to
    libtool
  - Bse::MidiEvent: should be wire-passable
  - Makefile.plugins doesn't get regenerated properly


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