0

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); } } } 
7
  • 1
    You can't. The beeps are queued up in the Windows message queue. If you want instant sounds, you'll need to use the DirectPlay API in .NET Commented Sep 10, 2019 at 19:02
  • ha…. thats bad news, maybe there is a way to verify if a key is pressed after each beeps ? Commented Sep 10, 2019 at 19:07
  • 1
    @Jon DirectPlay is for networking (and is obsolete). Are you thinking of DirectSound? (But DirectSound is obsolete now too - XAudio2 is the current sound API, but it's really meant for games. Perhaps the OP should be using MediaFoundation instead? Commented Sep 10, 2019 at 19:08
  • 1
    Put numbers for your beeps into an array, loop it with foreach and on each loop check for key pressed. That's probably the closest thing to your code. Commented Sep 10, 2019 at 19:10
  • Lol @Dai you are right, I just recall it was related to DirectX. It's been many years since I've done any sound programming. MediaFoundation is that the current API? I'll go check that out. Thanks. Commented Sep 10, 2019 at 19:11

1 Answer 1

3

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(). :)

Sign up to request clarification or add additional context in comments.

3 Comments

You need to wrap that in a while loop. OP wants to keep it ringing until stopped, not just once. (Also, need to modify modify the break.)
@Xiaoy312: okay, yes...I suppose it's better if the implementation repeats continuously as the OP had for their example. :)
Ok, thanks for answer, i didnt understand everything, i'm in darkness a little bit, i will see that later ! :)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.