Send Midi CC+PrgCH?

Is there a way to send Midi CC and PrgCH to external Devices ?
Can I assign MidiCC to the knobs of the Zynthian in a midi chain?
I have not found a way to do this within the MidiChain. There is no description in the User Guide.
Also in the Midi FX devices there is none that can do this.

https://wiki.zynthian.org/index.php/Zynthian_UI_User_Guide_-_V1/V4#MIDI-learning_.2F_binding

1 Like

By the way, I would like to send Midi CC and PrgCh within a Zynthian Midi chain to external devices using the Zynthian’s rotary controls.

For ORAM is in engine UI:

  • knob#1 - knob#4
    • rotate any knob to change the value of the assigned parameter.
    • short-push any knob to start MIDI-learning for the associated parameter.
    • bold-push any knob to open the options menu for the associated parameter.

https://wiki.zynthian.org/index.php/Zynthian_UI_User's_Guide_-_Oram#UI_Actions_5

1 Like

Enter Parameter menu for specific chain by short press on highlighted chain in the Mixer view.

From Mixer highlight the chain you wish to allocate on:

Short press on Select encoder to enter Parameter Menu…

Bold Press on Select Encoder to enter Chain Options Menu…

Scroll down to MIDI Learn…

Short Press to enter MIDI Learn Menu…

Select Enter MIDI Learn… Which takes you to CHAIN Control MIDI Learn

Select ( i.r. move the relevant encoder or select on touch screen) the Parameter you wish to control

Send MIDI CC you wish to control this parameter…

It’s appears long winded but it is logical given the number of options available around chain control . . . .

The V5 guide is here…

2 Likes

Thanks for the detailed explanation

I know that, but it’s not what I want to do.

How to teach an external controller is very well solved but how is it the other way round.
I am not interested in controlling a Zynthian plug-in with an external controller.

How can I send MidiCC or PrgCH from the Zynthian to an external synthseizer e.g. Behringer Deepmind?

To send MIDI data to external devices you need to build a MIDI chain and then route it to the appropriate Output MIDI Device within the chain MIDI out menu.

1 Like

Yes i know and sending notes is also no problem and works . But if I want to have a certain preset in the external synth I have to send a midi PrgCh (Program Change Message) from the Zynthian so that the external synth plays the preset I want.
where can I send it in the Zynthian.

I suspect, and I’m sure others will comment if I’m worng that you are probably building something in a MIDI LV2 for that functionality or a ctrldev device to respond on loading of a specific component. I’m not aware of any start up triggers also you can contrive some interesting tricks with zynseq on loading but I doubt that is the approach you would really want to use.

Apologies for posting the route to MIDI learn, I wanted to define the route and the elements above were the result.

1 Like

Okay then this function is missing then I don’t need to look for it any further.
A way to send MidiCC and MidiPrg to the outside world via the Zynthian’s knobs wouldn’t be bad.
If a sequencer is already installed you should think about the possibility to send MidiPrg every Groovebox Mc101,Mpc,Deluge,Force and many more can do this.

In Zynthian you could do this via a midifx device similar to Bitwig. Unfortunately I cannot programme something like this…

Thanks for your help.

We do not implement sending MIDI commands with rotary encoders as they are used to control the zynthian.

However, zynthian is very flexible so let’s see if we can do this… This might not be pretty but it may be a solution.

  • In webconf, SOFTWARE->Engines, select MIDI Tools tab and enable “setBfree MIDI controller”
  • Add a MIDI chain with setBfree MIDI controller plugin. It is in the “Other” catagory
  • Bold SELECT to show the Chain Options menu
  • Select the MIDI Out menu and enable the MIDI outputs you want to send CC messages to.
  • Cancel back until you reach the chain control view.
  • Select the second page of controls: “ctrls#2”
  • Adjust the encoders and CC 91, 93 & 7 should be sent for encoders 2, 3 & 4.

Okay - that’s not perfect but it is a start. I chose setBfree controller because it sends MIDI commands from encoders but its configuration is fixed and not necessarily what we want. So, lets try and change those CC numbers.

  • Add a MIDI effect to the chain in series: MIDI CC Map.
  • Set CC input to 7
  • Set CC output to 10 (or whatever CC number you want)
  • Back on ctrls#2 page, the “Volume” encoder

We now have an encoder sending the CC we want. Repeat the above steps to add another MIDI CC Map in series (not parallel) to map CC 91 to another CC value and again for CC 93. We now have three of our encoders sending the CC we want, as long as we have the control view page ctrls#2 open.

So what if we want 4 CC encoders? Well we don’t have a page with 4 encoders on it so this trick is limited to 3 CC encoders. There are other pages that send the drawbars as CC but they only send 9 discrete positions / values. And others have toggle values.

So what does that 4th encoder do? It sends Program Change 36 but only when it is turned on… which is odd. Not much use to us.

You also asked about sending Program Change. I am not sure what you want to do there so will let you clarify before trying to figure out a way to do it.

I said at the start that this isn’t pretty but it demonstrates that with some lateral thinking, many things are possible with zynthian.

[Edit] You could use a Moony plugin and with a lua script something like this:

local midiR = MIDIResponder({
  [MIDI.Controller] = function(self, frames, forge, chan, cc, val)
    if (cc == 7) then
      forge:time(frames):midi(MIDI.Controller | chan, 101, val)
    elseif (cc == 91) then
      forge:time(frames):midi(MIDI.Controller | chan, 102, val)
    elseif (cc == 93) then
      forge:time(frames):midi(MIDI.Controller | chan, 103, val)
    end
  end
})

function run(n, control, notify, seq, forge)
  for frames, atom in seq:foreach() do
    local handled = midiR(frames, forge, atom)
  end
end

-- vim: set syntax=lua:

I am not familiar with lua so my code is rather simplistic. It could be done more efficiently but this works. You could substitue or add a line for sending program changes by replacing controller with program and removing a parameter, e.g.

forge:time(frames):midi(MIDI.ProgamChange | chan, val)
3 Likes

[Thanks @Riban for these instructions.

I will try it out to see how it works.

So it is possible but it is not user friendly.
It’s pretty nerdy

Thanks again.

1 Like

Compliment accepted! :grinning:

Maybe someone will create a LV2 plugin that does this. Has 4 controls that just send CC. Maybe with 4 controls that set the CC number.

[Edit] And by someone, I mean me!

[Edit] I will try to get this into the next point release of Oram. It is fairly simple and could be enhanced but it does what is requested.

5 Likes

This could also be used to use Ostirus and Ostirus in multimode.

Both plug-ins are able to receive MidiCC in multimode.

Please also more than just 4 possibilities to map Midi CC.
The touch screen can also be used (y-x touch controller).

PrgCH could also be integrated if possible in conjunction with Bank select.

This last comment is quite confusing.

The request was for a way for the zynthian hardware encoders to send CC to an external MIDI device. We can already use the encoders to control plugin parameters. That is their default behaviour in the control view.

I only put 4 on because it was a simple proof-of-concept design. It could have more but I would be concerned about it getting confusing for the user. I am not too happy with having the configuration controls that allow too simple change of what the send controls do - but this is kinda normal in a zynthian plugin.

The X-Y touch controller does not currently send CC to external MIDI. See feature request 1184.

I am not sure how best to implement program change. We could have a page that has one encoder that sends program change and one that sends bank select.

Example.

Mixer Channel 1 is the channel with the Ostirus plugin in multimode.
Mixer Channel 2 is a normal midi channel without plugin.
Mixer Channel 3 is the same.

Now you can send midi notes from channels 2 and 3 to channel 1.
Ostirus (in multimode) receives these and assigns them to its internal channels.

An Ostirus instance now plays 3 different presets.

1 Bassline
2 Pad
3 Lead

Unfortunately you can’t control them at the moment and a preset has to be selected via VCN because there is no possibility to send MidiCC or PrgCH.

However, if you have the option of sending Midi CC from channel 2 or 3 to plug-in channel 1, you can, for example, control the filter cutoff from channel 3 (preset 3 Lead) or channel 2 (preset 2 Pad) based on the sent channel.

If you have the option of sending to channel 1 a PrgCH Message, you can also select the presets (per Channel) direkt in the Ostirius plug-in ohne VCN.

Virus TI Midi CC list… Ostirus understand this.

Virus TI Midi CC.pdf (32.9 KB)

So not only external synthesizers could be controlled but also internal ones that understand Midi CC like Osirus and Ostirus…

Sorry for my English…

1 Like

I try it compille on my Zynthian, but in final I was stoped by this:

/zynthian/zynthian-my-data/software/riban-lv2/DPF/utils/generate-ttl.sh: line 41: cd: ./lv2/ribanCCSend.lv2: No such file or directory
make: *** [Makefile:30: gen] Error 1

ls of /zynthian/zynthian-my-data/software/riban-lv2/DPF/utils/ directory:

(venv) root@zynthian:/zynthian/zynthian-my-data/software/riban-lv2/DPF/utils# ls
au-services-restart.sh	 lv2-ttl-generator    package-osx-bundles.sh  plugin.pkg   state2json.cpp
generate-ttl.sh	 lv2_ttl_generator    plugin.app	      png2rgba.py  symbols
generate-vst-bundles.sh  lv2_ttl_generator.d  plugin.bundle	      res2c.py	   valgrind-dpf.supp

What am I doing wrong?

Yep! I updated the README to explain how to work around that upstream (DPF) bug that I reported in November 2021.

So that’s a very old report… I just read it on github.

1 Like

I added bank and progam select.

1 Like