Beep erzeugen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Beep erzeugen

Beitrag von haderlump »

Noch eine wahrscheinlich einfache Geschichte.
Wie kann man den Lautsprecher veranlassen einen "Beep" von sich zu geben?

Gruß Fritz

itjump
Beiträge: 179
Registriert: Do 13. Okt 2016, 18:35
Wohnort: Winnenden

Re: Beep erzeugen

Beitrag von itjump »

Dazu muss man den Charakter 7 ausgeben. Also mit "write(#7);"

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Beep erzeugen

Beitrag von compmgmt »

Entweder Character 7 ausgeben oder (schöner): sysutils.Beep; (http://www.freepascal.org/docs-html/rtl/sysutils/beep.html)

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

itjump
Beiträge: 179
Registriert: Do 13. Okt 2016, 18:35
Wohnort: Winnenden

Re: Beep erzeugen

Beitrag von itjump »

compmgmt hat geschrieben:Entweder Character 7 ausgeben oder (schöner): sysutils.Beep; (http://www.freepascal.org/docs-html/rtl/sysutils/beep.html)

Warum schöner? Ich habe die Frage schon beantwortet und du antwortest nochmal das selbe, nur mit einem kleinen Zusatz. Das Verstehe ich nicht.

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Beep erzeugen

Beitrag von compmgmt »

itjump hat geschrieben:Warum schöner? Ich habe die Frage schon beantwortet und du antwortest nochmal das selbe, nur mit einem kleinen Zusatz. Das Verstehe ich nicht.

Ja, eine Ergänzung. Und ich finde es schöner, da man ein "Beep;" beim überfliegen des Quellcodes besser als Beep erkennt, als "WriteLn(#7);". Das mögen andere anders sehen, aber es ist für mich leichter zu lesen.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

itjump
Beiträge: 179
Registriert: Do 13. Okt 2016, 18:35
Wohnort: Winnenden

Re: Beep erzeugen

Beitrag von itjump »

compmgmt hat geschrieben:
itjump hat geschrieben:Warum schöner? Ich habe die Frage schon beantwortet und du antwortest nochmal das selbe, nur mit einem kleinen Zusatz. Das Verstehe ich nicht.

Ja, eine Ergänzung. Und ich finde es schöner, da man ein "Beep;" beim überfliegen des Quellcodes besser als Beep erkennt, als "WriteLn(#7);". Das mögen andere anders sehen, aber es ist für mich leichter zu lesen.

Da hast du wohl recht, allerdings schadet es meiner Meinung nach nicht, wenn man lernt, was Charakter eigentlich sind, bzw. wie sie auf Hardwareebene arbeiten

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Beep erzeugen

Beitrag von Mathias »

Ich habe 3 Varianten ausprobiert, aber aus keiner kommt ein Ton.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Write(^g);
  Beep;
  MessageBeep(0); // braucht uses Windows
end;   


Ich habe es mit WinXP in VirtualBox probiert.
Ansonsten funktioniert die Ton-Ausgabe, zB, die Systemklänge unter "Sounds und Audiogeräte".
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Beep erzeugen

Beitrag von compmgmt »

Mathias hat geschrieben:Ich habe 3 Varianten ausprobiert, aber aus keiner kommt ein Ton.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Write(^g);
  Beep;
  MessageBeep(0); // braucht uses Windows
end;   


Ich habe es mit WinXP in VirtualBox probiert.
Ansonsten funktioniert die Ton-Ausgabe, zB, die Systemklänge unter "Sounds und Audiogeräte".

1. Entweder, oder. Wenn du mehrere Töne gleichzeitig ausprobiert, wird entweder nichts passieren oder nur einer davon abgespielt. (Kann aber auch sein du hast das hier nur zur Veranschaulichung gemacht)
2. Unter Windows 10 folgendes Ergebnis: MessageBeep und Beep funktionieren wunderbar, bei Write stürzt logischerweise das Programm ab, da es keine Konsole zum Ausgeben gibt.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

itjump
Beiträge: 179
Registriert: Do 13. Okt 2016, 18:35
Wohnort: Winnenden

Re: Beep erzeugen

Beitrag von itjump »

Compmgmt, die Töne werden ausgegeben, allerdings fast gleichzeitig, was die Hardware unter Umständen nicht mitmacht, dann würde kein Ton kommen. Aber ansonsten hast du recht, das Programm dürfte nicht mal Kompeliert werden

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Beep erzeugen

Beitrag von compmgmt »

itjump hat geschrieben:Compmgmt, die Töne werden ausgegeben, allerdings fast gleichzeitig, was die Hardware unter Umständen nicht mitmacht, dann würde kein Ton kommen. Aber ansonsten hast du recht, das Programm dürfte nicht mal Kompeliert werden

Ich habe es auch schon erlebt, dass in so einem Fall gar kein Ton ausgegeben wird.
Kompiliert schon, ist ja kein Syntaxfehler drin. Nur es stürzt beim Aufrufen der Prozedur ab.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

itjump
Beiträge: 179
Registriert: Do 13. Okt 2016, 18:35
Wohnort: Winnenden

Re: Beep erzeugen

Beitrag von itjump »

compmgmt hat geschrieben:
itjump hat geschrieben:Compmgmt, die Töne werden ausgegeben, allerdings fast gleichzeitig, was die Hardware unter Umständen nicht mitmacht, dann würde kein Ton kommen. Aber ansonsten hast du recht, das Programm dürfte nicht mal Kompeliert werden

Ich habe es auch schon erlebt, dass in so einem Fall gar kein Ton ausgegeben wird.
Kompiliert schon, ist ja kein Syntaxfehler drin. Nur es stürzt beim Aufrufen der Prozedur ab.

Verstehe doch, wenn kein Ton ausgegeben wird, liegt das an der Hardware. Dadurch das 2 Töne gleichzeitig erzeugt werden, kann es passieren, das die Vibration des Lautsprechers sich selbst neutralisiert, wodurch dann kein Ton mehr kommt. Die Software gibt aber das Signal, was aber dann wenig bringt, wenn die Hardware das nicht verarbeiten kann.
https://www.welt.de/wissenschaft/article12280737/Antischall-Technik-bringt-endlich-Ruhe-ins-Haus.html. Das dürfte dir die Funktion ungefähr klar machen. Das hat zwar nichts mit Programmieren an sich zu tun, jedoch Funktioniert das ganze Grundsätzlich auch beim Programmieren

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Beep erzeugen

Beitrag von Mathias »

Verstehe doch, wenn kein Ton ausgegeben wird, liegt das an der Hardware. Dadurch das 2 Töne gleichzeitig erzeugt werden

Ich habe jetzt folgendes probiert, gibt auch keine Ton-Ausgabe, aber die 'x' werden sehr langsam ausgegeben.

Code: Alles auswählen

  for i := 0 to 10000 do begin
    Write(^g);
    Write('x');
  end;

Ich denke der Ton verschwindet irgendwo in XP.

Was ich vielleicht noch erwähnen muss, eine WAV-Datei, wird über die Soundkarte ausgegeben, aber [Ctrl-G] geht über den PC-Speaker.

Jetzt muss ich mal gucken, ob mein PC über ein Speaker hat.
Es muss wohl einer verbaut sein, wen ich den PC starte und der POST-Process in Ordnung war, piepst er kurz.
Vielleicht wird der Pieser in der Virtual-Box verschluckt.

Ich habe grade ein DOS-Games probiert, bei dem ich weis, das diese nur den PC-Speaker unterstützt, Ergebniss: kein Ton.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Beep erzeugen

Beitrag von m.fuchs »

itjump hat geschrieben:Aber ansonsten hast du recht, das Programm dürfte nicht mal Kompeliert werden

itjump hat geschrieben:Verstehe doch, wenn kein Ton ausgegeben wird, liegt das an der Hardware. Dadurch das 2 Töne gleichzeitig erzeugt werden, kann es passieren, das die Vibration des Lautsprechers sich selbst neutralisiert, wodurch dann kein Ton mehr kommt.

Warum schreibst du hier eigentlich soviel Unsinn. Das kann man beim Lesen ja kaum ertragen.

Mathias hat geschrieben:Was ich vielleicht noch erwähnen muss, eine WAV-Datei, wird über die Soundkarte ausgegeben, aber [Ctrl-G] geht über den PC-Speaker.
[...]
Vielleicht wird der Pieser in der Virtual-Box verschluckt.
Ich habe grade ein DOS-Games probiert, bei dem ich weis, das diese nur den PC-Speaker unterstützt, Ergebniss: kein Ton.

Dann wird tatsächlich VirtualBox das Problem sein. Die Audio-Einstellungen die du in VBox festlegst, betreffen ja nur das Soundkarten-System. Der PC-Speaker (im Sinne von dem piepsenden Teil) ist davon völlig unabhängig. Der wird unter Windows auch nicht im Bereich Audiogeräte augeführt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Beep erzeugen

Beitrag von Mathias »

Ich hatte gerade meinen PC mit MSDOS 3.3 gestartet.

Beim Kommando

Code: Alles auswählen

echo ^G^G^G^G^G^G

kommen ein paar Piepser.

Ich habe grade ein DOS-Games probiert, bei dem ich weis, das diese nur den PC-Speaker unterstützt, Ergebniss: kein Ton.

Diese Game habe ich gerade im "DOSBox Emulator" probiert, dort habe ich Ton.
Nur leider kann ich den obigen Echo-Befehl nicht eingeben, da es mir Ctrl-G nicht an nimmt.

Aber was komisch ist, ich habe dort ein kleiner Test mit TP geschrieben, aber write(#7) oder writeln(#7) bleibt stumm, auch mit ^G.
Egal ob mit oder ohne uses Crt.

Ich habe noch einen Treiber, welcher unter Win31 eine Soundkarte über den PC-Speaker emuliert.
Mit diesem habe ich auch PC-Speaker Ton in der DOSBox.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Beep erzeugen

Beitrag von compmgmt »

itjump hat geschrieben:Dadurch das 2 Töne gleichzeitig erzeugt werden, kann es passieren, das die Vibration des Lautsprechers sich selbst neutralisiert, wodurch dann kein Ton mehr kommt.
Mir ist noch was dazu eingefallen: Die Anweisungen zum Ton erzeugen laufen allerdings im selben Thread. Dadurch können theoretisch je nach OS folgende Szeanrien entstehen:
1. Ton wird Synchron erzeugt: Erst wird ein Ton ausgegeben, danach der nächste (es gibt einen langen Ton).
2. Nur der letzte Ton wird ausgeben, da alle vorherigen vom Betriebssystem abgebrochen werden. Dieses Phänomen kenne ich zwar nur vom wav-Dateien abspielen, kann allerdings theoretisch auch hier zutreffen.
3. Beide Töne werden gleichzeitig erzeugt. Durch das erzeugen zweier exakt gleicher Töne (in diesem Fall der Beep) wird die Schwingung des Lautsprechers sicherlich nicht neutralisiert, sondern verstärkt.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Antworten