And for my Friday gift to you all - working code that extracts full cubase track name with 29 characters...
//Sysex Track Variables
var trackName = "unpopulated"
var pos = 72
var rootPosLCD = 72
var keepStringVal = 0
var trackNameJoined = "unpopulated"
var bufferTrackName = "undefined"
var posBuffer = 72
var nameLengthCheck = 0
send('midi', 'MCU_From_OSC', '/note', 1, 44, 127); //Send MCU command to swith to track name sending
module.exports = {
oscInFilter:function(data){
var { address, args, host, port } = data
// if (host === 'midi' && port == 'MCU_To_OSC') {console.log('2MCU PING OCCOURED' + address)}
// MCU TEST AREA HERE
if (host === 'midi' && port === 'MCU_To_OSC' && address === '/sysex') {
if (args[0].value.includes("f0 00 00 66 14 12")) { // sysex header for mackie lcd text
var nameDone = false
var sysExVal = args[0].value
var d = sysExVal.split(" ").slice(6).map(x => parseInt(x, 16))
// console.log('d = ' + d)
pos = d[0] // first byte -> position // hex to int
//console.log('pos = ' + pos)
text = d.slice(1).map(x => String.fromCharCode(x)) // rest -> updated characters
text.pop() // drop sysex closing byte
trackName = text.join('')
nameLengthCheck = bufferTrackName.length - trackName.length
charFromStart = pos - rootPosLCD
var lengthCheck = charFromStart + trackName.lenth
if (lengthCheck < 29) {
let newEndLength = 29 - charFromStart - trackName.length
newEnd = bufferTrackName.substring(bufferTrackName.length - newEndLength)
} else {newEnd = ""}
if (pos == 72) { //Full length name recievd
trackNameJoined = trackName + newEnd
bufferTrackName = trackNameJoined
posBuffer = pos
console.log('TrackName Joined = ' + trackNameJoined)
nameDone = true
} else if (pos > posBuffer && posBuffer == 72 && nameDone == false) {
keepStringVal = pos - posBuffer //new name follows a full string text
var prevTrackKeep = bufferTrackName.substring(0, keepStringVal)
trackNameJoined = prevTrackKeep + trackName + newEnd
bufferTrackName = trackNameJoined
posBuffer = pos
nameDone = true
console.log('TrackName Joined = ' + trackNameJoined);
} else {
keepStringVal = pos - rootPosLCD //new name follows a full string text
var prevTrackKeep = bufferTrackName.substring(0, keepStringVal)
trackNameJoined = prevTrackKeep + trackName + newEnd
bufferTrackName = trackNameJoined
posBuffer = pos
nameDone = true
console.log('TrackName Joined = ' + trackNameJoined);
}
}
}
//END MCU TEST AREA
return {address, args, host, port}
},
oscOutFilter: function (data) { // Filter incomming osc messages
var { address, args, host, port } = data
return data //End of OSC out Filter here
}
}
Edit: Any bugs or problems let me know. It's probably not the most efficient code and could do with tidying up but it works on my machine...
Edit: there is a way better solution further down the thread with the bugs ironed out here Better solution here