Töne

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Töne

Beitrag von DAP »

Hallo,

kann mir jemand helfen, wie man zum Einen kurze beep - Töne und
zum Anderen kurze Musiksequenzen abspielen kann. Das beste wäre
es das man das ganze auch unter Linux compilieren kann.

Ich wollte auf ein Click-event akustisch antworten und kein mp3 player
erstellen.

Hoffentlich kann mir jemand weiterhelfen.

Gruß DAP

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Töne

Beitrag von Heinrich Wolf »

Hallo,

ich hab mich erst mal zurück gehalten, da ich von DirectSound nix weiß. Aber schade, dass Dir noch keiner geantwortet hat. Du könntest mal in Sachen Windows nach DirectSound googlen. Ich hab das gefunden: http://wiki.lazarus.freepascal.org/FPC_and_DirectX/de. Ich hab mal ein monophones Bildschirm-Keyboard gemacht. Dazu hab ich allerdings nur PlaySound() verwendet und die Töne selbst nach der WAV Spezifikation erstellt. Siehe hier: http://de.wikipedia.org/wiki/RIFF_WAVE Angefangen hab ich mit dem Kammerton a. Der hat 440 Hertz. Ein Halbtonschritt rauf kommt aus der Multiplikation der Frequenz mit der 12. Wurzel aus 2, ein Halbtonschritt runter kommt aus der Division der Frequenz durch die 12. Wurzel aus 2.

Gruß
Heiner

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Töne

Beitrag von carli »

Für Linux und Windows gibts zwei Bibliotheken, mit denen ich bereits gearbeitet habe:
- Bass
- SDL_Mixer

Für einfache Piepstöne erstellst du einfach von Hand eine Sinuskurve: die jeweilige Sound-Bibliothek erlaubt dir, Rohdaten hochzuladen, die ein Format haben, zum Beispiel 44kHz 16 bit signed. Das bedeutet im Klartext, dass 44.000 mal in der Sekunde ein 16-bit-signed-Wert (smallint) aus deinem Array ausgelesen wird und als Spannung auf den Lautsprecher gesetzt wird. 16 bit signed heißt, dass du die Werte zwischen -32.000 und 32.000 anlegen solltest. Um einen Sinuston (normaler Piepston) zu erzeugen machst du also:

Code: Alles auswählen

procedure fillSinus(freq: single; laenge: single);
var samples: array of smallint;
    i: integer;
begin
  setlength(samples, round(laenge*44000)); // laenge Sekunden lang den Ton abspielen, auch Kommawerte erlaubt
  for i:=0 to high(samples) do begin
    samples[i]:=round(30000*sin(i/44000*2*pi/freq));
  end;
  SoundLibrary_Upload_Data(@samples[0], length(samples), SoundLibrary_Format_16bit_signed, 44000); // durch spezifische Funktion ersetzen; 1. Parameter: Zeiger auf Daten; 2. Parameter: Anzahl Samples, 3. Parameter: Datenformat, 4. Parameter: Samplefrequenz
end;
Es lohnt sich bei Piepstönen auch, geringere Samplefrequenzen zu benutzen, so zum Beispiel 22.000 Hz.
fillsinus(440, 1); würde den Kammerton A mit einer Spielzeit von einer Sekunde erzeugen.

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Töne

Beitrag von DAP »

Hallo,

vielen Dank Heiner und Carli für eure Antworten.

Welche Unit muss ich einbinden, um SoundLibrary_Upload_Data benutzen zu können?
Ich werde mir erst einmal Bass anschauen.

Gruß DAP

Benutzeravatar
jwdietrich
Beiträge: 173
Registriert: Mo 20. Okt 2008, 20:50
OS, Lazarus, FPC: macOS 10.4-14.1, Windows 2000-11, Raspbian (L 3.7.0, FPC 3.2.2)
CPU-Target: PowerPC, Intel, ARM
Wohnort: Hattingen, NRW
Kontaktdaten:

Re: Töne

Beitrag von jwdietrich »

Für einfache Beep-Ausgaben habe ich für meine Programme die folgende plattformunabhängige Prozedur geschrieben:

Code: Alles auswählen

procedure bell; {platform-independent implementation of acustical warning}
begin
  {$IFDEF win32}
    MessageBeep(0);
  {$ELSE}
    {$IFDEF LCLCarbon}
      SysBeep(30);
    {$ELSE}
      beep;
    {$ENDIF}
  {$ENDIF}
end;
Insgesamt scheint das Thema Tonausgabe in Lazarus / Free Pascal aber noch erheblich zu kurz zu kommen.

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Töne

Beitrag von DAP »

Hallo,

dank dir jwdietrich, für ein einfaches beep ist das wunderbar.

Eine kleine Ergänzung für Neulinge wie mich, die Funktion steht in der Unit Windows.

Mit Bass habe ich in Windows auch wav-files ans laufen bekommen. Gibt es eine
Möglichkeit, bass mitzucompilieren, damit man nicht immer die dll an Freunde
weiterreichen muss?

Wie bekomme ich Bass in Linux (Ubuntu) ans laufen?

Gruß DAP

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Töne

Beitrag von theo »

jwdietrich hat geschrieben:Für einfache Beep-Ausgaben habe ich für meine Programme die folgende plattformunabhängige Prozedur geschrieben:
Was verstehst du unter "plattformunabhängig"? Auf Linux geht das afaik nicht.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Töne

Beitrag von pluto »

Wie bekomme ich Bass in Linux (Ubuntu) ans laufen?
http://www.un4seen.com/forum/?topic=8682" onclick="window.open(this.href);return false;

Das geht sogar unter Lazarus... Ich meine, die DLL/SO Datei muss aus Lizenz-Gründen extern sein.

Es gibt auf der Lazarus-Hompage noch eine andere Möglichkeit: Dort gibt es eine Sound-Komponente, für reine Wav Dateien, ich weiß jetzt aber nicht ob sie auch unter Linux läuft, sollte aber.

http://wiki.lazarus.freepascal.org/Comp ... e_examples" onclick="window.open(this.href);return false;

Such da mal nach Sound.
MFG
Michael Springwald

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Töne

Beitrag von DAP »

Hallo Pluto,

meintest Du die ACS-Komponente?
Ich werde mal reinschauen.

Gruß DAP

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Töne

Beitrag von pluto »

meintest Du die ACS-Komponente?
Nein! Die laufen nur auf ein paar System Einbandfrei. Wobei mir nicht bekannt ist, bei wem sie laufen. Ich höre immer nur das sie nicht laufen. Es gibt da noch was anders. Komme im Moment nicht auf den Namen, werde aber nachher mal schauen.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Töne

Beitrag von af0815 »

pluto hat geschrieben:
meintest Du die ACS-Komponente?
Komme im Moment nicht auf den Namen, werde aber nachher mal schauen.
Bei mir sind sie gelaufen (derzeit nicht im EInsatz) und Christian kannst du ansprechen, der betreut den Port (oder hat es gemacht).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Töne

Beitrag von creed steiger »

Du kannst dich auch hier:
http://breakoutbox.de/pascal/pascal.html" onclick="window.open(this.href);return false;

ein bissl umschauen.

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Töne

Beitrag von DAP »

creed steiger hat geschrieben:Du kannst dich auch hier:
http://breakoutbox.de/pascal/pascal.html" onclick="window.open(this.href);return false;

ein bissl umschauen.
Aber eine Sound-Komponente für Crosscompiling scheint es noch nicht zu geben.
Wenn ich das richtig gelesen habe, muss man portaudio auch erst compilieren
und dann als library einbinden.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Töne

Beitrag von carli »

DAP hat geschrieben:Hallo,

vielen Dank Heiner und Carli für eure Antworten.

Welche Unit muss ich einbinden, um SoundLibrary_Upload_Data benutzen zu können?
Ich werde mir erst einmal Bass anschauen.

Gruß DAP
Lies noch mal nach, SoundLibrary_Upload_Data ist kein Bezeichner, sondern ein Platzhalter.
In SDL_Mixer heißt die korresponierende Funktion "Mix_QuickLoad_RAW"
Bei Bass und OpenAL lass ich dich selber googeln (ist mir die Zeit zu schade)

Antworten