On Tuesday, May 30, 2017 07:33:18 Andrew C wrote:
> I saw the following:
> "
> 
> on note
>   disallow_group($ALL_GROUPS)  { turn all groups off }
>   allow_group(0)                         { turn first group on }
>   ignore_event($EVENT_ID)         { inhibit triggering note from being
> played } play_note($EVENT_NOTE, $EVENT_VELOCITY, 0, -1)          { replay
> note } end note
> "
> 
> It's just a fragment, but yes, it seems like play_note can still
> trigger the note and follow the 'note_on/note_off' of the note handler
> itself.

Ok, since you say it is just a fragment of the overall code, I can just guess 
that this technique might he used as an alternative for calling change_*() 
functions for the triggered note.

I do see use cases which were not possible with our implementation of 
play_note(), so I just implemented the following behavior changes of the 
play_note() function:

* If -1 was passed for the "duration" argument and the parent note is already 
gone (i.e. because of a previous call to ignore_event()) then play_note() 
silently returns 0 as result value.

* Additionally I added a new special value -2 for argument "duration", which 
essentially enables what you demonstrated.

Here the updated docs:

http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language/Reference/play_note_function/

Now I don't know Kontakt's precise behavior on this one, so I am not 
absolutely sure whether these changes are optimal. But let me describe the use 
cases for the two special values -1 and -2 and hence the reason why I think we 
need both:

* Use case for duration = -1 :
------------------------------

on note
  play_note($EVENT_NOTE+12, $EVENT_VELOCITY, -1, -1)
end on

This triggers an additional note (transposed upwards by one octave) each time 
you trigger a key on the keyboard. In this case the new note has a different 
note number, however you still want the new (transposed) note to be released 
when a note-off event arrives on $EVENT_NOTE, not on $EVENT_NOTE+12. So the 
new note's life time is sticked to its causing parent note.

In a more complex script of this use case, you might additionally have some 
logic code afterwards which might drop the original (parent) note on certain 
conditions, then also the already scheduled new (transposed) note should be 
dropped automatically as well, which our current behavior does. So this is a 
very handy feature in this case.

* Use case for duration = -2 :
------------------------------

on controller
  declare $someNoteNr := 60
  declare $someNoteVelocity := 127
  ...
  if ($CC_NUM = 1)
    play_note($someNoteNr, $someNoteVelocity, -1, -2)
  end if
end on

This triggers a new note (i.e. with note number 60) when the modulation wheel 
is used (MIDI CC#1), and sticks the life time of the new note to MIDI note/key 
number 60. So those new voice(s) shall play until a MIDI note-off arrives on 
MIDI note number 60.

As said, I don't know what Kontakt does exactly. It could be that Kontakt's 
duration=-1 case is what we now have as duration=-2, and that they don't have 
our duration=-1 behavior at all. Or their behavior could also be mix of our 
two -1 and -2 cases, such a mix behavior is not desirable IMO though. Maybe 
somebody can check what Kontakt really does here.

CU
Christian

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxsampler-devel mailing list
Linuxsampler-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxsampler-devel

Reply via email to