"on note" callback not executed if gap after release is too small
Hi there!
I am trying to write a legato script in Kontakt 5 script processor. It has some functionalities like:
- if there is a note overlap, naturally a legato sample is played back.
-1 seconds after a legato transition, if the note is held, the legato sample blends into a "start" sample, in case legato samples are not long enough
-if there is a small gap (200ms by default, adjustable) between a note release and another note on signal:
1) if the notes are different, a legato sample is played back.
2) if the notes are the same, a repetition sample is played back.
The Problem is:
if the gap is too small (to be specific, smaller than 12ms that a found by experimenting with adjusting midi data on a DAW); "on note" callback is not executed at all.
I mean, it really is not executed at all, not just due to some boolean condition within the callback. I am sure of that because i've checked by printing a message just after "on note" line, which is not displayed of the gap is <12ms
What might be the reason for this and how to solve it?
the code (only the note on/off callbacks):
on note $last_id := $EVENT_ID ignore_event($ALL_EVENTS) inc($note_counter) $last_time_note := $ENGINE_UPTIME $counter := num_elements(%downkeys)-1 while ($counter > 0) %downkeys[$counter] := %downkeys[$counter-1] dec($counter) end while $before_rep := 0 %downkeys[0] := $EVENT_NOTE if ($note_counter = 1) fade_out($ALL_EVENTS,$fade_time_release,1) disallow_group($ALL_GROUPS) if ($ENGINE_UPTIME < $last_time_release + $gap_time) message("WHY?") $before_rep := 1 stop_wait($release_id,1) if ($EVENT_NOTE = $last_release ) allow_group(find_group("0")) else allow_group(find_group(!intervals[$EVENT_NOTE-$last_release+12])) end if else allow_group(find_group("start")) end if play_note($EVENT_NOTE,$EVENT_VELOCITY,0,0) else if ($EVENT_NOTE-%downkeys[1] < 13 and $EVENT_NOTE-%downkeys[1] > -13) fade_out($ALL_EVENTS,$fade_time,1) disallow_group($ALL_GROUPS) allow_group(find_group(!intervals[$EVENT_NOTE-%downkeys[1]+12])) fade_in(play_note($EVENT_NOTE,$EVENT_VELOCITY,0,0),$fade_time) else fade_out($ALL_EVENTS,$fade_time_release,1) disallow_group($ALL_GROUPS) allow_group(find_group("release")) fade_in(play_note(%downkeys[1],$EVENT_VELOCITY,0,0),$fade_time_release) disallow_group($ALL_GROUPS) allow_group(find_group("start")) play_note($EVENT_NOTE,$EVENT_VELOCITY,0,0) end if end if $before1_wait := $ENGINE_UPTIME wait(1000000) if ($ENGINE_UPTIME >= $before1_wait+1000) fade_out($ALL_EVENTS,500000,1) disallow_group($ALL_GROUPS) allow_group(find_group("start")) fade_in(play_note(%downkeys[0],$EVENT_VELOCITY,0,0),500000) end if end on {**********} on release ignore_event($ALL_EVENTS) dec($note_counter) $last_time_release := $ENGINE_UPTIME $release_id := $NI_CALLBACK_ID $before_rep := 0 $last_release := $EVENT_NOTE if ($note_counter = 0) wait(1000*$gap_time) if ($before_rep = 0) fade_out($ALL_EVENTS,$fade_time_release,1) disallow_group($ALL_GROUPS) allow_group(find_group("release")) fade_in(play_note($EVENT_NOTE,$EVENT_VELOCITY,0,0),$fade_time_release) end if $counter := search(%downkeys,$EVENT_NOTE) while ($counter < num_elements(%downkeys)) %downkeys[$counter] := %downkeys[$counter+1] inc($counter) end while else if ($EVENT_NOTE = %downkeys[0]) if ($EVENT_NOTE-%downkeys[1] < 13 and $EVENT_NOTE-%downkeys[1] > -13) fade_out($ALL_EVENTS,$fade_time,1) disallow_group($ALL_GROUPS) allow_group(find_group(!intervals[%downkeys[1]-$EVENT_NOTE+12])) fade_in(play_note(%downkeys[1],$EVENT_VELOCITY,0,0),$fade_time) else fade_out($ALL_EVENTS,$fade_time_release,1) disallow_group($ALL_GROUPS) allow_group(find_group("release")) fade_in(play_note($EVENT_NOTE,$EVENT_VELOCITY,0,0),$fade_time_release) disallow_group($ALL_GROUPS) allow_group(find_group("start")) play_note(%downkeys[1],$EVENT_VELOCITY,0,0) end if $counter := search(%downkeys,$EVENT_NOTE) while ($counter < num_elements(%downkeys)) %downkeys[$counter] := %downkeys[$counter+1] inc($counter) end while else $counter := search(%downkeys,$EVENT_NOTE) while ($counter < num_elements(%downkeys)) %downkeys[$counter] := %downkeys[$counter+1] inc($counter) end while end if end if $before2_wait := $ENGINE_UPTIME wait(1000000) if ($ENGINE_UPTIME >= $before2_wait+1000) fade_out($ALL_EVENTS,500000,1) disallow_group($ALL_GROUPS) allow_group(find_group("start")) fade_in(play_note(%downkeys[0],$EVENT_VELOCITY,0,0),500000) end if end on
Categories
- All Categories
- 19 Welcome
- 1.4K Hangout
- 60 NI News
- 735 Tech Talks
- 3.9K Native Access
- 15.9K Komplete
- 1.9K Komplete General
- 4.1K Komplete Kontrol
- 5.5K Kontakt
- 1.5K Reaktor
- 364 Battery 4
- 817 Guitar Rig & FX
- 416 Massive X & Synths
- 1.2K Other Software & Hardware
- 5.5K Maschine
- 7K Traktor
- 7K Traktor Software & Hardware
- Check out everything you can do
- Create an account
- See member benefits
- Answer questions
- Ask the community
- See product news
- Connect with creators