AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Konstante Töne

Ein Thema von ReDoX · begonnen am 12. Jan 2005 · letzter Beitrag vom 12. Jan 2005
Antwort Antwort
ReDoX
(Gast)

n/a Beiträge
 
#1

Konstante Töne

  Alt 12. Jan 2005, 14:37
Hi,
Ich habe ein Problem und zwar erzeuge ich mit dieser procedure.
Das Töne erzeugen klappt auch schon gut aber wenn ich einen durchgehenden tön erzeugen will (TTimer) klappt das nicht so wie ich will. Wenn ich
MakeSound(1200, 100, 127); das in einen Timer mit dem Interval 1 schreibe gibt es immer pausen zwischen den Tönen wie kann ich das vermeiden?
Mfg MrScholz
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Konstante Töne

  Alt 12. Jan 2005, 14:40
Hi,

MakeSound(1200, 100, 127); Das ist auch kein Wunder .

Der zweite Parameter ( 100 ) gibt an, wielange der Ton erzeugt werden soll. In dem Fall 100 Millisekunden.

Wenn du den Ton 1 Minuten lang haben willst, dann musste halt 10000 einsetzen
  Mit Zitat antworten Zitat
ReDoX
(Gast)

n/a Beiträge
 
#3

Re: Konstante Töne

  Alt 12. Jan 2005, 14:46
Ja das ist schon klar aber ich will den Ton verändern können während der Ton abgespielt wird
deswegen die länge 100
Mfg MrScholz
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Konstante Töne

  Alt 12. Jan 2005, 15:02
Ich hab das mal so gemacht:
Delphi-Quellcode:
unit Unit1;

interface

uses
  [...], MMSystem;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
  public
    wData: packed array of SmallInt;
    wDataToSend: WAVEHDR_TAG;
    wFormat: TWAVEFORMATEX;
    wo: HWAVEOUT;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  res: MMResult;
  i: Integer;
begin
  SetLength(wData, IrgendeineLaenge); // in wData kommen die zu spielenden Samples

  with wFormat do
  begin
    // Das wird ein PCM-Wave (RAW), Mono, 44.1 kHz, 16 Bit
    wFormatTag := WAVE_FORMAT_PCM;
    nChannels := 1;
    nSamplesPerSec := 44100;
    nAvgBytesPerSec := 2*nSamplesPerSec;
    wBitsPerSample := 16;
    nBlockAlign := (nChannels*wBitsPerSample) div 8;
    cbSize := SizeOf(TWAVEFORMATEX);
  end;

  res := waveOutOpen(@wo, WAVE_MAPPER, @wFormat, 0, 0, 0);
  case res of
    MMSYSERR_ALLOCATED : ShowMessage('Specified resource is already allocated.');
    MMSYSERR_BADDEVICEID: ShowMessage('Specified device identifier is out of range.');
    MMSYSERR_NODRIVER : ShowMessage('No device driver is present.');
    MMSYSERR_NOMEM : ShowMessage('Unable to allocate or lock memory.');
    WAVERR_BADFORMAT : ShowMessage('Attempted to open with an unsupported waveform-audio format.');
    WAVERR_SYNC : ShowMessage('The device is synchronous but waveOutOpen was called without using the WAVE_ALLOWSYNC flag.');
  end;

  with wDataToSend do
  begin
    lpData := @wData[0];
    dwBufferLength := Length(wData)*SizeOf(SmallInt);
    dwFlags := WHDR_BEGINLOOP or WHDR_ENDLOOP;
    dwLoops := 1000;
  end;

  res := waveOutPrepareHeader(wo, @wDataToSend, SizeOf(WAVEHDR_TAG));
  case res of
    MMSYSERR_INVALHANDLE: ShowMessage('Specified device handle is invalid.');
    MMSYSERR_NODRIVER : ShowMessage('No device driver is present.');
    MMSYSERR_NOMEM : ShowMessage('Could not allocate Memory.');
  end;

  // Einfach mal Rauschen reinschreiben
  for i := 0 to Length(wData)-1 do
  begin
    wData[i] := random(High(SmallInt)*2) - High(SmallInt);
  end;

  waveOutWrite(wo, @wDataToSend, SizeOf(WAVEHDR));
  waveOutRestart(wo); // und abspielen
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  waveOutClose(wo); // Wichtig! Am Ende das Device schließen.
end;
Gruss,
Fabian

\\Edit: Zum Verändern den Output mit "waveOutPause(wo);" anhalten, wData neu befüllen, das "waveOutWrite()" erneut ausführen, und mit "waveOutRestart(wo);" weiter wiedergeben. Dabei kann es allerdings, je nach Bufferlänge und Aufwand des Befüllens, auch zu kleinen Aussetzern kommen. Da muss man dann ein wenig rumspielen, oder wie ich, es einfach hin nehmen
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
ReDoX
(Gast)

n/a Beiträge
 
#5

Re: Konstante Töne

  Alt 12. Jan 2005, 17:21
Danke für die Antwort
aber dann muss ich mein ganze programm umstellen ich gucke mal ob ich meinen source so hinbekomme das es funktioniert.
Mfg MrScholz
PS: Wer eine andere idee hat bitte melden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz