J'ai créé l'autre jour un script bash totalement inutile(donc indispensable... ), qui permet de faire chanter "Petit Papa Noël" au haut-parleur interne du PC (voir le post original pour savoir le "pourquoi du comment"). Ce que je vous propose, c'est de chercher ensemble à créer des partitions de différentes musiques/chansons connues pour les faire chanter à votre PC.
EDIT : devant la demande d'une version qui marche sous Windows, (et les problèmes avec le script bash via cygwin) j'en ai fait un programme en C++ qui compile sous les 2 OS à la fois, sans rien avoir à modifier. La version C++ devrait etre plus réactive que la version bash
Le programme
Voici le programme, merci à jolo2 pour avoir testé la compilation et l'exécution sous Windows :
Faites glisser le .txt de la partition sur le .exe du programme
Dans une console, suivant votre OS :
Sous Windows : play.exe fichier_partition.txt
Sous Linux : ./play fichier_partition
Note importante
Sous Linux, vous devez avoir installé le programme "beep", par exemple sous Ubuntu : sudo apt-get install beep
Vous devez aussi vous assurer que le module "pcspkr" est bien activé (en principe il devrait l'être) : sudo modprobe -a pcspkr
Méthode alternative : le script
Voici le script, que j'ai personnellement appelé "play.sh", après correction de petits bugs (merci à Aniem pour sa contribution) :
#!/bin/bash
#####################################################################
# File : play.sh
#-------------------
#
# Author : Arnaud Calmettes
#
# Reads a music sheet (txt file) and plays it on the pc speaker
# This script requires the "beep" program
#
######################################################################
# Note/Frequency correspondances : NOTE[octave]=Freq
#
# NOTE_ stands for the "sharp" note
# _ alone stands for a silence
#
DO[0]=16.35
DO_[0]=17.32
RE[0]=18.35
RE_[0]=19.45
MI[0]=20.60
FA[0]=21.83
FA_[0]=23.12
SOL[0]=24.50
SOL_[0]=25.96
LA[0]=27.50
LA_[0]=29.14
SI[0]=30.87
DO[1]=32.70
DO_[1]=34.65
RE[1]=36.71
RE_[1]=38.89
MI[1]=41.2
FA[1]=43.65
FA_[1]=46.25
SOL[1]=49
SOL_[1]=51.91
LA[1]=55
LA_[1]=58.27
SI[1]=61.74
DO[2]=65.41
DO_[2]=69.30
RE[2]=73.42
RE_[2]=77.78
MI[2]=82.41
FA[2]=87.31
FA_[2]=92.5
SOL[2]=98
SOL_[2]=103.83
LA[2]=110
LA_[2]=116.54
SI[2]=123.47
DO[3]=130.81
DO_[3]=138.59
RE[3]=146.83
RE_[3]=155.56
MI[3]=164.81
FA[3]=174.61
FA_[3]=185
SOL[3]=196
SOL_[3]=207.65
LA[3]=220
LA_[3]=233.08
SI[3]=246.94
DO[4]=261.66
DO_[4]=277.18
RE[4]=293.664
RE_[4]=311.126
MI[4]=329.627
FA[4]=349.228
FA_[4]=369.994
SOL[4]=391.995
SOL_[4]=415.304
LA[4]=440
LA_[4]=466.163
SI[4]=493.883
DO[5]=523.25
DO_[5]=554.37
RE[5]=587.329
RE_[5]=622.253
MI[5]=659.255
FA[5]=698.456
FA_[5]=739.988
SOL[5]=783.991
SOL_[5]=830.609
LA[5]=880
LA_[5]=932.327
SI[5]=987.766
DO[6]=1046.50
DO_[6]=1108.73
RE[6]=1174.059
RE_[6]=1244.507
MI[6]=1318.510
FA[6]=1396.912
FA_[6]=1479.976
SOL[6]=1567.982
SOL_[6]=1661.218
LA[6]=1760
LA_[6]=1864.654
SI[6]=1975.532
DO[7]=2093
DO_[7]=2217.46
RE[7]=2344.318
RE_[7]=2489.014
MI[7]=2637.02
FA[7]=2793.824
FA_[7]=2959.952
SOL[7]=3135.964
SOL_[7]=3322.436
LA[7]=3520
LA_[7]=3729.308
SI[7]=3951.064
DO[8]=4186.01
DO_[8]=4434.92
RE[8]=4698.636
RE_[8]=4978.028
MI[8]=5274.04
FA[8]=5587.648
FA_[8]=5919.904
SOL[8]=6270.928
SOL_[8]=6644.972
LA[8]=7040
LA_[8]=7458.616
SI[8]=7902.128
# End of note declarations
#####################################################################
SILENCE=${DO[0]}
TEMPO=250
DURATION=$TEMPO
CURRENT_OCTAVE=0
# Play a note, given its name, octave and length
play()
{
if [ -z "$1" ]
then
return
fi
if [ "$1" = "TEMPO" ]
then
TEMPO=$2
DURATION=$TEMPO
return
fi
if [ -n "$2" ]
then
CURRENT_OCTAVE=$2
fi
if [ -n "$3" ]
then
let "DURATION = $TEMPO * $3"
fi
if [ "$1" = "_" ]
then
freq=$SILENCE
else
note=`eval "expr \$\{\"$1\"\[\"$CURRENT_OCTAVE\"\]\}"`
freq=`eval "expr \"$note\""`
fi
beep -f $freq -l $DURATION
}
# Read the music sheet
readfile()
{
while read LINE
do
play `echo $LINE | awk '{ print $1; print $2; print $3}'`
done
}
main()
{
if [ -f "$1" ]
then
cat $1 | readfile
else
echo "Usage : $0 FILENAME"
fi
exit 0
}
main $*
Pour le faire fonctionner...
Sous Linux
Installez le programme "beep", s'il n'est pas déjà présent sur votre machine.
Par exemple, sous Ubuntu :
sudo apt-get install beep
Enregistrez le script dans un fichier "play.sh" et rendez-le exécutable :
chmod +x play.sh
Pour le lancer il suffit de lui spécifier un fichier de partition :
./play.sh fichierpartition
Sous Windows
Merci à jolo2.
Pour faire tourner le script sous windows, installez Cygwin.
Copiez l'exécutable "beep.exe" dans le dossier C:\cygwin\bin
Vous pouvez le trouver à cette adresse : http://www.frank-buss.de/beep/beep.exe
Remplacez dans la ligne 179 du script par :
beep $freq $DURATION
(il suffit de retirer le "-f" et le "-l").
Les reste fonctionne pareil.
Créer une partition
Pour créer une partition c'est très simple : 1 note par ligne.
La partition peut commencer par exemple par "TEMPO 250" pour fixer l'unité de temps à 250 millisecondes.
Une note est désignée par son nom en majuscules, suivie de son numéro d'octave, et sa durée relative :
Par exemple :
DO 5 2
Jouera le DO de la 5ème octave pendant 2 unités de temps (avec l'exemple TEMPO = 250, ça sera pendant 500 millisecondes).
Pour la durée de la note, vous pouvez aussi donner une fraction : 1/2, 3/4, 5/9...
Un silence est symbolisé par un underscore "_" : sa syntaxe est la même que pour une note.
Pour ajouter un dièse à une note, ajoutez un _ à son nom :
EXEMPLE :
TEMPO 300
DO 5 2
_ 5 1
DO_ 5 1/2
Ceci joue un DO 5 pendant 600ms, puis attend 300ms avant de jouer un DO 5 dièse pendant 150 ms.
Si vous ne spécifiez pas la durée d'une note (ou d'un silence), celle-ci durera le même temps que la précédente.
Pareil pour l'octave.
ATTENTION : si vous voulez changer la durée, vous êtes obligés de préciser aussi l'octave.
Voici une petite collection de partitions qui ont déjà été créées :
Chants de Noël
Petit papa noël :
TEMPO 125
DO 5 4
FA
FA
FA
SOL
FA 5 8
_ 5 4
FA 5 3
SOL 5 1
LA 5 4
LA
LA
LA_
LA 5 8
_ 5 4
SOL 5
FA 5
_ 5 2
FA 5
FA
FA
MI
RE
DO 5 8
_ 5 4
DO 5 2
DO
FA 5 4
_ 5
FA 5 2
FA
MI
FA
SOL 5 8
_ 5 4
DO 5 4
FA
FA
FA
SOL
FA 5 8
_ 5 4
FA 5 3
SOL 5 1
LA 5 4
LA
LA
LA_
LA 5 8
_ 5 4
SOL 5
FA 5
_ 5 2
FA 5
FA
FA
MI
RE
DO 5 8
_ 5 4
DO 5 2
DO
FA 5 4
_ 5
FA 5 2
FA
SOL
SOL
FA 5 6
Vive le vent (Jingle Bells)
TEMPO 225
MI 6
MI
MI 6 2
MI 6 1
MI
MI 6 2
MI 6 1
SOL 6
DO 6 5/3
RE 6 1/3
MI 6 3
_ 6 1
FA
FA
FA 6 5/3
FA 6 1/3
FA 6 1
MI 6
MI 6
MI 6
MI 6
RE 6
RE 6
MI 6
RE 6 2
SOL 6 1
_
MI
MI
MI 6 2
MI 6 1
MI
MI 6 2
MI 6 1
SOL
DO 6 5/3
RE 6 1/3
MI 6 3
_ 6 1
FA
FA
FA 6 5/3
FA 6 1/3
FA 6 1
MI
MI
MI
SOL
SOL
FA
RE
DO 6 3
_ 6 1
SOL 5
MI 6
RE
DO
SOL 5 3
_ 5 1
SOL
MI 6
RE
DO
LA 5 3
_ 6 1
LA 5
FA 6
MI
RE
SOL 6 2
SOL
LA 6 1
LA
SOL
FA
MI 6 3
_ 6 1
SOL 5
MI 6
RE
DO
SOL 5 3
_ 6 1
SOL 5
MI 6
RE
DO
LA 5 3
_ 6 1
LA 5
FA 6
MI
RE
SOL 6 2
SOL
LA 6 1
SOL
FA
RE
DO 6 3
Mon beau sapin
TEMPO 500
SOL 5 1
DO 6 2/3
DO 6 1/3
DO 6 2
RE 6 1
MI 6 2/3
MI 6 1/3
MI 6 3/2
MI 6 1/2
RE
MI
FA 6 1
SI 5
RE 6
DO 6 2
_ 6 1/2
SOL
SOL 6 2/3
MI 6 1/3
LA 6 3/2
SOL 6 1/2
SOL 6 2/3
FA 6 1/3
FA 6 3/2
FA 6 1/2
FA 6 2/3
RE 6 1/3
SOL 6 3/2
FA 6 1/2
FA 6 2/3
MI 6 1/3
MI 6 1
_ 6 1/2
SOL 5 1
DO 6 2/3
DO 6 1/3
DO 6 2
RE 6 1
MI 6 2/3
MI 6 1/3
MI 6 3/2
MI 6 1/2
RE
MI
FA 6 1
SI 5
RE 6
DO 6 2
Tetris
Merci à Hannibal !
TEMPO 200
MI 6
_
SI 5
DO 6
RE 6
_
DO 6
SI 5
LA 5
_
LA 5
DO 6
MI 6
_
RE 6
DO 6
SI 5
_
SI 5
DO 6
RE 6
_
MI 6
_
DO 6
_
LA 5
_
LA 5
_
_
_
LA 5
_
RE 6
FA 6
LA 6
_
SOL 6
FA 6
MI 6
_
_
DO 6
MI 6
_
RE 6
DO 6
SI 5
_
SI 5
DO 6
RE 6
_
MI 6
_
DO 6
_
LA 5
_
LA 5
Zelda
Thème principal :
TEMPO 200
DO 5 5/2
SOL 4 3
_ 5 1/2
DO
_
DO
RE
MI
FA
SOL 5 5
_ 5 1/2
SOL 5 1
SOL 5 3/4
SOL_ 5
LA_
DO 6 5
_ 5 1/2
DO 6 1
DO 6 3/4
LA_ 5
SOL_
LA_
_
SOL_
SOL 5 5
SOL 5 2
FA 5 1/2
_
FA
SOL
SOL_ 5 7/2
_ 5 1
SOL 5 1
FA
RE_ 5 1/2
_
RE_
FA
SOL 5 7/2
_ 5 1
FA 5 1
RE_
RE 5 1/2
_
RE
RE_
FA 5 7/2
FA 5 1/2
SOL
SOL_ 5 1
LA_
SOL
SOL 4 1/2
SOL
SOL
_
SOL
SOL
SOL
_
SOL
SOL
SOL 4 1
SOL
DO 5 5/2
SOL 4 3
_ 5 1/2
DO
_
DO
RE
MI
FA
SOL 5 5
_ 5 1/2
SOL 5 1
SOL 5 3/4
SOL_ 5
LA_
DO 6 11/2
_ 6 1/2
RE_ 6 5/2
RE 6
SI 5 5
SOL 5 5/2
SOL_ 5 11/2
_ 6 3/2
DO 6 5/2
SI 5
SOL 5 5
SOL 5 5/2
SOL_ 5 11/2
_ 6 3/2
DO 6 5/2
SI 5
SOL 5 5
MI 5 5/2
FA 5 11/2
_ 5 3/2
SOL_ 5 5/2
SOL
RE_ 5 5
DO 5 5/2
RE 5 11/2
_ 5 3/2
FA 5 5/2
SOL 5 11/2
_ 5 1/2
SOL 4 1/2
SOL
SOL 4 1
SOL
DO 5 1
Super Mario Bros
Thème original avec bruitages (repris depuis la version de Hannibal, merci à lui !)
TEMPO 135
MI 5 1
MI 5
_
MI 5
_
DO 5
MI 5
_
SOL 5
_
_
_
SOL 4
_
_
SOL_ 3 1/3
SOL_ 4
LA 3
LA 4
LA_ 3
LA_ 4
SI 3
SI 4
_ 5 1
_
MI 5 1/3
SOL
DO 6
FA_ 5
LA
RE 6
SOL_ 5
SI
MI 6
_ 5 1
_
DO 5 1
_
_
SOL 4
_
_
MI 4
_
_
LA 4
_
SI 4
_
LA_ 4
LA 4
_
SOL 4 4/3
MI 5
SOL 5
LA 5 1
_
FA 5
SOL 5
_
MI 5
_
DO 5
RE 5
SI 4
_
_
DO 5
_
_
SOL 4
_
_
MI 4
_
_
LA 4
_
SI 4
_
LA_ 4
LA 4
_
SOL 4 4/3
MI 5
SOL 5
LA 5 1
_
FA 5
SOL 5
_
MI 5
_
DO 5
RE 5
SI 4
_
_
_
SOL 5
FA_ 5
FA 5
RE_ 5
_
MI 5
_
SOL_ 4
LA 4
DO 5
_
LA 4
DO 5
RE 5
_
_
SOL 5
FA_ 5
FA 5
RE
RE_ 5
MI 5
_
DO 6
_
DO 6
DO 6
_
SI 6 1/2
SI
MI 7 3/2
_ 7 1/2
SI 6 1/2
MI 7 3/2
_ 7 1
SOL 5
FA_ 5
FA 5
RE_ 5
_
MI 5
_
SOL_ 4
LA 4
DO 5
_
LA 4
DO 5
RE 5
_
_
RE_ 5
_
_
RE 5
_
_
DO 5
_
_
_
_
_
_
DO
DO
_
DO
_
DO
RE
_
MI
DO
_
LA 4
SOL
_
_
_
DO 5
DO
_
DO
_
DO
RE
MI
SOL 6 1/2
DO 7
MI
RE
MI
SOL 7 1
_ 5 1
_
_
DO
DO
_
DO
_
DO
RE
_
MI
DO
_
LA 4
SOL
_
_
_
MI 5
MI 5
_
MI 5
_
DO 5
MI 5
_
SOL 5
_
_
_
SOL 4
_
_
_
MI 5
DO 5
_
SOL 4
_
_
SOL_
_
LA
FA 5
_
FA 5
LA 4
_
_
_
SI 4 4/3
LA 5
LA 5
LA
SOL
FA 5 1
MI 5 1
DO 5 1
_
LA 4
SOL
_
_
_
MI 5
DO 5
_
SOL 4
_
_
SOL_
_
LA
FA 5
_
FA 5
LA 4
_
_
_
SI 4 4/3
FA 5
FA
FA
MI
RE
DO
_
Le jingle de fin de niveau
TEMPO 275
DO 4 1/3
MI
SOL
DO 5
MI
SOL
DO 6 1
SOL 5
DO_ 4 1/3
FA
SOL_
DO_ 5
FA
SOL_
DO_ 6 1
SOL_ 5
RE_ 4 1/3
SOL
LA_
RE_ 5
SOL
LA_
RE_ 6 2/3
_ 6 1/3
RE_ 6 1/3
RE_
RE_
FA 6 2
La petite valse des niveaux aquatiques de Mario Bros 3 :
TEMPO 300
SOL 4 1
LA
SI
DO 5
RE
RE_
MI 5 1/2
MI
MI 5 1
MI
MI 5 2
_ 5 1
SOL 4 1/3
MI 5 3
RE_ 5 3
MI 5 3
_ 5 1
SOL 4 1/3
LA
SI
DO 5
RE
RE_
MI 5 3
RE_ 5 2
FA 5 1
MI 5 3
_ 5 2
_ 5 2/3
SOL 4 1/3
RE 5 3
DO_
RE
_ 5 2
SOL 4 1
RE 5 3
SOL 4 2
FA 5 1
MI 5 3
_ 5 2
_ 5 2/3
SOL 4 1/3
SOL 5 3
SOL
SOL
SOL 5 1
LA
_ 5 2/3
SOL 5 1/3
FA 5 3
FA
FA
FA 5 1
SOL
_ 5 2/3
FA 5 1/3
MI 5 3
SI 4 1
DO 5
FA
MI 5 1/3
MI
MI 5 1
SI 4 1
DO 5 3
au fait sur linux c'est rapide ou lent les musiques ? car moi c'est assez lent sous windows (surement a cause du logiciel supplementaire qu'il faut installer )
sa fait
tu.....................ti.............tu..................tu............................tu...........................tu
les points c'est les moment où y'as rien
Ça dépend des machines et de ce que tu exécutes en même temps je pense : bash n'est pas un langage réputé pour être ultra-rapide non plus
Perso, je n'ai eu aucun soucis sous toutes les machines que j'ai testé sous Linux.
Si quelqun se sent d'attaque pour créer une version en C ou C++ qui soit portable... il est le bienvenu !
EDIT : J'ai trouvé comment faire, je créerai le programme ce soir, j'aurai juste besoin de quelqun qui code sous Windows pour tester la compilation/l'exécution sous Win
Merci de m'adresser un MP si vous êtes volontaires.
Tiens encore une remarque : il faut rajouter une ligne a la fin du fichier de partition, sinon la derniere ligne de la partoche n'est pas jouée.
(peut-etre faut-il déplacer le premier bloc if de play() à la fin de la fonction, j'en suis pas sur et j'ai pas le temps de tester pour le moment)
Je testerai ce week-end, tiens. Faut déjà que je retrouve mon speaker.
( Il est externe a la carte mère, et je l'ai enlevé, parce que les erreurs windows, c'est strident).
'tin, c'est pas beep.exe qu'l faut modifier mais le script play.sh que vous recopiez en modifiant la ligne
Beep.exe vous avez juste à le caler dans C:\cygwin\bin
Quoi qu'il en soit je suis en train de finaliser une version en C++ qui compile sous Windows et Linux sans avoir à faire de modif'... encore quelques minutes de patience
Je viens d'éditer et de poster la version C++, normalement tout le monde devrait maintenant s'en sortir !
Merci de bien vouloir me signaler tout problème éventuel à la compilation ou à l'exécution en précisant ce qui se passe : j'ai codé assez rapidement, je n'ai aucune erreur chez moi, jolo2 non plus sous Windows, mais il vaut mieux prévenir que guérir .
Ouais mais j'ai pas de compilateur sous la main.
Merci jolo2.
Édit : Ça marche, faire glisser le .txt de la partition sur le .exe, et c'est parti.
Par contre je testerais en détails demain, ça fait un peu de bruit. Les sons semblent pas être ralentis chez moi.
Par contre, c'est quoi une Octave et une Durée ?
Et un Tempo ?
Ça me dit pas ce que c'est.
J'ai essayé un truc de mon cahier de musique mais c'est pas terrible, ça fait une musique qu'on dirait sortie de Animal Crossing.
J'avais une suggestion pour améliorer ce qui vient d'être fait, c'est de créer un petit logiciel qui permettrait de taper ou importer des partitions, et par exemple en cliquant sur un bouton Play, le système se met en marche. Je ne peux pas le faire car je ne connais pas de langage de prog logiciel, mais je pense que ça ne doit pas être très difficile.
J'avais une suggestion pour améliorer ce qui vient d'être fait, c'est de créer un petit logiciel qui permettrait de taper ou importer des partitions, et par exemple en cliquant sur un bouton Play, le système se met en marche. Je ne peux pas le faire car je ne connais pas de langage de prog logiciel, mais je pense que ça ne doit pas être très difficile.
L'exécutable ne fonctionne pas sous Vista
Non là désolé mais c'est trop demander pour un bête délire : déjà le temps perdu à expliquer à tout le monde comment ça fonctionne, si en plus faut faire une GUI qui compile de la même manière chez tout le monde, ça perd tout son sens !
Si l'exécutable ne fonctionne pas, alors essaye de compiler.
(dire que c'était parti d'un bête script shell un peu délirant sous linux , ce topic s'est barré en "ça marche pas chez moi", et personne n'a encore participé au sujet tel qu'il a été défini... )
J'avais une suggestion pour améliorer ce qui vient d'être fait, c'est de créer un petit logiciel qui permettrait de taper ou importer des partitions, et par exemple en cliquant sur un bouton Play, le système se met en marche. Je ne peux pas le faire car je ne connais pas de langage de prog logiciel, mais je pense que ça ne doit pas être très difficile.
L'exécutable ne fonctionne pas sous Vista
Non là désolé mais c'est trop demander pour un bête délire : déjà le temps perdu à expliquer à tout le monde comment ça fonctionne, si en plus faut faire une GUI qui compile de la même manière chez tout le monde, ça perd tout son sens !
Si l'exécutable ne fonctionne pas, alors essaye de compiler.
(dire que c'était parti d'un bête script shell un peu délirant sous linux , ce topic s'est barré en "ça marche pas chez moi", et personne n'a encore participé au sujet tel qu'il a été défini... )
Tu nous excusera si on fait pas de Shell.
Et puis maintenant qu'il y a l'exécutable, on va pouvoir essayer de bidouiller des trucs qui auront un semblant de musique.
Cadeau liveendirecttrodlaballe :
Au clair de la lune
TEMPO 300
SOL 4 1
SOL
SOL
LA
SI 4 2
LA
SOL 4 1
SI
LA
LA
SOL 4 2
SOL 4 1
SOL
SOL
LA
SI 4 2
LA
SOL 4 1
SI
LA
LA
SOL 4 2
_
LA 4 1
LA
LA
LA
MI 4 2
MI
LA 4 1
SOL
FA
MI
RE 4 3
SOL 4 1
SOL
SOL
LA
SI 4 2
LA
SOL 4 1
SI
LA
LA
SOL 4 4
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.