[erledigt] Piepton via beep bzw. echo -e "\a"

Antworten
Daniel L.
Beiträge: 7
Registriert: Fr 18. Apr 2025, 10:39
OS, Lazarus, FPC: Lnux Mint
CPU-Target: 64Bit

[erledigt] Piepton via beep bzw. echo -e "\a"

Beitrag von Daniel L. »

Lazarus 3.2
Linux Mint
Laptop Acer Aspire V3-772G


Hallo,

via Terminal lässt sich bei mir ein Piepton erzeugen:

Code: Alles auswählen

echo -e "\a" 
Es ist ein sehr kurzer, eher tieferer Sinuston.

Nun würde ich das gerne aus meinen Lazarus-Progs heraus ermöglichen:

SysUtils.beep ist leider wirkungslos (warum eigentlich?)
[geht aber unter Lazarus auf Win11 auf diesem Gerät,
dann erklingt ein Windows-Systemklang]

Dann habe ich es über ein Script probiert:
Script piep.sh:

Code: Alles auswählen

#!/bin/bash
echo  -e "Piep\\aTon"
exit 0
Den Text "PiepTon" habe ich zu Testzwecken reingenommen.

Direkt am Terminal funktioniert dieses Script wie erwartet.
(Ausgabe "PiepTon" und der Ton)

Geht aber nicht, wenn ich das Script aus Lazarus heraus aufrufe:

Code: Alles auswählen

...uses Process...
var s : string;
...
 if RunCommand('/home/.../piep.sh', [], s)
   then showmessage (s)
   else showmessage ('Fehler');
Ergebniss (kein Ton):
a.png
a.png (8.16 KiB) 421 mal betrachtet

Tausche ich im Script die Escape-Folge \a gegen \b (Backspace),

Code: Alles auswählen

echo  -e "Piep\\bTon"
ist die Ausgabe am Terminal wie erwartet:
"PieTon" (ohne kleines p),
unter Lazarus erscheint jedoch praktisch genau das gleiche Ergebniss wie oben

b.png
b.png (7.94 KiB) 421 mal betrachtet

Das Problem ist dann wohl allgemein, dass Escape-Folgen via RunCommand
nicht so behandelt werden wie im Terminal?
Zuletzt geändert von Daniel L. am Fr 13. Jun 2025, 14:59, insgesamt 2-mal geändert.

Warf
Beiträge: 2141
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Piepton via beep bzw. echo -e "\a"

Beitrag von Warf »

Naja zu erst einmal brauchst du kein Shellscript dafür, ein simples:

Code: Alles auswählen

Write(#7);
tuts genauso.

Der Grund warum es bei dir nicht funktioniert ist recht simpel. Der "Beep" sound ist kein allgemeines Programm Feature, sondern ist eine Funktionalität des Terminal(emulators) den du verwendest. Im Grunde ist ein Program nichts anderes als eine Ein und Ausgabenmaschiene, du bekommst Text eingaben über den Standard Input rein und kannst Textausgaben über den Standard Output rausschreiben. Damit das Programm mit einem Menschen Interagieren kann gibt es dann so genannte Terminals, die dann Menschliche tastendrücke lesen und an das Programm über Standard Input senden, und was das Programm auf Standard Input Rausgibt dann dem Nutzer anzeigen.

Normale Zeichen werden ganz Normal angezeigt, aber es gibt ein paar besondere Zeichen wenn das Terminal die sieht macht es ein paar spezielle Dinge. Z.B. bei Carriage Return(#13) springt das Terminal an den Anfang der Aktuellen Zeile:

Code: Alles auswählen

for i:=0 to 10 do
begin
  Write('.');
  if (i mod 3) = 0 then
    Write(#13);
  Sleep(1000);
end;
Beep (#7) ist ein anderes besonderes Zeichen, hierbei wird nichts an Text ausgegeben sondern ein Ton abgespielt. Es gibt noch andere besondere zeichen, z.B. Escape (#27) leutet Escape Sequenzen ein, mit denen ganz wilde Sachen gemacht werden können:

Code: Alles auswählen

Write(#27'[38;2;255;0;0m');
WriteLn('Ich bin Rot!!!!');
WriteLn('Ich auch');
Write(#27'[38;2;0;255;0m');
WriteLn('Ich Grün!');
Das Problem ist nun das nicht jeder Terminal Emulator alle diese sachen Unterstützt. Unter Linux liefert Lazarus einen eigenen mit (Ansicht -> Debugger Fenster -> Output oder so), und wenn du eine Anwendung in Lazarus startest wird der STDOut darüber geschrieben. Und der Lazarus Terminal Emulator kann so ziemlich gar keine Sonderfunktionalitäten, das heißt weder Carriage Return, noch Escape Sequenzen noch Beep führt da zu einer besonderen Reaktion

D.h. wenn du deinen Beep hören willst musst du dein Programm in einem Terminal Emulator starten der den Beep unterstützt. Das ist z.B. xterm, Konsole, Gnome Terminal, etc.

Daniel L.
Beiträge: 7
Registriert: Fr 18. Apr 2025, 10:39
OS, Lazarus, FPC: Lnux Mint
CPU-Target: 64Bit

Re: Piepton via beep bzw. echo -e "\a"

Beitrag von Daniel L. »

Hallo Warf,
vielen Dank für deine Ausführungen
D.h. wenn du deinen Beep hören willst musst du dein Programm in einem Terminal Emulator starten der den Beep unterstützt. Das ist z.B. xterm, Konsole, Gnome Terminal, etc.
Ja, so geht dann beep; und Write(#7);

Und Lazarus via Code dazu zu bringen, einen anderen Terminal Emulator zu beutzen,
geht nicht?

Stevie
Beiträge: 172
Registriert: Di 27. Feb 2024, 22:40

Re: Piepton via beep bzw. echo -e "\a"

Beitrag von Stevie »

Die Frage ist, ob Du überhaupt ein Terminal benutzt. Der Screenshot zeigt die Message Box einer grafischen Oberfläche. Auf dieser Ebene gehen Ausgaben nicht durch ein Terminal, sondern werden von Deinem UI Toolkit (Gnome, KDE o.ä.) direkt durch den Kernel in die Grafikkarte geschickt. Da ist dann weder ein Terminal noch eine Terminalemulation beteiligt.

Wenn Du Sound (einfache Beeps oder komplexere Dinge) in grafischen Linuxanwendungen erzeugen willst, musst Du entsprechende Libraries benutzen. Lies Dir mal viewtopic.php?t=13434 durch und schau Dir die dort von Winni vorgestellte alsa Unit an. Damit sollte es klappen.

Daniel L.
Beiträge: 7
Registriert: Fr 18. Apr 2025, 10:39
OS, Lazarus, FPC: Lnux Mint
CPU-Target: 64Bit

Re: Piepton via beep bzw. echo -e "\a"

Beitrag von Daniel L. »

Stevie hat geschrieben: Fr 13. Jun 2025, 08:35 Lies Dir mal viewtopic.php?t=13434 durch und schau Dir die dort von Winni vorgestellte alsa Unit an. Damit sollte es klappen.
Danke, da gibts ja noch viel zu entdecken.
Für meine Zwecke reicht vorerst AlsaBeep(...)von Fred bzw. Robert Rozee.

Stevie
Beiträge: 172
Registriert: Di 27. Feb 2024, 22:40

Re: [erledigt] Piepton via beep bzw. echo -e "\a"

Beitrag von Stevie »

Sehr schön! :)

PascalDragon
Beiträge: 962
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: [erledigt] Piepton via beep bzw. echo -e "\a"

Beitrag von PascalDragon »

Daniel L. hat geschrieben: Do 12. Jun 2025, 23:17 SysUtils.beep ist leider wirkungslos (warum eigentlich?)
Weil diese Funktion nicht auf jeder Plattform implementiert ist.
FPC Compiler Entwickler

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

Re: [erledigt] Piepton via beep bzw. echo -e "\a"

Beitrag von Mathias »

Und Lazarus via Code dazu zu bringen, einen anderen Terminal Emulator zu beutzen,
geht nicht?
Dies sollte aber gehen.
Start -> Startparameter... -> Startprogramm verwenden.

Oder einfach deine Bin von einer beliebigen Konsole aus starten.

Mit bel habe ich auch schon rumprobiert, so wie es aussieht, muss man recht viel in den Konfigurations-Dateien von Linux rumschrauben,
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Daniel L.
Beiträge: 7
Registriert: Fr 18. Apr 2025, 10:39
OS, Lazarus, FPC: Lnux Mint
CPU-Target: 64Bit

Re: [erledigt] Piepton via beep bzw. echo -e "\a"

Beitrag von Daniel L. »

PascalDragon hat geschrieben: Fr 13. Jun 2025, 23:30 Weil diese Funktion nicht auf jeder Plattform implementiert ist.
Ist sie bei mir schon.
Ich hab mal statt beep den Inhalt der procedure beep (sysutilh.inc)
etwas erweitert gecodet:

Code: Alles auswählen

If Assigned(OnBeep)
then
  begin
    showmessage ('assigned = true');
    sysUtils.OnBeep;
  end
else showmessage ('assigned = false');
"assigned = true" wird immer angezeigt,
der Beep ist dann zu hören, wenn das Prog von der Konsole aus gestartet wird,
(So, wie es Warf beschrieben hat)

Antworten