Go Back   Cockos Incorporated Forums > REAPER Forums > ReaScript, JSFX, REAPER Plug-in Extensions, Developer Forum

Reply
 
Thread Tools Display Modes
Old 02-09-2016, 03:43 PM   #1
Talagan
Human being with feelings
 
Join Date: Feb 2016
Location: Paris / France
Posts: 293
Default [JSFX] MIDI CC Mapper X [Advanced MIDI filter/router/response curve tweaker and more]

This is the official thread for the Midi CC Mapper X JSFX .

The current version is 5.3.1 (2024, January the 29th) and it looks like this :



MIDI CC Mapper X is a fully-featured MIDI middleware (a midilware ?) that stands as an intermediary in your FX chain, and appears as a control panel where you can organize and modify the real time feel and behaviour of your MIDI controls ; routing, filtering, response curve tweaking, keyboard splitting, transposing and more.

Originally, it is an extended version of the original plugin called "MIDI CC Mapper". But it has grown in features with time.

A more exhaustive list of features :
  • Tweak CC (or Channel Pressure) / Pitch Bend / Keyboard Velocity / Poly After Touch response curves :
    • By using predefined curves, some of them being parametric
    • By pen-drawing/prototyping custom curves
    • By smoothing the current curve
    • By restricting the range of values of your curve
    • By extending the predefined curves with your own sets of functions (through lib files)
    • The current curve can be exported and reused in your own sets
  • Morph the response curves between a starting curve and an ending curve, with a morphing parameter
    • The morphing parameter can be automated
    • An auto-emit option is available to continuously fill the gaps with MIDI events when the morphing parameter changes
  • Split/drop/channel re-route keyboard keys
  • Transpose keyboard keys
  • Re-route CCs / CP
  • Re-route CC channels
  • Channel re-route/drop CCs / CP / Pitch Bend / Velocity / Poly After Touch conditionally based on input/output values
  • Pass through initial unmodified events (and act as a splitter)
  • Handle High-Res input and Output for the CCs (CC/CC+32) and Keyboard velocity (CC#88 format).
  • Channel pressure (aka global AfterTouch) is treated as any other CC so that the conversion between Global AT <> CC is done seamlessly.

It has now basic support for REAPER Midi Buses (it can be used on all buses at a time, or layered on one MIDI Bus, and it can be rerouted).

                            

Installation / Update instructions

Current version is available through ReaPack, from the official ReaTeam/JSFX repo.
It is now the only advised way of installing MIDI CC Mapper X since it comes with a lot of data files.
Be sure to update without having any project open to avoid problems.



Obsolete version (v2) : https://stash.reaper.fm/28845/MIDI CC Mapper X
Obsolete version (v1) : https://stash.reaper.fm/26552/MIDI CC Mapper X


                            

Donation

If you like MIDI CC Mapper X and want to donate to support the development, you can donate here :



Thanks a lot for your support !

                            

Documentation

Here's an attempt of User Guide :

MIDI CC Mapper X 5.3 User Guide
MIDI CC Mapper X 5.2 User Guide
MIDI CC Mapper X 5.1 User Guide
MIDI CC Mapper X 5.0 User Guide
MIDI CC Mapper X 4.3 User Guide
MIDI CC Mapper X 4.3 User Guide
MIDI CC Mapper X 4.2 User Guide
MIDI CC Mapper X 4.1 User Guide


Customizing the curve library

The curve library is customizable. You can add/remove sets and curves and rearrange curve tabs. You can also export a curve from the UI to a file that you can reintegrate in the library.

To perform those advanced operations, an independent manual is located in the Data folder after installation, here :
<RESOURCE>/Data/talagan_MIDI CC Mapper X/README.md
                            

Screenshots



Curve morphing in action during CC activity.



Value-based conditional filtering/routing

                            

Changelog (from newer to older) :

V 5.3.1
  • Bug Fix : Note OFF events with non-zero velocities should make keypress feedback indicator disappear
V 5.3
  • Bug Fix : Note OFF velocities are not forced to zero anymore, but left intact
  • Feature : Made the circ family parametric, with varying radius
  • Feature : Added channel info on the keyboard indicator when playing MIDI notes
  • Feature : Added x,y position display when free hand drawing
  • Feature : Added xmirror, ymirror curve buttons
  • Cosmetics : Reworked drawing toolbar buttons with xpm icons (pen, smooth, copy, paste)
  • Cosmetics : Added tooltips on drawing toolbar buttons
  • Cosmetics : Added pen mouse cursor when free hand drawing
V 5.2
  • Feature : Added conditional filtering/routing for velocity.
  • Feature : Added "follow Note ON" option for Poly AT conditional filtering/routing.
V 5.1
  • Feature : Added conditional channel dropping/routing for CCs, CP, Pitch Bend and Poly AT.
  • Hot fix : Pitch Bend : Display limits between 0..8191 instead of 0..127
  • Bug fix : Poly AT widget disabled but with passthrough on would produce unnecessary events
  • Hot fix : the drawing of the result curve when morphing would glitch on the first point (one frame late)
V 5.0
  • Added curve morphing with automation for each control
  • Added auto-emit MIDI events for automated morphed curves
  • Relaxed transposition constraints on octavas (allow +/- 8 instead of +/- 2)
  • Added call to freembuf to reduce memory footprint
V 4.3.1
  • Added info notice in AfterTouch widgets to warn about the existence of the Channel Pressure virtual CC#128
V 4.3
  • Moved HighRes MIDI input option from global settings to per-control setting
  • Reworked HighRes MIDI CC input with one-event-forward lookup for LSB, and output with MSB/LSB order
  • Reworked pitch bend MSB/LSB calculations to fix corner cases
  • Added pitch bend reverse button
V 4.2
  • Default value for keyboard ranges transposition is now ON instead of OFF (it feels more logical in the main flow)
  • Added pass through option per control to keep original events and allow event duplication
V 4.1
  • Reworked Channel Pressure (breaking change) : treat Channel Pressure as Virtual CC#128 in the UI to allow painless CC<>CP conversion.
V 4.0
  • Reworked keyboard splitting : up to five ranges may be defined, each with its own routing, transpose parameters, velocity curve, after touch curve
  • Added color blind highlighting
  • Added support for Pitch Bend (symmetrical)
  • Added support for After Touch
  • Added support for Channel Pressure
  • Added "firewall" params accordingly
  • Added copy/paste curve
  • Minor bug fixes
V 3.6
  • Added MIDI Bus routing support as global setting.
V 3.5
  • Function library system : functions are stored in a function lib with sets that are extensible
  • Parametric sets : some sets are parametric, they can be used to generate an infinite number of curves
  • User sets : the user can now import her/his own curves in the library
  • Function export : MIDI CC Mapper X is now shipped with a script that exports the current curve
  • Added support for all notes within the MIDI range (0-127).
  • Bug fix for notes that could be transposed outside of midi range.
V 3.4
  • Skipped / Unreleased.
V 3.3
  • Fix : HighRes midi velocity was not properly handled for MSB 1, LSB 0.
  • Fix : HighRes midi velocity LSB was not sent on the proper CC (#88).
  • Added a "pen" button to trigger pen mode, to avoid accidental clicks on the curve
  • Added channel routing options for notes and ccs.
  • Added firewall option for unrouted notes.
  • Since red keys may now be kept due to channel re-routing, added an option to select what keys are transposed (All/Green/Red)
  • Since red keys may now be kept due to channel re-routing, added an option to select what keys are affected by the velocity control (All/Green/Red)
  • Added curve min/max behaviours : the user can now set some min/max limits on the curve, so that the curve is clamped between those bounds. Predefined curves will be adapted to that range and pen drawing will be restricted to that range too.
  • And a bit of source code cleaning.
V3.2
  • Added theme system, with two themes, Dark and Light.
  • Reworked contrasts on Dark Theme.
  • Bug fix : red curve feedback circle was a bit shifted if the CC was set to High Res.
V3.1c
  • Fixed bug introduced with transposition, notes were shifted by default.
  • First release through ReaPack.
V3.1b
  • Fixed bug introduced in 3.1a, notes would have velocity at zero if the velocity curve was not enabled.
V3.1a
  • Added global settings pannel
  • Added special control for adjusting the keyboard velocity curve
  • Added global param to enable High-Res midi input (for input CC#0-31/32-63 and velocity with CC#88 norm) (default: off).
  • Added per-control param to enable High-Res midi output (for output CC#0-31/32-63 and velocity with CC#88 norm) (default: off).
  • Reworked UI to indicate High-Res midi behaviors.
  • Added keyboard transpose options (enable/disable, 8vi, semi tones)
  • Added "Drop unrouted CC messages" option (default: off).
V3
  • Added Keyboard Filtering by key
  • Added "Copy Src" button
  • Bug Fix : faders realtime feedback was not working
  • Simplified the bottom of the interface
  • Clarified enable/disable buttons
  • Enhanced mouse events management to avoid accidental clicks

                            

Original post, for archiving purposes

Hello everyone!

Here's a small contribution for Reaper that I've developed a few days ago. I've just discovered that exceptional DAW and spent hours in a row toying with all its features and that was pure pleasure!

But at one stage there was something that I was missing which was the ability to fine tweak the response curves of my MIDI keyboard controls (especially the knobs), and despite my search on forums I could not find what I was looking for ; so maybe it's just me being clumsy doing my research, but anyway it was a good opportunity to test the JS SDK!

So here's a screenshot of the plugin :

As you can see, it's a modification of the Midi CC Mapper plugin that comes with Reaper. I removed the clamp feature because you can do it with my version.

The idea is simple, it's all about editing the response curve, either by choosing one in the "template library" on the right, or by drawing your own curve directly with the mouse (and smoothe afterwards it if you're bad at drawing). Or you can choose a curve in the library and draw some modifications. At start I wanted to put some bezier curve editing but it was more work so sorry for that. And at second glance, I'm happy with the draw / smoothe approach which is fun.

The plugin gives some real time feedback on the curve (the small red circle) to check if you what you hear is really what you want.

I've left the ability to remap the control to another one, I think that one's really cool when you don't want do modify the preset that you use in your VSTi for example.

Tell me if you find it useful / cool or whatever (or completely unuseful on the contrary), and if you see some bugs / things to improve. I've put quite a large bunch of templates in the "curve template library" but it can be augmented.

Thanks for reading!

Ben

Last edited by Talagan; 01-29-2024 at 02:38 PM. Reason: Updated documentation.
Talagan is offline   Reply With Quote
Old 02-09-2016, 03:53 PM   #2
DarkStar
Human being with feelings
 
DarkStar's Avatar
 
Join Date: May 2006
Location: Surrey, UK
Posts: 19,677
Default

Hello Talagan and welcome to these forums. You'll find many helpful people here and a lot of useful information. Make sure that you get the excellent User Guide too:
http://www.cockos.com/reaper/userguide.php

For a first post on the forum, that is exceptionally good. Well done. Of course, you'll get hooked on JSFX then EEL and LUA and be locked in for ever. .
__________________
DarkStar ... interesting, if true. . . . Inspired by ...

Last edited by DarkStar; 02-10-2016 at 03:29 AM.
DarkStar is offline   Reply With Quote
Old 02-09-2016, 06:08 PM   #3
X-Raym
Human being with feelings
 
X-Raym's Avatar
 
Join Date: Apr 2013
Location: France
Posts: 9,875
Default

That's why I called a first contributions.
Well done sir, thanks for sharing !
X-Raym is offline   Reply With Quote
Old 02-09-2016, 06:31 PM   #4
heda
Human being with feelings
 
heda's Avatar
 
Join Date: Jun 2012
Location: Spain
Posts: 7,239
Default

I wonder what can you do next if this is your first just discovered REAPER thing
Very good!
Thank you and welcome to this place
heda is offline   Reply With Quote
Old 02-10-2016, 04:15 AM   #5
Talagan
Human being with feelings
 
Join Date: Feb 2016
Location: Paris / France
Posts: 293
Default

Many thanks to you three for your warm welcoming! I'm glad that I could share my enjoyment on this plug-in. I'll definitely have a closer look at the hidden corners of the user guide, there seems to have plenty of treasures in there!

I hope I'll have plenty of other good ideas in a next future, but for the moment I've got to take care of my growing addiction
Talagan is offline   Reply With Quote
Old 02-10-2016, 08:22 AM   #6
Hubi
Human being with feelings
 
Join Date: Oct 2010
Posts: 83
Default

Hey there,

great work and welcome to the reaper community ^^

Have a look on my plug in: http://forum.cockos.com/showthread.php?t=121787
I´m currently working on a new version, that will support 14bit midi and a lot more...(huge steps are already done)
If you want we can combine some of our ideas to make it even better?

Oh and BTW, if you install reaper you`ll stick with it.... and if it does not do what you want, you modify it so welcome to this trap ^^

regards,
Hubi
Hubi is offline   Reply With Quote
Old 01-04-2017, 06:05 AM   #7
Proximac
Human being with feelings
 
Join Date: Jan 2017
Posts: 3
Default Nice but how do you scale your MIDI CC with VST parameters?

Hi Talagan,

I love it but how can you scale your MIDI CC with VST parameters if you cannot enter a low value? Let's say I don't want to start with a MIDI CC=0 but a MIDI CC=16 instead. How do I do that?

Last edited by Proximac; 01-04-2017 at 06:12 AM.
Proximac is offline   Reply With Quote
Old 01-04-2017, 07:39 AM   #8
Talagan
Human being with feelings
 
Join Date: Feb 2016
Location: Paris / France
Posts: 293
Default

Hi Proximac,

Thanks for your comment! The curve may not start at CC=0 and finish at CC=127, but can use all intermediary values and have any shape as long as it is a function from [0..127] to [0..127], just draw any curve with your mouse as if it was a pen, not starting at 0, but higher and it should be ok (see attachement).

However, since my first purpose was to have an analogous, continuous behavior with a quick draw method, there is no 'fine-grain' control of the values of the curve with a precise CC value input, and there's no precise CC value feedback. So if you try to aim, say CC=16 precisely, not 17, not 15, it may be a bit hard.

Does this answer your question, do you have any concrete example where that kind of fine tuning (almost programmatical) would be useful? If so, I'd be happy to add some tools to achieve that to my todo list!

Ben
Attached Images
File Type: png Curve Not Starting at CC0.png (8.0 KB, 726 views)

Last edited by Talagan; 01-04-2017 at 07:49 AM.
Talagan is offline   Reply With Quote
Old 01-11-2017, 09:31 AM   #9
G-Sun
Human being with feelings
 
G-Sun's Avatar
 
Join Date: May 2010
Location: Norway
Posts: 7,318
Default

Thanks a lot!

I can't get the updated version to work,
and the old one shows up with missing graphics.

v2: How do I sett pass through to "No"?
__________________
Reaper x64, win 11
Composer, text-writer, producer
Bandcamp
G-Sun is offline   Reply With Quote
Old 06-13-2019, 11:11 AM   #10
Talagan
Human being with feelings
 
Join Date: Feb 2016
Location: Paris / France
Posts: 293
Default

Hey everyone,

These last days I've been dusted this plugin, and here's the V3.



A long time wish was to add the ability to filter out some keys from the MIDI controller. The aim is to be able to achieve keyboard split/dual/etc between multiple tracks. To enable the filter, simply enable the top part of the plugin with the button and colorize in red or green the keys you want to silence or pass to the rest of the chain.

As well, there are a few other things that have changed, here's a changelog for V3 :

- Added Keyboard Filtering by key
- Added "Copy Src" button
- Bug Fix : faders realtime feedback was not working
- Simplified the bottom of the interface
- Clarified enable/disable buttons
- Enhanced mouse events management to avoid accidental clicks

You can download the plugin from the stash here : https://stash.reaper.fm/36552/MIDI%20CC%20Mapper%20X

@G-Sun : I'm completely sorry I've missed your answer! It's been a long while, I'm not even sure I understand your questions now - might it be possible you've messed up between my plugin and the original one?

Ben

Last edited by Talagan; 06-13-2019 at 11:22 AM.
Talagan is offline   Reply With Quote
Old 06-14-2019, 02:44 PM   #11
Broojacker
Human being with feelings
 
Join Date: Apr 2016
Location: Ukraine
Posts: 49
Default

Very usfull plugin and nice GUI!

It would be really cool if you added velocity and transpose. One MIDI JS for all needs, this is what I dream.

Thanks!
Broojacker is offline   Reply With Quote
Old 11-30-2022, 11:55 AM   #12
TonE
Human being with feelings
 
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 4,031
Default

Quote:
Originally Posted by Talagan View Post
[*] Hot fix : Pitch Bend : Display limits between 0..8191 instead of 0..127
Should not that be twice that range, going from -819. to +8191? Or 0..16...
TonE is offline   Reply With Quote
Old 11-30-2022, 02:04 PM   #13
Talagan
Human being with feelings
 
Join Date: Feb 2016
Location: Paris / France
Posts: 293
Default

Quote:
Originally Posted by TonE View Post
Should not that be twice that range, going from -819. to +8191? Or 0..16...
You're completely right ; but since MIDI CC Mapper X treats Pitch Bend symmetrically, only the positive part is shown/editable (hence the 0..8191), and thus the negative part follows
Talagan is offline   Reply With Quote
Old 11-30-2022, 02:38 PM   #14
vitalker
Human being with feelings
 
vitalker's Avatar
 
Join Date: Dec 2012
Posts: 13,333
Default

How could I miss this gem?!
vitalker is offline   Reply With Quote
Old 11-30-2022, 04:21 PM   #15
TonE
Human being with feelings
 
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 4,031
Default

Quote:
Originally Posted by vitalker View Post
How could I miss this gem?!
My main source for missing cool stuff is, Reaper not showing all actions in action list, even those are sitting as files in the Scripts directory. Not sure if there is a solution for this. Maybe I have too many actions, or was in the past, after Reapers changing stuff maybe it improved, maybe still not yet. So it might take a while I discover something, only because Reaper did not list it in actions window. Only with some accident I discover it over multiple corners.
TonE is offline   Reply With Quote
Old 12-01-2022, 12:56 AM   #16
vitalker
Human being with feelings
 
vitalker's Avatar
 
Join Date: Dec 2012
Posts: 13,333
Default

Quote:
Originally Posted by TonE View Post
My main source for missing cool stuff is, Reaper not showing all actions in action list, even those are sitting as files in the Scripts directory. Not sure if there is a solution for this. Maybe I have too many actions, or was in the past, after Reapers changing stuff maybe it improved, maybe still not yet. So it might take a while I discover something, only because Reaper did not list it in actions window. Only with some accident I discover it over multiple corners.
Maybe you've put scripts manually into folder and forgot to import it in actions dialog?
vitalker is offline   Reply With Quote
Old 11-30-2022, 04:18 PM   #17
TonE
Human being with feelings
 
Join Date: Feb 2009
Location: Reaper HAS send control via midi !!!
Posts: 4,031
Default

Quote:
Originally Posted by Talagan View Post
You're completely right ; but since MIDI CC Mapper X treats Pitch Bend symmetrically, only the positive part is shown/editable (hence the 0..8191), and thus the negative part follows
I see cool. I was assuming you implemented all correctly anyway, just had this thought while reading here, commented quickly.
TonE is offline   Reply With Quote
Old 06-12-2023, 05:45 AM   #18
jimbobbley
Human being with feelings
 
Join Date: Nov 2011
Posts: 95
Default

Thank you so much for this amazing plugin, which I use in every single live project.

Could I make one small request - would it be possible to drop / not route PC messages too? For very boring reasons I've got some issues arising from CCMX passing PCs through when I want it to filter pretty much all MIDI that isn't being directly processed by it.
jimbobbley is offline   Reply With Quote
Old 06-12-2023, 06:11 AM   #19
vitalker
Human being with feelings
 
vitalker's Avatar
 
Join Date: Dec 2012
Posts: 13,333
Default

Quote:
Originally Posted by jimbobbley View Post
Could I make one small request - would it be possible to drop / not route PC messages too? For very boring reasons I've got some issues arising from CCMX passing PCs through when I want it to filter pretty much all MIDI that isn't being directly processed by it.
These JSFX may be helpful for both you and Talagan (in case they want to implement this). Both scripts are not mine, but from this user. The first one allowing to filter one type of messages/event independently, another one is the same, but also allowing to send specific type to other channel (third state for dropdown lists).

If you have Reapack, there is already a similar JSFX in it called "MIDI Event Filter" by mabian.

Code:
desc:MIDI Message Filter with SySex v7

slider1:0<0,1,1{ON,OFF}}>Note off :
slider2:0<0,1,1{ON,OFF}}>Note on :
slider3:0<0,1,1{ON,OFF}}>Polyphonic Aftertouch :
slider4:0<0,1,1{ON,OFF}}>Control Change :
slider5:0<0,1,1{ON,OFF}}>Program Change :
slider6:0<0,1,1{ON,OFF}}>Channel Aftertouch :
slider7:0<0,1,1{ON,OFF}}>Pitch Bend Change :
slider8:0<0,1,1{ON,OFF}}>Sysex :

in_pin:none
out_pin:none

@block

while(len = midirecv_buf(offset, buf, 65535)) 
(
   pass = 1;
   
   s = buf[0] & 0xF0;
   
   slider1 && s == 0x80 ? pass = 0; // Note Off
   slider2 && s == 0x90 ? pass = 0; // Note On
   slider3 && s == 0xA0 ? pass = 0; // Polyphonic Aftertouch
   slider4 && s == 0xB0 ? pass = 0; // Control Change
   slider5 && s == 0xC0 ? pass = 0; // Program Change
   slider6 && s == 0xD0 ? pass = 0; // Channel Aftertouch
   slider7 && s == 0xE0 ? pass = 0; // Pitch Bend
   slider8 && s == 0xF0 ? pass = 0; // SysEx
   
   pass ? midisend_buf(offset, buf, len);
);
Code:
desc:MIDI Message Filter with Channel Change

slider1:1<0,2,1{OFF,ON,Change Channel}>Note off :
slider2:1<1,16,1>NoteOff Channel :

slider4:1<0,2,1{OFF,ON,Change Channel}>Note on :
slider5:1<1,16,1>NoteOn Channel :

slider7:1<0,2,1{OFF,ON,Change Channel}>PolyAftertouch :
slider8:1<1,16,1>PolyAftertouch Channel :

slider10:1<0,2,1{OFF,ON,Change Channel}>Control Change :
slider11:1<1,16,1>CC Channel :

slider13:1<0,2,1{OFF,ON,Change Channel}>Program Change :
slider14:1<1,16,1>PC Channel :

slider16:1<0,2,1{OFF,ON,Change Channel}>Channel Aftertouch :
slider17:1<1,16,1>ChanAftertouch Channel :

slider19:1<0,2,1{OFF,ON,Change Channel}>Pitch Bend Change :
slider20:1<1,16,1>Channel PB Change :

slider22:0<0,1,1{ON,OFF}>Sysex :




in_pin:none
out_pin:none

@block

while(len = midirecv_buf(offset, buf, 65535)) 
( 
  ChannelNoteOff = slider2-1;
  
  NoteOff=(buf[0]<=$x8F)||((buf[0]<=$x9F)&&(buf[2]==0));  //(buf[0]<=$x9F)&&(buf[2]==0)
  
  NoteOff&&(slider1==0)? 
  ( 
    MidiMessage = 0; //midi block
  ):(
    NoteOff&&(slider1==1)? 
    (              
      midisend_buf(offset,buf,len); 
    ):(
      NoteOff&&(slider1==2)? 
      (
        buf[0]=((buf[0]&$xF0)+ChannelNoteOff);  //buf[0]&$xF0 - обнуление младших разрядов в buf[0] (msg1)
        midisend_buf(offset,buf,len);
      );  
    );
  );
  
   
  ChannelNoteOn = slider5-1;
   
  NoteOn=((buf[0]>=$x90)&&(buf[0]<=$x9F)&&(buf[2]>0));
  
  NoteOn&&(slider4==0)? 
  ( 
    MidiMessage = 0; 
  ):(
    NoteOn&&(slider4==1)? 
    (              
      midisend_buf(offset,buf,len);
    ):(
      NoteOn&&(slider4==2)? 
      (
        buf[0]=((buf[0]&$xF0)+ChannelNoteOn);
        midisend_buf(offset,buf,len);
      );  
    );
  );
  
  
    ChannelPolyAftertouch = slider8-1;
   
  PolyAftertouch=((buf[0]>=$xA0)&&(buf[0]<=$xAF));
  
  PolyAftertouch&&(slider7==0)? 
  ( 
    MidiMessage = 0; 
  ):(
    PolyAftertouch&&(slider7==1)? 
    (              
      midisend_buf(offset,buf,len);
    ):(
      PolyAftertouch&&(slider7==2)? 
      (
        buf[0]=((buf[0]&$xF0)+ChannelPolyAftertouch);
        midisend_buf(offset,buf,len);
      );  
    );
  );
  
  
    ChannelContrChange = slider11-1;
   
  ContrChange=((buf[0]>=$xB0)&&(buf[0]<=$xBF));
  
  ContrChange&&(slider10==0)? 
  ( 
    MidiMessage = 0; 
  ):(
    ContrChange&&(slider10==1)? 
    (              
      midisend_buf(offset,buf,len);
    ):(
      ContrChange&&(slider10==2)? 
      (
        buf[0]=((buf[0]&$xF0)+ChannelContrChange);
        midisend_buf(offset,buf,len);
      );  
    );
  );
  
  
    ChannelProgChange = slider14-1;
   
  ProgChange=((buf[0]>=$xC0)&&(buf[0]<=$xCF));
  
  ProgChange&&(slider13==0)? 
  ( 
    MidiMessage = 0; 
  ):(
    ProgChange&&(slider13==1)? 
    (              
      midisend_buf(offset,buf,len);
    ):(
      ProgChange&&(slider13==2)? 
      (
        buf[0]=((buf[0]&$xF0)+ChannelProgChange);
        midisend_buf(offset,buf,len);
      );  
    );
  );
  
  
    ChannelChanAftertouch = slider17-1;
   
  ChanAftertouch=((buf[0]>=$xD0)&&(buf[0]<=$xDF));
  
  ChanAftertouch&&(slider16==0)? 
  ( 
    MidiMessage = 0; 
  ):(
    ChanAftertouch&&(slider16==1)? 
    (              
      midisend_buf(offset,buf,len);
    ):(
      ChanAftertouch&&(slider16==2)? 
      (
        buf[0]=((buf[0]&$xF0)+ChannelChanAftertouch);
        midisend_buf(offset,buf,len);
      );  
    );
  );
  
  
    ChannelPBChange = slider20-1;
   
  PBChange=((buf[0]>=$xE0)&&(buf[0]<=$xEF));
  
  PBChange&&(slider19==0)? 
  ( 
    MidiMessage = 0; 
  ):(
    PBChange&&(slider19==1)? 
    (              
      midisend_buf(offset,buf,len);
    ):(
      PBChange&&(slider19==2)? 
      (
        buf[0]=((buf[0]&$xF0)+ChannelPBChange);
        midisend_buf(offset,buf,len);
      );  
    );
  );
  
  
    ((buf[0] >= 0xF0)&&(slider22==0))? midisend_buf(offset,buf,len);  // if receive SySex
  

  
);
vitalker is offline   Reply With Quote
Old 08-29-2023, 03:10 AM   #20
XTU
Human being with feelings
 
Join Date: Oct 2021
Posts: 11
Default

Is it possible to use this plug-in to remap MIDI program change messages? (e.g. keyboard controller sends bank 0, program 17 and the target synthesizer needs bank 2, program 43). If not, might someone know of a solution?
XTU is offline   Reply With Quote
Old 08-29-2023, 04:11 AM   #21
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,687
Default

Quote:
Originally Posted by XTU View Post
Is it possible to use this plug-in to remap MIDI program change messages? (e.g. keyboard controller sends bank 0, program 17 and the target synthesizer needs bank 2, program 43). If not, might someone know of a solution?
For converting handling a list of multiple target valuse, you can use ReaPack -> Midi CC table.
mschnell is online now   Reply With Quote
Old 08-29-2023, 07:57 AM   #22
XTU
Human being with feelings
 
Join Date: Oct 2021
Posts: 11
Default

Quote:
Originally Posted by mschnell View Post
For converting handling a list of multiple target valuse, you can use ReaPack -> Midi CC table.
Thanks so much!
XTU is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 12:50 PM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.