Beep c# (api win32) (do, re, mi, fa, sol, la ...)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 32 294 fois - Téléchargée 31 fois

Contenu du snippet

Une petite classe qui m'a aidé a découvrir les sons (gammes, fréquences, notes ...)

Elle est static et posséde une methode asynchrone (thread).

On peut surement mieux faire (je ne suis pas parvenu à jouer deux fréquences en simultanés pour créer des harmoniques, et ce malgrès mon threading. Maybe une limitation de la fonction Beep win32 ou une mauvaise gestion de mes threads).

Page web m'ayant aidées à réaliser la classe (culture G) :
http://courses.ece.uiuc.edu/ece291/books/labmanual/io-devices-speaker.html
http://villemin.gerard.free.fr/CultureG/MusNote.htm
http://chv.chez.tiscali.fr/jm/musique/

Page web exemple de thread (Technique):
http://www.codeproject.com/csharp/threader.asp

Les sources parlent d'elles mêmes je pense (nc).

Source / Exemple :


using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace SQLSharpe
{
	/// <summary>
	/// Class static player de speaker (parfois la carte son simule le buzzer)
	/// </summary>
	public class mySpeaker
	{
		[DllImport("kernel32.dll")]
		public static extern bool Beep( int freq, int dur );

		public readonly static double Do = 32;
		public readonly static double Re = 32* Math.Pow(1.0595,2);
		public readonly static double Mi = 32*Math.Pow(1.0595, 4);
		public readonly static double Fa = 32*Math.Pow(1.0595, 5);
		public readonly static double Sol = 32*Math.Pow(1.0595, 7);
		public readonly static double La = 32*Math.Pow(1.0595, 9);
		public readonly static double Si = 32*Math.Pow(1.0595, 11);

		public static void TestSpeaker()
		{
			for (double i=5;i>0;i--){
				Beep((int)(Do*Math.Pow(2,i)),300);
				Beep((int)(Re*Math.Pow(2,i)),300);
				Beep((int)(Mi*Math.Pow(2,i)),300);
				Beep((int)(Fa*Math.Pow(2,i)),300);
				Beep((int)(Sol*Math.Pow(2,i)),300);
				Beep((int)(La*Math.Pow(2,i)),300);
				Beep((int)(Si*Math.Pow(2,i)),300);
			}

		}

		public static void AsyncBeep(int Frequence, int Duree)
		{
			
			Thread p;
			Beeper b = new Beeper(Frequence,Duree);
			p = new Thread(new ThreadStart(b.Beeping));
			p.Start();
		}

		private class Beeper
		{
			public int Frequence;
			public int Duree;

			public void Beeping()
			{
				Beep(this.Frequence, this.Duree);
			}

			public Beeper(int Frequence, int Duree)
			{
				this.Frequence = Frequence;
				this.Duree = Duree;
			}
		}
	}
}

Conclusion :


mySpeaker.Beep(440, 1000); //Simple Beep synchrone (un LA d'une seconde)
mySpeaker.AsyncBeep(440,1000); //Beep Asynchrone
mySpeaker.Beep(mySpeaker.Do,500); //Beep (DO) synchrone d'une demi seconde
mySpeaker.TestSpeaker(); // Joue 5 Gamme de note (exemple de gamme !!)

A voir également

Ajouter un commentaire

Commentaires

cs_zappy
Messages postés
161
Date d'inscription
mardi 19 juin 2001
Statut
Membre
Dernière intervention
10 avril 2007

En même temps la source a 10 ans, cela ne me surprend pas trop ;)
aurelien3030
Messages postés
6
Date d'inscription
mardi 9 mars 2010
Statut
Membre
Dernière intervention
30 mars 2011

J'ai un gros problème :

Sa marche pas du tout.
simaxe25
Messages postés
13
Date d'inscription
vendredi 7 janvier 2005
Statut
Membre
Dernière intervention
16 juillet 2008

pour ce qui est de la fonction Beep() elle se trouve uniquement dans le namespace
on peut trouver la classe console.beep uniquement en mode Console dans le namespace :
System.Console

pour ce qui est de l'impossibilité de faire 2 fréquence en même temps, cela dépend peut être d'une limitation technique du buzzeur
cs_wols
Messages postés
1
Date d'inscription
lundi 20 juin 2005
Statut
Membre
Dernière intervention
1 janvier 2007

Bjr,

Est ce que tu pourras mettre le zip de ce projet, j'arrive pas à, le faire marché.

merci d'avance
cs_JuS
Messages postés
121
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
20 mars 2009
1
mySpeaker.Beep(mySpeaker.Do,500); ne fonstionne pas !
Il faut mettre mySpeaker.Beep((int)mySpeaker.Do,500); car il ne peut pas convertir les double en int ...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.