やりたいこと
ノコギリ波や矩形波などを鳴らしてみる
やってみた
ノコギリ波
ノコギリ波の再生
p7_1.py
# -*- coding: utf-8 -*-
import sys
sys.dont_write_bytecode = True
from multiprocessing import Process
import time
from pydub import AudioSegment
from pydub.playback import play
from Grp import Line
import Dummy as dmy
def main():
smpl = 44100 # サンプリングレートは44.1KHz
sec = 1 # 1秒分
# ノコギリ波
wav1 = dmy.makeWave(1, smpl, sec, 0, 0, 1)
for i in range(64):
freq = i + 1
wav1 += dmy.makeWave(freq, smpl, sec, 1 / freq, 0, 1)
wav1 = wav1 * 16
p_s = []
p = Process(target=drawGraph, args=(wav1, smpl))
p.start()
p_s.append(p)
p = Process(target=playSound, args=(wav1, smpl))
p.start()
p_s.append(p)
while len(p_s) > 0:
for p in p_s:
if not p.is_alive():
p.join()
p_s.remove(p)
time.sleep(0.1)
# グラフの表示
def drawGraph(data, rate):
grp = Line()
grp.setData(data, rate)
grp.display()
# 音の再生
def playSound(data, rate):
aud = AudioSegment(
data.astype("int8").tobytes(),
sample_width=1,
frame_rate=rate,
channels=1
)
play(aud)
if __name__ == '__main__':
main()
ノコギリ波の再生結果
コポコポ鳴るだけで、音らしい音ではなかった。
ノコギリ波自体を440Hzで繰り返した波
単純なノコギリ波だと、空気がそれほど振動しない状態なので、音に鳴らないのではないかと推測。では、ノコギリ波自体を沢山繰り返せば、音になるのではないか。
ということで、ノコギリ波自体を440Hz(秒間440回)で繰り返してみた。
ノコギリ波自体を440Hzで繰り返した波の再生
p7_2.py
# -*- coding: utf-8 -*-
import sys
sys.dont_write_bytecode = True
from multiprocessing import Process
import time
from pydub import AudioSegment
from pydub.playback import play
import numpy as np
from Grp import Line
import Dummy as dmy
def main():
orgsmpl = 44100 # サンプリングレートは44.1KHz
sec = 1 # 1秒分
# ノコギリ波
# -> 440回繰り返したいので、サンプル数を440分の1にして、あとで440回繰り返す
smpl = int(orgsmpl / 440)
wav1 = dmy.makeWave(1, smpl, sec, 0, 0, 1)
for i in range(64):
freq = i + 1
wav1 += dmy.makeWave(freq, smpl, sec, 1 / freq, 0, 1)
# 440回繰り返す
wav2 = np.array(list(wav1) * 440) * 16
p_s = []
p = Process(target=drawGraph, args=(wav2, orgsmpl))
p.start()
p_s.append(p)
p = Process(target=playSound, args=(wav2, orgsmpl))
p.start()
p_s.append(p)
while len(p_s) > 0:
for p in p_s:
if not p.is_alive():
p.join()
p_s.remove(p)
time.sleep(0.1)
# グラフの表示
def drawGraph(data, rate):
grp = Line()
grp.setData(data, rate)
grp.setScale(10)
grp.display()
# 音の再生
def playSound(data, rate):
aud = AudioSegment(
data.astype("int8").tobytes(),
sample_width=1,
frame_rate=rate,
channels=1
)
play(aud)
if __name__ == '__main__':
main()
ノコギリ波自体を440Hzで繰り返した波の再生結果
矩形波を440Hzで繰り返した波
同じように、矩形波波自体を440Hz(秒間440回)で繰り返してみた。
矩形波を440Hzで繰り返した波の再生
p7_3.py
# -*- coding: utf-8 -*-
import sys
sys.dont_write_bytecode = True
from multiprocessing import Process
import time
from pydub import AudioSegment
from pydub.playback import play
import numpy as np
from Grp import Line
import Dummy as dmy
def main():
orgsmpl = 44100 # サンプリングレートは44.1KHz
sec = 1 # 1秒分
# 矩形波
# -> 440回繰り返したいので、サンプル数を440分の1にして、あとで440回繰り返す
smpl = int(orgsmpl / 440)
wav1 = dmy.makeWave(1, smpl, sec, 0, 0, 1)
for i in range(64):
freq = i + 1
if freq % 2 == 0:
continue
wav1 += dmy.makeWave(freq, smpl, sec, 1 / freq, 0, 1)
# 440回繰り返す
wav2 = np.array(list(wav1) * 440) * 16
p_s = []
p = Process(target=drawGraph, args=(wav2, orgsmpl))
p.start()
p_s.append(p)
p = Process(target=playSound, args=(wav2, orgsmpl))
p.start()
p_s.append(p)
while len(p_s) > 0:
for p in p_s:
if not p.is_alive():
p.join()
p_s.remove(p)
time.sleep(0.1)
# グラフの表示
def drawGraph(data, rate):
grp = Line()
grp.setData(data, rate)
grp.setScale(10)
grp.display()
# 音の再生
def playSound(data, rate):
aud = AudioSegment(
data.astype("int8").tobytes(),
sample_width=1,
frame_rate=rate,
channels=1
)
play(aud)
if __name__ == '__main__':
main()
矩形波を440Hzで繰り返した波の再生結果
同じように、ラっぽい音が出た。
※ 実は、上のノコギリ波も矩形波も、振幅を×16にしている。実態としては、大した意味は無い(ハズ)であるが、振幅が×1だと、ノコギリ波は音が出て、矩形波の方は音が出ない結果となった。×16としたところで、音が大きくなるわけでもないので、AudioSegmentの中で、何某かの調整が行われていると思われ、それが影響しているのかもしれない。
補足
Grp.pyはここにあります。
https://qiita.com/u1tym/items/b52c466620f65225edf3
Dummy.pyはここにあります。
https://qiita.com/u1tym/items/3e2be5364e83df1b7792