Создание WAV-тона в переполнении стека

Я хотел бы генерировать синусоидальный тон в php. Но для построения моего wav мне нужно дать значения в байтах. Я не знаю, как это сделать:

Вот код, который у меня есть:

$freqOfTone = 440;
$sampleRate = 44100;
$samplesCount = 80000;

$amplitude = 0.25 * 32768;
$w = 2 * pi() * $freqOfTone / $sampleRate;

//$dataArray = new$text = "RIFF"."80036"."WAVE"."fmt "."16"."1"."1"."44100"."44100"."1"."8"."data"."80000";

for ($n = 0; $n < $samplesCount; $n++)
{
$text .= (int)($amplitude *  sin($n * $w));
}$myfile = fopen("sine.wav", "w") or die("Unable to open file!");

fwrite($myfile, $text);

fclose($myfile);

6

Решение

Проблема в том, что ваш алгоритм записывает числа в виде текста. Принимая во внимание, что .wav Файл кодирует двоичные данные.

Вы можете использовать, например, pack сгруппировать данные.

$freqOfTone = 440;
$sampleRate = 44100;
$samplesCount = 80000;

$amplitude = 0.25 * 32768;
$w = 2 * pi() * $freqOfTone / $sampleRate;

$samples = array();
for ($n = 0; $n < $samplesCount; $n++) {
$samples[] = (int)($amplitude *  sin($n * $w));
}

$srate = 44100; //sample rate
$bps = 16; //bits per sample
$Bps = $bps/8; //bytes per sample /// I EDITED

$str = call_user_func_array("pack",
array_merge(array("VVVVVvvVVvvVVv*"),
array(//header
0x46464952, //RIFF
160038,      //File size
0x45564157, //WAVE
0x20746d66, //"fmt " (chunk)
16, //chunk size
1, //compression
1, //nchannels
$srate, //sample rate
$Bps*$srate, //bytes/second
$Bps, //block align
$bps, //bits/sample
0x61746164, //"data"160000 //chunk size
),
$samples //data
)
);
$myfile = fopen("sine.wav", "wb") or die("Unable to open file!");
fwrite($myfile, $str);
fclose($myfile);

Это производит это файл.

Обратите внимание, что вы не может просто используйте вышеуказанный заголовок. Некоторые аспекты были жестко запрограммированы и различались (например, размер файла, количество каналов, битрейт и т. Д.). Но если кто-то читает документация, можно легко изменить заголовок соответственно.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]