From 57c48f0c453a46292ee6a134e55c6a8a2f89931b Mon Sep 17 00:00:00 2001 From: nkymut Date: Thu, 23 Jan 2025 08:30:06 +0800 Subject: [PATCH] Add 'sysex' control - sysex(id, data) and both arguments are patternable --- packages/core/controls.mjs | 7 +++++++ packages/midi/midi.mjs | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 7bfeb1e3..00d6e7a2 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1616,3 +1616,10 @@ export const ar = register('ar', (t, pat) => { const [attack, release = attack] = t; return pat.set({ attack, release }); }); +export const sysex = register('sysex', (args, pat) => { + if (!Array.isArray(args)) { + throw new Error('sysex expects an array of [id, data]'); + } + const [id, data] = args; + return pat.sysexid(id).sysexdata(data); +}); diff --git a/packages/midi/midi.mjs b/packages/midi/midi.mjs index 5fabb3ea..058e7b68 100644 --- a/packages/midi/midi.mjs +++ b/packages/midi/midi.mjs @@ -153,6 +153,8 @@ Pattern.prototype.midi = function (output) { sysexdata, } = hap.value; + console.log('hap', hap.value); + velocity = gain * velocity; // note off messages will often a few ms arrive late, try to prevent glitching by subtracting from the duration length @@ -213,6 +215,21 @@ Pattern.prototype.midi = function (output) { device.sendProgramChange(progNum, midichan, { time: timeOffsetString }); } // Handle sysex + // sysex data is consist of 2 arrays, first is sysexid, second is sysexdata + // sysexid is a manufacturer id it is either a number or an array of 3 numbers. + // list of manufacturer ids can be found here : https://midi.org/sysexidtable + // if sysexid is an array the first byte is 0x00 + + // if (sysex !== undefined) { + // console.log('sysex', sysex); + // if (Array.isArray(sysex)) { + // if (Array.isArray(sysex[0])) { + // //device.sendSysex(sysex[0], sysex[1], { time: timeOffsetString }); + // } else { + // //device.sendSysex(sysex[0], sysex[1], { time: timeOffsetString }); + // } + // } + // } if (sysexid !== undefined && sysexdata !== undefined) { //console.log('sysex', sysexid, sysexdata); if (Array.isArray(sysexid)) {