Generowanie dźwięku o określonej częstotliwości i długości

0

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

0

Windows.Beep()

0
maly186 napisał(a)

Windows.Beep()

Jak to zrobić na PC Speakerze to wiem, ale jak na głośnikach?

0

w bibliotece BASS masz duzo przykladow jak odtwarzac dzwiek wiec poszukaj tam

0
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

0

Generowac tez mozesz

0
othello napisał(a)

Generowac tez mozesz

tylko jak? bo w przykładach nic nie ma na ten temat

0

Biblioteka BASS

Niestety ten artykul jeszcze powstaje...

0

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. 

user image

0

Na windzie zawsze możesz użyć MMSystem.pas i pisać prosto na waveout :) hehe

0

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

0

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

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1