砂で波の音を作る楽器の音っぽいの

音声信号のテスト用にサインウェーブ作ろうとしたら、たまたまそんな感じの音が鳴ったのでメモ。

フーリエ変換のチェック用に、1024 の窓でキリの良い音が欲しかっただけなんだ。

コード

makeWaveData.php はコレ。

<?php

require_once('makeWaveData.php');

// $sampleRate = 8000; // Phone quality
$sampleRate = 44100; // CD quality
$nChannel = 1; // 1:monoral, 2:stereo
$toneA = 44100/2048;
// $sampleBits = 8; // 8 or 16
$sampleBits = 16; // 8 or 16

//$period = 0.1; // seconds;
$period = 10; // seconds;
$data = '';
$theta = 0;
$theta_delta = $toneA * 2 * M_PI / $sampleRate;

$amp = 0x1000;
$totalSamples = $sampleRate * $period;
//for ($i = 0 ; $i < $totalSamples ; $i++) {
for ($i = 1 ; $i < $sampleRate * $period ; $i++) {

// signed 16-bit array (little endian)   
//    $v = 0 + 0x4000 * sin($theta);
//    $v = 0 + $amp * ($totalSamples - $i) / $totalSamples * mt_rand() / mt_getrandmax();
    $volume = $amp * ($totalSamples - $i) / $totalSamples;
    $v = 0 + $volume  * mt_rand()/ mt_getrandmax() * sin($theta/100);
    $data .= pack('v', $v); // acrovatic using for 'v'
    $theta += $theta_delta;
}

echo makeWaveData($data, $nChannel, $sampleBits, $sampleRate);

追記

\助けよや/
‏@yoya

rand 消し割れてた。。なのでコレは雑音にサインの振幅エンベロープかけただけ。オカルトでなくて良かった。