Dzwięki w Delphi
Adam Boduch
Funkcja PlaySound
Odtwarzanie dźwięków w Delphi nie musi następować bezpośrednio z komponentu MediaPlayer. Do odgrywania plików .wav wystarczy funkcja PlaySound();
Dodaj najpierw do sekcji uses słowo MMSystem
Struktura funkcji
PlaySound(pszSound, PCHar; hmod: HMODULE; fdwSound: DWORD);
Oto wyjaśnienie jej parametrów:
- pszSound - Oznacza nazwę pliku lub pozycji rejestru.
- hmod - jeżeli plik nie jest ładowany z zasobu ta wartość powinna mieć wartość 0.
- fdwSound - określa tzw. flagi. W tym miejscu możesz wstawić:
- SND_ALIAS - pozycja jest odgrywana z rejestru.
- SND_FILMENAME - plik odgrywany jest z dysku.
- SND_RESOURCE - plik odgrywany jest z zasobu.
- SND_PURGE - Polecenie to kończy odtwarzanie plików muzycznych.
- SND_ASYNC - odtwarzanie odbywa się równocześnie z działaniem aplikcaji.
- SND_LOOP - odtwarzanie następuje w sposób ciągły.
Odtwarzanie instniejącego pliku
Jeżeli chcesz odtworzyć teraz jakiś plik dźwiękowy z dysku to robisz tak:
PlaySound('C:\plik.wav', 0, SND_FILENAME);
I to wszystko! Jedna linia odtworzy plik C:\plik.wav.
Zatrzymywanie odtwarzania
Żeby wyciszyć wszytkie dźwięki tj. wyłączyć je musisz zrobić coś takiego:
PlaySound(nil, 0, SND_PURGE);
Dźwięki systemowe
```delphi PlaySound('SystemStart', 0, SND_ALIAS); ```Wszystkie dźwięki wraz z ich angielskimi odpowiednikami można znaleźć w rejestrze pod kluczem:
HKEY_CURRENT_USER\AppEvents\EventLabels
Może się jednak zdarzyć, że dźwięk nie uruchamiania systemu nie jest przypisany. Wtedy odtworzony zostanie standardowy dźwięk: ding.wav.
Aby temu zapobiedz musisz zastosować znacznik SND_NODEFAULT. Będzie to wyglądało tak:
PlaySound('SystemStart', 0, SND_ALIAS or SND_NODEFAULT);
Program MMPlayer
Na podstawie tego wszystkiego można napisać mały programik wczytujący z dysku plik .wav i odtwarzający go. Daj na formę dwa BitButtony z ikonami stop i play. Ustaw ich właściwości Align na alRight.Wstaw:
*BitButton z Ikonką Play i Align na alRight
*BitButton z Ikonką Stop i Align na alRight
*OpenDialog z Filtrem do *.wav
Ustaw:
*Szerokość formy na 235
*Wysokość formy na 47
*BorderStyle na bsToolWindow
Kod programu (z góry przepraszam za Form2 zamiast Form1)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MMSystem, StdCtrls, Buttons;
type
TForm2 = class(TForm)
Label1: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
OpenDialog: TOpenDialog;
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
NazwaPliku : String;
implementation
{$R *.dfm}
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
if NazwaPliku <> '' then
begin
PlaySound(PWideChar(NazwaPliku), 0, SND_FILENAME or SND_ASYNC)
end
else
begin
if OpenDialog.Execute then
begin
NazwaPliku := OpenDialog.FileName;
OpenDialog.FileName := '';
Label1.Caption := ExtractFileName(NazwaPliku);
PlaySound(PWideChar(NazwaPliku), 0, SND_FILENAME or SND_ASYNC);
end;
end;
end;
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
PlaySound(nil, 0, SND_PURGE);
end;
procedure TForm2.FormShow(Sender: TObject);
begin
Form2.Width := 235;
Form2.Height := 47;
Form2.BorderStyle := bsToolWindow;
if ParamStr(1) = '' then
NazwaPliku := ''
else
begin
NazwaPliku := ParamSTR(1);
PlaySound(PWideChar(NazwaPliku), 0, SND_FILENAME or SND_ASYNC);
end;
end;
end.
To by było na tyle jeśli chodzi o funkcję PlaySound.
Komponent MediaPlayer
Komponent MediaPlayer jest rozbudowanym komponentem do odtwarzania filmów, plików .mid ,.wav, *.avi. Na samym początku należy przypisać wartość FileName do pliku, który masz zamiar odtwarzać. Następnie należy go otworzyć no i odegrać:
with MediaPlayer do
begin
FileName := 'muzyka.mid';
Open; // Otwarcie...
Play; // Odtwarzanie...
end;
Przy pomocy tego komponentu można także nagrywać dźwięki. Oto przykład:
with MediaPlayer do
begin
FileName := 'test.wav'; // nadanie nazwy
Open;
StartRecording; // rozpoczęcie nagrywania
end;
Aby to teraz zatrzymać:
with MediaPlayer do
begin
Stop; // zatrzymanie nagrywania
FileName := 'plik.wav'; // nadanie nowej nazwy pliku
Save; // zapisanie...
Close; // zamknięcie
end;
Tu tylko odtwarzanie - a ja polecę mój artykuł na temat nagrywania dźwięku w Delphi:
http://lukashp.pl/Artykul/Programowanie/Delphi/delphi-nagrywanie_dzwieku
no ale to działa jak się chce odtworzyć jeden plik... a jeśli chce odtworzyć dwa pliki na raz to jak miałbym to zrobić? A tak konkretnie jak otworzyć port, odegrać dźwięk no i potem ten port zamknąć?
{---------------------------------------------}
i:=1;
repeat
if sciezka[i]<>'' then label1.caption:=label1.Caption+sciezka[i];
if sciezka[i]='' then label1.caption:='';
i:=i+1;
until (sciezka[i]='')and(sciezka[i]<>' ');
{-------------------------------------------------------}
jest to procedura wyciągająca ze ścieżki sama nazwę odtważanego obiektu czyli krutko mówiac tytuł, bo po co komu cała ścieżka z nazwą widoczna
Pozwoliłem sobie poprawić jedną literówkę w kodzie ;)
a jak zrobić żeby otwarzzało w pętli??
Wstawiasz komponent MediaPlayer (System),
dajesz Visible na False, potem 2 procedury:
MediaPlayer.FileName:='data\muza\cmentarz.mid';
MediaPlayer.Open;
MediaPlayer.Play;
Paszczak
Jak odgrywać dźwięki midi w programie??
Npiasz mi Adaś, czy to ty piszesz sobie te oceny, czy gdzieś da się dać swoją??