読者です 読者をやめる 読者になる 読者になる

クーの自由研究

かえるのクーが素朴な疑問を実験して報告します。

自由研究の準備(その5)Pythonでのサウンド操作の確認

おおまかな内容

実験(その7)までの振り返りの結果、素材を「サウンド」にします。

自己符号化器の入力と出力をサウンドにするにあたり、Pythonでサウンドを操作する方法を確認しました。

なぜやるのか・どうなると思うか

これができないと実験になりません。諸先輩のページを参考に基本的な動作を確認します。入出力がASIOインターフェースなので、その扱いが少し心配ですが、「問題なくできる」との情報ばかりなので、おそらく大丈夫です。

準備と確認のやり方 

Waveファイルの再生、Waveファイルへの録音、プログラム作成波形の再生(録音)が問題なくできるかを確認します。

WaveファイルはSoundCloudにアップしたものをハテナに埋め込む方法を紹介していた方がいたので参考にさせてもらいました。下の画像のような貼り付けになります(下はダミーで画像のみです。クリックしても動作しません。あしからず)

f:id:np2LKoo:20160829020539p:plain

確認の結果

インターフェースの確認

まずは、インターフェースの確認です。

入出力ポートが何番なのかを確認します。

# -*- coding: utf-8 -*-
import sys
import pyaudio

# インデックス番号の確認

p = pyaudio.PyAudio()
count = p.get_device_count()
devices = []
for i in range(count):
devices.append(p.get_device_info_by_index(i))

for i, dev in enumerate(devices):
print (i, dev['name'])

ボクのパソコンでは以下のようになりました。表示のとおりQUAD-CAPTUERというUSBオーディオインターフェースを使っています。ASIOで動作させています。

(0, 'Microsoft \x83T\x83E\x83\x93\x83h \x83}\x83b\x83p\x81[ - Input')
(1, u'1-2 (QUAD-CAPTURE)')
(2, u'MAIN (QUAD-CAPTURE)')
(3, u'3-4 (QUAD-CAPTURE)')
(4, 'Microsoft \x83T\x83E\x83\x93\x83h \x83}\x83b\x83p\x81[ - Output')
(5, u'1-2 (QUAD-CAPTURE)')
(6, '\x83f\x83W\x83^\x83\x8b \x83I\x81[\x83f\x83B\x83I (S/PDIF) (H')
(7, u'3-4 (QUAD-CAPTURE)')
(8, '\x83f\x83W\x83^\x83\x8b \x83I\x81[\x83f\x83B\x83I (S/PDIF) (H')

音の再生

PyAudio Documentation — PyAudio 0.2.9 documentation

参照させていただいた内容で問題なく再生できました。

音の録音

Pythonでマイクからの音を録音(pyaudio使用) – あかさたな

を参照させていただきました。ASIOインターフェースで、ギターエフェクタースタンドアロンソフト)を経由させているので、どちらかが「ダイレクト」、どちらかが「ミキサを通した(エフェクタのかかった)」音のポートです。初期設定のときいろいろ触った気がしますが、どちらだったか全く覚えていません。waveファイルに出力したものをsoundCloudにアップし貼り付けました。

1番ポートがこちらです。スマートフォンで[Listen in browser]が下部に黒色背景表示ででていればそれをおしてください。押しにくくてすみません。PCの方は左にある赤系のプレイボタンを押してください。音量にはご注意ください。(ブラウザのセキュリティ設定などにより再生できない場合があります。「準備と確認のやり方」と同じような画像がでていなければ、再生できないと思われます)

 

 

2番ポートの音です。

 

1番が生音(といってもプラグドです)、2番がミキサ(&エフェクタ)経由の音でした。

Pythonで作成した波形の再生と録音

次はPythonで作成した波形を鳴らします。

かの、「人工知能に関する断創録」様を参照させていただきました。

 直接ポートへ出力して鳴らすことができました。ポート出力のかわりに、ファイル(.wav)にしたものを貼り付けます。(ノコギリ波で耳が痛いので5倍音までにしています)

 

ついでにサンプルプログラムを少し調整して和音をならしてみました。ちょっとだけ手を入れさせてもらいました。同じくノコギリ波でこちらも5倍音までにして、周波数を少し正確にして、あと和音にしました。音も小さくしていますが結局3音かさねるので、少し大きく音がでます。

#coding: utf-8
import wave
import struct
import numpy as np
from pylab import *

def createSawtoothWave2 (A, fx, fs, length):
data = []
# [-1.0, 1.0]の小数値が入った波を作成
s = 0.0
for n in arange(length * fs): # nはサンプルインデックス
for k in range(1, 5):
for f0 in fx:
s += (A / k) * np.sin(2 * np.pi * k * f0 * n / fs)
# 振幅が大きい時はクリッピング
if s > 1.0: s = 1.0
if s < -1.0: s = -1.0
data.append(s)
# [-32768, 32767]の整数値に変換
data = [int(x * 32767.0) for x in data]
#plot(data[0:100]); show()
# バイナリに変換
data = struct.pack("h" * len(data), *data) # listに*をつけると引数展開される
return data

def play (data, fs, bit):
import pyaudio
# ストリームを開く
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=int(fs),
output= True)
# チャンク単位でストリームに出力し音声を再生
chunk = 1024
sp = 0 # 再生位置ポインタ
buffer = data[sp:sp+chunk]
while buffer != '':
stream.write(buffer)
sp = sp + chunk
buffer = data[sp:sp+chunk]
stream.close()
p.terminate()

def save(data, fs, bit, filename):
"""波形データをWAVEファイルへ出力"""
wf = wave.open(filename, "w")
wf.setnchannels(1)
wf.setsampwidth(bit / 8)
wf.setframerate(fs)
wf.writeframes(data)
wf.close()

allData = ""
freqList = [(261.626, 329.628, 391.995),(261.626, 349.228, 440.0),(261.626, 329.628, 391.995),(293.665, 391.995, 493.883),(261.626, 329.628, 391.995)] # ドレミファソラシド
for f in freqList:
data = createSawtoothWave2(0.05, f, 8000.0, 2.0)
play(data, 8000, 16)
allData += data
save(allData, 8000, 16, "Basic-Code.wav")

 

 

これで画像のかわりにサウンドを入出力として実験する「基本的なこと」は問題なさそうなことがわかりました。このあとうまくプログラムができるかどうかは別の問題ですが。。。

Pythonシンセサイザーも作れるようなので、そのうち確認したいと思います。

まとめ

サウンドを自己符号化器の入出力にするにあたり、Pythonで問題なく処理できそうなことがわかりました。

感想・思ったこと・考えたこと

サウンドも簡単に扱えるなんて、Pythonすごすぎです。

参照させていただいたサイトの諸先輩方、どうも有難うございます。

みなさんやっぱり画像より音楽に興味があるのですね

昨日計算機音楽のカテゴリの話題をかいたところ、ページのアクセス数がとても増えました。風呂敷を広げてしまった以上、あまりゆっくりのんびりやるわけにもいかなくなった感じがしています。
少しやる気をだして、このページを作成しました。あとが続くのか心配です。

欲しいと思った

コンピュータ音楽 歴史・テクノロジー・アート THE COMPUTER MUSIC TUTORIAL

をはじめ、いくつかの書籍を「ぽちっとな」とクリックしました。来月分のおこずかいまで底をついてしまいました。いくら内容がすごくても、分厚くても1冊一万円以上するのはとってもキツイです。今回は合計2万円くらいの本を仕入れます。もうあとへは引けません。(ミサカはクーはクーはジブンにハッパをかけてみたりとクーはクーはいってみたりなのでした)

(追記)今日生まれて初めて★をいただきました。(しかも3つ)ボクの文書を読んでくれる人がいて、★までいただけるなんてとっても嬉しく、幸せな気持ちです。一層がんばろうとおもいました。どうも有難うございます。