Behringer BCR2000 in Bitwig

Post Reply New Topic
RELATED
PRODUCTS

Post

Hi there,

I'm trying to get the most out of the Behringer BCR2000 controller in Bitwig. I want to use all 32 encoders as CC parameters with Bitwig also sending the information back to the controller so i have total recall. I also want to link every preset (page) on BCR to a different midi channel so that i can have 32 X 16 encoders. When i use the BCR preset by Bitwig (a Sysex file that you can download from the site) Bitwig only recognizes 1 Midi Channel, the other channel just seem to control the same parameters as the ones on channel 1. Also in the Mapping Browser Pannel i'm unable to set the value to work withing a certain percentage.

When i use the BCR with the factory presets and as a manualy added controller (Generic Keyboard) i am able to set the value within a certain percentage and de CC's are detected and numbered properly BUT yet again only on Midi channel 1 and Bitwig doesn't send information to the BCR so: no recall. Which makes it pretty much useless. I've tried editing patches for the BCR In BC Manager haven't found properly working settings yet.

I also have a nektar LX49 with the, by Bitwig provided, firmware. Those encoders work fine but the keyboard only has 8 encoders so that's not enough. If only there was a way to make the BCR's encoder work like the ones on the LX49 on all 16 Midi Channels.

2015 15" macbook pro, el capitan, MOTU 828 MKII

I already spent many hours on this problem, if someone has an solution for this, i would be forever grateful!

Post

Not exactly what you are looking for, but you could try this one.. Bidirectional control for volume, pans, sends (1-6), macros, 12 parameter pages and 48 assignable user controls.
https://github.com/justlep/bitwig/tree/ ... %20BCR2000

Post

Thanks for the tip BufoBufo, but still not quite what i'm looking for i'm afraid...

Post

Why aren't this script on the Bitwig site?
Last edited by stamp on Fri Oct 21, 2016 12:23 pm, edited 1 time in total.

Post

oh man, that script looks awesome, will try

Post

Try my modification of Thomas Helzle generic script:
https://github.com/adamkopf/BitwigGenericBCR2000

It works with default BCR presets. Haven't tried multiple channels yet but I think it will work.

Post

Hi. I am having problems getting LeP's awesome BCR2000 template to work in Bitwig2. Whenever BW2 tries to launch the script it comes up with this message "javax.script.ScriptException: TypeError: observerAddedMethod.call" is not a function in ToggledTransportValue.js at line number26.

Sadly I do not code and so cannot unpick what the issue is. If anybody has any ideas / suggestions then more than appreciated. Thanks.

Post

Hi Gaijin,
I've started refactoring my scripts for Bitwig 2 a couple of days ago.. It's all on a development branch still, but you can try the fixed scripts already if you want:

https://github.com/justlep/bitwig/blob/ ... -beta6.zip

I could only test in the 2.0.0-beta6 of Bitwig as I haven't purchased the Upgrade yet, but I think it should do fine. Some changes to notice:
- BW2 has no macros anymore, so instead I put a second Sends mode where the macros used to be. So now you can control up to 4 sends per channel simultaneously
- In params mode, unfortunately you can only control 8 parameters at a time now (so if you put the lower section of the BCR in Params mode, only the first row of rotatries will do)
- I excluded Effects+Master channels from the Volume & Pan modes.

Let me know if you find new bugs ;)
Cheers ~

Post

Hi,

Thanks for such a quick reply and for the potential fix. I have bought the new version so will let you know if I spot any other weird behaviour.

Most of all, thanks for taking the time to pull this script together in the first place!

David

Post

@Studiobones or others - did you have any luck with this?

I am trying to modify comxed's script but have not really gotten anywhere.

The BCR2000 allows you to create different presets. I have four separate presets where all the rotaries and buttons send data from different midi channels (1-4)

Bitwig just doesn't seem to recognise the data as coming from a different channel when I try to map parameters from the different presets.

Here is the code in case someone wants to suggest an idea:

Code: Select all

// Attempt to get BCR2000 multichannel off the ground, based on Adam Kopf's modification of Thomas Helzle's script. 

loadAPI(2);
host.setShouldFailOnDeprecatedUse(true);

host.defineController("AdrienneScripts", "BCR2000", "1.0", "d5790de0-a948-11e8-b568-0800200c9a66", "Adrienne Teicher");
host.defineMidiPorts(1, 1);

// CC 0 and CCs 120+ are reserved
var LOWEST_CC = 1;
var HIGHEST_CC = 119;

// Two variables to hold the Values of all the CCs and to check if they have changed
var ccValue = initArray(0, ((HIGHEST_CC - LOWEST_CC + 1) * 16));
var ccValueOld = initArray(0, ((HIGHEST_CC - LOWEST_CC + 1) * 16));
var ccValueIgnore = initArray(0, ((HIGHEST_CC - LOWEST_CC + 1) * 16));
var ccValueLastTouchedTime = initArray(0, ((HIGHEST_CC - LOWEST_CC + 1) * 16));

// A function to create an indexed function for the Observers
function getValueObserverFunc(index, varToStore) {
  return function (value) {
    varToStore[index] = value;
  }
}

function init() {

  // Create 16 NoteInputs + Omni. Verbose to allow commenting out unneeded channels
  //MultiBi = host.getMidiInPort(0).createNoteInput("Omni", "??????");
  MultiBi1 = host.getMidiInPort(0).createNoteInput("Ch 1", "?0????");
  MultiBi2 = host.getMidiInPort(0).createNoteInput("Ch 2", "?1????");
  MultiBi3 = host.getMidiInPort(0).createNoteInput("Ch 3", "?2????");
  MultiBi4 = host.getMidiInPort(0).createNoteInput("Ch 4", "?3????");
  //MultiBi5 = host.getMidiInPort(0).createNoteInput("Ch 5", "?4????");
  //MultiBi6 = host.getMidiInPort(0).createNoteInput("Ch 6", "?5????");
  //MultiBi7 = host.getMidiInPort(0).createNoteInput("Ch 7", "?6????");
  //MultiBi8 = host.getMidiInPort(0).createNoteInput("Ch 8", "?7????");
  //MultiBi9 = host.getMidiInPort(0).createNoteInput("Ch 9", "?8????");
  //MultiBi10 = host.getMidiInPort(0).createNoteInput("Ch 10", "?9????");
  //MultiBi11 = host.getMidiInPort(0).createNoteInput("Ch 11", "?A????");
  //MultiBi12 = host.getMidiInPort(0).createNoteInput("Ch 12", "?B????");
  //MultiBi13 = host.getMidiInPort(0).createNoteInput("Ch 13", "?C????");
  //MultiBi14 = host.getMidiInPort(0).createNoteInput("Ch 14", "?D????");
  //MultiBi15 = host.getMidiInPort(0).createNoteInput("Ch 15", "?E????");
  //MultiBi16 = host.getMidiInPort(0).createNoteInput("Ch 16", "?F????");

  // Disable the consuming of the events by the NoteInputs, so they are also available for mapping
  //MultiBi.setShouldConsumeEvents(false);
  MultiBi1.setShouldConsumeEvents(false);
  MultiBi2.setShouldConsumeEvents(false);
  MultiBi3.setShouldConsumeEvents(false);
  MultiBi4.setShouldConsumeEvents(false);
  //MultiBi5.setShouldConsumeEvents(false);
  //MultiBi6.setShouldConsumeEvents(false);
  //MultiBi7.setShouldConsumeEvents(false);
  //MultiBi8.setShouldConsumeEvents(false);
  //MultiBi9.setShouldConsumeEvents(false);
  //MultiBi10.setShouldConsumeEvents(false);
  //MultiBi11.setShouldConsumeEvents(false);
  //MultiBi12.setShouldConsumeEvents(false);
  //MultiBi13.setShouldConsumeEvents(false);
  //MultiBi14.setShouldConsumeEvents(false);
  //MultiBi15.setShouldConsumeEvents(false);
  //MultiBi16.setShouldConsumeEvents(false);

  // Setting Callbacks for Midi and Sysex
  host.getMidiInPort(0).setMidiCallback(onMidi);
  host.getMidiInPort(0).setSysexCallback(onSysex);

  // Make CCs 1-119 freely mappable for all 16 Channels
  userControls = host.createUserControls((HIGHEST_CC - LOWEST_CC + 1) * 16);

  for (var i = LOWEST_CC; i <= HIGHEST_CC; i++) {
    for (var j = 1; j <= 16; j++) {
      // Create the index variable c
      var c = i - LOWEST_CC + (j - 1) * (HIGHEST_CC - LOWEST_CC + 1);
      // Set a label/name for each userControl
      userControls.getControl(c).setLabel("CC " + i + " - Channel " + j);
      // Add a ValueObserver for each userControl
      userControls.getControl(c).addValueObserver(127, getValueObserverFunc(c, ccValue));
    }
  }
}

// Updates the controller in an orderly manner when needed
// so that LEDs, Motors etc. react to changes in the Software
// without drowning the Controller with data
function flush() {
  for (var i = LOWEST_CC; i <= HIGHEST_CC; i++) {
    for (var j = 1; j <= 16; j++) {
      var c = i - LOWEST_CC + (j - 1) * (HIGHEST_CC - LOWEST_CC + 1);
      // Check if something has changed
      if ((ccValue[c] != ccValueOld[c]) && !ccValueIgnore[c]) {
        // If yes, send the updated value
        sendChannelController(j - 1, i, ccValue[c]);
        // And update the value for the next check
        ccValueOld[c] = ccValue[c];
      }
    }
  }
}

// Update the UserControlls when Midi Data is received
function onMidi(status, data1, data2) {
  //printMidi(status, data1, data2);

  if (isChannelController(status)) {
    if (data1 >= LOWEST_CC && data1 <= HIGHEST_CC) {
      var index = data1 - LOWEST_CC + ((HIGHEST_CC - LOWEST_CC + 1) * MIDIChannel(status));
      ccValueIgnore[index] = true;
      userControls.getControl(index).set(data2, 128);
      ccValueLastTouchedTime[index] = Date.now();
      host.scheduleTask(unignoreHostChange, [index], 50);
    }
  }
}

function onSysex(data) {
    // MMC Transport Controls:
    switch (data) {
       case "f07f7f0605f7":
          transport.rewind();
          break;
       case "f07f7f0604f7":
          transport.fastForward();
          break;
       case "f07f7f0601f7":
          transport.stop();
          break;
       case "f07f7f0602f7":
          transport.play();
          break;
       case "f07f7f0606f7":
          transport.record();
          break;
    }
 }

 function unignoreHostChange(cc) {
   if (Date.now() - ccValueLastTouchedTime[cc] > 49){
     ccValueIgnore[cc] = false;
   }
 }

function exit() {
   // Nothing to do here... ;-)
}

Post

Anyone struggling with this problem should read this thread:

viewtopic.php?f=268&t=502857&p=7173910#p7173910

Post

I hope you get this. I have two BCR2000's myself and have been busting my butt for two days trying to find a way to use it in Bitwig that isn't their crappy preset template thing.

drop this file into your c:/Users/YOURNAME/My Documents/Bitwig Studio/Controller Scripts/User/ folder and it will create a new midi controller in the settings, the brand will say "TomsScripts" and the device will be called "GenericBCR2000". set the input and output to your BCR2000 hardware

https://drive.google.com/open?id=1HuA3T ... O2YL0O4BU6

this lets you map the BCR2000 knobs to any bitwig parameters, and it also sends data back to the BCR2000, making sure your hardware knob LED's always reflect what the device parameters are set to in the DAW, dynamically updating the knobs as you change presets, etc.

Post

test822 wrote: Sun Mar 10, 2019 10:38 pm https://drive.google.com/open?id=1HuA3T ... O2YL0O4BU6
this lets you map the BCR2000 knobs to any bitwig parameters,
Hi test822,
Do you still use the BCR2000? Could you update the Google Drive link or upload it on github? I was thinking to purchase one BCR because, you know... 32 encoders looks great for sound designing :)

Post Reply

Return to “Controller Scripting”