Генерация WAV и добавление второго (стерео) канала
Я обнаружил следующий незаметный код на stackru. Пожалуйста, кто-нибудь может помочь мне добавить второй канал (стерео)
Там будет nchannels = 2 Размер файла должен (как-то) быть увеличен, и массив 2. (т.е. samples2) должен быть добавлен.
Когда я пытаюсь, я достигаю только более высокой частоты.
Большое спасибо из Германии: Мартин
$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);
1 ответ
Перемещено решение от вопроса к ответу:
САМОСТОЯТЕЛЬНОЕ РЕШЕНИЕ: Я проверил веб-работник Recorder.js, нашел SPEC и как его использовать. Вот немного измененный код для тона, идущего от правого динамика к левому через 1 сек. Может быть, это кому-нибудь поможет.
$freqOfTone = 440; $sampleRate = 44100; $samplesCount = 80000; $amplitude = 0.25 * 32768; $w = 2 * pi() * $freqOfTone / $sampleRate; $samples = array(); $samples2 = array(); for ($n = 0; $n < $samplesCount; $n++) { $samples[] = (int)($amplitude*($n/$samplesCount) * sin($n * $w)); $samples2[] = (int)($amplitude*(1-$n/$samplesCount) * sin($n * $w )); } function interleave($l,$r){ $data=array(); $ix=0; for($i=0;$i<count($l);$i++){ $data[$ix++]=$l[$i]; $data[$ix++]=$r[$i]; } return $data; } $stereo=interleave($samples,$samples2); echo(count($samples)); echo(count($stereo)); $srate = 44100; //sample rate $bps = 16; //bits per sample $Bps = $bps/8; //bytes per sample /// I EDITED $samples_merge=array_merge($samples,$samples2); $str = call_user_func_array("pack", array_merge(array("VVVVVvvVVvvVVv*"), array(//header 0x46464952, //RIFF 80000*2*2+36, //File size *2*Channels +36 0x45564157, //WAVE 0x20746d66, //"fmt " (chunk) 16, //chunk size 1, //compression 2, //nchannels $srate, //sample rate $Bps*$srate, //bytes/second $Bps, //block align $bps, //bits/sample 0x61746164, //"data" 80000 * 2 *2 //chunk size (filesize * 2 *Channels) ), $stereo // Stereo tone left[0], right[0], left[1], right[1], ... ) ); $myfile = fopen("sine.wav", "wb") or die("Unable to open file!"); fwrite($myfile, $str); fclose($myfile);