Reputation: 49
I had a little problem. I made a very simple alarm clock with beep method. I have to press a key to stop the beeps, and it works fine BUT the beeps stops at the end of loop (it takes like 10 sec). I'd like the beeps stop at the nanosecond I press the key, how to do that?
Here is my program:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace beep
{
class Program
{
static void Main(string[] args)
{
int année = 2019;
int mois = 09;
int jour;
int heure;
int minute;
int secondes = 00;
do
{
Console.WriteLine("taper le jour sous la forme jj");
jour = Convert.ToInt32(Console.ReadLine());
}
while (jour < 1 || jour > 31);
do
{
Console.WriteLine("taper l'heure sous la forme hh");
heure = Convert.ToInt32(Console.ReadLine());
}
while (heure > 23);
do
{
Console.WriteLine("taper les minutes sous la forme mm");
minute = Convert.ToInt32(Console.ReadLine());
}
while (minute >59);
var dnew = new DateTime(année, mois,jour,heure,minute,secondes);
TimeSpan intervall = dnew - DateTime.Now;
System.Threading.Thread.Sleep(intervall);
Console.WriteLine();
Console.WriteLine("REVEILLE TOI !!!!!!!!!!!!");
Console.WriteLine();
Console.WriteLine("appuyez sur une touche pour arrter l'alarme, sinon elle sonera pour l'éternitée");
do
{
Console.Beep(659, 125);
Console.Beep(659, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 167);
Console.Beep(523, 125);
Console.Beep(659, 125);
Console.Beep(32400, 125);
Console.Beep(784, 125);
Console.Beep(32400, 375);
Console.Beep(392, 125);
Console.Beep(32400, 375);
Console.Beep(523, 125);
Console.Beep(32400, 250);
Console.Beep(392, 125);
Console.Beep(32400, 250);
Console.Beep(330, 125);
Console.Beep(32400, 250);
Console.Beep(440, 125);
Console.Beep(32400, 125);
Console.Beep(494, 125);
Console.Beep(32400, 125);
Console.Beep(466, 125);
Console.Beep(32400, 42);
Console.Beep(440, 125);
Console.Beep(32400, 125);
Console.Beep(392, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 125);
Console.Beep(784, 125);
Console.Beep(32400, 125);
Console.Beep(880, 125);
Console.Beep(32400, 125);
Console.Beep(698, 125);
Console.Beep(784, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 125);
Console.Beep(523, 125);
Console.Beep(32400, 125);
Console.Beep(587, 125);
Console.Beep(494, 125);
Console.Beep(32400, 125);
Console.Beep(523, 125);
Console.Beep(32400, 250);
Console.Beep(392, 125);
Console.Beep(32400, 250);
Console.Beep(330, 125);
Console.Beep(32400, 250);
Console.Beep(440, 125);
Console.Beep(32400, 125);
Console.Beep(494, 125);
Console.Beep(32400, 125);
Console.Beep(466, 125);
Console.Beep(32400, 42);
Console.Beep(440, 125);
Console.Beep(32400, 125);
Console.Beep(392, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 125);
Console.Beep(784, 125);
Console.Beep(32400, 125);
Console.Beep(880, 125);
Console.Beep(32400, 125);
Console.Beep(698, 125);
Console.Beep(784, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 125);
Console.Beep(523, 125);
Console.Beep(32400, 125);
Console.Beep(587, 125);
Console.Beep(494, 125);
Console.Beep(32400, 375);
Console.Beep(784, 125);
Console.Beep(740, 125);
Console.Beep(698, 125);
Console.Beep(32400, 42);
Console.Beep(622, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 167);
Console.Beep(415, 125);
Console.Beep(440, 125);
Console.Beep(523, 125);
Console.Beep(32400, 125);
Console.Beep(440, 125);
Console.Beep(523, 125);
Console.Beep(587, 125);
Console.Beep(32400, 250);
Console.Beep(784, 125);
Console.Beep(740, 125);
Console.Beep(698, 125);
Console.Beep(32400, 42);
Console.Beep(622, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 167);
Console.Beep(698, 125);
Console.Beep(32400, 125);
Console.Beep(698, 125);
Console.Beep(698, 125);
Console.Beep(32400, 625);
Console.Beep(784, 125);
Console.Beep(740, 125);
Console.Beep(698, 125);
Console.Beep(32400, 42);
Console.Beep(622, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 167);
Console.Beep(415, 125);
Console.Beep(440, 125);
Console.Beep(523, 125);
Console.Beep(32400, 125);
Console.Beep(440, 125);
Console.Beep(523, 125);
Console.Beep(587, 125);
Console.Beep(32400, 250);
Console.Beep(622, 125);
Console.Beep(32400, 250);
Console.Beep(587, 125);
Console.Beep(32400, 250);
Console.Beep(523, 125);
Console.Beep(32400, 1125);
Console.Beep(784, 125);
Console.Beep(740, 125);
Console.Beep(698, 125);
Console.Beep(32400, 42);
Console.Beep(622, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 167);
Console.Beep(415, 125);
Console.Beep(440, 125);
Console.Beep(523, 125);
Console.Beep(32400, 125);
Console.Beep(440, 125);
Console.Beep(523, 125);
Console.Beep(587, 125);
Console.Beep(32400, 250);
Console.Beep(784, 125);
Console.Beep(740, 125);
Console.Beep(698, 125);
Console.Beep(32400, 42);
Console.Beep(622, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 167);
Console.Beep(698, 125);
Console.Beep(32400, 125);
Console.Beep(698, 125);
Console.Beep(698, 125);
Console.Beep(32400, 625);
Console.Beep(784, 125);
Console.Beep(740, 125);
Console.Beep(698, 125);
Console.Beep(32400, 42);
Console.Beep(622, 125);
Console.Beep(32400, 125);
Console.Beep(659, 125);
Console.Beep(32400, 167);
Console.Beep(415, 125);
Console.Beep(440, 125);
Console.Beep(523, 125);
Console.Beep(32400, 125);
Console.Beep(440, 125);
Console.Beep(523, 125);
Console.Beep(587, 125);
Console.Beep(32400, 250);
Console.Beep(622, 125);
Console.Beep(32400, 250);
Console.Beep(587, 125);
Console.Beep(32400, 250);
Console.Beep(523, 125);
}
while (Console.KeyAvailable == false);
}
}
}
Upvotes: 0
Views: 129
Reputation: 70671
For more precise control over sound playback, you will need to use one of the more advanced APIs in Windows, such as DirectSound or MediaPlayer, or even XAudio2. But those APIs can be very difficult to use, especially for someone new to programming. And they are waveform-based, so if you want a note-based approach, you'd need to include some layer, such as different waveforms for different notes, or playing MIDI (which MediaPlayer supports).
That said, your example will work reasonably well if you just play the notes in a loop, checking for key input between each call to Console.Beep()
. For example:
struct Beep
{
public readonly int Frequency;
public readonly int Duration;
public Beep(int frequency, int duration)
{
Frequency = frequency;
Duration = duration;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine();
Console.WriteLine("REVEILLE TOI !!!!!!!!!!!!");
Console.WriteLine();
Console.WriteLine("appuyez sur une touche pour arrter l'alarme, sinon elle sonera pour l'éternitée");
_PlaySong();
}
private static void _PlaySong()
{
while (true)
{
foreach (Beep beep in _beeps)
{
if (Console.KeyAvailable) return;
Console.Beep(beep.Frequency, beep.Duration);
}
}
}
private static readonly Beep[] _beeps =
{
new Beep(659, 125),
new Beep(659, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 167),
new Beep(523, 125),
new Beep(659, 125),
new Beep(32400, 125),
new Beep(784, 125),
new Beep(32400, 375),
new Beep(392, 125),
new Beep(32400, 375),
new Beep(523, 125),
new Beep(32400, 250),
new Beep(392, 125),
new Beep(32400, 250),
new Beep(330, 125),
new Beep(32400, 250),
new Beep(440, 125),
new Beep(32400, 125),
new Beep(494, 125),
new Beep(32400, 125),
new Beep(466, 125),
new Beep(32400, 42),
new Beep(440, 125),
new Beep(32400, 125),
new Beep(392, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 125),
new Beep(784, 125),
new Beep(32400, 125),
new Beep(880, 125),
new Beep(32400, 125),
new Beep(698, 125),
new Beep(784, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 125),
new Beep(523, 125),
new Beep(32400, 125),
new Beep(587, 125),
new Beep(494, 125),
new Beep(32400, 125),
new Beep(523, 125),
new Beep(32400, 250),
new Beep(392, 125),
new Beep(32400, 250),
new Beep(330, 125),
new Beep(32400, 250),
new Beep(440, 125),
new Beep(32400, 125),
new Beep(494, 125),
new Beep(32400, 125),
new Beep(466, 125),
new Beep(32400, 42),
new Beep(440, 125),
new Beep(32400, 125),
new Beep(392, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 125),
new Beep(784, 125),
new Beep(32400, 125),
new Beep(880, 125),
new Beep(32400, 125),
new Beep(698, 125),
new Beep(784, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 125),
new Beep(523, 125),
new Beep(32400, 125),
new Beep(587, 125),
new Beep(494, 125),
new Beep(32400, 375),
new Beep(784, 125),
new Beep(740, 125),
new Beep(698, 125),
new Beep(32400, 42),
new Beep(622, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 167),
new Beep(415, 125),
new Beep(440, 125),
new Beep(523, 125),
new Beep(32400, 125),
new Beep(440, 125),
new Beep(523, 125),
new Beep(587, 125),
new Beep(32400, 250),
new Beep(784, 125),
new Beep(740, 125),
new Beep(698, 125),
new Beep(32400, 42),
new Beep(622, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 167),
new Beep(698, 125),
new Beep(32400, 125),
new Beep(698, 125),
new Beep(698, 125),
new Beep(32400, 625),
new Beep(784, 125),
new Beep(740, 125),
new Beep(698, 125),
new Beep(32400, 42),
new Beep(622, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 167),
new Beep(415, 125),
new Beep(440, 125),
new Beep(523, 125),
new Beep(32400, 125),
new Beep(440, 125),
new Beep(523, 125),
new Beep(587, 125),
new Beep(32400, 250),
new Beep(622, 125),
new Beep(32400, 250),
new Beep(587, 125),
new Beep(32400, 250),
new Beep(523, 125),
new Beep(32400, 1125),
new Beep(784, 125),
new Beep(740, 125),
new Beep(698, 125),
new Beep(32400, 42),
new Beep(622, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 167),
new Beep(415, 125),
new Beep(440, 125),
new Beep(523, 125),
new Beep(32400, 125),
new Beep(440, 125),
new Beep(523, 125),
new Beep(587, 125),
new Beep(32400, 250),
new Beep(784, 125),
new Beep(740, 125),
new Beep(698, 125),
new Beep(32400, 42),
new Beep(622, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 167),
new Beep(698, 125),
new Beep(32400, 125),
new Beep(698, 125),
new Beep(698, 125),
new Beep(32400, 625),
new Beep(784, 125),
new Beep(740, 125),
new Beep(698, 125),
new Beep(32400, 42),
new Beep(622, 125),
new Beep(32400, 125),
new Beep(659, 125),
new Beep(32400, 167),
new Beep(415, 125),
new Beep(440, 125),
new Beep(523, 125),
new Beep(32400, 125),
new Beep(440, 125),
new Beep(523, 125),
new Beep(587, 125),
new Beep(32400, 250),
new Beep(622, 125),
new Beep(32400, 250),
new Beep(587, 125),
new Beep(32400, 250),
new Beep(523, 125),
};
}
For clarity in the code above, I took out the "alarm clock" aspect of your example, where you prompt for the day, hour, and minutes and then sleep for the specified duration, because that part has nothing to do with the question you actually asked.
Note that I also moved your note data into a dedicated user-defined type, and stored the values in an array. This gives you more flexibility regarding how you can implement the logic, including provides an easy way to loop and check for key input at the same time, without having to hard-code a bunch of calls to Console.Beep()
and Console.KeyAvailable
.
This implementation will allow the user to stop the playing of the notes almost as soon as they press a key. There is still a little bit of latency, because the key can be checked only after each note is done playing, as well as the fact that Windows itself will still let a note in progress finish playing even after the process has exited. But it's as close as you're going to get in a console program that uses Console.Beep()
. :)
Upvotes: 3