![]()
救急車が道を走っているときの音知ってますよね。
近づいてくるときは高い音で離れていく時は低くなる。ドップラー効果ですね。
緊急車両でも無茶なスピードは出さずに安全なスピードで走ってます。
もしも救急車が、100km/hで走ったらどんな音になるのだろう?
F1のように300km/hなら・・・。
どんな音になるのか聞いてみたくなって作ってみました。
webで音の情報を入手して早速perlで書いてみました。
これは単なるサインウェブゼネレータです。
44.1kHzのサンプリング周期で、970Hzサイン波形の16bitフルスイングデータを吐き出します。
20秒固定として、近づく方向で10秒。遠ざかる方向で10秒にします。
20秒間なので、44100×20回のデータができます。
###########################################
#サウンド1 #
# #
# Date: 2016.12.26 #
# Programed: G-yan #
###########################################
require "saveWav.pl";
sub makeWaveData {
$wavSampleRate = 44100;
$wavDataLength = 0;
$tMax = $wavSampleRate * 20; #20sec
$t0 = 2 / $wavSampleRate; #44.1kHz = 2pi[rad]
$t01 = $t0 * 970; #970Hz
$t31 = 0;
$i3 = 32767; #Signed 16bitデータの最大値
$sw = 1;
while ($sw) {
if ($wavDataLength >= $tMax) { #20sec経過
$sw = 0;
last;
}
$t40 = sin(3.14 * $t31);
$wavData[$wavDataLength++] = int($t40 * $i3);
$t31 += $t01;
if ($t31 > 2) { #2Piを超えたら2Piを引く
$t31 -= 2;
}
}
}
&makeWaveData;
&saveWaveData("s1");
これも同じで、周波数が770Hzに変わっただけ。
###########################################
#サウンド2 #
# #
# Date: 2016.12.26 #
# Programed: G-yan #
###########################################
require "saveWav.pl";
sub makeWaveData {
$wavSampleRate = 44100;
$wavDataLength = 0;
$tMax = $wavSampleRate * 20; #20sec
$t0 = 2 / $wavSampleRate; #44.1kHz = 2pi[rad]
$t01 = $t0 * 970; #970Hz
$t11 = $t0 * 770; #770Hz
$t31 = 0;
$i3 = 32767;
$sw = 1;
while ($sw) {
if ($wavDataLength >= $tMax) {
$sw = 0;
last;
}
$t40 = sin(3.14 * $t31);
$wavData[$wavDataLength++] = int($t40 * $i3);
$t31 += $t11;
if ($t31 > 2) {
$t31 -= 2;
}
}
}
&makeWaveData;
&saveWaveData("s2");
650msec周期で、970Hzと770Hzを切り替えます。
###########################################
#サウンド3 #
# #
# Date: 2016.12.26 #
# Programed: G-yan #
###########################################
require "saveWav.pl";
sub makeWaveData {
$wavSampleRate = 44100;
$wavDataLength = 0;
$tMax = $wavSampleRate * 20; #20sec
$t0 = 2 / $wavSampleRate; #44.1kHz = 2pi[rad]
$t01 = $t0 * 970; #970Hz
$t11 = $t0 * 770; #770Hz
$t31 = 0;
$i3 = 32767;
$i4 = 0;
$sw = 1;
while ($sw) {
if (($i4++ & 0x1) == 0) { #偶数の時は970Hz
$t21 = $t01;
} else { #奇数の時は770Hz
$t21 = $t11;
}
$i2 = $wavSampleRate * 0.65; #650msec
for ($i1 = 0; $i1 < $i2; $i1++) {
if ($wavDataLength >= $tMax) {
$sw = 0;
last;
}
$t40 = sin(3.14 * $t31);
$wavData[$wavDataLength++] = int($t40 * $i3);
$t31 += $t21;
if ($t31 > 2) {
$t31 -= 2;
}
}
}
}
&makeWaveData;
&saveWaveData("s3");
10Hzの差がある波形を合成してビブラートさせます。
###########################################
#サウンド4 #
# #
# Date: 2016.12.26 #
# Programed: G-yan #
###########################################
require "saveWav.pl";
sub makeWaveData {
$wavSampleRate = 44100;
$wavDataLength = 0;
$tMax = $wavSampleRate * 20; #20sec
$t0 = 2 / $wavSampleRate; #44.1kHz = 2pi[rad]
$t01 = $t0 * 970; #970Hz
$t02 = $t0 * 960; #960Hz
$t11 = $t0 * 770; #770Hz
$t12 = $t0 * 760; #760Hz
$t31 = 0;
$t32 = 0;
$i3 = 32767;
$i4 = 0;
$sw = 1;
while ($sw) {
if (($i4++ & 0x1) == 0) {
$t21 = $t01;
$t22 = $t02;
} else {
$t21 = $t11;
$t22 = $t12;
}
$i2 = $wavSampleRate * 0.65; #650msec
for ($i1 = 0; $i1 < $i2; $i1++) {
if ($wavDataLength >= $tMax) {
$sw = 0;
last;
}
$t40 = sin(3.14 * $t31) * 0.7 + sin(3.14 * $t32) * 0.1; #基本波形 70% 合成波形 10%の割合で加算
$wavData[$wavDataLength++] = int($t40 * $i3);
$t31 += $t21;
$t32 += $t22;
if ($t31 > 2) {
$t31 -= 2;
}
if ($t32 > 2) {
$t32 -= 2;
}
}
}
}
&makeWaveData;
&saveWaveData("s4");
TM1時間で最大値まで直線的に音量を上げます。
これで音源は作れた感じです。
後編で音源を走らせてみようと思います。
###########################################
#サウンド5 #
# #
# Date: 2016.12.26 #
# Programed: G-yan #
###########################################
require "saveWav.pl";
use constant PI => 3.14;
use constant TM1 => 0.03; #30msec
use constant S_MAX => 32767;
sub makeWaveData {
$wavSampleRate = 44100;
$wavDataLength = 0;
$tMax = $wavSampleRate * 20; #20sec
$t0 = 2 / $wavSampleRate; #44.1kHz = 2pi[rad]
$t01 = $t0 * 970; #970Hz
$t02 = $t0 * 960; #960Hz
$t11 = $t0 * 770; #770Hz
$t12 = $t0 * 760; #760Hz
$t31 = 0;
$t32 = 0;
$i4 = 0;
$sw = 1;
while ($sw) {
if (($i4++ & 0x1) == 0) {
$t21 = $t01;
$t22 = $t02;
} else {
$t21 = $t11;
$t22 = $t12;
}
$i2 = $wavSampleRate * 0.65; #650msec
$i3 = 0;
for ($i1 = 0; $i1 < $i2; $i1++) {
if ($wavDataLength >= $tMax) {
$sw = 0;
last;
}
$t40 = sin(PI * $t31) * 0.7 + sin(PI * $t32) * 0.1;
$wavData[$wavDataLength++] = int($t40 * $i3);
$t31 += $t21;
$t32 += $t22;
if ($t31 > 2) {
$t31 -= 2;
}
if ($t32 > 2) {
$t32 -= 2;
}
if ($i1 < $wavSampleRate * TM1) { #0からTM1時間まで
if ($i3 < S_MAX) { #最大でない
$i3 += (S_MAX / ($wavSampleRate * TM1)); #ボリュームアップ
}
if ($i3 > S_MAX) {
$i3 = S_MAX;
}
}
if (($i1 + $wavSampleRate * TM1) > $i2) { #設定時間のTM1秒前
if ($i3 > 0) {
$i3 -= (S_MAX / ($wavSampleRate * TM1)); #ボリュームダウン
}
if ($i3 < 0) {
$i3 = 0;
}
}
}
}
}
&makeWaveData;
&saveWaveData("s5");