I’m also using Hauptwerk for my organ. At the moment I only have the free edition and only St Anne’s.
The key part of my solution is the way NG is using the script file. When the script file gets called it gets loaded from the SD card which takes about 5ms. When in the mean time another request to use the script file gets launched that means that the previous iteration gets abortet and a new instance gets launched. For a general cancel e.g. on the St Anne’s which has around 40 stop/combination jambs that means that Hauptwerk sends out 40 commands which will take less than 1ms (isn’t high speed usb midi transfer a nice thing … 50 times faster than standard midi … otherwise 40 commands would take several ms). In this time the script gets launched 40 times, the first 39 iterations don’t even manage to load the file from disk before they get aborted. Nevertheless all correct solenoids are now switched on and the 40th iteration starts to run. All the script is now doing is to deactivate the sending of the midi signal on change of any stop, wait 100ms, deactivate all solenoids and re-activate the midi signal broadcast.
After I had all my stop tabs wired in and written the configuration a general cancel of 40 stop tabs was the first thing I tried. It’s funny how emotional 40 switches switching can get you 
As I said I modded the original DOUT R5 board. It does support the footprint of the ULN2803 but the ULN specific pins are not connected to anything so I did the following:
<___base_url___>/gallery/image/2776-modded-dout-r5-board/?do=embed
for each SR/ULN I had a ground line which I wired to the power supply and a wire with the contact of the flyback diodes which I connected to the common positive. So overall 11 wires to the PSU ground and 11 wires to the PSU positive (+1 wire which connects to the common plus rail of the SAMs). You are obviously right that this means that for 100ms you get a current of potentially 1.6A (I use a 12V PSU rather than 15V reducing the current from 0.5A per solenoid to 0.4A) through a single ground wire of a ribbon cable which is everything but optimal but I hope that I don’t suffer any weird behaviour as a result of this.
I guess you could probably mod the board in some way to use the MIC (can it be used for common negative SAMs?) but I guess that your board is better for that. Redesigning the board was simply out of scope for me both time wise and money wise.
I think John was mainly struggling with weird behaviour coming from using the ULNs for his common negative SAMs as theyare designed for common positive SAMs. While it still works in principle you apparently get weird cross talk problems by occasionally actuating neighbouring SAMs, etc. If you would get a solution for common negative SAMs up and running I think he would be very interested though I read between the lines that he now got a commercial solution.
Finally I’m not sure if you put any thought into whether to use NRPNs or CCs for your SAMs/Pistons. If you want to use CCs I just wanted to make you aware of a caveat which I found out about from Hauptwerk support. Hauptwerk supports NRPN which really is a meta-protocol based on CCs. The CC messages which are used for NRPN are CC=6,38,98,99,100,101:
http://www.philrees.co.uk/nrpnq.htm
That means that these CC signals are reserved in Hauptwerk and have to be skipped when assigning signals.
I only collided with CC=6 and 38 before I found out. 38 simply doesn’t work (Hauptwerk can send it but won’t react to it on receiving it) while I attribute using cc=6 to corrupting the organ cache which means that I had the joy of having to wait 5 minutes for it to get rebuild.
Hauptwerk recommends using NRPN. You have to decide if it gives you any advantages over the down turn of increased bandwith usage.
edit: I totally appreciate that my solution seems a bit of an overkill … after all my configuration is now longer than 700 lines (config + script file attached).
edit2: my DOUTs are 10-12’’ next to the Core and all DOUTs are directly next to each other.
[ORGAN.zip](< base_url >/applications/core/interface/file/attachment.php?id=11873)