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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 33 522 fois - Téléchargée 33 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 2
30 mars 2011 à 17:50
En même temps la source a 10 ans, cela ne me surprend pas trop ;)
simaxe25 Messages postés 13 Date d'inscription vendredi 7 janvier 2005 Statut Membre Dernière intervention 16 juillet 2008
19 janv. 2008 à 12:32
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
1 janv. 2007 à 20:26
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
28 mai 2004 à 13:17
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 ...
cs_666Ange Messages postés 19 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 2 mars 2009
28 nov. 2003 à 03:40
Cool

et avec directSound ? (dsl si j'en demande trop mais ca m'interesserait)

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.