Beep unter Ubuntu

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
wennerer
Beiträge: 505
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Beep unter Ubuntu

Beitrag von wennerer »

Beep unter Ubuntu!

Ich bin vor nicht all zu langer Zeit von XP auf Ubuntu 14.04 umgestiegen. Da unter Ubuntu mein Delphi 3 nicht mehr läuft habe ich mich mit Lazarus beschäftigt und bin eigentlich sehr zufrieden (bin Laie und mache alles nur zum Spaß). Was mir unter Lazarus/Ubuntu aber sehr abgeht ist ein normaler Beep.
Ich hab mich mit dem Thema beep unter Ubuntu etwas beschäftigt und möchte deshalb einen relativ einfachen Weg aufzeigen um den PCSpeaker unter Ubuntu/Lazarus nutzen zu können.

Alles basiert auf dem Programm beep das aus den Paketquellen geladen werden kann. Wer näheres darüber wissen möchte dem empfehle ich die Seite: wiki.ubuntuusers.de/Soundausgabe_Systemlautsprecher
Jedenfalls wird das Programm im Terminal mit sudo apt-get install beep installiert. Damit der Treiber geladen wird muss nun sudo modprobe -v pcspkr im Terminal eingegeben werden. Bei Eingabe von ./beep im Terminal sollte nun ein beepton zu hören sein. Falls nichts zu hören ist möchte ich nochmal auf die oben erwähnte Seite verweisen, dort sind verschiedene Lösungsvorschläge zu finden. Wer den beepton wieder ausschalten möchte gibt im Terminal einfach sudo modprobe -r pcspkr ein, dann wird der Treiber wieder entfernt.
Im ersten Schritt habe ich je ein bashscript in gedit geschrieben mit denen ich den Treiber laden und entfernen kann. In meinem bashscript kommt der Befehl gksudo vor (macht die Passwortabfrage). Damit das Script funktioniert muss leider gksudo zuerst im Terminal installiert werden. Dazu im Terminal sudo apt-get install gksudo eingeben. Jetzt mit gedit eine neue Datei öffnen und den Quelltext wie untenstehend eingeben. Der Pfad zur Datei muss natürlich angepasst werden. Ich habe alles ins Verzeichnis /home/bernd/EigeneProgramme/beep1 kopiert. Achtung unter Ubuntu keine Leerzeichen in den Verzeichnisnamen verwenden, gibt nur Ärger!

Hier die Datei beepein:

Code: Alles auswählen

#!/bin/bash 
gksudo /home/bernd/EigeneProgramme/beep1/beepein
modprobe -v pcspkr



Hier die Datei beepaus:

Code: Alles auswählen

#!/bin/bash 
gksudo /home/bernd/EigeneProgramme/beep1/beepaus
modprobe -r pcspkr


Um die Datei ausführbar zumachen in Nautilus (ist das Aktenschrank Symbol im Starter) Bearbeiten – Einstellungen – Verhalten und dann ausführbare Textdateien ausführen, wenn sie geöffnet werden markieren. Durch doppelklicken der Dateien kann man nun den beep ein- bzw. ausschalten.


In Lazarus habe ich nun eine Unit mit Namen PCSpeaker geschrieben mit der ich das beep Programm ansprechen kann. Wer die Unit im ganzen System nutzen möchte muss die Dateien pcspeaker.ppu, pcspeaker.o und pcspeaker.pas in das Verzeichnis /usr/lib/fpc/2.6.2/units/i386-linux/BeepUnit (Ordner BeepUnit selbst erstellen!) kopieren. Der Quelltext und ein Beispielprogramm folgen hier:

Code: Alles auswählen

unit PCSpeaker; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils,Process;
 
const
      f1 = 174.6;fis1 = 185.0;
      g1 = 196.0;gis1 = 207.7;
      a1 = 220.0;b1   = 233.1;
      h1 = 246.6;
      c2 = 261.6;cis2 = 277.2;
      d2 = 293.7;dis2 = 311.1;
      e2 = 329.6;
      f2 = 349.2;fis2 = 370.0;
      g2 = 392.0;gis2 = 415.3;
      a2 = 440.0;b2   = 466.2;
      h2 = 493.9;
      c3 = 523.2;cis3 = 554.4;
      d3 = 587.3;dis3 = 622.3;
      e3 = 659.3;
      f3 = 698.5;fis3 = 740.0;
      g3 = 784.0;
      pause = 10; //ich hör da nix
 
      ganze   = 320;
      halbe   = 160;
      viertel =  80;
      achtel  =  40;
      sech10  =  20;   
 
var BProcess : TProcess;
    tempo    : byte;
 
procedure PCBeep;
procedure MessageBeep(freq:integer;len:word);
procedure Melodie(freq:double;len:integer;last:boolean);
 
implementation
 
procedure PCBeep;
 begin
   BProcess:=TProcess.Create(nil);
   BProcess.Executable := 'beep';
   BProcess.Execute;
   BProcess.Free;
 end;
 
procedure MessageBeep(freq:integer;len:word);
 begin
  BProcess:=TProcess.Create(nil);
  BProcess.Executable := 'beep';
  BProcess.Parameters.Add('-f '+inttostr(freq));
  BProcess.Parameters.Add('-l '+inttostr(len));
  BProcess.Execute;
  BProcess.Free;
 end;
 
procedure Melodie(freq:double;len:integer;last:boolean);
var first    : boolean;
   begin
    if first then
     begin
      BProcess:=TProcess.Create(nil);
      BProcess.Executable := 'beep';
      first:=false;
     end;
    BProcess.Parameters.Add('-f'+ floattostr(freq));
    BProcess.Parameters.Add('-l'+ inttostr(len*tempo));
    BProcess.Parameters.Add('-D 50');
    if not last then BProcess.Parameters.Add('-n');
    if last then
     begin
      BProcess.Execute;
      BProcess.Free;
      first:=true;
     end;
   end;
end.
 
Hier folgt das Beispielprogramm (für die beiden bashscripts muss eventuell der Pfad angepasst werden):
 
unit beep1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, process, pcspeaker;
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject)//ruft das beep Programm auf
var AProcess : TProcess;
begin
  AProcess:=TProcess.Create(nil);
  AProcess.Executable := 'beep';
  AProcess.Execute;
  AProcess.Free;
     //das geht auch
  //SysUtils.ExecuteProcess('beep','',[]);
     //und das geht auch
  //ExecuteProcess('beep','',[]);
end;
 
procedure TForm1.Button2Click(Sender: TObject); //ruft das beep Programm mit Parameter auf
var AProcess : TProcess;
begin
 AProcess:=TProcess.Create(nil);
 AProcess.Executable := 'beep';
 AProcess.Parameters.Add('-f 1000');   //ändert die Frequenz
 AProcess.Parameters.Add('-l 2000');   //ändert die Tonlänge
 AProcess.Execute;
 AProcess.Free;
end;
 
procedure TForm1.Button3Click(Sender: TObject)//ruft unit pcspeaker auf, macht beep
begin
  PCBeep;
end;
 
procedure TForm1.Button7Click(Sender: TObject)//ruft unit pcspeaker auf, macht beep (frequenz,länge)
begin
 messagebeep(500,150);
end;
 
procedure TForm1.Button8Click(Sender: TObject)//mit unit pcspeaker eine Tonleiter
begin
 tempo:=2;
 Melodie(f1,halbe,false);
 Melodie(g1,halbe,false);
 Melodie(a1,halbe,false);
 Melodie(h1,halbe,false);
 Melodie(c2,halbe,false);
 Melodie(d2,halbe,false);
 Melodie(e2,halbe,false);
 Melodie(f2,halbe,false);
 Melodie(g2,halbe,false);
 Melodie(a2,halbe,false);
 Melodie(h2,halbe,false);
 Melodie(c3,halbe,false);
 Melodie(d3,halbe,false);
 Melodie(e3,halbe,false);
 Melodie(f3,halbe,false);
 Melodie(g3,halbe,true);    //letzte Note true
 
end;
 
procedure TForm1.Button4Click(Sender: TObject)//ruft unit pcspeaker auf, macht Melodie
begin
 tempo:=6;
 Melodie(c2,achtel,false);
 Melodie(g2,achtel,false);
 Melodie(b2,(viertel+achtel),false);   //punktierte Viertel
 Melodie(c3,achtel,false);
 Melodie(b2,viertel,false);
 Melodie(gis2,viertel,false);
 Melodie(g2,viertel+achtel,false);
 Melodie(f2,achtel,false);
 Melodie(dis2,viertel,false);
 Melodie(b2,viertel,false);
 Melodie(c3,viertel,false);
 Melodie(b2,viertel,false);
 Melodie(gis2,viertel,false);
 Melodie(g2,viertel,false);
 Melodie(f2,halbe,false);
 Melodie(pause,viertel,false);
 Melodie(dis2,achtel,false);
 Melodie(g2,achtel,false);
 Melodie(b2,viertel,false);
 Melodie(b2,viertel,false);
 Melodie(b2,viertel,false);
 Melodie(dis3,viertel,false);
 Melodie(dis3,halbe,false);
 Melodie(c3,viertel,false);
 Melodie(f3,viertel,false);
 Melodie(dis3,halbe,false);
 Melodie(d3,halbe,false);
 Melodie(dis3,halbe,false);
 Melodie(pause,viertel,false);
 Melodie(b2,achtel,false);
 Melodie(g2,achtel,false);
 Melodie(g2,achtel+sech10,false);
 Melodie(f2,sech10,false);
 Melodie(f2,halbe,false);
 Melodie(c3,achtel,false);
 Melodie(gis2,achtel,false);
 Melodie(gis2,achtel+sech10,false);
 Melodie(g2,sech10,false);
 Melodie(g2,halbe,false);
 Melodie(dis2,achtel,false);
 Melodie(g2,achtel,false);
 Melodie(b2,viertel,false);
 Melodie(b2,viertel,false);
 Melodie(b2,viertel,false);
 Melodie(dis3,viertel,false);
 Melodie(dis3,halbe,false);
 Melodie(c3,viertel,false);
 Melodie(f3,viertel,false);
 Melodie(dis3,halbe,false);
 Melodie(d3,halbe,false);
 Melodie(dis3,halbe+viertel,true);   //letzte Note true
 
end;
 
procedure TForm1.Button5Click(Sender: TObject); //startet das bashscript beepaus
var AProcess : TProcess;
begin
  AProcess:=TProcess.Create(nil);
  AProcess.Executable := 'beepaus';
  AProcess.Execute;
  AProcess.Free;
end;
 
procedure TForm1.Button6Click(Sender: TObject)//startet das bashscript beepein
var AProcess : TProcess;
begin
  AProcess:=TProcess.Create(nil);
  AProcess.Executable := 'beepein';
  AProcess.Execute;
  AProcess.Free;
end;
 
 
 
 
end.
 


Wem die bashscripts nicht so zusagen für den kommt hier noch ein kleines Programm zum Ein- bzw Ausschalten des Beeptones (BeepCommander). Die unit pcspeaker muss eingebundenwerden!

Code: Alles auswählen

unit unitbeco; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, process, pcspeaker;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1                      : TForm1;
  AProcess                   : TProcess;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);   //Beep testen bzw. Kennwort eingeben
begin
 PCBeep;
end;
 
procedure TForm1.Button2Click(Sender: TObject)//Beep einschalten
begin
  AProcess:=TProcess.Create(nil);
  AProcess.Executable := 'gksudo';
  AProcess.Parameters.Add('modprobe -v pcspkr');
  AProcess.Options := AProcess.Options + [poWaitOnExit];
  AProcess.Execute;
  AProcess.Free;
end;
 
procedure TForm1.Button3Click(Sender: TObject)//Beep ausschalten
begin
 AProcess:=TProcess.Create(nil);
 AProcess.Executable := 'gksudo';
 AProcess.Parameters.Add('modprobe -r pcspkr');
 AProcess.Options := AProcess.Options + [poWaitOnExit];
 AProcess.Execute;
 AProcess.Free;
end;
 
 
end.
 


Bei mir funktioniert es problemlos. Sollte jemand eine bessere, einfachere Methode kennen oder wissen wie man die Lautstärke verändert nur her damit.
Zuletzt geändert von m.fuchs am Mi 20. Mai 2015, 00:02, insgesamt 1-mal geändert.
Grund: Highlighter

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Beep unter Ubuntu

Beitrag von Komoluna »

verwende doch bitte code-highlighter

Code: Alles auswählen

procedure Foo();
begin
  Bar := 0;
end;


MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

wennerer
Beiträge: 505
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Beep unter Ubuntu

Beitrag von wennerer »

Vielen Dank für deinen Hinweis, kenne mich leider noch nicht so aus. Beim nächsten Mal mach ichs besser.

LG
wennerer

Antworten