FIXMES:
- save loop coordinbates
- when loading/merging bse files, make sure all orphan parts are in a new muted track and delete part-item-view
- implement ordinary save functionality
- pattern editor: pressing G+1 on G+1, should delete old note (and its length) and insert new note (and its length)
- pattern editor: add note LENGTH editing!
- pattern editor: keep focus line (i.e. tick) across zoom changes
- pattern editor: delete line and insert line (Del Ins) implementations
- piano roll: undo-group movements while button is pressed 
- piano roll: drag-and-drop should preserve channel numbers if possible
- track view: when middle button is pressed to position song pointer, set keep-pos-til-song-start flag
- fix trackroll dnd behaviour in upper left corner of scrollarea
- document monphon/polyphon setups
- need midi keyboard demo .bse file to be easily loadable (via demo/ menu)
- make channel blurbs and module names have the same font in router display
- assertion failed: BSE-ERROR **: file bsemidireceiver.cc: line 525 (void <unnamed>::change_voice_input(<unnamed>::VoiceInput*, <unnamed>::VoiceInputTable*, long long unsigned int, <unnamed>::VoiceChangeType, float, float, GslTrans*)): assertion failed: (vinput->iter == table->end())
- add DSP engine module stats to profiler dialog
- add tooltips to categories and use that for bst_action_list_add_cat()
- take a look at the cdrecord source for their __dtoa() implementation
- if mmap() is available, write autosave.bse to it every couple minutes (no need to flush unless crashes take the data with them)
- make View/Rebuild --devel or -:d only
- provide "+"/"-" buttons for "path" property editors with own tooltips
- fix continue_after_deletion in gslwavetool.c for i==n_chunks-1
- beast depends on texithequemacros.texi but texitheque doesn't install it
- add tooltip and Filedialog-button to "WAVE File" entry
- big engine block sizes (>=1024) triggers sequencer race, causing clicks; in particular
  if (vinput->vstate == VSTATE_IDLE) g_printerr ("reading from idle\n"); in
  voice_input_module_process() holds true
- fix bse_gettext()
- deleting a track doesn't delete it's sniffer
- report sample rate to stdout if it doesn't match requested rate exactly
- 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)
- add gate-out to ADSR
- 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 radget notebooks
- add one-shot property to gxk-radget-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
- Time Counter: Measure,QuarterNote,SixteenthNote,3840ticks

DOCS:
- document choice<->enum conversion functions
- 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]

MONITORING DIALOG:
* Frame "Thread Info"
- tree view
- THREAD Cpu% User Sys
- TOTAL  Cpu% User Sys
* Frame "Latency"
- tree view
- Effective Output Latency: xx.x ms   [same for Input]
  (Beast DSP Engine ---> Membrane)
  (Beast DSP Engine ---> Output Driver)

DRIVER DIALOG:
* Frame "Audio Driver"
- Driver name (choice)
* Frame "Midi Driver"
- Driver NAme

TODO:
- support sequencer input from and to ALSA and JACK
- Icons: delete-track and delete-part shouldn't have the same item in track-roll
- 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
- Engine: skip ENGINE_NODE_LOCK() in master_process_locked_node() for singleproc
- 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

SourceSniffing:
  typedef struct {
    guint           n_channels;
    BseSourceProbe *probes;
  } BseSourceProbeList;
  typedef enum {
    BSE_SOURCE_PROBE_PEAKS   = 1,
    BSE_SOURCE_PROBE_SAMPLES = 2,
    BSE_SOURCE_PROBE_FFT     = 4,
  } BseSourceProbeMask;
  typedef struct {
    guint              channel_id;  // output channel id
    SfiTime            block_stamp;
    BseSourceProbeMask probe_mask;
    gfloat             min, max;    // probe_mask & BSE_SOURCE_PROBE_PEAKS
    FBlock            *sample_data; // probe_mask & BSE_SOURCE_PROBE_SAMPLES
    FBlock            *fft_data;    // probe_mask & BSE_SOURCE_PROBE_FFT
  } BseSourceProbe;
  bse_source_request_probes (BseSource *source, guint ochannel_id, BseSourceProbeMask probe_mask);
  /* lasts for approx 3 probes or 1 second */
  typedef struct {
    BseSource         *source;
    guint              ochannel_id;
    BseSourceProbeMask probe_mask;
  } BseSourceProbeRequest;
  typedef struct {
    guint                  n_requests;
    BseSourceProbeRequest *requests;
  } BseSourceMassRequest;
  bse_source_mass_request (BseSourceMassRequest *mrq);
  
Logging:
* stdlog could be log file, syslog, stderr and GUI
* Severity:
  - sfi_error (fwd, stdlog, GUI)
  - sfi_warn  (fwd, stdlog, GUI unless extra warning suppress)
  - sfi_info  (fwd, stdlog, GUI unless message suppress)
  - sfi_diag  (fwd, stdlog, not GUI)
  - sfi_debug (loc, stdlog)
* Message forewarding:
  Scheme -> Shell -> wire -> BSE -> Beast
  - need ability to track originating process
  - need ability to track originating package
* Allow message supression list through hash mechanism
* Origin: special case "io/" to stdlog
* GUI handler (thread local), proxy notification via BseServer signals
* Example:
  - #define LOG_DOMAIN "MidiDriver"
    #define LOG_ORIGIN IO_GENERIC
    _report ("MIDI", _("Advice about MIDI device selections"), _("failed to open %s, using Null MIDI device"), "/dev/midi");
    _report ("MIDI",
             _("Advice about MIDI device selections"),
             _("Alert me about MIDI device selections"),
             _("failed to open %s, using Null MIDI device"), "/dev/midi");
  : Report: failed to open /dev/midi, using Null MIDI device
    [ ] suppress future messages of this kind
    
        FooLogConf foo_log_conf (const char *, ...);

	#define LOG_DOMAIN "AllProtocolsLib"
	#define RDP_LOG     foo_log_conf ("io/rdp", _("Alert me about unrechable servers"), _("Alert me about unrechable servers"))
	static FooLogConf RDP_LOG ("io/rdp", _("Alert me about unrechable servers"), _("Alert me about unrechable servers"));
	foo_error (RDP_LOG, _("Server %s:%u not reachable"), server, port);
	RDP_LOG.error (_("Server %s:%u not reachable"), server, port);

	#define pcm_null FooLogger ("io/pcm", _("Advice about PCM device selections"))
	pcm_null.error (_("using NULL device"));
	
	#define pcm_avail FooLogger ("io/pcm", _("Advice about PCM device availability"))
	pcm_avail.warn (_("device disappeared: %s"), "/dev/pcm");
	pcm_avail.warn (_("device appeared: %s"), "/dev/pcm");

	#define music_log FooLogger ("io/music")
	music_log.error (_("using NULL device"));
	music_log.warn (_("device disappeared: %s"), "/dev/music");
	music_log.warn (_("device appeared: %s"), "/dev/music");

	#define midi_log FooLogger ("io/midi", _("Alert me about MIDI devices"), _("Advice about MIDI devices"))
	midi_log.error (_("using NULL device"));
	midi_log.warn (_("device disappeared: %s"), "/dev/midi");
	midi_log.warn (_("device appeared: %s"), "/dev/midi");

	Show Messages about:
	[ ] Advice about PCM device selections
	[ ] Advice about PCM device availability
	[ ] Advice about MIDI devices

	
  - Message Supression Configuration:
    -> reenable messages related to MIDI
       ["MIDI" being kind or class]
    Enable or disable certain messages types:
    [ ] Advice about device selections
   

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?
- 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]    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:
  - 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:
