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

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

waveファイルで、サウンドデータの符号を一斉に反転するとどうなるか?

 16ビットで録音されたwaveファイルでは(getparams()で得られる値がsampwidth=2)、サウンドデータは-32768~32767の範囲の整数値で表され、無音は0です。で、問題です。

16ビットで録音されたwaveファイルで、サウンドデータの符号を全て変えたら(1234を-1234に変える、など)音楽はどう変わるか? あるいは変わらないか?

試してみました。試すまでは「同じ音楽ではあるけれど、違和感がある。どこか違う」……はずだ、みたいに思っていましたが……。

 #====================
import sys
import numpy as np
import scipy as sp
from scipy.fftpack import fft
import wave
wavefile = wave.open('BGM.wav',"rb")
buf = wavefile.readframes(wavefile.getnframes())#サウンドデータ部分の読み取り
buf = np.frombuffer(buf, dtype= "int16")#16bit符号付き整数に変換
wavefile.close()
print(wavefile.getparams())
sounddata = buf.copy() #サウンドデータ用バッファ
print(sounddata)
sounddata = -sounddata  #サウンドデータの符号を一斉に反転
print(sounddata)
writewave = wave.Wave_write("keshitene.wav") #保存先ファイル
writewave.setparams(wavefile.getparams()) #保存先ファイルにパラメータをセット
writewave.writeframes(sounddata) #編集したサウンドデータを保存
writewave.close()
sys.exit()
 #====================

結果、もとと変わりませんでした。意外な結果と言うか、しかし「そういうこともあるかもね」という気もするんですが……。
 もとの音楽と変更後の音楽は少なくとも、プログラムの中で同時に流すと和は0なので聞こえなくなるはずです。しかし2つのメディアプレーヤーなどで同時に流したらどうなるか、は試さないと分かりません。完全な同期は難しそうですが、方法はあるかと思います。考えてみます。