I'll look into changing the model system for that idea later. It's a good idea, it's just on the back burner for now.
For the moment, I want to talk about the Expand modifier in the old system. Part of my ongoing series of "mods in the old system behave poorly" posts.
The problems with Expand are a bit harder to spot than some. At first glance, Expand just makes the notes spread and contract, repeating every 2pi seconds, stopping during stops and delays.
But it turns out that to do this, the engine updates a global variable every frame. This variable is not reset between songs. So you play a song twice, and the Expand effect is synced to the music differently.
Additionally, stops and delays are handled by simply not updating if the frame update occurs during a stop or delay. There is no adjustment for a stop that does not begin and end on a frame boundary. So every stop causes the sync of Expand to drift by a few milliseconds.
If you try to use Expand in a gimmick simfile, and you actually care about exactly which arrows are visible, the complete lack of sync guarantee will cause problems.
This is just one example of the problems in the old system. I've made videos about
Boost + speed mods acting funny, and
Hidden/Sudden + offset having weird effects, and there's also the weird effects you get from setting Alternate or Cross or Split to negative values (which I don't have a video of). Hallway and Distant shift the notefield's y position. So turn them up high enough, and the field just flies off the top of the screen. Reverse makes Hallway/Distant tilt the opposite way, so you can't make an effect where the notefield is tilted and the receptors slide up and down with reverse.
Every time I look at some new part of the old system, I find some weird side effect like this. There's no sync guarantee. There's no direct control. It's just a random agglomeration of special cases that isn't suitable for general usage at all.
Edit: And then I discover
the chunk of code for the column positions used by Invert. This loop runs every frame, 16 iterations per player. Even if you're playing dance single, 4 columns, this loop runs 16 iterations for you. Nothing used in the body of this loop even changes every frame. This doesn't need to update every frame, it should run once, when the steps or style is set, and be done. The effect of this instance may be small, but this is the kind of complete waste that really irritates me.
Tipsy is also not synced to the music.
(link goes to an old version of the code because I moved the
tipsy code to ArrowEffects::Update to make it more efficient, and I didn't want people accusing me of screwing it up)
OpenITG has unsynced Tipsy too.