Déclancher un signal midi avec NodeJs sur Windows
Tags: node, midi, easymidi, express
Published: 2022-02-17 16:53:58

---
title: Déclancher un signal midi avec NodeJs sur Windows
published: true
description: 
tags: 
- nodejs
- midi
- easymidi
- express
//cover_image: https://direct_url_to_image.jpg
---

Je vais présenter ici un script simpliste pour générer un signal midi depuis une application NodeJs.

# Installation

Pour cet exemple, nous avons besoin de :
* NodeJs
* Express
* EasyMidi

```
mkdir Project
cd Project
npm init
npm install express
npm install easymidi
```

En complément, il nous faut installer 2 logiciels tiers :

[LoopMidi](https://www.tobias-erichsen.de/software/loopmidi.html) qui nous permet de créer un périphérique midi virtuel
et
[Midi-OX](http://www.midiox.com/) qui permet de visualiser les logs.

# Configuration

## LoopMidi
Démarre LoopMidi et créé un nouveau périphérique en lui assignant un nom et en appuyant sur le bouton "+"
![add loopmidi device](https://res.cloudinary.com/practicaldev/image/fetch/s--R4Y1Hw-9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/v4nsaXf.png)

## Midi-OX
Démarre Midi-OX et affiche le moniteur si il n'apparait pas
![open monitor midi-ox](https://res.cloudinary.com/practicaldev/image/fetch/s--feiuG3sl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/Rq66FCl.png)

Ensuite, plug LoopMidi avec midi-ox en allant dans Options->Midi Devices
![option midi-Ox](https://res.cloudinary.com/practicaldev/image/fetch/s--Dii2Ou0L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/ElJZUE0.png)

Pour finir, sélectionne le périphérique que vous avez créé avec LoopMidi dans la partie "MIDI Inputs" (1) et "Microsoft GS Wavetable Synth" dans "MIDI Outputs" (3). Si tout est ok, ils apparaîtront respectivement dans "Port Map Objects" (2) et "Port Mapping" (3).

![midi-ox midi device](https://res.cloudinary.com/practicaldev/image/fetch/s--7X3Quj9Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/33AdU57.png)

## Main.js
Dans le dossier du projet, ajoute le fichier main.js

```
let easymidi = require("easymidi")
let express = require('express')
let output = new easymidi.Output("NAME OF VIRTUAL DEVICE")
const app = express()
let is_on = false;
app.get('/', function (req, res) {
    res.sendFile(__dirname + '/index.html');
})

app.post('/click', (req, res)=>{
    console.log('received')
    
    output.send("cc", {
        controller: 37,
        value: (is_on) ? 0:127,
        channel: 0
    })

    is_on = !is_on;
    res.sendStatus(201);
})

app.listen(3000)
```
Ce script génère un serveur http affichant simplement un bouton. 
Le but du script est de déclancher un signal midi chaque fois que le bouton "ON/OFF" est cliqué

Pour lier le script au périphérique midi virtuel, il faut indiquer le nom du périphérique à la ligne suivant : 
```
let output = new easymidi.Output("NAME OF VIRTUAL DEVICE")
```


Ensuite, création du fichier index.html suivant :
```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="button">ON/OFF</button>
    <script>
        document.getElementById('button').onclick = ()=>{
            
            fetch('/click', {method: 'POST'})
        }
    </script>
</body>
</html>
```

# Start

Execute le script main.js
```
node main.js
```

Et ouvre la page [http://localhost:3000](http://localhost:3000) pour afficher le bouton d'envoi de signal midi. Chaque fois que le bouton est cliqué, un signal midi est envoyé au périphérique LoopMidi et intercepté par Midi-OX.

![log midi-ox](https://res.cloudinary.com/practicaldev/image/fetch/s--0W2RUksL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/kGJHXr6.png)

Bravo, tu sais envoyer un signal midi avec NodeJs :)

# Sources

Pour cette présentation, je me suis beaucoup aidé de cette [vidéo](https://www.youtube.com/watch?v=vW2Lve_hMzg)

Pour en savoir plus sur les signaux possible à envoyer, je conseille de lire la section "Message Reference" sur le [github de easymidi](https://github.com/dinchak/node-easymidi) 

Tous les codes pour cet exemple sont disponible sur [mon github](https://github.com/multiplaie/arduino-madmapper-js-control)