I’m hoping that some devs see this because this would be such a useful addition to Cubase.
Imagine this:
You have a rotary MIDI controller. When its value is somewhere between 44 and 88, it does nothing.
When you move the encoder to a position which is > 88, the playhead will move forward. The higher the value, the faster it moves.
When you move the encoder to a position which is < 44, the playhead will move backward (rewind). Again, the higher the value, the faster it moves.
If you bring the encoder back towards the 44 to 88 range (from above or below), the playline movement slows down, and when the encoder is inside that 44-88 range, the playhead stops moving.
The speed of the movement should also be effected by the current horizontal zoom settings (as already happens in Cubase).
This would be a great way to move the playline without having to grab the mouse, especially for people who prefer to use hardware transport buttons. Personally I only use Cubase as a sort of tape machine, and try to get away from mousework as much as possible.
The above suggestions would also work with an endless controller (with the right functionality, it would be even better, as any positive or negative movement would start the playline moving), and the numbers suggested aren’t set in stone, it’s just an example.
You are describing a shuttle behaviour. There are several commercial devices available. You could also code this via the remote api as @Martin.Jirsak stated.
Thinking a bit more about it, an endless encoder really would be best for this. Because then the playline starts moving immediately when you turn it. Then as you turn it back it would slow down again and eventually stop. But it shouldn’t reverse direction until you stop turning for some predetermined length of time, say 300ms.
Out of curiosity I gave this a go but wasn’t able to get any satisfactory results. I tried a number of different approaches in my script but in the end was not successful.
The provisions appears to be there via makeCommandBinding(). The main issue appears to be that the Shuttle Play commands are treated as toggles making it challenging to seamlessly go from one play speed to another.
If you have been successful in mapping a MIDI controller to the Shuttle Play commands I would love to see an example of your solution.
Yes, I recall I’ve experimented a bit with these too and got to the very same conclusion. Seems like these commands were optimised for keyboard usage only. I did try the makeRepeating() addition, didn’t work flawlessly either.
Anyway, here’s a test remote using DA, in which I’ve setup buttons to act as gates for various speeds and directions, i.e. activating the shuttle upon a press and deactivating when releasing the (gate) button:
var midiremote_api=require('midiremote_api_v1')
var deviceDriver=midiremote_api.makeDeviceDriver('Test','Shuttle','m.c')
var midiInput=deviceDriver.mPorts.makeMidiInput()
var detectionUnit=deviceDriver.makeDetectionUnit()
detectionUnit.detectSingleInput(midiInput)
.expectInputNameEquals("your MIDI In Port Name")
var surface=deviceDriver.mSurface
var mapping=deviceDriver.mMapping
var page=mapping.makePage("shuttle")
var daTransport=page.mHostAccess.makeDirectAccess(page.mHostAccess.mTransport)
var initShuttleTag=2000
//Shuttle direction and speed tags (2000->2013)
//Fw 1x, Fw 2x, Fw 4x, Fw 8x, Bw 1x, Bw 2x, Bw 4x, Bw 8x
//Fw 1/2x, Fw 1/4x, Fw 1/8x, Bw 1/2x, Bw 1/4x, Bw 1/8x
for(var i=0;i<14;i++){
var button=surface.makeButton(i,0,1,1)
button.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(0,20+i)
var customHostValue=page.mCustom.makeHostValueVariable("customHostValue"+i)
page.makeValueBinding(button.mSurfaceValue,customHostValue).mOnValueChange=function(activeDevice,activeMapping,value,diff){
daTransport.setParameterProcessValue(activeMapping,daTransport.getBaseObjectID(activeMapping),initShuttleTag+this.i,value)
}.bind({i})
}
I did make some tests but couldn’t make it work.
I remember that at some point i tried to trigger a stop value between each change of shuttle speed but I abandoned, probably because i wasn’t convinced.