Behringer BCR2000 in Bitwig

Studio Bones
KVRer
7 posts since 13 Oct, 2016

Post Thu Oct 13, 2016 5:30 am

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!

User avatar
BufoBufo
KVRist
178 posts since 23 Oct, 2008

Re: Behringer BCR2000 in Bitwig

Post Thu Oct 13, 2016 1:42 pm

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

Studio Bones
KVRer
7 posts since 13 Oct, 2016

Re: Behringer BCR2000 in Bitwig

Post Thu Oct 20, 2016 1:57 pm

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

stamp
KVRian
542 posts since 10 Sep, 2014

Re: Behringer BCR2000 in Bitwig

Post Thu Oct 20, 2016 2:47 pm

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

gigaherz
KVRist
33 posts since 17 Nov, 2011

Re: Behringer BCR2000 in Bitwig

Post Fri Oct 21, 2016 3:04 am

oh man, that script looks awesome, will try

comxed
KVRist
30 posts since 14 Aug, 2006 from Bydgoszcz, Poland

Re: Behringer BCR2000 in Bitwig

Post Sun Feb 26, 2017 12:57 pm

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.

gaijin14
KVRer
9 posts since 4 Nov, 2016

Re: Behringer BCR2000 in Bitwig

Post Thu Mar 02, 2017 1:44 pm

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.

User avatar
BufoBufo
KVRist
178 posts since 23 Oct, 2008

Re: Behringer BCR2000 in Bitwig

Post Thu Mar 02, 2017 5:40 pm

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 ~

gaijin14
KVRer
9 posts since 4 Nov, 2016

Re: Behringer BCR2000 in Bitwig

Post Fri Mar 03, 2017 4:19 am

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

tusk
KVRist
51 posts since 18 Jun, 2015

Re: Behringer BCR2000 in Bitwig

Post Mon Aug 27, 2018 12:19 pm

@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... ;-)
}

tusk
KVRist
51 posts since 18 Jun, 2015

Re: Behringer BCR2000 in Bitwig

Post Wed Sep 19, 2018 10:41 am

Anyone struggling with this problem should read this thread:

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

test822
KVRer
11 posts since 31 Jan, 2017

Re: Behringer BCR2000 in Bitwig

Post Sun Mar 10, 2019 2:38 pm

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.

solyon
KVRer
4 posts since 28 Nov, 2019

Re: Behringer BCR2000 in Bitwig

Post Tue Dec 03, 2019 3:43 am

AUTO-ADMIN: Non-MP3, WAV, OGG, SoundCloud, YouTube, Vimeo, Twitter and Facebook links in this post have been protected automatically. Once the member reaches 5 posts the links will function as normal.
test822 wrote:
Sun Mar 10, 2019 2:38 pm
https://drive.google.com/open?id=1HuA3T ... O2YL0O4BU6 (https://drive.google.com/open?id=1HuA3T8g2CGDOM01nlMfZxfO2YL0O4BU6)
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 :)

Return to “Controller Scripting”