HD Midi

Anything about hardware musical instruments.
Post Reply New Topic
RELATED
PRODUCTS

Post

I may have spoken too soon... Diva may be ignoring data sent on CC38 when configured to Continuous14bit. I'll have to investigate more when I have a chance.

Post

AdmiralQuality wrote:
justin3am wrote:For anyone who is interested, it appears that Ableton Live and U-he's Diva will respond correctly to 14bit absolute values. Diva also responds to inc/dec messages... one of the few instruments I know of that will, outside of Reaktor and such. Most DAWS will respond to inc/dec messages but it's unusual for an instrument to do that (probably because most plug-ins can't send parameter feedback directly to a controller via MIDI).
Well, also, what does inc/dec mean with 32 bit floating point resolution? How much is an increment?
It depends.

Ultimately the software receiving the message will have to decide what value to increment by. The controller has no idea what is happening on the receiving end, unless you can transmit parameter feedback.

Most controllers that transmit inc/dec messages use acceleration curves, so if you turn an encoder clockwise at a slow rate, it will send out a value of 1 (this doesn't necessarily mean that the software on the receiving end should increment by 1) for each step/increment, turn the encoder counter-clockwise at a slow rate it will transmit a value of 127 for each step/decrement. If you turn the encoder clockwise but slightly faster it will transmit a value of 2 for each step (telling the software to increment by a coarser value) and if you turn the encoder ccw but slightly faster it will transmit a value of 126 for each step (telling the software to decrement by a coarser value). Does that make sense?

In Diva, you have a few options for how coarse/fine you want parameters to increment each time it receives a new message via a given CC.

Post

AdmiralQuality wrote: Unfortunately there's no mechanism for VST automation (the correct name for the communication standard you're referencing) to be communicated from any device, to your computer, and on to your host. (There are various "control surface" interfaces but they're all completely proprietary, with no common standard.) You can't even typically send automation events from one plug-in to another. (Some hosts may let you copy automation envelopes, after the fact, from one instrument or effect's track to another, but again this is a far cry from what MIDI offers us).

So sorry, but VST automation is not a substitute for MIDI. I can't buy a keyboard that sends VST automation. And in VST 3.x land, I can't buy a keyboard that sends "Note Events", even though it is Yamaha/Steinberg who are forcing that nonsense on us! :x (Sorry, a particularly large pet peeve.)
Don't be silly. Just load up Cubase and enjoy the direct control of vst parameters, with any controller, even the 7bit ones. Even better if you have an inc/dec capable controller.


Btw. Why do you need to send automation between plugins?


Proprietary control surface standard:
http://home.comcast.net/~robbowers11/MCMap.htm
www.mkdr.net

MophoEd - the BEST DSI Mopho Editor VSTi

Post

justin3am wrote:I may have spoken too soon... Diva may be ignoring data sent on CC38 when configured to Continuous14bit. I'll have to investigate more when I have a chance.
The last I've known about it is it's still not implemented http://www.kvraudio.com/forum/viewtopic.php?p=4764068

But thats one year ago, Things might have changed but I can't find any thing about it.

Post

mkdr wrote:
AdmiralQuality wrote: Unfortunately there's no mechanism for VST automation (the correct name for the communication standard you're referencing) to be communicated from any device, to your computer, and on to your host. (There are various "control surface" interfaces but they're all completely proprietary, with no common standard.) You can't even typically send automation events from one plug-in to another. (Some hosts may let you copy automation envelopes, after the fact, from one instrument or effect's track to another, but again this is a far cry from what MIDI offers us).

So sorry, but VST automation is not a substitute for MIDI. I can't buy a keyboard that sends VST automation. And in VST 3.x land, I can't buy a keyboard that sends "Note Events", even though it is Yamaha/Steinberg who are forcing that nonsense on us! :x (Sorry, a particularly large pet peeve.)
Don't be silly. Just load up Cubase and enjoy the direct control of vst parameters, with any controller, even the 7bit ones. Even better if you have an inc/dec capable controller.
I would love to know how is this done, I don't use cubase, but I have the lite version. I just fired it and midi learned a knob on Sylenth1, same old levels (stepping). I assume your doing some thing else?

Post

mkdr wrote:Btw. Why do you need to send automation between plugins?
same reason as to send CVs between parts of a modular synth.

if plugins could generate automation data that could be routed to other plugins, all sorts of things would become possible, from sidechaining to LFOs to sequencers etc etc.
my other modular synth is a bugbrand

Post

S0lo wrote:
justin3am wrote:I may have spoken too soon... Diva may be ignoring data sent on CC38 when configured to Continuous14bit. I'll have to investigate more when I have a chance.
The last I've known about it is it's still not implemented http://www.kvraudio.com/forum/viewtopic.php?p=4764068

But thats one year ago, Things might have changed but I can't find any thing about it.
It is implemented now. I think it was added before v1.1. Right-click on the display at the top of the GUI and select 'MIDI Controllers'. There you can select between Continuous7bit, Continuous14bit and Encoder (inc/dec) message types.

Post

justin3am wrote:
S0lo wrote:
justin3am wrote:I may have spoken too soon... Diva may be ignoring data sent on CC38 when configured to Continuous14bit. I'll have to investigate more when I have a chance.
The last I've known about it is it's still not implemented http://www.kvraudio.com/forum/viewtopic.php?p=4764068

But thats one year ago, Things might have changed but I can't find any thing about it.
It is implemented now. I think it was added before v1.1. Right-click on the display at the top of the GUI and select 'MIDI Controllers'. There you can select between Continuous7bit, Continuous14bit and Encoder (inc/dec) message types.
Ok, I finally found the way to setup my slimphatty to send 14bit MIDI. Just tried it on Diva with that Continuous14bit setting. Unfortunately no use!!. The knob in diva simply wiggles very slightly when I move the knob in slimphatty.

I'm positive I can see 14bit data coming from Slimphatty, two CC controller numbers get sent when I move one knob.

Post

AdmiralQuality wrote:A few other requests to anybody who'd like to send me some 14-bit MIDI controller recorded in .mid files.

- Let me know what controller hardware it is.

- Let me know what host you recorded it in.

- And please do complete knob movement, from 0% to 100% and back, several times. Both fast and slow. The number of knobs you do doesn't matter much, but mixing up a few different ones and particularly moving two at a time would be very helpful.

Thanks! Email to aq AT admiralquality.com
Ok, Just sent you my 14bit MIDI test on SlimPhatty done in Reaper

Post

S0lo wrote: I would love to know how is this done, I don't use cubase, but I have the lite version. I just fired it and midi learned a knob on Sylenth1, same old levels (stepping). I assume your doing some thing else?
If you can record the data to an automation lane, you are done. Now you have 32bit data that gets fed to the synth. Your sequencer draws 32bit fades between the "levels" you just recorded with your 7bit controller. Enjoy :)



If you need even more control, there's Automap. Go google and watch youtube videos etc.
www.mkdr.net

MophoEd - the BEST DSI Mopho Editor VSTi

Post

mkdr wrote:
S0lo wrote: I would love to know how is this done, I don't use cubase, but I have the lite version. I just fired it and midi learned a knob on Sylenth1, same old levels (stepping). I assume your doing some thing else?
If you can record the data to an automation lane, you are done. Now you have 32bit data that gets fed to the synth. Your sequencer draws 32bit fades between the "levels" you just recorded with your 7bit controller. Enjoy :)
Thanks, but Won't work, Thats almost exactly like the lag/delay. It can't stop in the middle of two values, unless you MANUALLY edit the recorded and faded data, which is obviously not for a live performance.

Post

S0lo wrote:I'm positive I can see 14bit data coming from Slimphatty, two CC controller numbers get sent when I move one knob.
As far as I know four CC messages should be transmitted when sending 14bit messages.
NRPN LSB = CC98
NRPN MSB = CC99
NRPN Data Entry LSB = CC38
NRPN Data Entry MSB = CC6

RPN LSB = CC100
RPN MSB = CC101
RPN Data Entry LSB = CC38
RPN Data Entry MSB = CC6

It's possible that Moog are using a non-standard format but they would still need 3 CCs for a 14bit value (one for the control address and two for the value).

Post

justin3am wrote:
S0lo wrote:I'm positive I can see 14bit data coming from Slimphatty, two CC controller numbers get sent when I move one knob.
4 CC messages should be transmitted when sending 14bit messages.
NRPN LSB = CC98
NRPN MSB = CC99
NRPN Data Entry LSB = CC38
NRPN Data Entry MSB = CC6

RPN LSB = CC100
RPN MSB = CC101
RPN Data Entry LSB = CC38
RPN Data Entry MSB = CC6

It's possible that Moog are using a non-standard format but they would still need 3 CCs for a 14bit value (one for the control address and two for the value).
This could be my stupidity, But I meant that I'm seeing two controller numbers (19 and 51) NOT two CC messages. I don't know how many messages are sent. Here is what I'm seeing when I do a small tweak on a knob:

Controller, Channel: 1, Number: 51 (), Value: 45
Controller, Channel: 1, Number: 51 (), Value: 70
Controller, Channel: 1, Number: 51 (), Value: 97
Controller, Channel: 1, Number: 51 (), Value: 124
Controller, Channel: 1, Number: 19 (General Purpose Slider 4), Value: 39
Controller, Channel: 1, Number: 51 (), Value: 23
Controller, Channel: 1, Number: 51 (), Value: 50
Controller, Channel: 1, Number: 51 (), Value: 77
Controller, Channel: 1, Number: 51 (), Value: 104
Controller, Channel: 1, Number: 19 (General Purpose Slider 4), Value: 40
Controller, Channel: 1, Number: 51 (), Value: 3
Controller, Channel: 1, Number: 51 (), Value: 30
Controller, Channel: 1, Number: 51 (), Value: 60
Controller, Channel: 1, Number: 51 (), Value: 87
Controller, Channel: 1, Number: 51 (), Value: 117
Controller, Channel: 1, Number: 19 (General Purpose Slider 4), Value: 41
Controller, Channel: 1, Number: 51 (), Value: 16
Controller, Channel: 1, Number: 51 (), Value: 46
Controller, Channel: 1, Number: 51 (), Value: 76
Controller, Channel: 1, Number: 51 (), Value: 106
Controller, Channel: 1, Number: 19 (General Purpose Slider 4), Value: 42
Controller, Channel: 1, Number: 51 (), Value: 8
Controller, Channel: 1, Number: 51 (), Value: 38
Controller, Channel: 1, Number: 51 (), Value: 65
Controller, Channel: 1, Number: 51 (), Value: 92
Controller, Channel: 1, Number: 51 (), Value: 119
Controller, Channel: 1, Number: 19 (General Purpose Slider 4), Value: 43
Controller, Channel: 1, Number: 51 (), Value: 21
Controller, Channel: 1, Number: 51 (), Value: 48
Controller, Channel: 1, Number: 51 (), Value: 75
Controller, Channel: 1, Number: 51 (), Value: 102

Post

For what it's worth I wrote a midi JS for Reaper that converts lane automation (32-bit float) to RPN/NRPN messages:
http://forum.cockos.com/showpost.php?p= ... stcount=30
The JS is here:
http://stash.reaper.fm/v/3763/Automation_to_MIDI.zip

JS files are simply text scripts interpreted at run-time. You can open them in any text editor to see what I did.

The heart of the algorithm is the following:

Code: Select all

slider2 == 0 ? (
	// RPN mode
	cc_msb = 101;
	cc_lsb = 100;
) : (
	// NRPN mode
	cc_msb = 99;
	cc_lsb = 98;
);

num_msb = (slider3  / 128) | 0;
num_lsb = (slider3  & 127) | 0;
val_msb = (val_curr / 128) | 0;
val_lsb = (val_curr & 127) | 0;

midisend(offset, (cc_msg + slider1), (cc_msb) | (num_msb * 256)); // MSB Address
midisend(offset, (cc_msg + slider1), (cc_lsb) | (num_lsb * 256)); // LSB Address
midisend(offset, (cc_msg + slider1),      (6) | (val_msb * 256)); // MSB Data byte
midisend(offset, (cc_msg + slider1),     (38) | (val_lsb * 256)); // LSB Data byte

// The website http://www.philrees.co.uk/nrpnq.htm recommends all RPN/NRPN should
// send the registered RPN (127,127) after sending a data change.  This prevents
// a device from accidentally accepting a second change to the RPN/NRPN if CC
// messages 6 or 38 are sent sometime in the future withouth a corresponding
// address.
midisend(offset, (cc_msg + slider1), 32613); // (101 | (127 * 256))
midisend(offset, (cc_msg + slider1), 32612); // (100 | (127 * 256))
run = 0;
It worked well with all teh VSTs I tried that supported NRPN/RPN messages.
Last edited by bmrzycki on Tue Dec 11, 2012 7:21 pm, edited 2 times in total.

Post

S0lo wrote: Controller, Channel: 1, Number: 51 (), Value: 45
Controller, Channel: 1, Number: 51 (), Value: 70
Controller, Channel: 1, Number: 51 (), Value: 97
Controller, Channel: 1, Number: 51 (), Value: 124
Controller, Channel: 1, Number: 19 (General Purpose Slider 4), Value: 39

Controller, Channel: 1, Number: 51 (), Value: 23
Controller, Channel: 1, Number: 51 (), Value: 50
Controller, Channel: 1, Number: 51 (), Value: 77
Controller, Channel: 1, Number: 51 (), Value: 104
Controller, Channel: 1, Number: 19 (General Purpose Slider 4), Value: 40

Controller, Channel: 1, Number: 51 (), Value: 3
Controller, Channel: 1, Number: 51 (), Value: 30
Controller, Channel: 1, Number: 51 (), Value: 60
Controller, Channel: 1, Number: 51 (), Value: 87
Controller, Channel: 1, Number: 51 (), Value: 117
Controller, Channel: 1, Number: 19 (General Purpose Slider 4), Value: 41
Your controller is sending MSB/LSB CC messages. This is not the same thing as RPN/NRPN.

Basically your controller is taking two 7-bit CC messages (19 and 51 in your case) and sending the coarse adjustment as 19 (MSB) and fine adjustment as 51 (LSB).

The resulting number your host sees is a 14-bit integer represented as:

value = (CC_19_VALUE * 128) + CC_51_VALUE;

It's another way to get 14-bit precision in midi and the LSB/MSB pair is always 1 <= LSB <= 32
MSB = LSB + 32

And as you can see 19 + 31 = 51.
Last edited by bmrzycki on Tue Dec 11, 2012 7:31 pm, edited 2 times in total.

Post Reply

Return to “Hardware (Instruments and Effects)”