<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=243776&amp;view=findpost&amp;p=2115494</guid>
        <pubDate>Fri, 14 Nov 2008 11:06:10 +0000</pubDate>
        <title>Сохранение писка в файле</title>
        <link>https://forum.sources.ru/index.php?showtopic=243776&amp;view=findpost&amp;p=2115494</link>
        <description><![CDATA[ttiger: <strong class='tag-b'>Romtek</strong>, хороший научный подход.<br>
Особенно ценно указание источников пояснения логики действий. Соглашусь с тобой.]]></description>
        <author>ttiger</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=243776&amp;view=findpost&amp;p=2057568</guid>
        <pubDate>Fri, 29 Aug 2008 09:08:15 +0000</pubDate>
        <title>Сохранение писка в файле</title>
        <link>https://forum.sources.ru/index.php?showtopic=243776&amp;view=findpost&amp;p=2057568</link>
        <description><![CDATA[Romtek: Эту статью стоит оформить по таким правилам:<ol class="tag-list" type="I"><li>Вводная часть, состоящая из &quot;истории&quot; и цели статьи. Почему выбран тот или иной аспект.</li><li>Теоретическая выкладка с формулами и ссылками на источники литературы и сайтов. Если неполно даётся материал, то давать пояснение откуда можно его взять и прочитать.</li><li>Описание возможных трудностей и &quot;подводных камней&quot;.</li><li>Ядро статьи.</li><li>Подведение итогов.</li><li>Список источников (References).</li></ol><br>
Возможно, со мной не согласятся, но мне именно так видится интересная статья.]]></description>
        <author>Romtek</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=243776&amp;view=findpost&amp;p=2019869</guid>
        <pubDate>Mon, 21 Jul 2008 08:42:40 +0000</pubDate>
        <title>Сохранение писка в файле</title>
        <link>https://forum.sources.ru/index.php?showtopic=243776&amp;view=findpost&amp;p=2019869</link>
        <description><![CDATA[Останній герой України: Возможно, лучше бы область данных не размещать в динамическом массиве, а писать сразу в файл. Таким образом отпадет необходимость в пояснениие относительно динамических массивов и ограничение в размере файла для 16-битных систем.]]></description>
        <author>Останній герой України</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=243776&amp;view=findpost&amp;p=2017101</guid>
        <pubDate>Thu, 17 Jul 2008 15:25:32 +0000</pubDate>
        <title>Сохранение писка в файле</title>
        <link>https://forum.sources.ru/index.php?showtopic=243776&amp;view=findpost&amp;p=2017101</link>
        <description><![CDATA[ZenIA: Да именно «писка», я не ошибся и опишу как сохранить в звуковом файле формата WAV (стандарт OS Windows) монотонный моно звук с прямоугольным импульсом, частотой <strong class='tag-b'>n</strong> и длительностью звучания в микросекундах <strong class='tag-b'>L</strong>.<br>
Для начала уясним, что собой представляют звуковые данные. Процесс цифровой записи звука можно абстрактно представить таким образом: под действием движения воздуха, в цепи микрофона возникают изменения силы тока, а компьютер с определенной частотой, именуемой частотой дискретизации, производит запись значения силы тока в относительных единицах от (в нашем случае от 0 до 255). Воспроизведение звука происходит в обратном порядке – с частотой дискретизации на звуковоспроизводящее устройство подается напряжение, сила которого зависит от значения, записанного в звуковом файле.<br>
Немного формальностей. WAV файла состоит из двух частей заголовка и области данных. Заголовок в нашем простейшем случае будет состоять из трех последовательно вложенных друг в друга заголовков (chunks). Первый — свойственный для файлов формата RIFF, представляет собой запись из трех полей: символов «RIFF», размера области данных в байтах (без учета размера самого заголовка), и второго «чунка».<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">tSoundFile=record</div><div class="code_line">Caption:array[0..3]of char;</div><div class="code_line">Size:longint;</div><div class="code_line">Data:tSoundFormat;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Второй «чунк», элемент WAV-файлов, состоит из четырех частей: <br>
•	слова «WAVE», <br>
•	слова «fmt »(три буквы и пробел в конце), <br>
•	32 битной переменной, хранящей размер следующего поля, <br>
•	переменной типа tpcmWaveFormat, описанной в файле MMSystem.pas<br>
•	третього „чунка”.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">tSoundFormat=record</div><div class="code_line">Caption1,Caption2:array[0..3]of char;</div><div class="code_line">Size:longint;</div><div class="code_line">Format:tpcmWaveFormat;</div><div class="code_line">Data:tSoundData;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
тип <strong class='tag-b'>tpcmWaveFormat</strong> представляет собой record из двух записей<br>
<strong class='tag-b'>wf: TwaveFormat</strong> и <strong class='tag-b'>wBitsPerSample: Word.</strong> Вторая указывает, сколько бит занимает одна выборка сигнала (в нашем случае 8). Первая – тип record, описывающий формат звуковых данных:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">TWaveFormat = record</div><div class="code_line">wFormatTag: Word;</div><div class="code_line">nChannels: Word;</div><div class="code_line">nSamplesPerSec: Longint;</div><div class="code_line">nAvgBytesPerSec: longint;</div><div class="code_line">nBlockAlign: Word;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<strong class='tag-b'>wFormatTag</strong> – тип звуковых данных должен быть равен константе WAVE_FORMAT_PCM<br>
<strong class='tag-b'>nChannels</strong> – количество каналов, для моно звука – 1.<br>
<strong class='tag-b'>NsamplesPerSec</strong> — частота дискретизации.<br>
<strong class='tag-b'>NavgBytesPerSec</strong> — количество байт передаваемое на воспроизведение в секунду.<br>
<strong class='tag-b'>NblockAlign</strong> – размер одной выборки в байтах.<br>
<br>
Третий «чунк» тоже имеет тип record и содержит слово “data”, размер области данных и массив данных.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">tSoundData=record</div><div class="code_line">Caption:array [0..3]of char;</div><div class="code_line">Size:longint;</div><div class="code_line">Data:array[0..0]of byte;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
В написании кода будем использовать следующие константы:<br>
<strong class='tag-b'>FDiscretisation=44100;</strong> – частота дискретизации (рекомендуется брать только стандартеые значения: 8 000 Гц, 11 025 Гц, 12 000 Гц, 16 000 Гц, 22 050 Гц, 24 000 Гц, 32 000 Гц, 44 100 Гц, 48 000 Гц)<br>
<strong class='tag-b'>Canals=1;</strong>– количесво каналов (у нас монозвук)<br>
<strong class='tag-b'>Discret=8;</strong> – количество бит, занимаемых одной выборкой сигнала для одного канала<br>
<br>
Переменные: <br>
<strong class='tag-b'>SoundFile:pSoundFile;</strong> – создадим наш файл сперва в динамической памяти.<br>
<strong class='tag-b'>SizeOfData:longint;</strong> – размер массива данных<br>
<strong class='tag-b'>SizeOfFile: longint;</strong> – размер файла.<br>
<strong class='tag-b'>I: longint;</strong>  – переменная-счетчик для цикла.<br>
<br>
По-е-ха-ли.<br>
Размер области данных у нас будет:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SizeOfData:=Duration*fDiscretisation*(Discret shr 3) div 1000;</div></ol></div></div></div></div><br>
Размер файла – размер заголовка + длина массива данных-1 выборка.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SizeOfFile:=sizeOf(tSoundFile)+ SizeOfData-Discret shr 3;</div></ol></div></div></div></div><br>
Выделяем память под файл:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">GetMem(SoundFile,SizeOfFile);</div></ol></div></div></div></div><br>
<br>
Заполняем заголовок<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SoundFile^.Size:=SizeOfFile-SizeOf(SoundFile^.Caption)-SizeOf(SoundFile^.Size);</div><div class="code_line">SoundFile^.Data.Size:=SizeOf(tpcmWaveFormat);</div><div class="code_line">SoundFile^.Data.Data.Size:=SizeOfData;</div><div class="code_line">&nbsp;</div><div class="code_line">SoundFile^.Caption:=&#39;RIFF&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">SoundFile^.Data.Caption1:=&#39;WAVE&#39;;</div><div class="code_line">SoundFile^.Data.Caption2:=&#39;fmt &#39;;</div><div class="code_line">SoundFile^.Data.Format.wBitsPerSample:=Discret;</div><div class="code_line">SoundFile^.Data.Format.wf.wFormatTag:=WAVE_FORMAT_PCM;</div><div class="code_line">SoundFile^.Data.Format.wf.nChannels:=Canals;</div><div class="code_line">SoundFile^.Data.Format.wf.nSamplesPerSec:=FDiscretisation;</div><div class="code_line">SoundFile^.Data.Format.wf.nAvgBytesPerSec:=FDiscretisation*Canals*(Discret shr 3);</div><div class="code_line">SoundFile^.Data.Format.wf.nBlockAlign:=(Canals*Discret)shr 3;</div><div class="code_line">&nbsp;</div><div class="code_line">SoundFile^.Data.Data.Caption:=&#39;data&#39;;</div></ol></div></div></div></div><br>
<br>
Итак, с заголовком закончили и переходим к заполнению сегмента данных. Волна нашего звука на осциллографе имела бы прямоугольный вид, другими словами, один промежуток времени длительностью 1/<strong class='tag-b'>n</strong> на звуковоспроизводящее устройство будет подаваться максимальный сигнал, а следующий равный по длительности промежуток нулевое напряжение.<br>
Итак, заполнение сегмента данных будим производить следующим образом: если конкретная выборка была бы сделана в четный промежуток времени 1/<strong class='tag-b'>n</strong>, то оно равно 255, иначе оно равно 0:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">for i:=0 to SoundFile^.Data.Data.Size-1 do</div><div class="code_line">if Round(Frequenz*i/fDiscretisation) mod 2=0 then</div><div class="code_line">SoundFile^.Data.Data.Data[i]:=255</div><div class="code_line">else</div><div class="code_line">SoundFile^.Data.Data.Data[i]:=0;</div></ol></div></div></div></div><br>
<br>
Осталось лишь самым банальным образом переписать наш звуковой файл из динамической памяти в файл и освободить динамическую память.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Assign(F,FileName);</div><div class="code_line">ReWrite(F,1);</div><div class="code_line">BlockWrite(F,SoundFile^,SizeOfData);</div><div class="code_line">Close(F);</div><div class="code_line">FreeMem(SoundFile);</div></ol></div></div></div></div><br>
<br>
Полный листинг выглядит так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">program BeepGenerator;</div><div class="code_line">&nbsp;</div><div class="code_line">{$R-}{$A-}</div><div class="code_line">const</div><div class="code_line">WAVE_FORMAT_PCM &nbsp; &nbsp;= 1;</div><div class="code_line">type</div><div class="code_line">TWaveFormat = record</div><div class="code_line">wFormatTag: Word;</div><div class="code_line">nChannels: Word;</div><div class="code_line">nSamplesPerSec: Longint;</div><div class="code_line">nAvgBytesPerSec: longint;</div><div class="code_line">nBlockAlign: Word;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">TPCMWaveFormat=record</div><div class="code_line">wf: TWaveFormat;</div><div class="code_line">wBitsPerSample: Word;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">tSoundData=record</div><div class="code_line">Caption:array [0..3]of char;</div><div class="code_line">Size:longint;</div><div class="code_line">Data:array[0..0]of byte;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">tSoundFormat=record</div><div class="code_line">Caption1,Caption2:array[0..3]of char;</div><div class="code_line">Size:longint;</div><div class="code_line">Format:tpcmWaveFormat;</div><div class="code_line">Data:tSoundData;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">pSoundFile=^tSoundFile;</div><div class="code_line">tSoundFile=record</div><div class="code_line">Caption:array[0..3]of char;</div><div class="code_line">Size:longint;</div><div class="code_line">Data:tSoundFormat;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">FDiscretisation=44100;</div><div class="code_line">Canals=1;</div><div class="code_line">Discret=8;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure SaveBeep(FileName:string;Frequenz,Duration:integer);</div><div class="code_line">var</div><div class="code_line">F:File;</div><div class="code_line">SoundFile:pSoundFile;</div><div class="code_line">SizeOfData:longint;</div><div class="code_line">I: longint;</div><div class="code_line">SizeOfFile:longint;</div><div class="code_line">begin</div><div class="code_line">SizeOfData:=Duration*fDiscretisation*(Discret shr 3) div 1000;</div><div class="code_line">SizeOfFile:=sizeOf(tSoundFile)+ SizeOfData-Discret shr 3;</div><div class="code_line">GetMem(SoundFile,SizeOfFile);</div><div class="code_line">&nbsp;</div><div class="code_line">SoundFile^.Size:=SizeOfFile-SizeOf(SoundFile^.Caption)-SizeOf(SoundFile^.Size);</div><div class="code_line">SoundFile^.Data.Size:=SizeOf(tpcmWaveFormat);</div><div class="code_line">SoundFile^.Data.Data.Size:=SizeOfData;</div><div class="code_line">&nbsp;</div><div class="code_line">SoundFile^.Caption:=&#39;RIFF&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">SoundFile^.Data.Caption1:=&#39;WAVE&#39;;</div><div class="code_line">SoundFile^.Data.Caption2:=&#39;fmt &#39;;</div><div class="code_line">SoundFile^.Data.Format.wBitsPerSample:=Discret;</div><div class="code_line">SoundFile^.Data.Format.wf.wFormatTag:=WAVE_FORMAT_PCM;</div><div class="code_line">SoundFile^.Data.Format.wf.nChannels:=Canals;</div><div class="code_line">SoundFile^.Data.Format.wf.nSamplesPerSec:=FDiscretisation;</div><div class="code_line">SoundFile^.Data.Format.wf.nAvgBytesPerSec:=FDiscretisation*Canals*(Discret shr 3);</div><div class="code_line">SoundFile^.Data.Format.wf.nBlockAlign:=(Canals*Discret)shr 3;</div><div class="code_line">&nbsp;</div><div class="code_line">SoundFile^.Data.Data.Caption:=&#39;data&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">Assign(F,FileName);</div><div class="code_line">ReWrite(F,1);</div><div class="code_line">for I:=0 to SoundFile^.Data.Data.Size-1 do</div><div class="code_line">if Round(Frequenz*i/fDiscretisation) mod 2=0 then</div><div class="code_line">SoundFile^.Data.Data.Data[i]:=255</div><div class="code_line">else</div><div class="code_line">SoundFile^.Data.Data.Data[i]:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">BlockWrite(F,SoundFile^,SizeOfFile);</div><div class="code_line">FreeMem(SoundFile);</div><div class="code_line">Close(F);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">{Создадим файл Dash.wav, частотой 900 Гц и длительностью 0,75 с}</div><div class="code_line">SaveBeep(&#39;Dash.wav&#39;,900,750);</div><div class="code_line">end.</div></ol></div></div></div></div>]]></description>
        <author>ZenIA</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      </channel>
      </rss>
	