You are not logged in.

  • Login

Friday, April 2nd 2010, 6:54pm

Tags

beep, C++, Lautsprecher, pc, tutorial

Abstract

Dieses Tutorial handelt von der Beep Funktion.

Article

Ich möchte mich in diesem Tutorial mit der Windows-Funktion Beep beschäftigen.
Diese Funktion lässt den SystemSpeaker einen Ton mit einer bestimmten Frequenz und für eine bestimmte Dauer erklingen.

1. Gerüst


Hierzu ist

C/C++ Quellcode

1
2
3
#include <windows.h>
#include <iostream>
using namespace std;

erforderlich. Außerdem importiert ihr iostream und verwenden den namespace std für Ausgaben in der Konsole.
Jetzt bestimmt ihr die Frequenz der Töne als const int, weil sie ja nicht verändert werden müssen.

2. Musiklehre


Wichtig ist zu wissen, dass die Hälfte einer Frequenz, der gleiche Ton eine Oktave tiefer, und, dass das Doppelte der Frequenz eine Oktave höher ist.
Wenn man die Frequenz selber berechnen möchte, muss man die 12. Wurzel aus 2 mit der Frequenz des Tones, der eine halbe Stufe unter dem gesuchten Ton liegt multiplizieren.

Ein Beispiel:
- Ton A = 440Hz (ein normal temperierte Klaviersaite des Tons A schwingt mit dieser Frequenz (es kann auch mit der Hälfte oder dem Doppelten gerechnet werden))
- 12. Wurzel aus 2 * Frequenz des Tones = Halbton höher (Ais) = 466
- beliebig oft wiederholen :)

3. Frequenzen


Also, für diejenigen, die die Frequenzen nicht selber berechnen möchten:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
const int C    = 261;
const int Cis  = 277;
const int D    = 293;
const int Dis  = 311;
const int E    = 329;
const int F    = 349;
const int Fis  = 369;
const int G    = 391;
const int Gis  = 415;
const int A    = 440;
const int Ais  = 466;
const int H    = 493;
const int Takt = 2000;


Was die Variable Takt soll, könnt ihr euch sicherlich denken.
Recht praktisch ist, jeden Beep so zu gestalten:
So ertönt der Ton C1 als Viertelnote.

C/C++ Quellcode

1
Beep(C * 1, Takt / 4);

Wieder der Ton C, allerdings doppelt so lang und eine Oktave höher.

C/C++ Quellcode

1
Beep(C * 2, Takt / 2);

Und nochmal der Ton C, diesmal jedoch 4 Mal so lang und 2 Oktaven höher.

C/C++ Quellcode

1
Beep(C * 4, Takt / 4);

Um einen Ton eine Oktave niedriger erklingen zu lassen, einfach das * Zeichen mit / ersetzen.
Eventuell ist es erforderlich, das ihr hinter einen jeden Beep Aufruf das Programm kurz mit Sleep(1); anhalten und danach weiterlaufen lassen, beispielsweise bei 16tel Noten.
Ihr könnt ja mal Probieren "Alle meine Entchen" zu programmieren.

4. Beispiel Tetris


Hier noch der Sourcecode von Tetris.

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <windows.h>
#include <iostream>
using namespace std;
 
const int C    = 261;
const int Cis  = 277;
const int D    = 293;
const int Dis  = 311;
const int E    = 329;
const int F    = 349;
const int Fis  = 369;
const int G    = 391;
const int Gis  = 415;
const int A    = 440;
const int Ais  = 466;
const int H    = 493;
const int Takt = 1700;
 
int main() {
    cout << "Tetris" << endl << " (Enter dr" << (unsigned char)129 << "cken um fortzufahren)";
    getchar();
    while (1) {
        Sleep(Takt / 4);
        Beep(E * 2, Takt / 4);
        Beep(H * 1, Takt / 8);
        Beep(C * 2, Takt / 8);
        Beep(D * 2, Takt / 4);
        Beep(C * 2, Takt / 8);
        Beep(H * 1, Takt / 8);
        Beep(A * 1, Takt / 4);
        Beep(A * 1, Takt / 8);
        Beep(C * 2, Takt / 8);
        Beep(E * 2, Takt / 8);
        Beep(E * 2, Takt / 8);
        Beep(D * 2, Takt / 8);
        Beep(C * 2, Takt / 8);
        Beep(H * 1, Takt / 2.5);
        Beep(C * 2, Takt / 8);
        Beep(D * 2, Takt / 4);
        Beep(E * 2, Takt / 4);
        Beep(C * 2, Takt / 4);
        Beep(A * 1, Takt / 4);
        Beep(A * 1, Takt / 4);
        Sleep(Takt / (8 / 3));
        Beep(D * 2, Takt / 3.25);
        Beep(F * 2, Takt / 8);
        Beep(A * 2, Takt / 8);
        Beep(A * 2, Takt / 8);
        Beep(G * 2, Takt / 8);
        Beep(F * 2, Takt / 8);
        Beep(E * 2, Takt / 3);
        Beep(C * 2, Takt / 8);
        Beep(E * 2, Takt / 8);
        Beep(E * 2, Takt / 8);
        Beep(D * 2, Takt / 8);
        Beep(C * 2, Takt / 8);
        Beep(H * 1, Takt / 4);
        Beep(H * 1, Takt / 8);
        Beep(C * 2, Takt / 8);
        Beep(D * 2, Takt / 4);
        Beep(E * 2, Takt / 4);
        Beep(C * 2, Takt / 4);
        Beep(A * 1, Takt / 4);
        Beep(A * 1, Takt / 4);
    }
    return 0;
}

Lexikon 4.1.5, developed by www.viecode.com