Actualiser src/utils/midiHelper.js
Deploy to home / deploy (push) Failing after 7s

This commit is contained in:
cvancau
2026-08-09 17:08:54 +02:00
parent 126b578a16
commit 8ab55e1094
+49 -32
View File
@@ -1,66 +1,83 @@
// Variable globale contenant l'interface MIDI actuellement sélectionnée par l'utilisateur
let selectedMidiOutput = null; let selectedMidiOutput = null;
let selectedMidiInput = null;
/** /**
* Initialise l'accès MIDI et renvoie la liste des périphériques physiques disponibles * Initialise l'accès MIDI et renvoie les entrées et sorties disponibles
* @returns {Promise<Array>} Liste des ports de sortie MIDI [{id, name}, ...] * @returns {Promise<{inputs: Array, outputs: Array}>}
*/ */
export const initWebMidi = () => { export const initWebMidi = () => {
return new Promise((resolve, reject) => { return new Promise((resolve) => {
if (!navigator.requestMIDIAccess) { if (!navigator.requestMIDIAccess) {
console.error("[MIDI] L'API Web MIDI n'est pas supportée."); console.error("[MIDI] L'API Web MIDI n'est pas supportée.");
return resolve([]); return resolve({ inputs: [], outputs: [] });
} }
navigator.requestMIDIAccess({ sysex: true }) navigator.requestMIDIAccess({ sysex: true })
.then((midiAccess) => { .then((midiAccess) => {
const outputs = Array.from(midiAccess.outputs.values()); 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 // Sélection par défaut du premier périphérique trouvé si non défini
if (outputs.length > 0 && !selectedMidiOutput) { if (outputs.length > 0 && !selectedMidiOutput) selectedMidiOutput = outputs[0];
selectedMidiOutput = outputs[0]; if (inputs.length > 0 && !selectedMidiInput) setupMidiInputListener(inputs[0]);
}
// On renvoie un tableau d'objets simples exploitables par React resolve({
const devices = outputs.map(port => ({ id: port.id, name: port.name })); outputs: outputs.map(port => ({ id: port.id, name: port.name })),
resolve(devices); inputs: inputs.map(port => ({ id: port.id, name: port.name }))
});
}) })
.catch(err => { .catch(err => {
console.error("[MIDI] Accès refusé : ", 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 * Modifie le port de sortie (MIDI Out)
* @param {string} portId - L'identifiant du port choisi
*/ */
export const changeSelectedMidiPort = (portId) => { export const changeMidiOutputPort = (portId) => {
if (!navigator.requestMIDIAccess) return; if (!navigator.requestMIDIAccess) return;
navigator.requestMIDIAccess({ sysex: true }).then((midiAccess) => { navigator.requestMIDIAccess({ sysex: true }).then((midiAccess) => {
const outputs = Array.from(midiAccess.outputs.values()); const outputs = Array.from(midiAccess.outputs.values());
const targetPort = outputs.find(port => port.id === portId); const target = outputs.find(port => port.id === portId);
if (targetPort) { if (target) selectedMidiOutput = target;
selectedMidiOutput = targetPort;
console.log(`[MIDI] Nouveau port sélectionné : ${selectedMidiOutput.name}`);
}
}); });
}; };
/** /**
* 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) => { export const sendMicroKorgParam = (parameterId, value) => {
if (!selectedMidiOutput) return; // Si aucun choix n'est fait, on n'envoie rien if (!selectedMidiOutput) return;
const sysExMessage = [0xF0, 0x42, 0x30, 0x58, 0x41, parameterId, value, 0xF7];
const sysExMessage = [
0xF0, 0x42, 0x30, 0x58, 0x41,
parameterId,
value,
0xF7
];
selectedMidiOutput.send(sysExMessage); selectedMidiOutput.send(sysExMessage);
}; };