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

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

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

 この記事に直接関連した内容の書籍をブログ管理人が出版しました。記事をリファインして、極力詳しく解説しています。見ていただけるとうれしいです(2022年5月15日(日))。↓

 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つのメディアプレーヤーなどで同時に流したらどうなるか、は試さないと分かりません。完全な同期は難しそうですが、方法はあるかと思います。考えてみます。