Hi, you can give this code a try:
var midiremote_api=require('midiremote_api_v1')
var deviceDriver=midiremote_api.makeDeviceDriver('Roland','VM-C7x00','Pierre Babeck')
var midiInput=deviceDriver.mPorts.makeMidiInput()
var detectionUnit=deviceDriver.makeDetectionUnit()
detectionUnit.detectSingleInput(midiInput)
.expectInputNameEquals("your MIDI In Port Name")
var knobs=[]
var faders=[]
var numChannels=16
for(var ci=0;ci<numChannels;ci++){
var knob=deviceDriver.mSurface.makeKnob(ci*2,0,2,2)
knob.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(ci,10) //Channel 0-16, CC 10 PAN
knobs.push(knob)
var fader=deviceDriver.mSurface.makeFader(ci*2+0.5,2,1,6) //position
// Label direkt an den Fader, muss dann nicht extra aufgerufen werden
var label=deviceDriver.mSurface.makeLabelField(ci*2,8,2,1) //position
label.relateTo(fader)
fader.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(ci,7) //Channel 0-16, CC 7 VOL
faders.push(fader)
}
var pageMixer1_16=deviceDriver.mMapping.makePage('Mixer Page 1-16')
var hostMixerBankZone=pageMixer1_16.mHostAccess.mMixConsole.makeMixerBankZone()
.includeAudioChannels()
.includeInputChannels()
.includeOutputChannels()
//sure about these includes?
for(var ci=0;ci<numChannels;ci++){
var channelBankItem=hostMixerBankZone.makeMixerBankChannel()
var knobSurfaceValue=knobs[ci].mSurfaceValue
var faderSurfaceValue=faders[ci].mSurfaceValue
pageMixer1_16.makeValueBinding(knobSurfaceValue,channelBankItem.mValue.mPan).setValueTakeOverModePickup()
pageMixer1_16.makeValueBinding(faderSurfaceValue,channelBankItem.mValue.mVolume).setValueTakeOverModePickup()
}
midiInput.mOnSysex=function(activeDevice,sysexMsg){
if(isSysexTimeMsg(sysexMsg)===true){
console.log("Sysex TIME OK")
}
}
function isSysexTimeMsg(sysexMsg){
var timeMessageLength=12
if(sysexMsg.length!=timeMessageLength+1){
return false
}
// no need to check for a 0xF7, since a sysex always ends with that
// time sysex header: 240 127 127 6 68 6 1
var sFirst=[0xF0,0x7F,0x7F,0x06,0x44,0x06,0x01]
for(var i=0;i<sFirst.length;i++){
if(sysexMsg[i]!=sFirst[i]){
return false
}
}
var tHour=sysexMsg[sFirst.length]-0x20 //default 0 is 32Dez (0x20HEX) then sub 32 = result ist hour
var tMin=sysexMsg[sFirst.length+1]
var tSec=sysexMsg[sFirst.length+2]
var tFrame=sysexMsg[sFirst.length+3]
var timeString=tHour+":"+tMin+":"+tSec+":"+tFrame
console.log("Time: "+timeString)
//no need to bind to a surfaceValue,call this, having previously set the activeMapping abstract (see page.mOnActivate event)
pageMixer1_16.mHostAccess.mTransport.mTimeDisplay.mPrimary.mTransportLocator.setTime(currentMapping,timeString)
return true
}
var currentMapping
pageMixer1_16.mOnActivate=function(activeDevice,activeMapping){
currentMapping=activeMapping
}