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

## やりたいこと

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


## やってみた

### ノコギリ波
#### ノコギリ波の再生
```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850619/a320a9b7-f3e2-e072-f498-4150156c9b8f.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850619/48def7b4-fc22-7a6a-e296-cd613d9b3ea0.png)


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

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