# How to control cc1 + cc11 with one controller?



## Christof (Oct 24, 2014)

Logic X users:

Is there a way to control cc1 and cc11 with only one controller, lets say the mod wheel?

This would be a huge timesaver...

Thanks for any hints in advance!

Christof


----------



## Rctec (Oct 24, 2014)

Do you really want to do that? I like the independence, but I have them right next to each other so I can 'play' them simultaneously. 
Even though cc1 is really timbre modulation that inevitably is tied to amplitude, I just like the extra bit of feel I can impart with the Expression controller. Mind you, my samples start at ppp, which most libraries don't do (it took forever to get that cleanly out of a large string section) and sometimes, well always, I like to cheat and not be tied to the natural amplitude laws of the physics of an instrument... Think of Mahler's poor brass players in the 2nd: banished into the balcony to not obliterate the flute solo


----------



## Christof (Oct 24, 2014)

Yes I know what you mean,when cc1 controls the velocity x fade and cc1 the volume, but in some of my string libraries cc11 controls the amount of vibrato,cc1 the dynamics and sometimes I want to sync dynamics and vibrato.
As cello palyer I also do that quite naturally, when I play a crescendo my vibrato increases.
I haven't tried it in my DAW yet, but I thought it could be handy sometimes.


----------



## Jdiggity1 (Oct 24, 2014)

You can achieve this in cubase by using Transformer. Does logic have any sort of MIDI transformer or equivalent? They are often an overlooked element to a DAW.


----------



## Christof (Oct 24, 2014)

Great, this seems to work, in Logic X it's the midi modifier, I just have to send cc1 thru cc11.
Very easy!


----------



## JBZeon (Oct 24, 2014)

Do you use Lemur?, another option is to link faders in Lemur with a simple script if you want. so you have independent faders for CC1 and CC11 and another fader to move this two faders in sync when you need.


----------



## sinkd (Oct 24, 2014)

CC1 and 11 on an x/y touchpad is the way to go. Plenty of cheap otions for iPad, if you've got one.

DS


----------



## Jetzer (Oct 24, 2014)

Do you guys play them in real-time? 

I currently use an expression pedal for CC11 + modhweel for C1, but my leg get's tired after a while. Just wondering if playing them in at the same time with two fingers controlling both faders would work.


----------



## Nick Batzdorf (Oct 24, 2014)

Christof, the best way to set this up is with a Transformer object in the Environment. 

Go to the Click and Ports layer and set up the Transformer to convert CC1 to CC11. If you want you can draw in a separate response curve.


To patch it in, leave the cable going into the Sequencer input, but run a parallel one from whatever's feeding the Sequencer input to the Transformer, then out into the Sequencer input.

In other words, you're Y-ing the regular input so CC1 goes directly in unaltered and also goes in after being converted to CC11.

You could also set up an on-off switch for the Transformer in a floating window, then put it in your other screensets.


----------



## ChristopherDoucet (Oct 24, 2014)

I also use lemur. 

Its great to have CC 1 and CC 11 independent for some library's but more often than not I use them together on a custom built lemur page.


----------



## A.G (Oct 24, 2014)

Christof @ Fri Oct 24 said:


> Is there a way to control cc1 and cc11 with only one controller, lets say the mod wheel?



Hi Christof,
There are two ways in Logic X to do that - as Pre Sequencer (Global) and as Post Sequencer (Local).

*Copy CC1 to CC11 as Pre Sequencer (Global)*

You have to create a Transformer object in the Click & Ports Environment layer and patch/ cable it between
the Physical Input and the Sequencer as shown in *Fig.1*. Set the Transformer as shown in the image. 
*Note*: This setup is Global so it will affect any selected Instrument. The Sequencer will record both CC definitions!







*Copy CC1 to CC11 as Post Sequencer (Local)*

Insert a Modifier MIDI FX into the Channel Strip(s) you want to copy CC1 to CC11 and set the Modifier as shown in *Fig.2*. 
*Note*: This setup is Local so the Sequencer will record CC1 only! The Modifier will transform CC1 to CC11 on the fly.






Regards,

Ivan


----------



## Nick Batzdorf (Oct 24, 2014)

"Copy matching events and apply operation" is another way to do it, but the reason I suggested running a separate cable is so you can also insert an on/off switch there.

To be blunt I think that's a better way of doing it, because you don't want CCs 1 and 11 to be duplicated all the time. Most instruments use them individually to do different things.


----------



## TGV (Oct 25, 2014)

I personally prefer not to copy them 1-on-1. I like mapping CC11 to the lower dynamics and CC1 to the higher. E.g., you can make CC11 go from 0 to 127 in the input range 0-48, and CC1 go from 0 to 127 on the input range 32-127. It's library dependent, and takes a bit of fiddling to find out what works best. This approach requires three transformers: one to let all data that is not the target controller pass through, and two to transform the target controller.

However, as posted above, an approach with the javascript plugin is much more flexible. I think I'll code one up to do what I described above.

Ok, I've done just that. It's a script with 7 parameters: first source CC number, then the first output CC plus its range, and then the second CC plus its range. Its default is to map CC1 to CC1 32-127 and CC11 0-48, as described above. You can drop it in ~/Music/Audio Music Apps/Plug-In Settings/Scripter. If you chose the Scripter as the MIDI FX plugin, it should then show up in the presets.


----------



## A.G (Oct 25, 2014)

Nick Batzdorf @ Fri Oct 24 said:


> "Copy matching events and apply operation" is another way to do it, but the reason I suggested running a separate cable is so you can also insert an on/off switch there.


You still can patch a Cable Switcher before my transformer example and:
1. Cable the Top Cable Switcher pin to the sequencer (Thru/Off).
2. Cable the second Cable switcher pin to the Transformer (Processing/On).

Anyway my focus was to show basic examples of Pre-Sequencer (Global) setup and Post - Sequencer (Local). 
I did not come into complex exvironment schemes though I can show thousands. By the way all of my Logic
Pre-Sequencer Macro Tools support such On/Off switch for the reason you say. Those On/Off buttons can be
controlled via MIDI CC# as well (a regular Cable Switcher can be controlled via MIDI too). The image below shows my 
"True MIDI Latch" Pre-Sequncer tool which supports such remote On/Off switch button, so a Complex Pre-Sequencer 
Modifier be designed like this Latch Tool.









TGV said:


> Ok, I've done just that. It's a script with 7 parameters: first source CC number, then the first output CC plus its range, and then
> the second CC plus its range. Its default is to map CC1 to CC1 32-127 and CC11 0-48, as described above.



Your work is highly appreciated but it can be done easily just by using two factory "Modifier" MIDI FX plugins inserted into a
given Instrument Channel Strip. Here is an example scenario which is relative to your scale conditions.
1. Top Modifier plugin: CC1 to Scaled CC11 + CC1 (Thru);
2. Bottom Modifier plugin: CC1 (The original via "Thru") to CC1 Scaled;


----------



## TGV (Oct 25, 2014)

A.G @ Sat Oct 25 said:


> Your work is highly appreciated but it can be done easily just by using two factory "Modifier" MIDI FX plugins inserted into a
> given Instrument Channel Strip.


Ah, I'd always assumed the Thru button was a bypass, not a transform plus copy. That is very neat, thanks.


----------



## TGV (Oct 25, 2014)

TGV @ Sat Oct 25 said:


> A.G @ Sat Oct 25 said:
> 
> 
> > Your work is highly appreciated but it can be done easily just by using two factory "Modifier" MIDI FX plugins inserted into a
> ...


Now that I've tried it, I notice that the modifier doesn't go beyond 200%. So even the moderate scaling, that I described above, and which works nicely with Mural, is not possible with two Modifier plugins: you'd need three. The Modifier plugin is also not very accurate (only increments of 10%), but that's not that important.


----------



## A.G (Oct 25, 2014)

TGV @ Sat Oct 25 said:


> Now that I've tried it, I notice that the modifier doesn't go beyond 200%.


That's right. That means Max multiplication (*2). Probably a few people like you need some brutal freezing multiplication (*64). :shock: 



TGV @ Sat Oct 25 said:


> The Modifier plugin is also not very accurate (only increments of 10%), but that's not that important.


This is low significant. 

PS. I gave a try with your Scripter tool - it does not work by the way when I twitch external CC1 (neither CC1 or CC11 are output via the plugin). There is some error in "HandelMIDI" CB in the "Math" code line shown in the Scripter Trace monitor. I noted some other logical errors as well, but do not have any time to backwards your code. Nice to see other guys who crack the Scripter. :wink:


----------



## TGV (Oct 25, 2014)

That's most odd. It works fine for me. I can see the different controls (in a Spitfire patch) move correctly, and there is no error indication whatsoever. It would also be very odd if one can't use Math.trunc() in a script, so there's something fishy. Do you care to elaborate?


----------



## A.G (Oct 25, 2014)

TGV @ Sat Oct 25 said:


> Do you care to elaborate?


I do not mind. 
*Issue 1:*When I load your default preset (I do not change anything) and try to twitch my External Controller Modulation Wheel nothing is shown in the Kontakt Multi Script Monitor Display. Look at the image below. CC1 is shown in the Environment Input View Monitor (and in the Transport) but it is blocked in the Scripter as well the Copied CC11 (cause of Error). If I bypass the Scripter then CC1 is shown in the Kontakt Monitor Display.
By the way all other CC#s pass thru the Scripter without problem as well Notes etc.
Only CC1 causes error and is blocked in the Scripter.






Here is the Scripter Error shown in the Editor:






*Issue 2:* By the way I have noted that you have declared some fixed/default values for the UI Parameters. Later the user can update those default UI Parameter values via the "Parameter Changed" callback. So far so good. However it is supposed that the user will "Save As" that Scripter preset or will store the Logic song/project.
After the next Logic song project loading the Scripter will load your default parameter assignments not the user ones on unit, though the UI Parameters will be loaded properly. Same if the user loads his Scripter custom "pst" preset. I.e after Init, on "HandleMIDI" CB your code will get the declared "var" defaults not the user UI Parameter values.
I could not try out that cause the code does not work, so correct me if I'm wrong.

*Issue 3:* What I do not love in the Logic Factory MIDI FX is that there is no MIDI Channelizing. So my examples with the *Modifier* were just for fun :D . It is supposed that you can have CC1 recorded events on MIDI Channel 1; Ch.2 etc which feed a given Multi-Timbral Instrument. In this case the *Modifier* will apply those CC1 ->CC11 copy & Scale processing to ANY Channel and affect the other Instruments loaded in the Multi whereas you do not wish that!
I do not see any Channelizing in your prototype as well?


----------



## TGV (Oct 25, 2014)

I do not understand why you get an error on Math.trunc. It evaluates without any problem for me. I've noticed that the Scripter doesn't want to evaluate certain calls when there is no instrument plugin on its channel, but it seems you've got one hooked up. I can't find any reference to possible difference in Javascript engines, nor where Logic gets its JS interpreter from, but Math.trunc has been in the specs for ages. Apparently, Scripter doesn't need the values to be integral, so Math.trunc can be removed. Does it work then?

> After the next Logic song project loading the Scripter will load your default parameter assignments not the user ones on unit, though the UI Parameters will be loaded properly.

The documentation says: "ParameterChanged is also called once for each parameter when you load a plug-in setting." So that works as it should. When I change a parameter, save the project, and reopen, the function ParameterChanged() is called for each parameter, and all are restored to their saved value. Adding a Trace() statement confirms that. The initial values of the parameters are superfluous.

> What I do not love in the Logic Factory MIDI FX is that there is no MIDI Channelizing.

A channel parameter is easily added.


----------



## A.G (Oct 25, 2014)

TGV @ Sat Oct 25 said:


> I've noticed that the Scripter doesn't want to evaluate certain calls when there is no instrument plugin on its channel


The MIDI FX plugins are in "sleeping mode" until you awake them using the following methods (it is regarding my personal MIDI FX researches and is not documented anywehre):
*1.* You have to Insert an Instrument and open its interface. If you store a project with closed Instrument interface and re-open the project and try to play anything which must be processed by the MIDI FX plugin it will not be processed until you open the Instrument interface which will cause initialization in the MIDI FX to make it work.
*2.* You must run Logic for a while or just run it to play the song (*recommended*) which will awake all MIDI FX plugins inserted into all Logic Channel Strips in one go.

Anyway I tried several methods to awake your Prototype. I inserted the External Instrument plugin and routed it to IAC to be able to Monitor the problem using third party MIDI monitoring apps or routing the IAC back to Click & Ports Monitor.
It does not work - the error still exist. If I try to twitch any other CC# or other MIDI events such as Notes, Pitch Bend etc they pass thru your Scipter plugin and are shown in the Monitors. Testing is under Logic 10.0.7.


----------



## TGV (Oct 25, 2014)

It can't be a matter of "waking". If the JS engine doesn't respond, it cannot make an error, and everything passes without problem. If only CC1 blocks, that means the script is active. It's very odd that it doesn't respond to Math.trunc. Did you try to remove just the string "Math.trunc"?


----------



## A.G (Oct 25, 2014)

TGV @ Sat Oct 25 said:


> Did you try to remove just the string "Math.trunc"?


Nope, I did have any time or willing to fix any third party experiments. However I do want to support you cause you just ask for that. Here it is:
*1.* I replaced the "Math.trunc" with "Math.floor" (which works as expected). I guess you want to filter any sub event CC un-wished values such as 0.345 etc. "Math.floor" does that without any Scripter errors.
*2.* The "OutputHigh" UI assignments did not work as well. It does not mater what I set in the "OutputHigh" UIs, the transformed scaled "OutputHigh" values go to 127 cause you have set those to fixed values 127 in your original code (see the 3,4,5,6 red-highlighted code places shown in the image below) .

Now the code works as expected. It will be nice if you update it with a MIDI Channel assignment.


----------



## TGV (Oct 26, 2014)

A.G @ Sat Oct 25 said:


> *1.* I replaced the "Math.trunc" with "Math.floor" (which works as expected). I guess you want to filter any sub event CC un-wished values such as 0.345 etc. "Math.floor" does that without any Scripter errors.


That is bizarre. That means your Logic and mine use different Javascript engines. That makes Scripter use rather awkward.



> *2.* The "OutputHigh" UI assignments did not work as well. It does not mater what I set in the "OutputHigh" UIs, the transformed scaled "OutputHigh" values go to 127 cause you have set those to fixed values 127 in your original code (see the 3,4,5,6 red-highlighted code places shown in the image below).


You might have misunderstood the goal of this script. It maps two ranges of one CC input to the full range of two output CCs. The idea is to do what you see in the attached picture. So input range 0-48 is mapped onto the first CC 0-127, and 32-127 is mapped onto the second's 0-127.

I agree that is quite simplistic, and possibly not optimally using the range of the input, but it's what works well for sample libraries. CC1 often controls timbre and gives the most realistic control of dynamics, while CC11 often just scales the volume like CC7. However, Mural needs CC11 for a complete fadeout, and other libraries might need it to push the volume when CC1 is at 127, but it's always the full range that's needed. That's why it was designed like this.



> Now the code works as expected. It will be nice if you update it with a MIDI Channel assignment.



I'll do that, and add min and max limits for the two outputs, although that make the interface a bit cluttered.


----------



## TGV (Oct 26, 2014)

Ok, I've rewritten the script. It now only transforms one CC, but has a "thru" function like the Modifier plugin, so they can be chained as in the picture. The script can map a range of the input CC onto a range of another (or the same) CC, and apply a "sensitivity" curve (like these).

The attached picture shows two chained scripts. The first maps the range 0-49 from CC1 to the full range of CC11, and applies a light curve (negative means that low values increase the output fast; positive means that low values increase the output slowly; it basically pulls the curve in the direction of the slider). It also has "Send Original Event Too" set to yes, so the original CC1 gets copied to the second script, which maps range 36-127 to CC1's full range.

The Math.trunc() function has been replaced by Math.floor(). The script has been released under CC4.0. Have fun.

Thanks to Ivan for his help.


----------



## chimuelo (Oct 26, 2014)

I was trained as an Organist and Pianist as a kid so I always kept my knees tight for swells and Walking Bass Pedals. 
No longer have a crew or a Hammond but since then learned to use Expression Pedals and a MIDI Solutions T8.
Articulations can be changed w/ 4 x FSwitches, 2 x more for Rotary cabinet and Portamento/Glissando, plus 2 x Expression Pedals.

Each pedal has 12 x CC assignments, combinations of 1 and 11 are really nice too as I can assign not just timbre but various aspects of a hardware or software filter, along with amplitude and real time hardware effects.

Each CC has it's own starting point, lag time, curve and target destination.
presets can be summoned manually or via Cubase 7/Bidule.
Also have over lapping splits that can track and move their ranges in real time.
If you can do it live, you can do it in the studio.

Below is the routing window where hardware MIDI and DAW MIDI are merged and Filtered.
These signals then are sent back into the DAW or out to hardware, which is also routed back into the project window as ASIO sends, audio, etc.

Someday a DAW developer might want to emulate this ancient DSP technology from 2002 and offer it to composers.

While I am really enjoying my recent Cubase 7 upgrade from SX2, there's very little real time stuff, when I get hip I guess I can learn about groove machines, pitch corrective algos, etc.




imgurl



image hosting no sign up


----------



## jcrosby (Dec 6, 2014)

Christof @ Fri Oct 24 said:


> Logic X users:
> 
> Is there a way to control cc1 and cc11 with only one controller, lets say the mod wheel?
> 
> ...



Lots of great solutions above. You could also use several "transformer" objects in logic's environment to manipulate them both from the mod wheel. 

A scenario where the advantage of doing it in the environment is the ideal solution would be when you're running VE Pro. 
Since you have to use external midi to access multiple instruments, you may not want them all responding the same way. The transformer in the environment will let you address each instrument separately… 

If you're hosting your instruments in Logic then scripter or the modifier midi plugin are great, and simple solutions.

This is a link to an absolutely phenomenal (free) tutorial that shows you the power of the Logic environment … 

http://music.tutsplus.com/tutorials/understanding-logic-pros-environment--audio-1313


----------



## JohnBMears (Jan 21, 2015)

Hey there! Could you help me create this floating on/off switch you speak of regarding a 'selectable' joining of cc01 and cc11 when I need it, then off when I don't?

thank you so much!

JOHN


----------



## apessino (Jan 21, 2015)

I am not a Logic user but.... it seems to me that TransMIDIFier would be a better/cleaner solution to any of the above - it is very intuitive, extremely flexible, it has a million other uses (especially with a DAW that does not have Expression Maps), works with any app and it is free (donations appreciated).

http://www.bewaryprods.com/software/pro ... sMIDIfier/

i use it all the time, for example to map my breath controller to any other CC, at the press of a button, with custom curves, and without interfering with the sequencer project or settings.


----------



## Øivind (Jan 21, 2015)

Just wanted to jump in with the others and suggest an X/Y Pad for Lemur or TouchOSC.

This should work for tabs and phones (at least for Android), and even iPods i believe.
Setting it up in TouchOSC is very easy and intuitive, and it also comes with a x/y pad
ready to use from the 'Simple' preset i believe. 

I have not dabbled with Lemur much yet, but i am sure you can find a ready made 
x/y pad on there too.


----------



## Lannister (Jan 22, 2015)

Sorry to butt in with a request here, but Cubase was mentioned a couple of times further up the thread. I don't suppose anyone has an idiots guide for getting CC1 mirrored to CC11? 

I tried the transformer (Logical Editor) MIDI-insert but couldn't figure it out.


----------



## JFB (Jan 23, 2015)

Not that you want to buy one of these, but I use the venerable JLCooper Fadermaster Pro for this. It allows you to slave one or more of its 8 faders to one as a master. I'll have the master fader set to CC01 with a range of 0-127 and the slave fader set to CC11 with a range of, say, 40-127. It scales perfectly. The reason I do this is that many sustain instruments in sample libraries are too loud in the pp range compared to ff and this solves that (assuming your sustain instruments respond to CC11 for volume). It can also smooth things out in those instruments where the CC01 xfades between layers are a bit "lumpy".


----------



## mohurwitzmusic (Jan 24, 2015)

Lemur!

https://www.youtube.com/watch?v=oPN2_pN_IaI#t=525


----------

