Right, the evolution aspect I get, or maybe shouldn't need to get. I'm talking about UI.
For example, there are four cells to hold patches to morph. How do I get patches into each of those cells so start the process? I don't recall if I managed it or only managed two, but the process was not intuitive.
On my evolver, every empty cell initially contains a button that says "ClickToGetPatch" and pulls the current patch into that cell. It spells it out about as blatantly as possible. Once a patch is in a cell its name is displayed and clicking the cell sends it back to the synth for audition. "Click cell to send, right-click to delete" is the text I put somewhere around the frame if I remember right. I also include a counter that shows how many iterations a particular cell has survived.
Sorry, I don't mean to be a downer on Edisyn. It is a useful piece of work that you've worked hard on and it has been helpful. Your choice of synths was great, I have many of those synths. And if you hadn't written Edisyn with the PseudoMPE and sysex, I would not have bought a Kyra.
As far as the off-by-one error ... checking ...
Just now I loaded a patch and pulled it in to Edisyn. I display slot 6 of the patch's mod matrix on Kyra's display. I select Channel Pressure in Edisyn as the first mod source for slot 6. The Kyra now displays the Pitch bend as the first source for slot 6, which is one off from Channel Pressure. So I am guessing one array is zero-based and one is one-based.
I just checked, destinations are also off by one in the same direction. I selected Osc 1 detune and Kyra is now set to Course tune, so the Kyra is one less.
Amounts of the modulations are correct.
Oh I forgot, my patch evolver also does the pitch bend max range tweak and the CC74->CC19 tweak on the fly as well.

I think I'll need to implement your PseudoMPE button for auditioning.