Help needed with Yamaha EZ-AG and Sysex

Hi. I have bought myself a Yamaha EZ-AG guitar to use for MIDI. It is pretty rubbish at it, but I want to just use the left hand only, so not concerned about variable velocity what happens when I strike a string. However, it’s useless when it comes to sending note-off and so you constantly get stuck notes. I have figured out that if I capture the Sysex and convert that to note on and off in Bome, it works well. It also let’s me press more than one note on a ‘string’, which can be very handy. But, it can also be a pain if say playing bar chords, as it plays every single note you press down and sounds a mess.

So, I am trying to figure out a way that it will only play the highest note on each string at any one time, but am really struggling. I took a look at a project uploaded to hear for low not priority, but that was low note obviously, but also based on incoming notes, rather than Sysex.

Each ‘string’ comes in on a different MIDI channel, but I output them all to Channel 1. The channel and note are determined in the Sysex as follows:

F0 43 7F 00 00 01 06 36 F7

The 3 number before F7 are the important ones. In this example, 01 is note on (whereas 02 is note off). 06 is the String / MIDI Channel and 36 refers to the actual note - in this case 36 is G2.

I am pretty sure I should be capturing the sysex from each channel and then only outputting the note on is it is higher than the other notes for that channel, but getting very confused how to do that! Any help would be appreciated.

Thanks!

Yes, this will be a tricky one and would be beyond the scope of free support but I can guide you.

You need to look at each string and create global variables as follows

last note played on that string
current incoming note on that string
highest note on that string.

If it is a note on:
You then have rules to compare the current note to the incoming note and if it is higher than the highest note then you set that to the note-on that you want to send and also the highest note
You set note off to the last note
You place all of the notes into local variable and send an outgoing message such as

vv uu 7f ww tt 7f

Where you have uu as last note played and tt as highest note.
vv will be a note off message set up in rules (0x80)
ww will be a note on message set up in rules (0x90)

Of course you update the global variables accordingly for the next note.

If it is note off you set up both vv and ww as 0x80 and then send out the same message. (sending to note off with the same note number will not hurt anything) I would set highest note variable to -1 if no notes are currently playing on that string and you could use that for comparison on the last iteration

If you need me to do this for you, please reach out to me via email or private message for a quotation. I expect it would take 1-2 hours.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Thanks for the reply, much appreciated, I will give it a go, but looks rather complicated and I can’t really afford to pay for anything at the moment, so I will be content with the way I have it for now.

I assume when you say an outgoing message, you mean Sysex? As the outgoing doesn’t need to be Sysex. The part I struggle with is the workflow of grabbing the Sysex, converting it to a note, and then being able to compare the notes to see which are higher as I assume you can’t compare with Sysex?

Thanks.

Hi,

Set your incoming SysEX for string 1 to:
F0 43 7F 00 00 oo 01 pp F7
For string 2 to
F0 43 7F 00 00 oo 02 pp F7
etc

Then you can use the local variables oo and pp to do the comparison, with the global variables you have set up.

Then for outgoing, you can create a raw midi message

80 ss 7f vv rr 7f

where 80 ss 7f is note off MIDI CH 1 velocity 127 (7FH) and ss is your last note played. This allows you to turn off the last note.

vv would be either note on or note off (0x90 or 0x80) depending on whether the incoming note is on or off and ss would be set to the highest note. If it is note off, it doesn’t hurt to send another note off of the same value again.

Once you are done with the calculations, you store all the relevent local values back into the proper global variables and you output the message based on the local variable I showed above.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Hi, you got my curiosity up so I created a template. I have no way to completely test it and I only created a translator for string 1 but you can try it out and play with it if you would like. I commented the rules so perhaps you can figure it out from here.

Enjoy!
Yamaha EZ-AG and Sysex.bmtp (2.6 KB)

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Oh wow, brilliant! Thank you very much. I am sure I can figure it out with a head-start! Really appreciate this.

Steve.

This works! I had an issue to start with where it would just send a not off straight after the note one, and then another note on when releasing the button. Spent ages trying things, and then noticed that the guitar actually send out additional message with each note one and off where the first number (oo in the rules) is either 03 or 04 (I think it is to do with velocity). So, I just added a line that if oo was greater than 02, to exit and skip - that sorted it!

I also had an issue where if you held or pressed a lower note whilst holding the higher one, then it would send a note off to the higher one as well when releasing. I solved that with adding ‘if pp<h1 then exit rules, skip Outgoing Action’ to the Noteoff label part. Don’t know if that is the correct way to do it, but it worked!

One last thing to ask; how do I send the Velocity via the MIDI message - currently it send at 127 I think, and I want to change that to 64.

Thanks again, for you help!

Hi, I’m glad I got you along far enough to sort it out!

The outgoing velocity pattern is 7F ( which is hexadecimal for 127) . If you change it to 40 (which is hexadecimal for 64), then you should be all set.

So
uu ss 7f vv tt 7f

would be

uu ss 40 vv tt 40

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Brilliant, thanks!

1 Like

This has been working brilliantly, apart from one very bizarre issue related to Nuendo and the retro record MIDI buffer. It is unlikely you will no the solution but I thought I would ask anyway!

I use the Retro record buffer a lot - it records what you play in the background and the you hit a shortcut and it puts the MIDI you played on the track. It is fine when using the Yamaha playing all different notes, but as soon as you play the same note as previously played, it joins them up when inserting the recorded buffer.

The 2nd note wasps short as the others, but as you can see from the image, all was fine until the second note was played again where it has then extended it to see itself!

Any idea why it would be doing this at all? When I use my paint mode on the Yamaha where it doesn’t’t turn previous notes off, it doesn’t’t do this.

Thanks.

Steve.

Also, to clarify, it doesn’t do this when recording the MID in real time rather than using the buffer. I did wonder it is something to with the Note off of the note being played being sent immediately before the note on because of ‘ss’ in the outgoing message being set the same as pp when ss is less than 1.

Well, I think I have actually solved and it was to do with sending the same Note off just before the note on. So I removed the part about making ss (note off) the same as pp (current note). What that has meant is that if ss is less than 0 it send a G8 note off, which frankly, I doubt I will ever use a note that high, so that is fine! It seems that if the note is lees than 0, then Bome automatically makes it G8?

Yes, the way the project was constructed was to turn the previous note off before sending a new note-on so that you would not have hung notes. If your Yamaha does this already, you can modify the script to only send a single note-off or note-on message.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

This is all working perfectly and I also now have 4 modes set up - this one, one for just the left hand that does allow multiple notes on one string (Piano mode) - the standard play like a guitar mode, but filtering out the notes when just the left hand is placed and finally the same as the latter, but with pull-off notes allowed. Can switch modes via my Stream Deck as well Just used on a big project and it was great.

However, I do now have a slight issue with the Standard mode, in the for some reason when playing at tiger velocities, the Yamaha send out a double note - it’s normally a much lower velocity (around 30 to 50) and is very short, because the second note with the actual velocity played is sent pretty much straight away after. I could filter by velocity, but that does leave me without being able to play quite bits, as 50 is too high to filter in my opinion.

I have also tried filter out short notes in Nuendo with the MIDI transformer, but that doesn’t’t seem to want to work!

So, is there a fairly simple way to filter them out in Bome? I can’t seem to see anything to do with note length, so assume it would be a timer or something similar to see if 2 notes were sent very quickly after each other and only send the 2nd. But after having a go, I can’t seem to figure it out. I think the gap between the 2 notes is around 200ms if that helps. Any ideas?

So to summarise, I think we need to wait for 200 milliseconds before sending the note on - if within that 200ms another note is received, then send that, if not, send the original. IT may well make it unplayable with MIDI because of the delay, but worth experimenting with. Unless you can think of another way?

Thanks.

Hi, I’ll look into this, however I think 200ms in terms of music is a big delay. It would likely be more like 10-20 ms otherwise the latency you would generate would make playing quite annoying to your ears and make it difficult to play.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Thanks. That’s what I thought. I looked again and it is probably nearer to 50ms, but still too much. For now I just remove short notes with a shortcut in Nuendo after recording, but it would be nice not to have to remember to do that every time.