| ! | Implement init commands Problem: We must invoke the init() commands when the Part starts to play, not before!
 > Add eval invocation code (controller)
 > Add corba events to list (midifileplayer)
 
 | 
| ! | Load and save compositions 
 | 
| ! | Patent 
 | 
| ! | Add Exceptions to CommittedDeviceDialog 
 | 
| ! | Add factories to UncommittedDeviceDialog 
 | 
| ! | Implement other timing types in MidiUtil.getPPQ(..) 
 | 
| ! | Opening a MIDI File Player dialog before the corresponding part has
		started playing shows current settings 
 | 
| ! | If a PartElement is re-matched, it is possible that a previously matched
		Device will be unavailable for the new booking.  The Controller releases
		the previous booking and matches the DeviceElement to a new Device
		instance.  Design issue: If the Device has been modified using a device
		client, the new match will device will omit such modificatons. 
 | 
| 
 | 
| O | Linux release 
 | 
| O | Create an applet version.  Can we copy the DLLs from the jar file
		to the cwd? 
 | 
| O | Implement HardwareDevice:Musical This device is the parent of the 2 midifileplayer factories
 
 | 
| O | Create automatic latency calculator Possibly using a loopback audio cable.
 
 | 
| O | SMF to XML studio Existing SmfToXml: Allow user to select interface, instance names
 
 | 
| O | Put "event management" or "trade shows" into the WHATIS 
 | 
| O | Synchronised blocks for many, many users (CTRL, midifileplayer, UI)
 
 | 
| O | Migrate MidiFilePlayerClient to dmidi 
 | 
| O | Get an official server port: IANA application form 
 | 
| O | License content under Creative Commons 
 | 
| O | Slide projector controller 
 | 
| O | Graphics player 
 | 
| O | WAV/MP3 player (research 'acidized') 
 | 
| O | Lights controller 
 | 
| O | Add XML view to CommittedDeviceDialog 
 | 
| O | Detach controller dialog thread 
 | 
| O | Implement Save As... for devices 
 | 
| O | Create persistant explorer folders view, which is built up by navigating through different URLs which contain links to Doors XML files. 
 | 
| O | Zoom buttons 
 | 
| O | Icons in PartLabel 
 | 
| O | CTRL-drag copies 
 | 
| O | Add tooltips for dialog elements 
 | 
| O | Move preferred devices up and down 
 | 
| O | Drag pointers 
 | 
| O | PartLabel colour 
 | 
| O | If the user cancels the 'second' match some devices may still be booked in the schedule 
 | 
| O | play() returns device exceptions in XML 
 | 
| O | getPartXml returns an array of XML parts in the schedule, so that regestering a UI is faster 
 | 
| O | Convert command-line options to a .properties file 
 | 
| O | Groups of Controllers 
 | 
| O | Input devices 
 | 
| O | Save changes to config file on exit.  (Would affect just 'latency' at present.) 
 | 
| 
 | 
| ¯ | Win32 installer 
 | 
| ¯ | Think of better names for: Part, Part.Device, PartXML, Schedule Part, Device, PartXML -> PartElement, Part.Device -> DeviceElement
 
 | 
| ¯ | Launcher for CTRL, midifileplayer, UI 
 | 
| ¯ | Switch to SourceForge.net project news mechanism (?) 
 | 
| ¯ | Translate to SWT (?) 
 | 
| ¯ | Create alien writing backdrop for website 
 | 
| ¯ | Convert website to XML + XSLT (?) 
 | 
| ¯ | Boot floppy/CD 
 | 
| ¯ | SoftSynth midifileplayer 
 | 
| ¯ | If the config file doesn't specify the latency, then automagically calculate an estimate based on the CPU frequency - it's better than nothing. 
 | 
| ¯ | Switch from custom Factories to CORBA DII (?) 
 | 
| ¯ | Switch from int[] to MidiMessage (?) Ie. our Event class has a reference to a javax.sound.midi.MidiMessage instead of int[] data.
 
 | 
| ¯ | Automatic selection of config file based on MIDI hardware ID 
 |