Creating a wav tone in PHP

I would like to generate a sine tone in php. But, having built my wav, I need to give values ​​in bytes. I do not know how to do that:

Here is the code I have:

$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
source share
1 answer

The problem is that the algorithm writes numbers as text. While the .wav file encodes the binary data file.

You can use, for example, pack to group data.

 $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); 

This creates a file .

Please note that you cannot just reuse the above header. Some aspects were hard-coded, which differ (for example, file size, number of channels, bit rate, etc.). But if you read the documentation, you can easily change the title accordingly.

+5
source

Source: https://habr.com/ru/post/981305/


All Articles