![]() |
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 |
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: |
Re: Ausgabe von Soundatein, bräuchte hilfe
Wenns über den PC-Speaker ausgegeben werden soll, genügt
Delphi-Quellcode:
Die 500 ist die Frequenz in Hertz, die 1000 die Länge in ms (1 Sekunde).
procedure Blaa;
Windows.Beep(500, 1000); end; |
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:
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.
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; Ein Beispiel: Du möchtest eine Frequenz erzeugen von 400 hz und 1 sekunde dann
Delphi-Quellcode:
ich hoffe das ist was du meinst!
wavefile := TWaveFile.Create;
wavefile.addheader(44100,1000); wavefile.adddata(400,1000); wavefile.play; wenn du eine pause machen willst : wavefile.adddata(0,length) |
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