Audio Birdi
Active Member
+1 Default behaviour please!
Indirectly, through MIDI learn in Reaper.By the way, is there a way to control host automation in Kontakt with Reaticulate?
Definitely. And I should have a prerelease out later this week. (Sorry about the delayed reply.)@tack most likely a silly question, will there be beta testing needed to be done for the next release?
No problem! at all Looking forward to assisting with testing! :DDefinitely. And I should have a prerelease out later this week. (Sorry about the delayed reply.)
Reaticulate doesn't handle this case as nicely as it might.@tack, could you tell me the best way to use Re-articulate with somthing like the ISW Ventus Bansuri. This has separate keyswitches for attack and release ornaments, on the same note. Which basically means keyswitches have to be stacked.
I'm not certain how it would scale on a project with hundreds of MIDI tracks that need to be chased, but my experience has been that Reaper is reasonably fast at MIDI processing unless you're doing things that involve tons of iteration. I think just chasing program changes wouldn't hit performance too hard.I don't know how to solve this (so that chasing will Just Work across all groups regardless of playhead position). Implementing customized chasing behavior in Reaticulate is really daunting, and I'm not sure if it could be done performantly. The only implementation I can think of is, when transport switches to playing or recording, have Reaticulate enumerate every MIDI item under the playhead, crawling backwards looking for all program changes until all applicable groups are found. If anyone has better ideas I'd be interested. It's on my to-do list to prototype that and see how badly it sucks on large projects (or maybe be surprised to learn it doesn't).
Reaticulate doesn't handle this case as nicely as it might.
The obvious way to deal with this is to use different groups for attack and release ornaments. The limitation here is that Reaper doesn't understand Reaticulate's notion of groups and so it'll only chase the most recent program change, regardless of the group. In practice, this means that you need to ensure the playhead is positioned before all relevant program changes to get proper playback.
I don't know how to solve this (so that chasing will Just Work across all groups regardless of playhead position). Implementing customized chasing behavior in Reaticulate is really daunting, and I'm not sure if it could be done performantly. The only implementation I can think of is, when transport switches to playing or recording, have Reaticulate enumerate every MIDI item under the playhead, crawling backwards looking for all program changes until all applicable groups are found. If anyone has better ideas I'd be interested. It's on my to-do list to prototype that and see how badly it sucks on large projects (or maybe be surprised to learn it doesn't).
In the meantime, one workaround is to use separate banks for attack and release, and on the track definition, map the banks onto different source channels, say channel 1 for attacks and channel 2 for releases. They can both still ultimately route to channel 1 (or whatever) where your patch is in Kontakt, but then the program changes for these two types of articulations will be on different channels in your MIDI item. Because of this, Reaper will chase them properly.
Hope any of that made sense.
And thanks for sharing those banks!
That last bit sort of made sense. How do I get different channels on my Midi item though?
The 1-16 buttons are to control what's called the default channel. That's documented here.Then do I add both banks on Midi Channel 1 in rearticulate? (I assume this is what numbers 1-16 at the top of the window mean).
No custom routing is needed. Sit your ISW patch on channel 1, and Reaticulate takes care of ensuring program changes on channel 2 (for releases) will be controlling the patch in Kontakt on channel 1.Do I then need to route two Midi events to one kontakt instance and have attacks on one and releases on the other?
If it was just a matter of enumerating program changes, I think I'd agree. But I don't see a way to do that. I think I'd have to enumerate over all CC events (via MIDI_GetCC() which will also return program changes) which could include quite a large number of CCs used for regular MIDI performance, especially when your CC resolution is quite high. Hence my skepticism about this being able to be done efficiently.I think just chasing program changes wouldn't hit performance too hard.
Hm, that's an interesting idea. Unfortunately as far as I can tell this would require continuously polling all MIDI items in the project all the time. Worse still, there doesn't seem to be any kind of timestamp metadata or other means of determining if the item changed since last poll, so it'd require enumerating all CC events on all MIDI items constantly.for example, a table storing the program change state for each measure of each track that gets built initially when Reaticulate launches and then updates itself every time MIDI data on a track changes.
If I understand the reaper.MIDI_GetHash and reaper.MIDI_GetTrackHash functions correctly (I've never actually used them for anything), you would take the hash value of each track periodically and check that value against the hash value that was returned at the last check. If the values differ, it means the MIDI data on that track has changed, so then you compare the new hash value of each take on the track to the old hash values of the takes to find the one that changed, then you crawl through the data on the changed take, then you update the program change table and record the takes' hash values so you can check against them in the future. The hashes should save you from having to evaluate the actual data until the data changes. You'd still have to evaluate track hashes continually, but that shouldn't impact performance.If it was just a matter of enumerating program changes, I think I'd agree. But I don't see a way to do that. I think I'd have to enumerate over all CC events (via MIDI_GetCC() which will also return program changes) which could include quite a large number of CCs used for regular MIDI performance, especially when your CC resolution is quite high. Hence my skepticism about this being able to be done efficiently.
Hm, that's an interesting idea. Unfortunately as far as I can tell this would require continuously polling all MIDI items in the project all the time. Worse still, there doesn't seem to be any kind of timestamp metadata or other means of determining if the item changed since last poll, so it'd require enumerating all CC events on all MIDI items constantly.
Do you see another way?
Ah, good call. And those are quite speedy functions, clearly the hash value is cached internally.If I understand the reaper.MIDI_GetHash and reaper.MIDI_GetTrackHash functions correctly (I've never actually used them for anything)
First, thanks for doing the video. It's quite useful.hm, strange - if I switch short to supershort from Cubase Expression map or just press keyswitch on midi keyboard, all works. If I switch same from Reaticulate - not works (but similar neighboring keyswitches works well) - what's wrong?
First, thanks for doing the video. It's quite useful.
.
Yes, it's very appreciate!If you're willing to try a prerelease, I plan to cut one later today.