Логин:     Забыли пароль?
 
Пароль:   Регистрация

Форум / Программирование - Как создать звук?  

Как создать звук?


Страницы: «1» «2»
IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #1] ? 24 апреля 2012, 02:10
Здравствуйте!
У меня есть такой вопрос. Подскажите пожалуйста ответ на него.
Дело в том, что я звук раньше не пытался создать в Delphi. и поэтому не знаю ни процедур, ни функций для этого...
У меня имеется обычный массив. Мне из него надо создать звуковую дорожку по герцево. Т. е. massiv[i]= 1 герц звука. и все это соответственно циклом заполняется и получается звуковая дорожка.
Абсолютно не важно что это будет за звук, что там играть будет, фактически там ничего играть и не будет в итоге, должен получиться просто набор быстрых пиков или его еще называют белым шумом. Мне не важна высота звука. в общем должно получиться простое заполнение звука, где-то есть 1 пик длинною в 1 герц, а дальше допустим его нет, потом снова есть и тд.
Сможет ли мне кто-то подсказать какими командами этого добиться?
Повторюсь, что я раньше не пытался создавать звук в делфи, поэтому не знаю ни одной подобной команды и обращаюсь за помощью...

Gooddy
Gooddy
3-ий класс
Сообщения: 84
[Сообщение #2] 24 апреля 2012, 06:45
Миди подойдёт? Правда там погерцово вроде нельзя, но точно можно нотами.

Чисти код! Чисти код! Чисти код!
IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #3] 24 апреля 2012, 13:49
нет, нотами не нужно... только по каждому герцу...

IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #4] 24 апреля 2012, 14:13
Буду благодарен, если для начала расскажите, как хотя бы создать wav самый простой, заголовок его и прочее или ссылку на литерату напишете.

bugmenot
bugmenot
3-ий класс
Сообщения: 88
[Сообщение #5] 25 апреля 2012, 15:09
Синусоидой заполни массив и будет звук.

виконання програми розпочинається з того самого мiсця, де призупинилося.

IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #6] 25 апреля 2012, 16:17
bugmenot, я знаю, что нужно сдеать, я не знаю как...

IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #7] 25 апреля 2012, 17:00
какой параметр отвечает за высоту звука?

Gooddy
Gooddy
3-ий класс
Сообщения: 84
[Сообщение #8] 26 апреля 2012, 08:22
bugmenot: человека интересует как массив перевести в wav-файл.
IgoRek125: по самому вопросу я ответить не могу - не знаю.
Но для чего это нужно? Может можно обойтись без генерации шума?

Чисти код! Чисти код! Чисти код!
IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #9] 26 апреля 2012, 14:21
Gooddy в общем-то я могу рассказать, но лучше б наверное показать)).. когда сумею сделать, но я кое-чего и добился)
Ну в принцепи вот, что у меня получилось.
только понять не могу, почему у меня в конечном файле скорость, с которой проигрывается звук, эмм... как бы сказать.. секунды вдвое , если даже не втрое, быстрее тикают???

[PHP]
ZvukData = Record
wSamplesPerSec : Cardinal;
wAvgBytesPerSec: Cardinal;
wBitsPerSample : WORD;
wChannels : WORD;
Data : TMemoryStream;
end;


TWaveHeaderChank = packed record
wFormatTag : Smallint;
wChannels : WORD;
wSamplesPerSec : Cardinal;
wAvgBytesPerSec: Cardinal;
wBlockAlign : WORD;
wBitsPerSample : WORD;
wcbSize : WORD;
end;


..........................................................................


Function WriteWave(FileName : AnsiString; data : ZvukData) : WORD;
var
f : TFileStream;
wFileSize : Cardinal;
wChankSize : Cardinal;
ID : array[0..3] of Char;
Header : TWaveHeaderChank;
Begin
f:=nil;
Try
f := TFileStream.Create(FileName, fmCreate);
f.Seek(0, soFromBeginning);
Header.wFormatTag := 1;
Header.wChannels := data.wChannels;
Header.wSamplesPerSec := data.wSamplesPerSec;
Header.wBlockAlign := data.wChannels * (data.wBitsPerSample div 8);
Header.wAvgBytesPerSec:= data.wSamplesPerSec * Header.wBlockAlign;
Header.wBitsPerSample := data.wBitsPerSample;
Header.wcbSize := 0; //iao aiiieieoaeuiiai aeiea

ID := 'RIFF';
f.WriteBuffer(ID, 4);
wFileSize := 0;
f.WriteBuffer(wFileSize, 4);
ID := 'WAVE';
f.WriteBuffer(ID, 4);

ID := 'fmt ';
f.WriteBuffer(ID, 4);
wChankSize := SizeOf(Header);
f.WriteBuffer(wChankSize, 4);
f.WriteBuffer(Header, SizeOf(Header));

ID := 'data';
f.WriteBuffer(ID, 4);
wChankSize := data.Data.Size;
f.WriteBuffer(wChankSize, 4);
data.Data.Seek(0, soFromBeginning);
f.CopyFrom(data.Data, data.Data.Size);

f.Seek(SizeOf(ID), soFromBeginning);
wFileSize := f.Size - SizeOf(ID) - SizeOf(wFileSize);
f.Write(wFileSize, 4);
except
f.Free;
end;

end;






procedure TForm1.Button7Click(Sender: TObject);
var
x,y,liniya: integer;
r: ZvukData;
d: SmallInt;
begin
try
with r do begin
wSamplesPerSec:=Chastota;
wBitsPerSample:=8;
wChannels:=1;
Data:=TMemoryStream.Create;
Data.Seek(0,soFromBeginning);
end;
liniya:=-1;
For y:=0 to Image1.Height-1 do begin
For x:=0 to Image1.Width-1 do begin
If massiv[x,y]=True then begin
liniya:=liniya+1;
d:=500; ///aeaeii yoi aunioa caoea a aaoeaaeao
r.Data.WriteBuffer(d, 1);
end
else begin
d:=-128;
r.Data.WriteBuffer(d, 1);
end;
end;
end;

WriteWave(FileName, r);

finally
r.Data.Free;
end;
ShowMessage('..... Oaee aeaaiiieo?ii nicaai! .....');
end;
[/PHP]

bugmenot
bugmenot
3-ий класс
Сообщения: 88
[Сообщение #10] 26 апреля 2012, 15:09

Цитата (IgoRek125):

я знаю, что нужно сдеать, я не знаю как...

Я думаю, надо писать код для этого...

Цитата (Gooddy):

как массив перевести в wav-файл

Тащемта это многоформатный контейнер, если что.

виконання програми розпочинається з того самого мiсця, де призупинилося.


Страницы: «1» «2» (всего страниц: 2, текущая: 1)
Всего сообщений: 15 (сейчас показаны: с 1 по 10)

Перейти в раздел:


 © 2004 - 2024, Delphi.int.ru
Версия форума: 1.10 (19.01.2010)
RSS Delphi.int.ru Expert Код
Выполнено за 0.02 сек.
Обратная связь