Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Ausgabe von Soundatein, bräuchte hilfe (https://www.delphipraxis.net/57684-ausgabe-von-soundatein-braeuchte-hilfe.html)

Bebbo86 25. Nov 2005 08:04


Ausgabe von Soundatein, bräuchte hilfe
 
Hallo.

Ich mache gerade eine Projekt in der Schule, in dem ich ein Morseprogramm schreiben will, und das mit Tonausgabe. Wie kann ich die Tonausgabe machen? Kann mir das bitte jemand sagen?

Danke schon Mal

Bebbo86

tigerman33 25. Nov 2005 08:18

Re: Ausgabe von Soundatein, bräuchte hilfe
 
Zunächst mal herzlich Willkommen in der Delphi-PRAXIS!! :dp: :cheers:

IMHO gibt es in der Unit mmsystem eine Routine PlaySound, die genau das macht, was du suchst.

PS: Ich glaub aber, du bist im falschen Forum gelandet. Hat ja nicht wirklich was mit der Delphi-IDE zu tun, oder? :wink:

Daniel Schuhmann 25. Nov 2005 08:56

Re: Ausgabe von Soundatein, bräuchte hilfe
 
Wenns über den PC-Speaker ausgegeben werden soll, genügt

Delphi-Quellcode:
procedure Blaa;
  Windows.Beep(500, 1000);
end;
Die 500 ist die Frequenz in Hertz, die 1000 die Länge in ms (1 Sekunde).

igel457 25. Nov 2005 09:09

Re: Ausgabe von Soundatein, bräuchte hilfe
 
Ich wollte mal auch so was schrieben, hab das folgender maßen, mit einem Objekt gemacht:
Delphi-Quellcode:
const
    Mono      : Word = $0001;
    RiffId    : string = 'RIFF';
    WaveId    : string = 'WAVE';
    FmtId     : string = 'fmt ';
    DataId    : string = 'data';

type
  TWaveFile = class
    WaveFormatEx : TWaveFormatEx;
    MS          : TMemoryStream;
    TempInt,
    DataCount,
    RiffCount   : integer;
    SoundValue  : byte;
    w           : double; // omega ( 2 * pi * frequency)
    duration    : integer;
    samplerate  : integer;
  constructor Create;
  procedure AddHeader(HSampleRate,HDuration:Integer);
  procedure AddData (Freq,HDuration:Integer);
  procedure SaveToFile(FileName:String);
  procedure Play;
  destructor Free;
end;

constructor TWaveFile.Create;
begin
  inherited Create;
  MS := TMemoryStream.Create;
  samplerate := 11025;
end;

destructor TWaveFIle.Free;
begin
    MS.Free;
end;

procedure TWaveFile.AddHeader(HSampleRate,HDuration:integer);
begin
  duration := hduration;
  samplerate := HSampleRate;
  with WaveFormatEx do begin
    wFormatTag := WAVE_FORMAT_PCM;
    nChannels := Mono;
    nSamplesPerSec := SampleRate;
    wBitsPerSample := $0008;
    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
    nBlockAlign := (nChannels * wBitsPerSample) div 8;
    cbSize := 0;
  end;
  with MS do begin

    {Calculate length of sound data and of file data}
    DataCount := (Duration *  SampleRate) div 1000; // sound data
    RiffCount := Length(WaveId)
                 + Length(FmtId) + SizeOf(DWord)
                 + SizeOf(TWaveFormatEx)
                 + Length(DataId) + SizeOf(DWord)
                 + DataCount; // file data
    {write out the wave header}
    Write(RiffId[1], 4);                       // 'RIFF'
    Write(RiffCount, SizeOf(DWord));           // file data size
    Write(WaveId[1], Length(WaveId));          // 'WAVE'
    Write(FmtId[1], Length(FmtId));            // 'fmt '
    TempInt := SizeOf(TWaveFormatEx);
    Write(TempInt, SizeOf(DWord));             // TWaveFormat data size
    Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
    Write(DataId[1], Length(DataId));          // 'data'
    Write(DataCount, SizeOf(DWord));           // sound data size
  end;
end;

procedure TWaveFile.AddData(Freq,HDuration:integer);
var i :integer;
begin
    w := 2 * Pi * Freq; // omega
    for i := 0 to hduration*samplerate div 1000 - 1 do begin
      // wt = w *i /SampleRate
      SoundValue := 127 + trunc(127 * sin(i * w / SampleRate));
      MS.Write(SoundValue, SizeOf(Byte));
    end;
end;

procedure TWavefile.SaveToFile(FileName:String);
begin
    MS.Seek(0, soFromBeginning);
    MS.SaveToFile(Filename);
end;

procedure TWaveFile.Play;
begin
    sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
end;
Nun kannst musst du deinen Text, oder was auch immer erst einmal in "Morsecodes" umwandeln. Dann kanns du zu der Wave feile die entsprechenden Töne hinzufügen.

Ein Beispiel:
Du möchtest eine Frequenz erzeugen von 400 hz und 1 sekunde dann
Delphi-Quellcode:
wavefile := TWaveFile.Create;
wavefile.addheader(44100,1000);
wavefile.adddata(400,1000);
wavefile.play;
ich hoffe das ist was du meinst!
wenn du eine pause machen willst : wavefile.adddata(0,length)

Bebbo86 27. Nov 2005 12:09

Re: Ausgabe von Soundatein, bräuchte hilfe
 
Ich möcht mich dann mal bedanken für die antworten hat mir sehr geholfen :-D :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz