I've written some arduino code that can control multiple GE G-35 strings at once. It can control 8 at the same time (provided they're all on the same port). It takes around 920 usec to update 1-8 lights. So it could update 400 lights at the frequency 21 Hz (if my calculations are correct). Of course, if you need to use multiple ports, the frequency decreases exponentially. Although, normally, you do the updates to multiple ports simultaneously, rather than update all 50 lights on one port and then update the next port.
The first is a common library:
It should go into your <Arduino Projects Dir>/libraries directory. And it contains code to actually send signals. As well as some code for parallelizing updates. You basically specify the program to run for a particular string of lights (track) and the framework will execute it in parallel.
The second is an example program with some simple animations:
This uses the above library and executes some programs on the attached strings of lights.
Finally, there is a en ethernet UDP controller:
This code listens to UDP messages in my custom format (number of commands byes (1 <= X <= 8), followed by 5 * X bytes commands, each of which is pin (track) number, followed by 4 bytes (32 bits) light command. 26 lower bits out of 32 are used and are the same as GE control protocol 26 bits.
Because this involves a UDP read, it lowers update rate. Safe margin is 1.2ms per port, which brings refresh rate down to 16 Hz. There is not much I can do about UDP read delay, of course, but I can potentially change it to read multiple ports update in one message. So for instance, updates to 3 ports will take 3ms rather than 3.6ms.
I also have Java based controller that I'm planning to use to send commands to the above program (GECERemote). I haven't put it into git yet but if there's interest, I will do it.
I'd appreciate some opinions, comments, etc. Thanks.