いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

wavファイルで、強い音は弱く、弱い音は強く記録し直す

 音楽やその他の音が鳴っているとき、大きな音なら媒質(音を伝える媒体。空気や水など)は大きく、小さな音なら小さく揺れているはずです。wavファイルに記録するデータはそれをある程度反映しているのでしょう。媒質が変位していないならデータは0、変位しているのを+12000とか-5900とかで表しているのだと思います。
 今回はwavファイルに記録された値が0以上のデータxなら y=32767-x、負のデータなら y=-32768ーx でyを定めてこれを記録し直して新しいwavファイルを作ってみましょう。平たく表現すると「強い音は弱く、弱い音は強く記録し直す」ということになります。前、データがxだったらーxを記録する、とやってみたところ、聴いた感じはもとと全く変わりませんでしたが、今回はさすがにまるっきり違う感じになる気がします……。なおwavファイルのパラメータなどについては、必要に応じて下の記事を参照してください。
www.omoshiro-suugaku.com

#=============================
#wavファイルのリード、一部の書き換え
#
#データ長が16bitなら signed short で-32768~32767
#
import sys
import wave
import numpy as np
wavefile = wave.open('BGM.wav',"rb")
params = wavefile.getparams()
if params.sampwidth != 2:
    #記録データが2バイトの整数でなければ終了
    sys.exit()
nframes = params.nframes #フレーム数の取得
buf = wavefile.readframes(nframes) #サウンドデータ部分の読み取り
buf = np.frombuffer(buf, dtype= "int16") #16bit符号付き整数に変換
wavefile.close()
bufcopy = buf.copy()
for i in range(0, bufcopy.size):
    if bufcopy[i] >= 0:
        #許されるデータの範囲に余裕を持って収まるように0.9倍
        bufcopy[i] = (32767-bufcopy[i])*0.9
    else:
        bufcopy[i] = (-32768-bufcopy[i])*0.9
writewave = wave.Wave_write("keshitene.wav")
writewave.setparams(wavefile.getparams())
writewave.writeframes(bufcopy)
writewave.close()
sys.exit()
#=============================

念のため、コードの#A、#Bのところはデータを変換した後、0.9倍して絶対値を小さめにしてあります。
 実際に聴いてみたところ……もとの音楽であることは分かりますが、汚い音になっています。最初は0.9倍しないコードでやっており、例えば無音(データ=0)が多く変換後のデータにmaxの値が多すぎて音が割れてしまっているのかも……と考えて0.9倍してみました。でもあまり変わりません。
 想像では何かこの世のものとも思えなさそうな音楽が聴こえるのではないかと思っていたんですが。いまひとつ面白くない結果ですが実験結果なので仕方ありません……。