Midi-in SysEx time values binding to surface element - midi remote script

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

}
1 Like