|
Post by John Tennison on Jun 25, 2018 22:54:14 GMT
Dear Nic,
I continue to love MIDIFire. Thanks for the new update!
I am encountering a problem and I am having trouble conceptualizing what code is needed in Stream Byter to overcome the problem.
Here's the scenario:
If I use the Channel strip to re-map C#3 to C3, and keep C3 mapped to C3, I then have a mapping that will play the C3 pitch when pressing either the C3 key or the C3# key. If I play both the C3 and C3# keys, I get the expected sound, and when I let up on the two keys, 2 note-offs are sent for C3, which stops the sound, as wanted.
However, if I place the Dynamic Transpose module AFTER the Channel strip which has the remapping described above, and if I send the Dynamic Transpose module the correct CC19 value to transpose the output of the channel strip by non-zero value, I get a stuck note when then play both C3 and C#3 at the same time.
For example, if I have the channel strip set as described above, and have its output going into the dynamic transpose module, and if I have set the dynamic transpose module to transpose down by one semitone, and if I then play the C and C3# SIMULTANEOUSLY, I will get (as expected), the pitch of B2. However, when I release the physical keys of C3 and C3#, 2 note offs for C3 are sent, but I get hung note for the B2 pitch which I just played. When I don't play press the C3 and C3# keys simultaneously (either C3 or C#3 by itself), the Dynamic Transpose module sends the appropriate note offs.
Is there any way that the Dynamic Transpose module can be altered such that it can send the appropriate note offs when being placed AFTER channel-strip scale remappings which map 2 or more keys to the same MIDI note number, and when those two or more keys have been played simultaneously?
As always, thank you so much for any expertise you can lend in this matter.
With deep appreciation, John Tennison
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 26, 2018 8:10:45 GMT
Hi John,
OK, I see the problem. Try adjusting the code in the Dynamic Transposer as below and see how you go. I'm not sure why I am resetting the delta of the note on a note off; I don't think I need to, but maybe there will be other unwanted side effects that I'm not considering.
... # apply current delta to note off and reset IF M0 == L2 MAT L3 = M1 + IM1 ASS IM1 = 0 <- comment out/remove this line ASS M1 = L3 END
Regards, Nic.
|
|
|
Post by John Tennison on Jun 26, 2018 14:19:39 GMT
Thanks, Nic.
This fixed the problem when I have the Dynanic Transposer module set to a fixed transpose value, but while dynamically sending new transpose values (via CC 19), I sometimes getting stuck notes when playing the two keys which are mapped to the same MIDI note number as described above.
I am not sure why this happening.
Out of curiosity, I did try using the channel strip with MIDI remote control via CC 19 for the transpose function, and it works seemingly without stuck notes when dynamically transposing. However, I really need the CC 19 controller message to be coming from within MIDIFire if possible.
Thanks for any further thoughts you might have.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 26, 2018 14:23:45 GMT
Yeah, there must have been a reason why I reset it ;-)
How are you currently generating to 19 inside MidiFire? Stream Byter?
To get an internally generated CC19 to drive a channel strip using remote control, use the SND with +I option?
Regards, Nic.
|
|
|
Post by John Tennison on Jun 26, 2018 14:35:48 GMT
I was using a controller that could only generate Note Ons, so I was converting its note-ons to CC 19 in MIDIFire.
Once I have generated these CC19 messages, could you remind me how to set up the SND +1 command so that the Channel strip can receive those CC 19 values?
Thanks, John
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 26, 2018 15:02:06 GMT
Sure!
Can you post the little snippet of Stream Byter code you are using to make the conversion? This will dictate how we do the SND +I
Regards, Nic
|
|
|
Post by John Tennison on Jun 26, 2018 15:07:52 GMT
Here is the Stream Byter code I'm using
# generate CC19 for each note on IF M0 >= 90 IF M0 <= 9F IF M2 > 0 # we have a note on
# convert to CC, preserve channel MAT L0 = M0 + 20
# add 4 to note number MAT L1 = M1 + 4
# issue complementary CC SND L0 13 L1
END END END
# block all events XX = XX +B
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 26, 2018 15:32:39 GMT
Ah, perfect. All you need to do is add +I to the end of that SND and you should be set. The complementary CC will be injected into MidiFire as if it was received from the 'MidiFire' virtual port and processed as a remote control event to the Channel Strip configured to react to CC 19
(I wasn't sure whether you were modifying the event and passing it through in which case we would have had to change your code a little bit)
Regards, Nic.
|
|
|
Post by John Tennison on Jun 26, 2018 16:27:37 GMT
Thank you, Nic!
I deeply appreciate your help.
-John (AKA Nonjohn)
|
|
|
Post by John Tennison on Jun 26, 2018 21:25:06 GMT
Nic,
I added the +1 at the end of the line with the SND command, but I am still having trouble getting MidiFire to "see" the CC 19 command that the code generates.
Here is what the Stream Byter looks like as of now:
# generate CC 19 for each note on IF M0 >= 90 IF M0 <= 9F IF M2 > 0 # we have a note on
# convert to CC, preserve channel MAT L0 = M0 + 20
# add 4 to note number MAT L1 = M1 + 4
# issue complementary CC SND L0 13 L1 +1
END END END
# block all events XX = XX +B
------------------------
I can send Note ons from an external controller and with the MIDI monitor, confirm that the code converts the notes to CC 19 commands, but the Channel strip transposer is unresponsive.
Is there some additional routing that I need to do after the Stream Byter module that converts Note ons to CC19?
As a diagnostic, I checked to make sure that the Channel Strip Transposer was responsive to CC19 commands arriving at my USB hub from an external controller, and it is.
So the MIDI Remote control is working properly. I just can't get Stream Byter to see the CC19 command generated by the code above.
Thanks for any hep you can lend.
-John
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 26, 2018 22:50:59 GMT
That should be a +I (I for Inject) not +1. :-)
Regards, Nic.
|
|
|
Post by John Tennison on Jun 27, 2018 3:26:55 GMT
Thanks, Nic. Sorry I mistook the I for a 1. ;-) MidiFire is now responding to the CC 19 generated by the code.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 27, 2018 6:35:38 GMT
Good stuff!
|
|
|
Post by John Tennison on Jun 27, 2018 16:20:37 GMT
Nic,
Even though the +I allowed MIDIFire to "see" the CC 19 command generated by the code, MIDIFire is only seeing values of zero transposition and +4 transposition. That is, either no transposition or a major 3rd upward. (As you can see from the code, it adds +4 to the CC 19 value so that a note-on of C3 corresponds to zero transposition.)
So even though MIDIFire sees a CC 19 command, it seems that MIDIFire only seeing two possible values, rather than the full range of values that would normally be output by the module if the SND +I was not used.
Do you have any thoughts about what I might need to change in the code to fix this problem?
Thanks,
John
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 27, 2018 19:26:49 GMT
Well, not sure why you were adding 4 - should that not have been 40? (dynamic transposer module mid-point is 40)
In any case, the issue is that the channel strip transposer has a range of -24 to +24 (49 positions) and the control CC will be scaled accordingly so that CC value 0 == -24 and CC value 127 == +24.
That means you need to take into account that the CC must step 2.6 times roughly to transpose up or down one semitone.
I think we need to take a step back. Can you describe for me how the note events should affect the transposition. We probably discussed this early on but my memory is very hazy!
Once I understand that, I can give you replacement code to map the note events to the correct CC for driving the Chanel Strip transposer.
Regards, Nic.
|
|