12.08.2012, 13:44
|
Активный
|
|
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
|
|
Цитата:
Сообщение от poli-smen
Вот наваял (не проверял, но должно работать):
Код:
procedure WriteWav();
type
TChunkID = packed array [0..3] of Char;
THeader = packed record
ChunkID : TChunkID;
ChunkSize : Longword;
Format : TChunkID;
Subchunk1ID : TChunkID;
Subchunk1Size : Longword;
AudioFormat : Word;
NumChannels : Word;
SampleRate : Longword;
ByteRate : Longword;
BlockAlign : Word;
BitsPerSample : Word;
Subchunk2ID : TChunkID;
Subchunk2Size : Longword;
end;
var
Header: THeader;
NumSamples, BytsPerSample, Sample, I, J: Longword;
fs: TFileStream;
begin
NumSamples := ;// Здесь записываешь количество сэмплов у твоего звука
BytsPerSample := 2; // Размер сэмплов в байтах твоего звука. Обычно 1 или 2, но можно и 3 и 4.
Header.ChunkID := 'RIFF';
Header.Format := 'WAVE';
Header.Subchunk1ID := 'fmt ';
Header.Subchunk1Size := 16;
Header.AudioFormat := $0001; // Только PCM
Header.NumChannels := ;// Здесь записываешь число каналов своего звука. 1 - моно, 2 - стерео и т.д.
Header.SampleRate := ;// Здесь записываешь частоту дискретизации своего звука. Типа 8000, 44100 и т.п.
Header.BitsPerSample := BytsPerSample * 8;
Header.BlockAlign := Header.NumChannels * BytsPerSample;
Header.ByteRate := Header.SampleRate * Header.BlockAlign;
Header.Subchunk2ID := 'data';
Header.Subchunk2Size := NumSamples * Header.BlockAlign;
Header.ChunkSize := Header.Subchunk2Size + SizeOf(Header) - 8;
fs := TFileStream.Create(Имя файла в который выводить, fmCreate);
try
fs.WriteBuffer(Header, SizeOf(Header));
for I := 1 to NumSamples do
begin
for J := 1 to Header.NumChannels do
begin
Sample := ;{ Здесь читаешь очередной сэмпл оттуда, куда их записывал
твой конвертор "из относительного в абсолютное частотное звучание"}
fs.WriteBuffer(Sample, BytsPerSample);
end;
end;
finally
fs.Free;
end;
end;
|
Это очень даже неплохо! Должно работать, но есть некие вопросы: для начала хочу спросить чего не хватает, чтобы файл создавался сохранением через SaveDialog2, который я кинул на форму, а SaveDialog2 вызывался нажатием Button4Click, которую я тоже кинул на форму? Ну и второй вопрос содержится в коде (строка 58)
Код:
procedure TForm1.Button4Click(Sender: TObject);
procedure WriteWav();
type
TChunkID = packed array [0..3] of Char;
THeader = packed record
ChunkID : TChunkID;
ChunkSize : Longword;
Format : TChunkID;
Subchunk1ID : TChunkID;
Subchunk1Size : Longword;
AudioFormat : Word;
NumChannels : Word;
SampleRate : Longword;
ByteRate : Longword;
BlockAlign : Word;
BitsPerSample : Word;
Subchunk2ID : TChunkID;
Subchunk2Size : Longword;
end;
var
Header: THeader;
NumSamples, BytsPerSample, Sample, I, J: Longword;
fs: TFileStream;
begin
NumSamples := 22050;// Здесь записываешь количество сэмплов у твоего звука
BytsPerSample := 2; // Размер сэмплов в байтах твоего звука. Обычно 1 или 2, но можно и 3 и 4.
Header.ChunkID := 'RIFF';
Header.Format := 'WAVE';
Header.Subchunk1ID := 'fmt ';
Header.Subchunk1Size := 16;
Header.AudioFormat := $0001; // Только PCM
Header.NumChannels := 1;// Здесь записываешь число каналов своего звука. 1 - моно, 2 - стерео и т.д.
Header.SampleRate := 44100;// Здесь записываешь частоту дискретизации своего звука. Типа 8000, 44100 и т.п.
Header.BitsPerSample := BytsPerSample * 8;
Header.BlockAlign := Header.NumChannels * BytsPerSample;
Header.ByteRate := Header.SampleRate * Header.BlockAlign;
Header.Subchunk2ID := 'data';
Header.Subchunk2Size := NumSamples * Header.BlockAlign;
Header.ChunkSize := Header.Subchunk2Size + SizeOf(Header) - 8;
//fs := TFileStream.Create('Writen.wav', fmCreate);
try
fs.WriteBuffer(Header, SizeOf(Header));
for I := 1 to NumSamples do
begin
for J := 1 to Header.NumChannels do
begin
Sample := что сюда записать, чтобы для начала и для моего понимания, в файл шли теперешние сэмплы (не измененные)? ;{ Здесь читаешь очередной сэмпл оттуда, куда их записывал
твой конвертор "из относительного в абсолютное частотное звучание"}
fs.WriteBuffer(Sample, BytsPerSample);
if SaveDialog2.Execute then
Form1.fs.SaveToFile(Form1.SaveDialog2.FileName + '.wav');
fs.Free;
end;
end;
finally
end;
end;
end.
|