Convert Absolute 1–127 Knob to Relative ±2-Step CC

Hello, I have a SL73 mk2 keyboard, I would like to create a hack to remap the knob A which send CC7 on chan1 value 0-12a7 to sending relative CC value to cubase. In cubase the knob need to be set to Relative Twos Complement in order to do what I want.

The issue is when reaching 127, I can still physically move the knob and it keeps sending 127 and same thing when it reach 0. Is there a crazy workaround I can do ?

My second question is can I remap in the same way the main encoder of my keyboard, which only send CC100 on chan1 but when the keyboard reach program100, It doesn’t send anything (I assume the answer for this is no)

Hi,

Please find the attached.

Translator 0.0 handles the conversion by comparing the last known absolute value of your encoder (in global variable “ga”) to the new value and will send either 127 for left movement)or 1 for right movement. When it reaches each end it continues to send 1 for right movement or 127 for left movement.

Translator 0.1 does the same but if the values are equal, it sends nothing. I used CC8 in this example. I use the global variable gc for the last known value.

In addition, I added translator 0.2 which simply toggles the value of global variable “gb”. If translator sees this value of other than 0, then it allows your to recenter your fader without sending anything. I use note 8 to toggle the value of gb.

Absolute-to-Relative-01-7F-2026-01-02.bmtp (2.8 KB)

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Hello, I tried to refine your translator to make it work, I arrived at this (yours was working only when my knob sent 60 to 65 approx)

// qq = incoming absolute value
// ta = last absolute value

rr=qq-ta

// ignore no movement
if rr==0 then exit rules, skip Outgoing Action

// keep direction only
if rr>0 then rr=1
if rr<0 then rr=-1

// invert if needed
rr=rr*-1

// rate limit: one step per message
ts=64+rr

ta=qq

Log ‘dir=%rr% out=%ts%’

I replaced all “g” in the global variables by “t”

So I could make it work but my only issue is that the values in cubase moves from minimum to maximum ultra fast when moving the knob + they seems to be moving by burst instead of linearly but that’s hard to say since it’s so fast

the knob in cubase is set to Relative Two Complement because I want the knob to move the pre-gain filter volume knob from whatever position it is

This is what my midi monitor register being sent to cubase (this log is only clockwise movement)

MIDI Log

Generated at 3 Jan 2026 at 03:13:30

Time Device Type Channel Data Info
03:13:11.795 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:11.855 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:11.935 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:12.015 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:12.095 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:12.195 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:12.275 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:12.375 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:12.435 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:12.495 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:12.575 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.135 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.202 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.275 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.355 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.435 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.495 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.575 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.635 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.715 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.791 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63
03:13:13.855 Bome MIDI Translator 1 Control Ch 1 7, 63 CC 7 = 63

| | | |

Please open the log window within Bome MIDI Translator Pro and check the boxes, Incoming, Outgoing, MIDI IN and MIDI out and move your CC1 knob right and then left. Then paste the results in a posting so I can take a look.

You could also look at this tutorial.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

1: MIDI INPUT “SL CTRL” now successfully opened.
2: MIDI IN [SL CTRL]: B0 07 65
3: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=101
4: 0.0:21 dir=-1 out=63
5: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 3F
6: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=63
7: MIDI IN [SL CTRL]: B0 07 65
8: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=101
9: MIDI IN [SL CTRL]: B0 07 66
10: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=102
11: 0.0:21 dir=-1 out=63
12: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 3F
13: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=63
14: MIDI IN [SL CTRL]: B0 07 66
15: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=102
16: MIDI IN [SL CTRL]: B0 07 67
17: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=103
18: 0.0:21 dir=-1 out=63
19: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 3F
20: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=63
21: MIDI IN [SL CTRL]: B0 07 67
22: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=103
23: MIDI IN [SL CTRL]: B0 07 68
24: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=104
25: 0.0:21 dir=-1 out=63
26: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 3F
27: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=63
28: MIDI IN [SL CTRL]: B0 07 68
29: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=104
30: MIDI IN [SL CTRL]: B0 07 69
31: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=105
32: 0.0:21 dir=-1 out=63
33: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 3F
34: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=63
35: MIDI IN [SL CTRL]: B0 07 69
36: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=105
37: MIDI IN [SL CTRL]: B0 07 6A
38: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=106
39: 0.0:21 dir=-1 out=63
40: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 3F
41: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=63
42: MIDI IN [SL CTRL]: B0 07 6A
43: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=106
44: MIDI IN [SL CTRL]: B0 07 69
45: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=105
46: 0.0:21 dir=1 out=65
47: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 41
48: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=65
49: MIDI IN [SL CTRL]: B0 07 69
50: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=105
51: MIDI IN [SL CTRL]: B0 07 68
52: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=104
53: 0.0:21 dir=1 out=65
54: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 41
55: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=65
56: MIDI IN [SL CTRL]: B0 07 68
57: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=104
58: MIDI IN [SL CTRL]: B0 07 67
59: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=103
60: 0.0:21 dir=1 out=65
61: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 41
62: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=65
63: MIDI IN [SL CTRL]: B0 07 67
64: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=103
65: MIDI IN [SL CTRL]: B0 07 66
66: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=102
67: 0.0:21 dir=1 out=65
68: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 41
69: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=65
70: MIDI IN [SL CTRL]: B0 07 66
71: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=102
72: MIDI IN [SL CTRL]: B0 07 65
73: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=101
74: 0.0:21 dir=1 out=65
75: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 41
76: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=65
77: MIDI IN [SL CTRL]: B0 07 65
78: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=101
79: MIDI IN [SL CTRL]: B0 07 64
80: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=100
81: 0.0:21 dir=1 out=65
82: MIDI OUT [Bome MIDI Translator 1 Virtual Out]: B0 07 41
83: OUT 0.0 Control Change on ch. 1 with CC#:7 (0x07) and value:ts=65
84: MIDI IN [SL CTRL]: B0 07 64
85: IN 0.0 Control Change on ch. 1 with CC#:7 (0x07) and any value set “qq” to value=100

this is the current translator 1

this is the current translator 1
// qq = incoming absolute value
// ta = last absolute value

rr=qq-ta

// ignore no movement
if rr==0 then exit rules, skip Outgoing Action

// keep direction only
if rr>0 then rr=1
if rr<0 then rr=-1

// invert if needed
rr=rr*-1

// rate limit: one step per message
ts=64+rr

ta=qq

Log ‘dir=%rr% out=%ts%’

(output is ts)

I have tested the tutorial project from the video you linked, in fact it works way better, but when my hardware knob reaches the minimum or the maximum, it keeps sending 0 or 127, and this is where the translator break. Since it’s not a fader but a knob, I cannot use the “center” feature, because I’d need to be turning the knob for 10 seconds before it goes back to the middle

1: MIDI IN [SL CTRL]: B0 07 00
2: IN 0.1 Control Change on ch. 1 with CC#:7 (0x07) and any value set “pp” to value=0
3: OUT 0.1 Timer qq times ‘Fader 1’: 0 ms (initial delay: 0 ms)
4: MIDI IN [SL CTRL]: B0 07 00
5: IN 0.1 Control Change on ch. 1 with CC#:7 (0x07) and any value set “pp” to value=0
6: OUT 0.1 Timer qq times ‘Fader 1’: 0 ms (initial delay: 0 ms)
7: MIDI IN [SL CTRL]: B0 07 00
8: IN 0.1 Control Change on ch. 1 with CC#:7 (0x07) and any value set “pp” to value=0
9: OUT 0.1 Timer qq times ‘Fader 1’: 0 ms (initial delay: 0 ms)
10: MIDI IN [SL CTRL]: B0 07 00
11: IN 0.1 Control Change on ch. 1 with CC#:7 (0x07) and any value set “pp” to value=0
12: OUT 0.1 Timer qq times ‘Fader 1’: 0 ms (initial delay: 0 ms)
13: MIDI IN [SL CTRL]: B0 07 00
14: IN 0.1 Control Change on ch. 1 with CC#:7 (0x07) and any value set “pp” to value=0
15: OUT 0.1 Timer qq times ‘Fader 1’: 0 ms (initial delay: 0 ms)
16: MIDI IN [SL CTRL]: B0 07 00
17: IN 0.1 Control Change on ch. 1 with CC#:7 (0x07) and any value set “pp” to value=0
18: OUT 0.1 Timer qq times ‘Fader 1’: 0 ms (initial delay: 0 ms)
19: MIDI IN [SL CTRL]: B0 07 00
20: IN 0.1 Control Change on ch. 1 with CC#:7 (0x07) and any value set “pp” to value=0
21: OUT 0.1 Timer qq times ‘Fader 1’: 0 ms (initial delay: 0 ms)
22: MIDI IN [SL CTRL]: B0 07 00
23: IN 0.1 Control Change on ch. 1 with CC#:7 (0x07) and any value set “pp” to value=0
24: OUT 0.1 Timer qq times ‘Fader 1’: 0 ms (initial delay: 0 ms)

OK I found a working solution, let me write it and you tell me if you think it’s optimized …. a few minutes

Translator 1: Input movement
incoming CC7, stored as pp
rules :
// Disable output so you can center encoder
if gb==1 then exit rules, skip Outgoing Action
// Determine Count

qq=pp-ga
// Down
if qq<0 then gc=127
// Up
if qq>0 then gc=1
// Fix counter to positive
if qq<0 then qq=qq*-1

outgoing : timer 1

Translator 2 : Output

Incoming : Timer Fader 1

rules :
// Edge mode: do NOT move virtual position

if gd==1 then exit rules, execute Outgoing Action

// Normal mode
if gc==127 then ga=ga-1
if gc==1 then ga=ga+1

outgoing : CC7 gc


translator 3 : MINIMUM Edge Injector
incoming CC7 = 0
rules :

// Only if truly at minimum
if ga!=0 then exit rules, skip Outgoing Action
if gb==1 then exit rules, skip Outgoing Action

// Mark edge mode
gd=1

// Force DOWN
gc=127
qq=1

Outgoing : Timer Fader 1


translator 4 : MINIMUM Clear Edge Injector variable to reset to normal behavior

incoming : CC7 pp

rules :

// Only when leaving minimum

if ga!=0 then exit rules, skip Outgoing Action

// Only if value is above minimum

if pp==0 then exit rules, skip Outgoing Action

// Clear edge mode
gd=0

outgoing : nothing

and the same for the maximum edge

If it works for you, then that is OK. I cannot really comment because the initial solution I gave should have worked if you described what you wanted correctly. You never posted the log as I suggested (only the end points).

I don’t think there is a need for a timer here although maybe I used one in the tutorial I pointed you to.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz