jtackaberry / reaticulate

An articulation management system for REAPER
Other
101 stars 46 forks source link

Support output events to target channels that do not affect routing #30

Closed jtackaberry closed 6 years ago

jtackaberry commented 6 years ago

A rather uncommon use case, but sometimes an articulation needs to emit output events on specific channels while not affecting routing setup by prior articulations (e.g. as modifiers to the previous one).

Proposed syntax: prefix channel numbers with - sign. e.g. o=note@-13:42/note@10:20 would setup routing to channel 10 but not 13, even though note 42 would be sent on channel 13.

jtackaberry commented 6 years ago

By way of implementation, could hijack bit 7 of byte 1 of the output event slot to indicate whether the routing should modified. MIDI event parameters only need 7 bits, so bits 0-6 used for that, and bit 7 to modify the channel as described.

Bit of a kludge, but otherwise would need to switch to 2 slots per output event which is a much more disruptive change.

jtackaberry commented 6 years ago

Used this syntax instead:

o=-note@13:42/note@10:20

Because for this feature you will always specify some output type, but yet may want to leave out the destination channel to use the default source channel. So it made sense to create a modifier for the output event type rather than the dst channel.

Levitanus commented 6 years ago

I'm sorry, but still can't get how to use it)

//----------------------------------------------------------------------------
//! g="Orchestra tools/Berlin Strings" n="Options"
Bank 16 1 USER OT/BST/Options
//! c=default i=con-sord g=4 o=-cc:16,127
31 OPT 1 ON
//! c=default i=con-sord g=4 o=-cc:16,1
36 OPT 6 OFF
//----------------------------------------------------------------------------
//! g="Orchestra tools/Berlin Strings" n="Core" f=!chase
Bank 16 2 USER OT/BST/Core

//! c=legato i=legato g=1 o=cc@1:84,1
1 ART1 Legato
//! c=legato i=legato-bowed g=1 o=cc@2:84,1
2 ART2 Fingered
//! c=legato i=legato-runs g=1 o=cc@3:84,1
3 ART3 Arpeg
//! c=textured i=tremolo g=1 o=cc@4:84,1
4 ART4 Trem

Sordino, for example, should work on the current channel, depends on chosen by articulations (legato, tremolo). So, I want to be able to go to the tremolo on ch4, then press sord on and sent via it cc16 to channel 4, but not to 1. Where am I wrong?

jtackaberry commented 6 years ago

@Levitanus I think the problem is you've misunderstood the behavior of this change.

The feature added under this issue allows you to emit output events without modifying the current target channels, which applies to future events. It doesn't affect the channel of those output events, where all the same rules apply (if you don't specify @chnum then it will use the "default channel" -- the one higihlighted in the UI).

I guess you're looking for a different idea of "default channel" -- not the one that's selected in the UI (or by one of the "Set default MIDI channel" actions), but rather you want the ability to send output events based on the target channels setup by previous articulations.

Will give some thought to this.

Levitanus commented 6 years ago

Thanks! Don't know how to appreciate to Your work!