# Carla TODO

# ----------------------------------------------------------------------------
# in short

1. move backend from Qt to Juce (80% done)
2. move frontend from PyQt4 to PyQt5, rewrite to share widget code (60% done)
3. allow to use old Qt code (except graphics) for non-Juce-supported OSes (BSD, Haiku, Solaris, etc)
4. custom "plugin slots" skins, ala Reaper (also define set of keys for a new LV2 extension)
5. internal patchbay processing mode (needs #1)
6. Carla as an LV2 plugin (needs #5)
7. direct support for csound files (as plugins, inspired by 'cabbage')
8. OSX builds (needs #1 and #2)

Ideas for later:

 9. Carla as VST plugin (will have to be a custom UI)
10. easier canvas connections by using smart key shortcuts
11. Mobile version (using Android Patchfield for example)
12. Mobile OSC Control app
13. Port good JACK-only apps as internal plugins (zita stuff would be nice)

# ----------------------------------------------------------------------------
# more detailed

GENERAL:
 - finalize Juce backend move
 - finalize PyQt5 move
 - add back old Qt code for when Juce is not available (or disabled by user)
 - add direct program access on ui-dialogs (needed for standalone bridges), maybe add extra buttons too (reset plugin, fix ui size)
 - implement midi-learn (new dialog)
 - custom skins for plugin slots, design for 8 types + instruments (gig, sf2, sfz)
 - custom skins for internal plugins
 - implement favorite plugins, add in new tab near file-browser
 - blender style canvas theme
 - make it possible to run forced (and only) rack or patchbay mode
 - make it possible to use backend as fake standalone app (using pipes) instead of a shared library
 - create startup scripts for carla-rack, carla-patchbay, carla-settings, etc
 - smarter carla-single script (LV2 must only need URI for example, and ignore all other hints)
 - alternate, simpler UI for mobile and/or VST version

ENGINE:
 - allow to change position of plugins (up/down)
 - allow to add plugins when engine is stopped
 - save&restore canvas connections (optional, must not be used under SM)
 - complete RtAudio+RtMidi support (only MIDI out missing + save&restore)
 - complete Juce engine driver support
 - implement Haiku Media support (based from JACK?, LATER)
 - implement latency in continuous-rack mode
 - implement internal patchbay mode (once Juce move is complete)
 - engine as internal plugin
 - internal patchbay mode, based on Juce graph code
 - handle sample-rate changes in JACK (made possible by switch-master)
 - add MIDI-bank change type (GM, GS, XG and MMA). See fluidsynth docs
 - allow to use static OSC ports

PLUGINS:
 - add control-out rate/freq option in frames (or just a regular block-size option?)
 - control/midi-out in singleProcess() calls, use timeoutFrames var
 - implement midi-cc automation special rules (invert, half, logarithmic, etc)
 - implement Juce plugin hosting (provides AU and VST2/3 support; will replace current VST hosting if Juce is used)
 - implement LSCP file support (new native plugin)
 - implement Csound file support

Native:
 - Cleanup API
 - Document API

LADSPA:

DSSI:
 - custom chunk-data extension, publish on kx website when complete

LV2:
 - complete lv2-worker support
 - handle in-process graphics via Juce
 - no in-process UI support if juce disabled
 - revisit all extensions
 - option to set lv2 preset folder
 - only load LV2 bundles on request, never load full LV2 world

VST: (non-Juce build)
 - no UI support
 - simplify code (because of no Juce)

FluidSynth:
 - per-channel volume control
 - proper buffer-size/sample-rate change

LinuxSampler:
 - multi-program
 - 16outs (depends on multi-program)
 - proper buffer-size/sample-rate change

# ----------------------------------------------------------------------------
# current work

BACKEND:
 - cleanup API, document everything properly (tested with doxygen)
 - apply API docs to python code as well (TODO: use proper predefined pydoc style)

FRONTEND:
 - fix things to new cleanup API
 - share code as much as possible

OTHER:
 - create tests for all utils code
