|
SND +I
Feb 3, 2021 7:26:33 GMT
Post by Torrontés on Feb 3, 2021 7:26:33 GMT
Hi,
I have found that SND with the +I option appears not to work reliably.
Consider the following script; I admit it is pointless, but it shows the behaviour:
IF MT == 90 SND B0 01 M2 +I +D100 BLOCK EXIT END
BLOCK EXIT
This script should produce no output, and indeed, it behaves as expected if there isn't a rush of NoteOn events. But if you send in big chords in quick succession, now and then SND does not reinject B0 01 M2 into the input, but sends it to the output instead. This happens randomly, and quite frequently. Unless I am not understanding SND +I correctly, this seems like a bug to me. What do you think? Is there a possible workaround? The snippet above, stupid as it is, is the simplest illustration I could think of. I have only tested it in the AUv3 version of StreamByter, hosted in AUM. The actual application I have in mind is more complicated, but I think getting into the details would only obscure the problem. However, if there is no workaround, I'd be happy to explain what I'm trying to do to put the problem in context and see if there are alternative approaches. Thanks in advance.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
SND +I
Feb 7, 2021 16:30:18 GMT
Post by nic on Feb 7, 2021 16:30:18 GMT
Hi @torrentes,
I was able to reproduce this and I think I understand what is happening.
In an AU context, injected events could be passed in a list along with any incoming events together in the 'render cycle'. In a CoreMIDI context the injected and incoming events always come in one by one and are processed individually.
If an incoming note comes in during the same render cycle as an inject, then your 'exit' statement will stop the script in its tracks, but... the inject event is still in the list of events since the script never got to look at it. In this case, the injected message is not blocked and passed to output.
If you alter your script as follows, it will work:
if MT == 90 send B0 01 M2 +I +D100 end block
I guess we could call this a 'quirk' ;-)
Regards, Nic.
|
|
|
SND +I
Feb 8, 2021 22:48:56 GMT
Post by Torrontés on Feb 8, 2021 22:48:56 GMT
Thank you for taking the time to look into this. I'll try out your workaround in the actual application (not the silly example) and see how it goes.
|
|
|
SND +I
Feb 8, 2021 23:28:52 GMT
Post by Torrontés on Feb 8, 2021 23:28:52 GMT
I think this may have other implications beyond the original question. For instance, in my own scripts, I'm in the habit of doing things like these:
IF MT == 80 (do something) BLOCK EXIT END
IF MT == 90 (do something else) BLOCK EXIT END
IF MT == A0 (do yet another thing) BLOCK EXIT END
(etc)
This is in principle all "by the book", yet, in light of your comment, I can see how this "idiom" might be problematic. I guess have a bit of reworking to do, for safety's sake.
|
|
|
SND +I
Feb 9, 2021 5:49:02 GMT
Post by Torrontés on Feb 9, 2021 5:49:02 GMT
Your suggestion worked! Thanks again!
|
|