Program Change increment/decrement via buttons (for Korg DW-8000)

3 posts / 0 new
Last post
planist79
planist79's picture
Program Change increment/decrement via buttons (for Korg DW-8000)

Hi,

i have a Korg DW-8000 + BCR2000 and made a Sysex Template for the BCR to control the parameters of the DW.

What i would like to do is change patches not with one of the rotary controllers but with one of the Buttons on the right of the BCR, so, in short: One button to go one patch up, one button to go one patch down, in order to cycle through the 88 patches via buttons in either direction.

Yesterday evening I tried some things with he BC Manager to find it out myself. I found a solution:
So i made a custom sysex line for each button:

$C0 val

(with value 1 set to 0 and value 2 set to 63 with incremental step set to whatever step you like) I programmed the 4 buttons to +1, -1, +8, -8

But then I found out a logical error in my template:

The problem with program changes via a BCR button is there is no internal counteer for program changes - each button has its own counter which is a problem for Program Changes.

  • So imagine i am on Program 01.
  • Now, when i press the button "PC +1" (sysex = '$C0 val' with incremental +1) it goes up to 2 correctly.
  • If i then want to go back to the previous program 1 by pressing the other button "PC -1" (sysex = '$C0 val' with incremental -1) it starts at its own counter which is still at 01 and therefore sends a program change to go 01 -1, so to the last program which is in this case 88.
  • When i now press PC +1 again, the program goes up to 3, because the counter for PC +1 was at 2, and so on.

Is there a solution for this kind of problem: the BCR counter should internally count the PC Number, so all buttons send the correct PC number.

Thank you!

Peter

Mark van den Berg
Mark van den Berg's picture

As described in section 14.9 of BC MIDI Implementation.pdf, the BCR only synchronizes the values of different elements for "standard output" definitions (using ".easypar" statements), not for "custom output" definitions (using ".tx" statements).

So you'll have to piggy-back the custom output definition ("$C0 val") on "dummy" standard output definitions, using a standard output "Type" that supports increments.
There are three such types: Control Change, NRPN and (Channel or Note) Aftertouch.
Which of these types is most appropriate, depends on several factors:

  • The receiving device (in your case the Korg DW-8000) should ignore the dummy messages. The simplest way to ensure this is to use a MIDI channel (1-16) not used by the receiver. As a second "line of defence" for dummy Control Change messages, the used Controller (0-127) should be ignored by the receiver.
  • The BCR should send as few dummy bytes as possible. Control Change and Note Aftertouch messages consist of 3 bytes, but Channel Aftertouch messages of only 2. So dummy Channel Aftertouch messages are best, unless the receiving device responds to these messages on all channels. An NRPN definition causes the BCR to output three Control Change messages (so 9 bytes in total); so NRPN is by definition much worse than Control Change. (Side-note: I'm ignoring MIDI's "running status" protocol here: this allows a MIDI output device to leave out a channel message's status byte if it's the same as the previous one.)

Here is a BCL script defining dummy Channel Aftertouch messages on MIDI channel 16 (you can paste this script into BC Manager's BCL Editor window for your BCR, then "Execute" it (i.e. apply it to BC Manager's representation of the BCR) or "Send" it to your BCR directly):

$rev R1 ; Firmware 1.10; BC Manager 4.1.1
$button 49 ;Program -8
;Dummy Channel Aftertouch
  .easypar AT 16 all 63 0 increment -8
  .showvalue on
  .default 0
  .tx $C0 val
$button 50 ;Program +8
;Dummy Channel Aftertouch
  .easypar AT 16 all 63 0 increment 8
  .showvalue on
  .default 0
  .tx $C0 val
$button 51 ;Program -1
;Dummy Channel Aftertouch
  .easypar AT 16 all 63 0 increment -1
  .showvalue on
  .default 0
  .tx $C0 val
$button 52 ;Program +1
;Dummy Channel Aftertouch
  .easypar AT 16 all 63 0 increment 1
  .showvalue on
  .default 0
  .tx $C0 val
$end

And here is a script using Control Change messages for Controller 119 on channel 16:

$rev R1 ; Firmware 1.10; BC Manager 4.1.1
$button 49 ;Program -8
;Dummy Control Change
  .easypar CC 16 119 63 0 increment -8
  .showvalue on
  .default 0
  .tx $C0 val
$button 50 ;Program +8
;Dummy Control Change
  .easypar CC 16 119 63 0 increment 8
  .showvalue on
  .default 0
  .tx $C0 val
$button 51 ;Program -1
;Dummy Control Change
  .easypar CC 16 119 63 0 increment -1
  .showvalue on
  .default 0
  .tx $C0 val
$button 52 ;Program +1
;Dummy Control Change
  .easypar CC 16 119 63 0 increment 1
  .showvalue on
  .default 0
  .tx $C0 val
$end

Hope this helps,
   Mark.

planist79
planist79's picture

Hey Mark,

You are the best! Thynk you. Yes, i found the section "value synchronisation" in the PDF manual as well, but then i wondered how it can be synced when i really need to output a tx statement instead of a standard Program Change, since the DW-8000 only accepts Sysex for Program Changes.

Your idea to "hide" the .tx statement in the standard CC output works perfectly!!

The DW-8000 accepts the "hidden" program changes via ".tx $C0 val" and at the same time the BCR syncs the program values over all 4 buttons- Great!

And it also work for an Encoder which i set to the similar settings Channel 16, CC 119, Mode Increment/Decrement plus the Sysex statement "$C0 val".

When i now press the buttons the Encoder follows the values and vice versa. 

 

Thank you so much!

Have a good evening! smiley

Peter