Taming the QChord's MIDI output

BJG

2015-03-01 13:29:15

Hi all -

I have a Suzuki QChord, the lastest incarnation of the Omnichord, which I'd like to use for 'strumming' VST instruments like a harp.

Image

Unfortunately it has a pretty crazy MIDI implementation which has caused a fair amount of exasperation over the years from would-be users. One of the longest discussions is at KVR here:

http://www.kvraudio.com/forum/viewtopic.php?p=3505481

It seems to me that Bome might provide an ideal solution, but as a newbie I'd be grateful if someone could help me figure out how to approach it.

Basically, you can hold down a chord button (eg D), strum the scratchplate, and the QChord will play a ripple of D Bb A notes in ascending octaves. But in terms of the MIDI output, all you get is a stream of C notes with pitch bend info on three different MIDI channels (14, 15, 16). I get the impression this works with GM sound modules, but it's hopeless with anything else. In MIDI Ox, the data for a "D" harp strum as described looks like this.

Image

So we get three "C" notes on 14, 15, 16 repeated in rising octaves, and pitchbend messages which must move these notes to D, Bb, A. (I don't know what the blue CC stuff is, or whether I need it.) If you feed it into a VST synth, all you get is a bunch of out-of-tune C notes.

Any suggestions on how I could use Bome to process this into something more useful like actual notes would be gratefully received...

:-)

DvlsAdvct

2015-03-06 15:03:53

Well, this strikes me as a fun one. This is going to take a lot of experimentation to follow.

First, when you press the chord button, does Midi-Ox pick up any info? For example, does it send a note message that's unique for each button, or is that all handled internally by the controller?

Those CC messages are some sort of 14-bit message (MSB/LSB). I don't know what they control. Do they trigger whenever you hit the scratch pad, or do they trigger at any other time?

What we need to do is figure out a way to set a variable, so the VST/DAW/MIDI Translator knows what chord it SHOULD be playing, and then ignore all the data that isn't striking the scratch pad (and possibly that CC data depending on what it's doing). Does that make sense?

J

BJG

2015-03-07 15:31:07

Thanks for the reply.

When you press a chord button, the Qchord transmits what is shown in blue and red. If you play/strum notes on the scratchplate while holding the button, it transmits the "Note On" / "Note Off" data shown in green.

So for instance, if I press and release the "D" button then the "A" button (without playing any notes) it produces this:

Image

I don't know what the blue messages are, but they seem to be the same for every button. The Qchord has various auto-accompaniment sections I'm not interested in (rhythm, bass, etc) and perhaps it has something to do with those. I'm thinking maybe I can just ignore it, but like I say, I don't actually know what it does.

The red messages seem to set appropriate pitch-bend values to turn "C" notes into the three notes of the selected chord, across three different channels (14,15,16). If I hold the "D" button and play the lowest note, then hold the "A" button and play the lowest note again, I get this:

Image

The instrument plays a "D" note followed by an "A" note.

If you plug it into a virtual synth, you can see the pitchbend control move slightly when you hold down the two chord buttons, and it plays "C" notes. The Qchord is presumably working in terms of bending notes within a range of several octaves (in a GM way...?) but most virtual instruments don't work with that.

* * * * *

I found this page describing a utility someone had written to do the translation on a Mac, but there's no Windows version.

http://antifluke.blogspot.co.uk/2010/09 ... lease.html

* * * * *

The thread on KVR includes a note about an attempt to assist the translation with a custom MIDI plugin, though I couldn't get this working at all with my setup, and it doesn't sound like it's verified anyway. It's a possible approach though.

midiPitchBendToNotes.zip

This should turn the pitch bend plus C notes into the correct notes. it will read the pitch bend range if it's set by the associated RPN, otherwise it assumes +/-12 semitones, which is what the QChord sets.

i don't know if it will work right when moving the actual pitch wheel, because the channel 1 data wasn't in that midi file for me to test it.

actually, you'll probably get better results by running the original midi to three instances of a VSTi, where each one responds to channel 14, 15, or 16. that should work with anything that can set its pitch bend range to 12.


Maybe I can apply the same method with Bome...calculate simple new note data from +/-12 pitchbend data applied to "C" notes somehow, then combine the three channels into one.

DvlsAdvct

2015-03-07 16:12:22

Okay, so I think we should focus on the pink commands, alright? Those are going to designate the notes the device sends based on the strum command. I can't figure out what the MSB LSB messages are for, but it's might be related to sending trigger commands to make sure everything is listening for the pitch getting set. Not sure, though, so yeah, good times.

So now we need to talk functionality. Don't worry, this will actually result in something at the end, I just need as much information as I can get to build the beginnings adequately.

What we want to do is utilize math to change the actual note that gets sent instead of using a pitch bend message to augment the root C that it's sending by default. Let me talk to my boss and see if he has any tricks floating around for using 14-bit messages to augment 7-bit messages, or we'll have to experiment ourselves. This should definitely be doable, I'm just trying to find the easiest solution. Out of curiosity, how many chords does the device control?

J

BJG

2015-03-07 16:42:31

Hey, I appreciate the feedback, and going over this stuff again it's starting to make more sense to me.

I just added three copies of a VST instrument responding to the three channels 14,15,16, and with the pitchbend range adjusted to +/-12 instead of the default, and it works. :D I never got that far before.

Using Bome to convert this data into a single channel of notes would certainly simplify things though.

It has three rows of twelve buttons, Maj/Min/7th, but also produces other chord variations if you hold down, say, Maj+Min together.

(Can't wait to get this thing working to add some Celtic harp to my folk outfit. I love instruments that get people coming up afterwards and asking, "What the heck is that?")

BJG

2015-03-07 17:50:02

(PS I should add that so far I've just been playing around a little with MT Classic. Since this stuff would require the Pro version, I wouldn't want to put you to the trouble of working it all out - or not just yet anyway... :) Just interested in a possible solution...)

DvlsAdvct

2015-03-08 22:52:32

That's totally fair. The moral of this conversation is that MT Pro can definitely do what you want, it just won't be easy.

But the best projects are hard.

florian

2015-03-09 02:11:54

chiming in... a bit (at least).

Pitch bend is transmitted using 2x7bit data bytes, forming a signed 14 bit number in the range of -8192...+8191.
You can use MT Pro's rules to convert the two pitch bend data bytes to a variable that will then have a value in the range -8192...+8191.

Now if you've configured pitch bend to go +/-12 semi tones, then the range 8192 covers 12 semitones, i.e. each semitone spans 682.66 numbers. In order to get the intended semitone offset, divide the pitch bend value by 683. Use a global variable (per channel) to remember that offset.

So here's a pseudo algorithm:
on pitch bend message:
- calculate 14-bit pitch bend value
- divide by 683 to calculate semi tone offset
- remember that offset in a global variable (per channel)
on note message:
- add the semi tone offset (of that channel) to the note number
- reset channel

And here is the MT Pro implementation (off of my head, not tested!):

Code: Select all

Translator 0: Get Pitch Channel 14
Incoming: ED pp qq
Rules:
 g0=qq*128
 g0=g0+pp
 g0=g0-8192
 g0=g0/683
Outgoing: none
Translator 1: patch Note On on Channel 14 to correct note on Channel 1
Incoming: 9D pp qq
Rules:
 pp=pp+g0
Outgoing: 90 pp qq
Translator 2: patch Note Off on Channel 14 to correct note on Channel 1
Incoming: 8D pp qq
Rules:
 pp=pp+g0
Outgoing: 80 pp qq
For channels 15, create duplicates of the 3 translators above for each channel, then replace "D" with "E" in the incoming MIDI messages, and g0 with g1 (so that it uses a different global variable). Same for channel 16, just replace D with F and g0 with g2.

Fun stuff!
Florian

BJG

2015-03-09 21:36:05

Thanks guys - very helpful info. :D

Incidentally, here's a sample of a Kontakt harp played from a QChord by inserting three copies on 14,15,16 and altering pitchbend to +/-12.

http://www.artemisrecording.co.uk/harp.mp3

The problem with this approach is that you can hear a "swoop" as the chords change (most noticeable at the end, where I'm switching chord buttons without strumming). So it seems converting to notes as suggested would provide a better solution...

(I've added a link here to the thread at KVR.)