EWIUSB.COM
Electronic Wind Instrument Information and More

Controlling hardware settings via MIDI - Part 2 of 2

*** NOTE, all values on this page are in Hexadecimal ***

Since on the previous page we figured out how to monitor the data and what is sent, we can now document how it works, and build a reference chart. First, let us re-cap how to build a EWI USB system exclusive message.

Before any sysex is sent to the EWI USB the Aria software seems to send the following NRPN:

63 01 62 04 06 20

I think that's some sort of "unlocking" mechanism to allow sysex to actually write to the EWI, maybe it's a "stop playing while we change values" or perhaps a pointer reset of some sort, or a combination of all the above. After all sysex is sent they send this NRPN...

63 01 62 04 06 10

All EWI USB sysex start with a standard System Exclusive header:

F0 // Start Sysex
47 // Vendor ID
7F // Device ID (this is 00 if being sent FROM the EWI)
6D // Model ID

Likewise all sysex messages end with

F7 // End of Sysex

It's the stuff between those that we need to dig into.

The next word appears to be the starting address - pretty much the same thing as the MSB and LSB on our NRPN chart.

00 // MSB
00 // LSB

Our next byte seems to indicate the amount of data that follows...

06 // Six bytes follow

Then our data starts, in the case of the "setup" Sysex, that goes something like:

40 // Breath Gain
40 // Bite Gain
40 // Bite AC Gain
40 // Pitch Bend Gain
08 // Key Delay
7F // Unknown ???

Which builds our complete messages... Which for "setup controls", aka MSB 00

F0 47 7F 6D 00 00 06 40 40 40 40 08 7F F7

or in the case of the larger "performance/controller settings" MSB 02

F0 F7 7F 6D 02 00 0B 00 00 40 20 02 00 00 7F 00 7C 7D F7 

As we determined on the previous page, if we were to send both of those back to back to the EWI, we'd want to use those header and footer NRPN's so a complete SYSex send to the unit is thus:

// sysex enable
63 01 62 04 06 20
// sysex message
F0 47 7F 6D 00 00 06 40 40 40 40 08 7F F7
// sysex enable
63 01 62 04 06 20
// sysex message
F0 F7 7F 6D 02 00 0B 00 00 40 20 02 00 00 7F 00 7C 7D F7
// sysex done
63 01 62 04 06 10

Which means we just need to know what all those parameters are - after sending data from Aria and monitoring it, I've come up with the following values.

EWI USB NRPN/SYSEX chart
MSB LSB Message Range Default
00 00 Breath Gain 00..7F 40
00 01 Bite Gain 00..7F 40
00 02 Bite AC Gain 00..7F 40
00 03 Pitch Bend Gain 00..7F 40
00 04 Key Delay 00..0F 08
00 05 Unknown ??? ------ 7F
02 00 Midi Channel 00..0F 00 (midi channel 1)
02 01 Fingering 00 EWI 00
01 Saxophone
02 Flute
03 Oboe
04 EVI Valve 1
05 EVI Valve 2
02 02 Transpose* 00..7F 40 (middle C)
02 03 Velocity 01..7F 20 (fixed)
00 Dynamic
02 04 Breath CC1 00..7F 02 (CC2/Breath)
02 05 Breath CC2 00..7F 00 (Off)
02 06 Unknown ??? ------ 00
02 07 Bite CC1 00..7F 7F (Pitch bend down/up)
02 08 Bite CC2 00..7F 00 (Off)
02 09 PitchBend UP control 00..7F 7C (Pitch bend up)
02 0A PitchBend Down control 00..7F 7D (Pitch bend down)

* Care should be taken using transpose, as it's possible to set it to values that could confuse the EWI by making the lowest note playable below 0, or the highest note above 127... It appears to "wrap" at the top and bottom, but given we don't know what it's doing with the "carry" I suggest restricting the value range to 22...5D.

I have made a simplified version of this information available as a pdf.

The unknown values are real head scratchers. They appear to remain unchanged regardless of what you set in Aria... I included them in this chart because that byte value does exist in the system exclusive. I may try sending some random values to that to see what/if it does anything... hopefully I won't brick it in the process.

In any case, that documents everything the ARIA software is able to configure on the EWI USB, giving us all the information needed (in theory) to make our own control software if so desired bypassing ARIA. I'm looking at the various options for making such a program, and am still undecided as to which language/api combinations would be best as I'd LIKE the result to be cross platform to Win/OSX/*nix - which pretty much means the easiest approach is Java. Unfortunately while I know assembly, pascal, modula, C, C++, C#, php, mysql, html, javascript... etc, etc, etc... I haven't bothered with JAVA because frankly I don't trust it after being repeatedly pwned by JAVA malware "back in the day". Usually I won't even allow it to be INSTALLED on any of my machines.

But if someone else is willing to help with that or wants to tackle it and wants help, feel free to give a holler via our contact form.

-- Jason M. Knight (aka Deathshadow)