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
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.
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.