Introduction
Le titre de cet article c'est l'opposé planétaire du putaclick... On comprends pas du tout de quoi ça parle, les gens nés après 1990 n'ont probablement absolument aucune idée de ce qu'est le HAUT PARLEUR PéCé, et de toutes manières c'est pas très clair ce qu'on va faire avec.
Ben ouais bienvenue dans le vraie vie, on commence avec un problème réel puis ça se transforme en script Bash qui joue Despacito en mono-voix très fort et moche.
**Bruit de baskets neuves glissant sur un pâté de campagne**
C'est quoi le haut parleur PC?
Ah je suis bien content que vous posiez la question ma foi certes.
Voyez-vous, les ordinateurs et l'audio, c'est une longue histoire.
Les gens se disaient que ce serait pas mal de produire des sons d'alerte et puis surtout que ce serait un ajout bien plaisant pour les jeux vidéos (qui ont toujours existé à toute époque de la micro-informatique).
Problème: si je veux jouer un bon vieux MP3 depuis un ordinateur, il y a plusieurs couches de trucs coûteux en traitement:
- Décoder les données MP3 (compressées) en une liste d'échantillons (nombre fixe d'échantillons par seconde, chaque échantillon est une valeur codée sur X bits (aussi nombre fixe));
- Prendre tous ces échantillons et les passer dans un convertisseur numérique vers analogique qui va produire une forme d'onde de courant électrique à envoyer à des hauts parleurs ou un casque, lequel transforme ce courant électrique variable en onde de pression.
Pour passer de 1 à 2 il faut que tous ces échantillons passent par la mémoire du système et donc par le processeur.
La qualité CD (lol qui utilise encore des CD?) c'est 44100 échantillons par seconde.
Je rappelle que sur un Atari, compter jusque 1000 en BASIC ça prend plus d'une seconde. On est pas dans la merde...

Par conséquent, les vieux ordinateurs étaient incapables de gérer de l'audio à moins qu'il s'agisse d'un nombre très limité d'échantillons par seconde et/ou de passer par un circuit accélérateur qui dispense le processeur de gérer l'audio — Les anciennes cartes son étaient parfois considérées "accélératrices", ce qui a totalement disparu de nos jours.
Pourquoi? Parce que pour un processeur moderne, traiter et passer même un très grand nombre d'échantillons audio en interne c'est comme une micro-chatouille, ça ne représente plus aucune difficulté. QUEL PROGRES MES ENFANTS!
Passer le son d'un jeu dans une moulinette qui ajoute de la raisonnance parce qu'on se trouve dans une grotte en ce moment, il fût un temps où ça demandait du matériel spécifique et une compatibilité de la carte son avec "EAX", un vieux standard proprétaire.
Aujourd'hui il n'y plus du tout besoin de carte son pour ça. Vous avez même des casques qui se branchent en USB, et donc s'identifient comme une carte son. Et ça marche avec tous les effets que vous voulez sans perte de performances, parce que les processeurs modernes sont des brutes.
Pendant la préhistoire, IBM (qui sont les inventeurs du PéCé, je rappelle au cas où) a créé un standard permettant de communiquer avec un circuit imprimé de type registre-compteur que l'on peut utiliser pour générer des ondes carrées.
Je précise pour les gens aussi bizarres que moi qui se posent la question: une onde carrée avec une belle arête qui passe de 0 à X volts en 0 secondes, ça n'existe pas vraiment dans le monde réel. On peut tout de même admettre que, vu d'un peu plus loin, on arrive facilement à produire des ondes presques-carrées au point qu'on peut dire qu'elles sont carrées moi je trouve.
Ce signal peut ensuite être plus ou moins amplifié, ou pas, et simplement balancé dans un petit haut parleur, et BOOM ça fait du son. Moche.
Par exemple si je demande au registre de créer une onde carrée de fréquence 440hz, le haut parleur va jouer un "La". Ben ouais.
C'est beaucoup plus simple à gérer pour un microprocesseur, il doit juste traiter un appel système pour jouer un son de telle fréquence pendant telle durée, les deux codés sur un nombre très limité de bytes, et voilà, on a du son. Sur une seule voix et toujours sous forme d'onde carré, c'est-à-dire avec un seul timbre possible.
Il n'y a pas non plus d'info de volume, l'onde carrée a toujours la même amplitude et est toujours amplifiée (ou pas) de la même manière.
Les consoles de jeu (et les anciens Atari) ne peuvent pas raisonnablement se contenter de si peu, et utilisent des générateurs de son plus complexes, souvent sur trois voix + un canal pour le "bruit" (les PFFRRRT, Brrrrrt, CSHCHHHHH, FruuuuuuuuuutPSCHHHHHHH, TrsHHHhhhhFrCkkkkkk) et leur générateur d'onde peut être en dent de scie ou autre, ce qui produit un son un peu plus agréable à entendre.
Pour ce qui est du PéCé, c'est un truc pour bosser donc on se contente du mono-canal d'ondes carrées du pauvre.
Ce protocole qu'offre les systèmes d'exploitation pour parler au haut parleur PC a tout de même été utilisé par de nombreux jeux pour sortir un son... Minimaliste (et moche).
Normalement ça sert à générer des alertes, par exemple pour autoriser un diagnostic d'erreur sans avoir besoin d'écran.
Ce haut parleur est soit quelque part sur la carte mère, soit est connecté à la carte mère par un fil et est collé à un endroit improbable dans la tour, et ressemble à ceci:
Autant vous dire que sur les machines récentes (surtout les tours) c'est très rare qu'il y ait encore un bidule comme ça. Ceci dit, certaines cartes mères modernes proposent toujours le connecteur et possèdent la circuiterie pour utiliser ce haut parleur PC.
Sur certains vieux ordis qui ont la classe, c'était même un véritable petit haut parleur plutôt que le truc sale que j'ai montré plus haut.
Mon ordi fait des gros beeps intempestifs
Mon voyage a commencé avec mon ordi portable de travail qui tourne sous Linux parce que je suis un trop pauvre pour avoir un Mac.
L'avantage c'est qu'on a un vrai clavier et pas un truc chelou sorti des caprices de Steve Jobs (lol qui va avoir besoin d'une touche "["??) mais par contre on se tape tous les trucs un peu bizarres de Linux qui apparaissent parfois au détour d'une mise à jour.
Une de ces étrangetés prise totalement au hasard, c'est que mon ordi décide parfois d'émettre un gros BEEP bien gras quand je l'éteint ou redémarre, ce qui surprend tout le monde dans la pièce y compris le chat.
Pas cool quand t'essayes de passer inaperçu quelque part ou que tu dois t'expliquer devant tout le monde à la fin d'une réunion de travail ou ton ordi vient de crier à l'aide très fort.
Je suis pas le premier a avoir eu des soucis similaires, quelque soit la distribution utilisée.
C'est assez simple à empêcher complètement, le son du haut parleur PC passe par un module noyau sur les Linux modernes et il suffit de blacklister ce module.
La page Wiki pour Arch l'explique super bien et donne d'autres pistes et alternatives si besoin. Au début j'allais écrire une brève sur ça. Et finalement non.
Moi ce qui m'intéresse c'est comment on utilise ce "PC speaker", est-ce qu'il sort vraiment d'un bidule sur la carte mère (ça a l'air parce que ça fonctionne si le volume est à 0)? Qu'est-ce qu'on peut faire avec ce truc?
Essayer de produire un BEEP
C'est pas si simple. En tous cas pas pour mon ordi portable. En fait j'ai découvert que c'était immensément plus simple sur une vieille tour abandonnée avec une Debian dessus (mê.
Il fût un temps où il était possible de produire des beeps avec un caractère spécial du terminal. Par exemple, cette commande devrait sonner une notification:
printf "\a"
Sauf que je ne trouve aucun système où ça fonctionne, que ça soit un son d'un haut parleur PC ou un son venant d'un émulateur de terminal ou autre. Il faut dire que je désacive systématiquement les CLOCHEs de terminal, quand ce n'est pas déjà fait de base.
Reste plus qu'à essayer de parler directement au haut parleur PC. Mais je sais pas comment.
Il semblerait que ça passe par un module noyau appelé pcspkr. S'il est chargé chez vous, vous devriez le voir apparaître après cette commande:
lsmod | grep pcspkr
C'est pas tout d'avoir le module présent, il faut encore réussir à parler au haut parleur PC. Je pense qu'initialement, un fichier spécial du type /dev/pcspkr était impliqué, mais plus sur les noyaux modernes.
Quoi qu'il en soit, quelqu'un s'est donné la peine d'écrire un petit programme en C affectueusement surnommé beep qui va nous permettre de balancer des sons au haut parleur PC en choisissant automatiquement la méthode idoine.
Vous trouverez facilement ce programme dans votre gestionnaire de paquets.
Il est possible de lui spécifier la fréquence et la longueur (en millisecondes) du son à jouer. Juste entrer "beep" devrait produire un son court (un La à 440hz) dont le volume peut éventuellement surprendre.
Sur la vieille tour susnommée, c'est tranquille et paisible. Sur mon ordi portable, ça perce le temps et l'espace à une telle amplitude que je pense sentir l'endroit où est le haut parleur chauffer.
Comme expliqué précédemment dans l'intro que personne n'a lu, il n'est pas possible de choisir le volume du haut parleur PC.
Alors, je sais pas si ça fonctionne d'emblée chez vous mais chez moi il se passe générallement rien du tout, pas d'erreur, mais pas de son.
Heureusement, beep a un mode "debug" que vous activez ainsi:
beep --verbose
Je vois qu'il essaye plusieurs possibilités successives avant de s'arrêter sur une erreur de permission relative à:
/dev/input/by-path/platform-pcspkr-event-spkr
Ce fichier faisant partie d'une API événementielle du noyau pour euh... Générer des événements. Qui font des trucs. Si on en crois ce Gist (censé fonctionner comme beep mais en Python), ça a l'air assez simple à utiliser.
Les fichiers qui sont dans le répertoire by-path sont en fait des liens:
wilbur@rollator:/dev/input/by-path$ ls -lh
total 0
lrwxrwxrwx 1 root root 9 Aug 31 20:52 pci-0000:00:04.0-event-mouse -> ../event6
lrwxrwxrwx 1 root root 6 Aug 31 20:52 pci-0000:00:04.0-mouse -> ../js0
lrwxrwxrwx 1 root root 9 Aug 31 20:52 pci-0000:00:06.0-usb-0:1:1.0-event-mouse -> ../event7
lrwxrwxrwx 1 root root 6 Aug 31 20:52 pci-0000:00:06.0-usb-0:1:1.0-mouse -> ../js1
lrwxrwxrwx 1 root root 9 Aug 31 20:52 platform-i8042-serio-0-event-kbd -> ../event0
lrwxrwxrwx 1 root root 9 Aug 31 20:52 platform-i8042-serio-1-event-mouse -> ../event1
lrwxrwxrwx 1 root root 9 Aug 31 20:52 platform-i8042-serio-1-mouse -> ../mouse0
lrwxrwxrwx 1 root root 9 Aug 31 20:52 platform-pcspkr-event-spkr -> ../event2
Et si on jette un oeil au niveau précédent, ces fichiers ne sont inscriptibles (écritables? Editables? Ecrivables?) que par root et le groupe input:
crw-rw---- 1 root input 13, 66 Aug 31 20:52 event2
Ce qui m'amène à penser que peut-être si je deviens root je pourrai faire des gros beeps?
He ben non:
~$ sudo beep
[sudo] password for wilbur:
beep: Error: Running under sudo, which is not supported for security reasons.
beep: Error: Set up permissions for the pcspkr evdev device file instead.
Pourquoi c'est un problème de sécurité de vouloir beeper avec sudo? He ben J'EN SAIS RIEN mais si vous avez une idée, ça m'intéresse. Merci de laisser votre trace bien visible dans les commentaires ci-dessous.
C'est d'autant plus bizarre que beep passe si je me connecte en tant que root sans passer par sudo. Mystère et boule de Berlin.
Le mieux serait peut-être d'ajouter mon utilisateur à ce mystérieux groupe input:
sudo usermod -a -G input <VOTRE_NOM_D_UTILISATEUR>
Avant de tester il faut relancer toute ma session ou redémarrer l'ordi parce qu'il n'y a toujours pas moyen de recharger les groupes d'un utilisateur sans se mettre en poirier sur un poirier.
Et puis après, ça marche toujours pas. Je ne vois plus aucune erreur, chouette. J'ai pas de beep boop buzz non plus.
Tout à coup, PPPPPPPFFFFFFFFFR éclair de lucidité! Chaque fois que mon ordi beep quand je l'éteins, il est sur batterie. Peut-être que les beeps sont mystérieusement activés quand l'alimentation est retirée? J'entends bien que ça n'a absolument aucun sens mais après plusieurs années d'utilisation quotidienne de Linux je dois dire que, vraiment, ça m'étonnerais pas du tout du moins du monde.
Et... Ben ouais. C'est ça. Avec le petit bonus que si je rebranche il veut bien produire encore quelques sons puis c'est terminé. Je sais pas pourquoi et je veux pas (plus?) vraiment savoir parce que, comme d'hab, cet article est beaucoup trop long et était censé être une brève mais y a rien de bref dans ma vie, comme mon chat (il est très long c'est pour ça, j'explique).
Comme vous pouvez l'entendre, le beep de mon ordi portable est particulièrement sûr de lui. Possiblement un tantinet de trop.
A quoi ça sert?
De nos jours? Pas à grand chose. C'est surtout pour signaler des erreurs au démarrage par exemple. Le haut parleur PC a peu d'intérêt une fois dans un système d'exploitation moderne.
Il fait même plutôt franchement peur.
Pour un jeu, ça n'a clairement plus d'intérêt à moins de vouloir revivre une pure expérience nostalgique. Et même pour ça, DOSBOX (émulateur MSDOS) est capable d'émuler le haut parleur PC. Générer des ondes carrées pour les envoyer sur une sortie son sous Windows ou Linux n'a rien de très savant et donne l'avantage de pouvoir modifier le volume ou facilement la mettre en veilleuse.
Pour une blague? J'avoue que le potentiel de rigolo est assez intéressant, par exemple de jouer la lambada chaque fois que quelqu'un se connecte sur une machine en physique (via .bashrc ou profile, ou autre) ça pourrait être bien.
Ou jouer une sirène bien aigue et désagréable (si le haut parleur PC est puissant) et utiliser une vieille tour comme alarme foireuse avec un capteur webcam des années 80.
J'AI BEAUCOUP TROP D'IDEES.
Pour revenir sur l'aspect nostalgie tant que je vous ai toujours sous les yeux, j'ai passé un certain nombre d'heure à jouer avec l'interpréteur BASIC de MSDOS/Windows 3.11: QBASIC.
J'en parlais même dans un vieil article sur les vieux trucs de ma vie de vieux.
Les interpréteurs BASIC des vieilles consoles avaient juste une instruction SOUND qui pouvait être plus ou moins complexe selon la technologie de génération de son sur le système avec tout de même le point commun qu'il est toujours nécessaire de spécifier une fréquence et une durée, comme pour utiliser le haut parleur PC.
QBASIC, lui, fournit une instruction PLAY (en plus de SOUND) qui permet d'écrire une chaîne de caractères représentant des notes de musiques avec des durées un peu plus compréhensives.
Par exemple:
PLAY "C C C D E P1 D P1 C E D D C"
C'est frère Jacques (je crois), P1 est un silence du nombre de note indiqué par le chiffre qui suit. Il y a évidemment d'autres symboles pour changer d'octave, de longueur de notes et de durée de pause entre les notes.
Attends une minute... Je peux installer QBASIC sous Linux
Mais oui! Je viens de parler de DOSBOX, cet émulateur permet aussi de lancer autre chose que des jeux. J'ai même entendu dire qu'on pouvait y installer Windows 3.11 à condition de tripoter un peu la config. Sauf que ça m'intéresse pas moi je veux juste faire des bruits de robot.
Dosbox devrait être dans le gestionnaire de paquets de votre distribution et QBASIC.exe peut être trouvé quelque part sur cette mangnifique page et ce magnifique domaine: https://www.qbasic.net/en/top-ten-downloads
Je vois qu'il y a des vrais fans dont le sens du design sent encore plus la vieille grotte que le mien. Fantastique.
Reste plus qu'à lancer Dosbox, se rendre compte que tout est en QWERTY et que j'avais oublié que le premier truc à faire c'est de trouver comment on change le clavier.
Normalement Dosbox vous a créé un répertoire de config pour votre utilisateur dans ~/.dosbox. Si vous regardez là dedans il devrait y avoir un fichier .conf. Il suffit de modifier la ligne "Keyboardlayout":
Keyboardlayout=be
Oui j'utilise la rare et extrêmement utile disposition de clavier Belge, zallez faire quoi maintenant hein?
Reste plus qu'à monter l'endroit où vous avez casé QBASIC.exe avec la commande "MOUNT". Par ex:
mount x: ~/Opt/dosbox
Puis rendez-vous dedans en tapant "X:", et enfin "qbasic" pour lancer... Ben QBASIC certes diantre!
Vous devriez avoir l'émulation de la souris, mais sinon c'est Alt+première lettre des menus pour les ouvrir, Shift+F5 pour lancer le programme. Rhaaa ce truc c'est juste mieux que Visual Studio! Ce bleu... Ce curseur... Ces ombres de menu...
Si vous paniquez parce que votre souris ne sort plus et que vous êtes en train de vous résigner à juste utiliser DOS pour toujours, Ctrl+F10 devrait libérer la souris.
Pour avoir la véritable expérience le mieux est de passer en plein écran avec Ctrl+Enter, ou en passant un petit fullscreen=true dans le fichier de config, on le regrette pas.

Si vous essayez les instructions SOUND et PLAY, vous pourrez expérimenter l'émulateur de haut parleur PC dont je parlais plus haut. Chez moi ça manque clairement de charme, mais ça n'explose pas les oreilles et n'entraine pas une panique soudaine chez mes chats, ce qui m'incite à penser qu'on y gagne.
Scripter du beep par la puissance du shell
La ligne de commande Linux, vous avez dû en entendre parler et avoir imaginé ce truc de sorcier barbu mystérieux.
Bon il y a quelques barbus derrière un bon nombre des programmes impliqués. Cela dit, le
C'est aussi valable pour les Mac d'ailleurs, Mac et Linux sont frère et soeur c'est juste qu'il y en a une qui est belle et mince et l'autre vient de se chier dessus en essayant de mettre sa montre à l'heure. Par contre il est moins cher et peut être installé sur pratiquement n'importe quelle machine. Oui j'ai abandonné mon analogie foireuse en plein milieu, comme ça.
Ce que j'essaye d'expliquer, c'est que maintenant que beep est installé et fonctionne, rien ne vous empêche de le mettre dans des scripts. Avec des boucles. Infinies. Par exemple remplacer une commande super utilisée par la même commande mais qui joue BABY SHARK en boucle après. Genre remplacer "ls" par ça:
#!/bin/bash
ls "$@"
while true; do
beep -f 100
done
Enfin, je dis ça, les possibilités sont INFINIES, vous pouvez créer des alias de commandes, lancer plusieurs programmes de beep en arrière plan en même temps pour un réel chaos, ...
Je suis même tombé sur des gens qui ce sont dit que ce serait marrant de compiler une série de scripts qui fait de la musique de beeps.
Je dois vous avouer que je me suis aussi dit que ce serait marrant avant de voir que d'autres gens avaient l'air de trouver ça marrant. Internet c'est très rassurant sur l'idée que vous êtes jamais seul, même si votre trip est vraiment très, très étrange. Je sais pas si c'est une bonne chose mais on s'égare.
Je me suis lancé dans l'écriture de ma cover beeps de Despacito, avec des FONCTIONS et tout, par ex:
verse1() {
beep -f $B4 -l 700 -n -f $FS4 -l 200 -n \
-f $B4 -l 200 -n -f $CS5 -l 200 -n \
-f $D5 -l 200 -n -f $E5 -l 200 -n \
-f $D5 -l 200 -n -f $CS5 -l 300 -n \
-f $B4 -l 200 -n -f $A4 -l 200 -n \
-f $G4 -l 400 -n -f $D5 -l 400 -n \
-f $D5 -l 600
sleep .5
beep -f $D5 -l 300 -n -f $A4 -l 200 -n \
-f $D5 -l 300 -n -f $A4 -l 200 -n \
-f $D5 -l 300 -n -f $A4 -l 200 -n \
-f $D5 -l 300 -n -f $E5 -l 200 -n \
-f $CS5 -l 600
}
J'utilises des variables pour la fréquence des notes parce que jamais je vais retenir que Do# c'est 554 hz. J'utilises sleep pour insérer des pauses. Je pense que beep peut le faire aussi mais j'ai pas tout compris et j'ai pas le temps (je vous jure, on dirait pas vu que cet article fait 18 pages mais j'ai vraiment pas le temps, là).
Comme je ne liste que les notes que j'utilise ça m'a permis de constater qu'on en utilise que 10 dans cette chanson ce qui témoigne de la richesse harmonique du morceau qui transpire le sable Porto-ricain. Puerto rican? Portoricard? Tout ça quoi.
Je m'étais aussi dit que ce serait marrant d'avoir un "Oh yeah" au synthétiseur de voix avant un des couplets comme dans la chanson sauf que ça désactive le haut parleur PC pour une raison qui doit exister quelque part. Genre l'ordi se rend compte qu'il est vraiment en train de beeper du Despacito SUPER FORT et souffre enfin des remors qu'il doit à l'univers.
Je le dis tout de suite, c'est pas parfait et c'est pas complet. Je n'ai pas d'autres moyen de tester que de BLAST ce gros son qui traverse probablement plusieurs murs et c'est pas super agréable pour moi non plus. C'est une bonne raison d'utiliser des fonctions d'ailleurs, je le dis pour les autres futurs DJ-beep.
D'ailleurs si quelqu'un veut finir le morceau, ajouter plus de pistes, accompagner au Ukulele... C'est votre vie et vos voisins. Le script est ici.
Je l'ai enregistré, interprêté par mon ordi portable:
Pour aller plus loin (lol)
Je n'ai aucune idée de si le haut parleur PC est utilisable depuis Windows pourtant ça toucherait beaucoup plus de monde.
Ce serait aussi marrant (ah oui on se marre) d'essayer de brancher un haut parleur sur une prise PC-speaker de carte mère moderne et tenter de l'utiliser. On peut aussi s'amuser à piloter un de ces haut parleurs PC avec un petit processeur de type Arduino ou quelque chose d'encore plus simple vu que ça ne manque pas de générateurs d'onde carrée en électronique (vous devriez pouvoir créer le votre avec un transistor et quelques composants passifs d'ailleurs).
Finalement: désactivez-le. Oui je vais le faire après avoir écrit tout cet article. C'est ça l'impermanence de l'univers.


Commentaires
Il faut JavaScript activé pour écrire des commentaires ici