@Fabian
A good suggestion to use pause/play instead of stop/play but produces the same results.
@DarkStar
Those 'odd messages' are absolutely necessary
There should be lots of program changes, some volume changes, and of course velocity setting for each note.
Well I found 2 solutions; here there are in order of performance.
1) Disable/Uncheck "reset CC" on stop/play. Preferences -> MIDI Devices -> Reset CC
Not sure if disabling this is what DarkStar meant, but he pointed me in the right direction - thank you!
2) If you absolutely NEED Reset CC enabled then use a simple JS script to spam volume reset to 100 for each program on each channel. This is a last resort solution because this is 128*16*2=4096 midi messages sent every time you press play (EDIT: which means it won't scale well if you have many tracks doing this...). The problem also still happens if you pause/play a lot instead of stop/play.
Here's the script. Copy this into a text file and save it without an extension into the folder with other reaper scripts. Add it in your project as a plugin just before Kontakt.
Code:
@init
loopChannel = 0;
loopProgram = 0;
loop(16,
loop(128,
midisend(0,192 + loopChannel, loopProgram ); // send channel/prog chng
midisend(0,176 + loopChannel, 256*100+7); // send volume set to 100
loopProgram += 1;
);
loopProgram = 0;
loopChannel += 1;
);
Thank you everyone for your suggestions.