Introduction

Le synthétiseur de fréquences Bébé présenté ici par l'IREM des Pays de la Loire se veut élémentaire aussi bien dans sa manière de produire des sons que dans son utilisation.

Il est placé sous la licence GPLv3.

L'investissement en matériel nécessaire est limité puisqu'il suffit d'un ordinateur portable et d'un clavier MIDI (USB) quelconque.

Toutes les notes MIDI sont jouables simultanément, ce que l'on traduit en jargon commercial par : il y a 128 notes de polyphonie.

Matériel requis et avertissements

Il faut un ordinateur avec une carte son, et une source MIDI reliée à l'ordinateur. Il faut un compilateur OCaml dans sa distribution standard pour fabriquer les exécutables. Pour envoyer le signal sonore brut (numérique) vers la carte son, il faut de préférence le paquet logiciel sox (SOund eXchange), sinon à la rigueur le paquet logiciel esd (Enlighted sound daemon). (L'avantage du premier est son filtrage qui (entre autres) atténue le repli fréquentiel au prix d'un léger temps de latence.)

La pédale "Sustain pedal" empêche l'arrêt des notes à l'enfoncement, et effectue l'action "All notes off" au relâchement.

ATTENTION À NE PAS LÉSER LES OREILLES DANS LE CAS D'UNE ÉCOUTE AU CASQUE.

Compilation

Les exécutables sont placés dans bin, les bibliothèques dans lib, les configurations dans syntheBBrc et la documentation dans doc.

La compilation normale est réalisée en exécutant dans le dossier bin/ :

sh compile.sh

Démarrage et exploitation du son

Sur un système BSD, où les périphériques MIDI apparaissent sous la forme /dev/umidi0.0, il faut lancer :

sh syntheBSD.sh
Sur un UNIX de type système V (comme GNU/Linux), il faut lancer :
sh syntheSV1.sh
si les périphériques MIDI ont tendance à apparaître sous la forme /dev/midi00 ; sinon il faut lancer :
sh syntheSV2.sh
quand les périphériques MIDI ont tendance à apparaître sous la forme /dev/snd/midiC1D0.

Il faut appuyer sur quelques touches du clavier MIDI pour que le périphérique MIDI soit détecté.

En cas de problème, il se peut que des processus excédant leur durée de vie normale empêchent le succès d'une autre tentative. Il est bon de nettoyer les processus en lançant :

sh nettoyage.sh

Utilisation du casque

Pour utiliser le jack casque sous FreeBSD (/dev/dsp1.0) -par exemple sur un ordinateur portable- avec certaines cartes-son on peut avoir besoin de faire en tant que root (avec réponse du SHELL montrée sur la deuxième ligne) :

# sysctl hw.snd.default_unit=1
hw.snd.default_unit: 0 -> 1

Commandes

Le clavier de l'ordinateur sert à envoyer les commandes suivantes.

Après avoir tapé sur la touche ENTRÉE, s'effectue la prise en compte de la commande (ou des commandes accumulées sur une ligne).

Pour chaque commande, un message de diagnostic est affiché sur la sortie de diagnostic standard (standard error).

La charge du processus le plus gourmand sur la machine est affichée en pourcentage d'utilisation CPU au début de chaque message de diagnostic.

Commandes supplémentaires

Les commandes précédentes suffisent pour l'utilisation du synthétiseur Bébé. Cependant par commodité, certaines commandes ont été reprises du piano électrique : il faut se reporter à la documentation du logiciel pianelIREM concernant leurs fonctions. Elles ouvrent quelques possibilités supplémentaires, surtout avec un clavier azerty.

Organisation générale

Le module cherche_midi.ml

contient la fonction qui détecte quel périphérique MIDI envoie effectivement des données (à condition d'en envoyer).

Le module data.ml

construit les données et fonctions universelles. Un résumé des caractéristiques principales de quelques instruments historiques y est présenté.

Le module init.ml

initialise le synthétiseur : crée les coefficients de rotation des générateurs.

Le module initJeux.ml

efface la mémoire des jeux.

Le module initReglages.ml

efface les réglages du synthétiseur.

Le module clavier.ml

construit un programme sans fin qui transforme les signaux de l'entrée standard (par exemple /dev/umidi0.0) en état du clavier dans /tmp/syntheBB/etatClavier. Le foncteur Make est à appliquer à une configuration de clavier consignée dans un fichier tel que clavierX.ml où la lettre X correspond au fabricant.

Le module omega.ml

contient des numéros de contrôleurs MIDI pour un appareil générique.

Le module filtre_tty.ml

est un filtre pour envoyer les messages MIDI sur le clavier générique.

Le module clavierO.ml

applique le foncteur Clavier.Make aux sources MIDI normales.

Le module etat.ml

transforme l'état du clavier de /tmp/syntheBB/etatClavier en état du synthétiseur dans /tmp/syntheBB/etatSynthe.

Le module manivelle.ml

fabrique chaque échantillon sonore en stéréo 16 bits (signés) avec 44100 points d'échantillonnage par seconde.

La taille du vecteur échantillon par défaut est 882 et peut être modifiée par recompilation.

Ces deux dernières valeurs numériques sont fixées dans le module data.ml.

Une taille d'échantillon plus longue donne un clavier moins réactif et un peu moins de charge sur le processeur, une taille plus courte facilite le jeu rapide mais est plus exigeante pour l'ordinateur.

Cette taille influence la ligne à retard utilisée pour le vibrato stéréophonique et la réverbération. (Le vibrato monophonique a une fréquence relativement élevée et une faible profondeur.) La taille d'échantillon influence aussi l'enveloppe de clic.

Le parcours du signal est le suivant :

  1. générateurs, clic, effets simples et filtre :
  2. effets - chacun des deux signaux grave, aigu passe dans un cheminement : vibrato, chorus, rotation - en incorporant le filtrat correspondant de la ligne de retard principale -> ( gauche ; droite )
  3. sortie - les quatre signaux grave gauche, grave droit, aigu gauche, aigu droit sont tous incorporés dans le cheminement :
La réverbération et le vibrato stéréophonique utilisent substantiellement l'échantillon précédent ; le filtrage et le vibrato monophonique l'utilisent à la marge.

Le module synthe.ml

construit la boucle infinie qui ordonne la fabrication des échantillons sonores en fonction de la date.

Si la commande sleep sur l'ordinateur accepte un argument non entier, la boucle est mise en sommeil par morceaux d'une millisecondes jusqu'à l'échéance du prochain échantillon. L'utilisation du processeur (ou de l'un des processeurs) peut varier entre quelques pourcents et 100%, auquel cas on déclenche la saturation de calcul (production de clocs en sortie son).

Si la commande sleep ne convient pas (rares sont les systèmes avec une fonction sleep qui n'accepte que des durées entières), une action stérile est faite dans l'entretemps pour garder la main : Dans ce cas l'utilisation du processeur (ou de l'un des processeurs) est obligatoirement 100% même dans le cas où la génération du son charge peu la machine.

Copyright Stéphane Grognet
IREM des Pays de la Loire - Université de Nantes
Laboratoire de mathématiques Jean Leray UMR 6629 CNRS
version 0.1

Author(s): Stéphane Grognet
Version: 0.1
Since 2014, 2015