Actualiser src/utils/midiHelper.js
Deploy to home / deploy (push) Successful in 12s

This commit is contained in:
cvancau
2026-08-09 16:48:41 +02:00
parent ad7135bc9f
commit 9c6e25519f
+48 -29
View File
@@ -1,47 +1,66 @@
// Stocke l'interface MIDI physique de sortie
let activeMidiOutput = null;
// Variable globale contenant l'interface MIDI actuellement sélectionnée par l'utilisateur
let selectedMidiOutput = null;
/**
* Initialise l'accès à la Web MIDI API du navigateur (Exige un contexte HTTPS ou localhost)
* Initialise l'accès MIDI et renvoie la liste des périphériques physiques disponibles
* @returns {Promise<Array>} Liste des ports de sortie MIDI [{id, name}, ...]
*/
export const initWebMidi = () => {
if (navigator.requestMIDIAccess) {
navigator.requestMIDIAccess({ sysex: true }) // REQUIS pour le SysEx du microKORG
return new Promise((resolve, reject) => {
if (!navigator.requestMIDIAccess) {
console.error("[MIDI] L'API Web MIDI n'est pas supportée.");
return resolve([]);
}
navigator.requestMIDIAccess({ sysex: true })
.then((midiAccess) => {
const outputs = Array.from(midiAccess.outputs.values());
if (outputs.length > 0) {
activeMidiOutput = outputs[0]; // Sélectionne par défaut la première interface physique
console.log(`[MIDI ALAPATCH] Connecté au port de sortie : ${activeMidiOutput.name}`);
} else {
console.warn("[MIDI ALAPATCH] Aucune interface de sortie MIDI physique trouvée.");
// Si un périphérique est déjà branché, on le sélectionne par défaut
if (outputs.length > 0 && !selectedMidiOutput) {
selectedMidiOutput = outputs[0];
}
// On renvoie un tableau d'objets simples exploitables par React
const devices = outputs.map(port => ({ id: port.id, name: port.name }));
resolve(devices);
})
.catch(err => console.error("[MIDI ALAPATCH] Accès refusé par le navigateur : ", err));
} else {
console.error("[MIDI ALAPATCH] Ce navigateur ne gère pas l'API Web MIDI.");
}
.catch(err => {
console.error("[MIDI] Accès refusé : ", err);
resolve([]);
});
});
};
/**
* Transmet un message de changement de paramètre (Parameter Change) en SysEx
* @param {number} parameterId - L'adresse interne du bouton (ex: 0x1E pour le Cutoff)
* @param {number} value - La valeur du curseur (0 à 127)
* Permet à l'utilisateur de changer d'interface MIDI depuis le menu déroulant
* @param {string} portId - L'identifiant du port choisi
*/
export const changeSelectedMidiPort = (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}`);
}
});
};
/**
* Envoie la trame SysEx au port actuellement sélectionné
*/
export const sendMicroKorgParam = (parameterId, value) => {
if (!activeMidiOutput) return; // Si aucune carte MIDI n'est branchée, on ignore
if (!selectedMidiOutput) return; // Si aucun choix n'est fait, on n'envoie rien
// Trame System Exclusive standard du protocole Korg microKORG Original (2002)
const sysExMessage = [
0xF0, // Début du message SysEx
0x42, // Identification du fabricant (Korg)
0x30, // Canal MIDI Global (0x30 = Canal 1)
0x58, // Identification du modèle (microKORG)
0x41, // Type de commande : Parameter Change
parameterId, // ID du potentiomètre ciblé (ex: 30 pour le Cutoff)
value, // Position du curseur (0-127)
0xF7 // Fin du message SysEx
0xF0, 0x42, 0x30, 0x58, 0x41,
parameterId,
value,
0xF7
];
// Envoi physique immédiat dans le câble USB-MIDI
activeMidiOutput.send(sysExMessage);
selectedMidiOutput.send(sysExMessage);
};