Witam.
Jak wygenerować dźwięk o określonej częstotliwości w Hz i długości w ms? Najlepiej za pomocą biblioteki bass, ale TToneGen odpada.
Z góry dziękuje
Witam.
Jak wygenerować dźwięk o określonej częstotliwości w Hz i długości w ms? Najlepiej za pomocą biblioteki bass, ale TToneGen odpada.
Z góry dziękuje
Windows.Beep()
maly186 napisał(a)
Windows.Beep()
Jak to zrobić na PC Speakerze to wiem, ale jak na głośnikach?
w bibliotece BASS masz duzo przykladow jak odtwarzac dzwiek wiec poszukaj tam
Bass.dll napisał(a)
w bibliotece BASS masz duzo przykladow jak odtwarzac dzwiek wiec poszukaj tam
nie odtwarzać, ale generować. wiec to co napisałeś mi nie potrzebne
Generowac tez mozesz
othello napisał(a)
Generowac tez mozesz
tylko jak? bo w przykładach nic nie ma na ten temat
Niestety ten artykul jeszcze powstaje...
Spróbuj komponentu: TALSignalGen z pakietu AudioLab_VCL_3_1 -
http://www.sharewareconnection.com/audiolab-vcl.htm
* SignalType - The signal type - Tone, Triangle, ChainSaw, Square.
* Phase - The initial Phase of the generated periodic signal.
* Amplitude - The Amplitude of the generated signal.
* Frequency - The Frequency of the generated periodic signal.
* Asymmetry - The Amplitude of generated triangle signal.
Na windzie zawsze możesz użyć MMSystem.pas i pisać prosto na waveout :) hehe
dzięki :-) w kwestii pisania na waveout to znalazłem kod do tego:
var
SR: integer;
L: integer;
F: single;
Hz: integer;
A: integer;
O: Array[0..1000] OF SmallInt;
T: integer;
begin
Hz := 900;
L := 1000;
A := 32760;
SR := 22000;
F :=(2*pi*Hz)/SR;
For T:=0 to L do
begin
O[T]:=Round(A*sin(F*T));
end;
(...)
tylko problemem jest to że gdy tablica O jest dynamiczna to nie działa
mam z tą biblioteką (AudioLab) problem.
gdy generuje dźwięk normalnie w procedurze/funkcji np:
ALSignalGen1.Start;
Sleep(DotLength);
ALSignalGen1.Stop;
to działa poprawnie. z kolei jak dam to w pętle
for i := 0 to Length(FText) do
begin
if FText[i] = '.' then
begin
ALSignalGen1.Start;
Sleep(DotLength);
ALSignalGen1.Stop;
end;
(...)
to wysypują się błedy na ntdll.dll
testowałem to i w aplikacji, i w nowy projekcie - efekt taki sam
Czy wie ktoś co z tym zrobic? Bo jest mi to bardzo potrzebne
Rozwiązanie problemu jest takie:
Dźwięk jest zapisywany bezpośrednio do wave out, problemem była zmiana długości dźwięku, przy dynamicznych tablicach nic nie było odtwarzane, rozwiązanie jak się okazało było bardzo proste. Zamiast tablic wystarczyło użyć klasy TMemoryStream. Oto kod:
procedure GenerateSound(Frequency, Duration: integer);
const
RiffID: string = 'RIFF';
WaveID: string = 'WAVE';
FmtID: string = 'fmt ';
DataID: string = 'data';
var
FStream: TMemoryStream;
FWHandle: THandle;
FWFE: TWaveFormatEx;
Header: TWaveHdr;
DataCount: integer;
SoundValue: Byte;
i: integer;
begin
FStream := TMemoryStream.Create;
FStream.Clear;
with FWFE do
begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1;
nSamplesPerSec := 44100;
wBitsPerSample := $0008;
nBlockAlign := 2;
nAvgBytesPerSec := 22050;
cbSize := 0;
end;
DataCount := (Duration * 44100) div 1000;
for j := 0 to DataCount - 1 do
begin
SoundValue := 127 + Trunc(127 * Sin(j * ((2 * Pi * Frequency) / 44100)));
FStream.WriteBuffer(SoundValue, SizeOf(Byte));
end;
with Header do
begin
lpData := FStream.Memory;
dwBufferLength := FStream.Size;
dwFlags := 0;
dwLoops := 0;
end;
if waveOutOpen(@FWHandle, WAVE_MAPPER, @FWFE, 0, 0, CALLBACK_NULL) = MMSYSERR_NOERROR then
begin
waveOutPrepareHeader(FWHandle, @Header, SizeOf(Header));
waveOutWrite(FWHandle, @Header, SizeOf(Header));
Sleep(Duration);
waveOutUnPrepareHeader(FWHandle, @Header, SizeOf(Header));
waveOutReset(FWHandle);
waveOutClose(FWHandle);
end;
FStream.Free;
end;
Do działania trzeba dodać do uses moduł MMSystem,
Pozdrawiam