From 8ab55e10944dbfe8c9898536c70d91a989f8fee1 Mon Sep 17 00:00:00 2001 From: cvancau Date: Sun, 9 Aug 2026 17:08:54 +0200 Subject: [PATCH] Actualiser src/utils/midiHelper.js --- src/utils/midiHelper.js | 81 +++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/src/utils/midiHelper.js b/src/utils/midiHelper.js index 0ec7bf8..42afe05 100644 --- a/src/utils/midiHelper.js +++ b/src/utils/midiHelper.js @@ -1,66 +1,83 @@ -// Variable globale contenant l'interface MIDI actuellement sélectionnée par l'utilisateur let selectedMidiOutput = null; +let selectedMidiInput = null; /** - * Initialise l'accès MIDI et renvoie la liste des périphériques physiques disponibles - * @returns {Promise} Liste des ports de sortie MIDI [{id, name}, ...] + * Initialise l'accès MIDI et renvoie les entrées et sorties disponibles + * @returns {Promise<{inputs: Array, outputs: Array}>} */ export const initWebMidi = () => { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { if (!navigator.requestMIDIAccess) { console.error("[MIDI] L'API Web MIDI n'est pas supportée."); - return resolve([]); + return resolve({ inputs: [], outputs: [] }); } navigator.requestMIDIAccess({ sysex: true }) .then((midiAccess) => { const outputs = Array.from(midiAccess.outputs.values()); + const inputs = Array.from(midiAccess.inputs.values()); - // Si un périphérique est déjà branché, on le sélectionne par défaut - if (outputs.length > 0 && !selectedMidiOutput) { - selectedMidiOutput = outputs[0]; - } + // Sélection par défaut du premier périphérique trouvé si non défini + if (outputs.length > 0 && !selectedMidiOutput) selectedMidiOutput = outputs[0]; + if (inputs.length > 0 && !selectedMidiInput) setupMidiInputListener(inputs[0]); - // On renvoie un tableau d'objets simples exploitables par React - const devices = outputs.map(port => ({ id: port.id, name: port.name })); - resolve(devices); + resolve({ + outputs: outputs.map(port => ({ id: port.id, name: port.name })), + inputs: inputs.map(port => ({ id: port.id, name: port.name })) + }); }) .catch(err => { console.error("[MIDI] Accès refusé : ", err); - resolve([]); + resolve({ inputs: [], outputs: [] }); }); }); }; /** - * Permet à l'utilisateur de changer d'interface MIDI depuis le menu déroulant - * @param {string} portId - L'identifiant du port choisi + * Modifie le port de sortie (MIDI Out) */ -export const changeSelectedMidiPort = (portId) => { +export const changeMidiOutputPort = (portId) => { if (!navigator.requestMIDIAccess) return; - navigator.requestMIDIAccess({ sysex: true }).then((midiAccess) => { const outputs = Array.from(midiAccess.outputs.values()); - const targetPort = outputs.find(port => port.id === portId); - if (targetPort) { - selectedMidiOutput = targetPort; - console.log(`[MIDI] Nouveau port sélectionné : ${selectedMidiOutput.name}`); - } + const target = outputs.find(port => port.id === portId); + if (target) selectedMidiOutput = target; }); }; /** - * Envoie la trame SysEx au port actuellement sélectionné + * Modifie le port d'entrée (MIDI In) et branche l'écouteur + */ +export const changeMidiInputPort = (portId) => { + if (!navigator.requestMIDIAccess) return; + navigator.requestMIDIAccess({ sysex: true }).then((midiAccess) => { + const inputs = Array.from(midiAccess.inputs.values()); + const target = inputs.find(port => port.id === portId); + if (target) setupMidiInputListener(target); + }); +}; + +/** + * Active l'écoute des messages envoyés par le microKORG + */ +const setupMidiInputListener = (inputPort) => { + if (selectedMidiInput) { + selectedMidiInput.onmidimessage = null; // Nettoie l'ancien écouteur + } + selectedMidiInput = inputPort; + selectedMidiInput.onmidimessage = (event) => { + const data = event.data; + // C'est ici que l'on interceptera plus tard les dumps SysEx reçus du microKORG + console.log("[MIDI IN] Message reçu du microKORG :", Array.from(data).map(b => b.toString(16).toUpperCase())); + }; + console.log(`[MIDI IN] Écoute active sur : ${selectedMidiInput.name}`); +}; + +/** + * Envoie la trame SysEx au microKORG (MIDI Out) */ export const sendMicroKorgParam = (parameterId, value) => { - if (!selectedMidiOutput) return; // Si aucun choix n'est fait, on n'envoie rien - - const sysExMessage = [ - 0xF0, 0x42, 0x30, 0x58, 0x41, - parameterId, - value, - 0xF7 - ]; - + if (!selectedMidiOutput) return; + const sysExMessage = [0xF0, 0x42, 0x30, 0x58, 0x41, parameterId, value, 0xF7]; selectedMidiOutput.send(sysExMessage); };