0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonでの音声信号処理 (7) 色々なデータを鳴らす

Last updated at Posted at 2023-01-21

やりたいこと

ノコギリ波や矩形波などを鳴らしてみる

やってみた

ノコギリ波

ノコギリ波の再生

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で繰り返した波の再生結果

ラっぽい音が出た。
p7_2.png

矩形波を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の中で、何某かの調整が行われていると思われ、それが影響しているのかもしれない。

矩形波
p7_3.png

補足

Grp.pyはここにあります。
https://qiita.com/u1tym/items/b52c466620f65225edf3

Dummy.pyはここにあります。
https://qiita.com/u1tym/items/3e2be5364e83df1b7792

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?