When a device responds to a Property Exchange ChannelList Get, the Workbench renders it using the hardcoded column set in the built-in ChannelList descriptor (libs/midiCITables.js:635), which always includes a { "link": "ProgramList", "title": "Program List" } column. During header construction in buildTable (output/app/common.js, near line 2194), the renderer calls getResourceWithSchemaRef(colObj.link) for every link column to read the linked resource’s schema title. For ProgramList, this rejects in getResourceWithSchemaRef (libs/midici.js:1746) with "No Resource in ResourceList called ProgramList", because the device legitimately does not advertise ProgramList in its ResourceList.
This is a false error. Per M2-105, ProgramList is optional, and there is no requirement that a device exposing ChannelList also expose ProgramList. A device with no programs correctly omits it. The column link is a Workbench UI convenience based on the common synth pairing of channels with program lists, not a specification rule. The code already flags the gap: the block carries the comment // TODO Look up the link and make sure the Resource Exists - otherwise trigger an error.
The important detail is where the error surfaces. The log line is written by the main process, not the renderer. In the getResourceWithSchemaRef IPC handler (main.js, case 'getResourceWithSchemaRef'), the .catch() both replies to the renderer and unconditionally calls d.msg('pe', { title: 'Get Resource Error', ... }). Therefore, adding a .catch() on the renderer side does not remove the log entry. The fix must be made in the main-process handler, or by avoiding the request for an unadvertised resource in the first place.
Minimal fix in main.js, in the case 'getResourceWithSchemaRef' catch handler: skip logging the benign “not advertised” rejection while still replying to the renderer.
.catch(eMsg=>{
event.reply('asynchronous-reply', 'callback',
{
error: eMsg,
callbackId: xData.callbackId
});
// A column link may reference a Resource the device never advertised
// (e.g. the hardcoded ChannelList -> ProgramList column link). That is
// expected, not a device error, so do not surface it as a Get Resource Error.
if(typeof eMsg === 'string'
&& eMsg.startsWith('No Resource in ResourceList called')){
return;
}
d.msg('pe',{
title: 'Get Resource Error',
errors: [eMsg]
},
'in',
xData.umpDev,
0,
[eMsg],
null
);
});
Optionally, in output/app/common.js, at the link-column header branch near line 2194, set the fallback header from the column definition before probing. This ensures the column remains labeled correctly and no longer depends on the linked resource resolving.
}else if(colObj.link){
if(colObj.link==="ChCtrlList"){
ChCtrlListShown=true;
jqHead.attr("data-ChCtrlList","1");
}
jqHead.text(colObj.title || '');
getResourceWithSchemaRef(colObj.link).then(([resourceObj])=>{
jqHead.text(resourceObj.schema.title);
}).catch(()=>{
/* linked Resource not advertised by this device */
});
}else{
With these changes, the ChannelList table still shows the Program List column header, links continue to work for devices that advertise ProgramList, and devices that do not advertise it no longer trigger a spurious Get Resource Error.
When a device responds to a Property Exchange ChannelList Get, the Workbench renders it using the hardcoded column set in the built-in ChannelList descriptor (libs/midiCITables.js:635), which always includes a { "link": "ProgramList", "title": "Program List" } column. During header construction in buildTable (output/app/common.js, near line 2194), the renderer calls getResourceWithSchemaRef(colObj.link) for every link column to read the linked resource’s schema title. For ProgramList, this rejects in getResourceWithSchemaRef (libs/midici.js:1746) with "No Resource in ResourceList called ProgramList", because the device legitimately does not advertise ProgramList in its ResourceList.
This is a false error. Per M2-105, ProgramList is optional, and there is no requirement that a device exposing ChannelList also expose ProgramList. A device with no programs correctly omits it. The column link is a Workbench UI convenience based on the common synth pairing of channels with program lists, not a specification rule. The code already flags the gap: the block carries the comment // TODO Look up the link and make sure the Resource Exists - otherwise trigger an error.
The important detail is where the error surfaces. The log line is written by the main process, not the renderer. In the getResourceWithSchemaRef IPC handler (main.js, case 'getResourceWithSchemaRef'), the .catch() both replies to the renderer and unconditionally calls d.msg('pe', { title: 'Get Resource Error', ... }). Therefore, adding a .catch() on the renderer side does not remove the log entry. The fix must be made in the main-process handler, or by avoiding the request for an unadvertised resource in the first place.
Minimal fix in main.js, in the case 'getResourceWithSchemaRef' catch handler: skip logging the benign “not advertised” rejection while still replying to the renderer.
Optionally, in output/app/common.js, at the link-column header branch near line 2194, set the fallback header from the column definition before probing. This ensures the column remains labeled correctly and no longer depends on the linked resource resolving.
With these changes, the ChannelList table still shows the Program List column header, links continue to work for devices that advertise ProgramList, and devices that do not advertise it no longer trigger a spurious Get Resource Error.