The original idea would make things a pain quick if you wanted to swap the id of a channel in you show because you would need to update every group that uses that channel and re map it.
This is only a pain if your groups explicitly reference channels - which would mean you are not sufficiently abstracting your lights.
I think the sweet spot here is to think about what it is one sequences. I don't sequence channels, I sequence items in my display - this might be a window frame, a mini-tree, a mega-tree etc.
These might be be composed of many lights and many channels.
At a low level, there will always be channels - real channels or "physical channels"
Also at a low level, a single physical light might use one or more than one channel (an RGB pixel node, or a 16ch DMX fixture)
This low level association between a fixture and real channels is something that can't be abstracted - but from that point forward, this direct association should never be assumed by other features of the software.
so in pseudo code (though not far from they way my software works):
left_window = channel 2
right_window = channel 3
windows = group(left_window,right_window)
The windows group doesn't know anything about the channels used by the left or right window
Now I currently take it a step farther, I map a signal to a light or group. The signal could be any number of inputs, the computer keyboard, a MIDI keyboard, a 3D intersection in Kinect, the tilt of an iPhone etc.
The signal is received and dispatched according to a mapping. A given signal can be dispatched to one or more items.
So lets say I map the "R" key to the windows group.
dispatcher.add_observer("R", windows)
now I tap out a bunch of window flashes using the R key to my song. I have a signal track.
I have a "sequence" that only consists of a set of signals. This is completely abstracted from the groups, which are abstracted from the channels.
Now if I decide to add a roofline to be in sync with the windows, I can go back later and do:
eve1 = channel 9
eve2 = channel 10
eve3 = channel 11
eves = group(eve1, eve2, eve3)
dispatcher.add_observer("R",eves)
Now without changing the "sequence" (the signal sequence) at all, I can change how the lights map to it. I can add or remove lights from groups, change some effects etc, without changing the sequence at all.
The signal only provides basic timing info. The "show" part comes from properties of the lights, groupings, sequences and effects that these signals trigger. You can experiment with all of the effects parameters etc without needing to change the sequence.
This object oriented approach is mapped directly onto Python's own object oriented language constructs, which provides lots of flexibility in creating a show.
-Preston