But if the format of NRPN can be totally arbitrary, is it possible to read them? For example, we can easily read custom meta events since meta events have fixed format. But what if we encountered NRPN in a MIDI file? Is there reliable way to read it? Waiting for NRPN NULL (99/127 98/127)? But, for example, for RPN it's possible to omit NULL since data can be read by definition of RPN. So if we don't know NRPN, it's impossible to read it in general case?
Yes, of course we can't interpret NRPN data. But if format is arbitrary, we can't even read data. For example, we see following bytes sequence: 99/xx 98/yy 6/zz 6/rr. What is 6/rr? It's a new NRPN with data of rr, or 6/zz 6/rr together create two-byte value? With RPN we can easily understand where each new RPN starts and ends, even without NULL bytes, just by knowing format of each RPN.
Usually when both the Data MSB and the Data LSB are used, they are part of a single value, but again, with NRPN you cannot make that assumption.
Are you trying to decide how to present the data in a user interface? What is your goal?
My goal is to cc automate the Filter Envelope Depth of my synth (Hypersynth Xenophone) from my sequencer (Squarp Pyramid). The hardware does not really matter here, the question is general, although there are details of the hardware, that make a difference.
From the user manual EnvD is controlled by NRPN 9, with a range of 0-1000. The synth manufacturer tells me on his website that the maximum resolution in NRPN mode is 12 bit.
Turning the EnvD knob on the synth changes the values between -50 and +50. (I want to modulate it between -30 and 0, or thereabouts). I have also used on NRPN 9.
If supported by your synth, NRPN is going beyond conventional MIDI CC modulation, allowing finer resolutions (beyond values in the range of 0-127). To this end more than one item of controller data need to be send.
Not sure what you mean by 'NRPN 9'. You need to use the TWO controllers for NRPN, and these are CC 98 and 99 (decimal). Controller 98 contains the LSB, while 99 contains the MSB. So you are correct, you need to use the two bytes of data, and this will allow you to enter a larger value.
These things have been referred to earlier in this thread.
Another problem may relate to what you're sending data to, and what data you send. Are you wanting to send data to alter the EnvD setting directly, which may require data in one format. Or do you want to alter the parameters/operation of the EnvD knob, which may need something different. You should check the manual to see which should be the best way to do it.