Generation of railroad crossing alarm sounds by Python.
今日は小ネタです。
皆さん、踏切の警報音がどんなのだか御記憶でしょうか?
クルマを運転する人(でなくても)にとっては、踏切の警報音というのは「あちゃー。電車来ちゃったよ。あら!? 反対からも電車が来るのか…orz」という具合に、あまり好ましくない印象がありますが、多くの方が、そういえば、2つの音の不協和音みたいなやつだよな、くらいは御記憶なのではないでしょうか。
調べてみたところ、こんな資料がありました。
なるほど、なるほど。700Hz と 750Hz の電鐘を和音にして、1分間に 130回の頻度で鳴らせばいいんだそうです。
さっそく Python でコードを書いてみました。えいっ。
import numpy as np
import os
from scipy import signal
from scipy.io import wavfile
FS = 32000 # sampling frequency
MAX_AMP = np.iinfo(np.int16).max
FILENAME = "fumikiri.wav"
DECAY_RATE = 3.0
LEN_SEC = 60 / 130
t = np.linspace(0, LEN_SEC, int(LEN_SEC * FS))
# '** 0.5' due to converting power attenuation to amplitude attenuation
envelope = np.exp(- DECAY_RATE * t / LEN_SEC) ** 0.5
amp = 0.48 * MAX_AMP
s1 = amp * envelope * signal.square(2 * np.pi * 700 * t)
s2 = amp * envelope * signal.square(2 * np.pi * 750 * t)
s = np.tile(s1 + s2, 10)
wavfile.write(FILENAME, FS, s.astype(np.int16))
os.system("afplay " + FILENAME)
最後の行だけが、macOS 依存となっています。スミマセン。
電鐘というのがどんな構造と仕組なのか分かりませんが、奇数倍音を多く含む矩形波で作ってみました。「鐘」ですので減衰のエンベロープも掛けています。(自分で以前に書いた、こんな記事も参考にしました。)
時変フィルタとか掛けて、最初は倍音を多く、時間が経つにつれて倍音を減らし…、とかこだわるのはメンドーなので、この辺で御容赦ください。(実際の踏切の警報音は、もっと濁った感じに聞こえたような気もします。)
音を貼っておきます。こんな感じです。(音が鳴ります。職場などで鳴らすと顰蹙を買いますので御注意! 🙂 )
今日はここまで。