Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Copyright (c) 2011 Ransui Iso, All rights reserved.
Pytnonで作る
俺様Sound Effector
2015-10-10
Python Conference JP 2015
Ransui...
Copyright (c) 2011 Ransui Iso, All rights reserved.
おまえ誰よ?
http://www.facebook.com/ransui
@ransui
Ransui Iso (磯 蘭水)
Python...
Copyright (c) 2011 Ransui Iso, All rights reserved.
Demo Programのありか
●
デモプログラムは以下のURLで入手できます
http://alpa.homeip.net/files/...
Copyright (c) 2011 Ransui Iso, All rights reserved.
音って何だ?
Copyright (c) 2011 Ransui Iso, All rights reserved.
音ってなんだ?
●
空気の密度の時間変化
– 粗密波として視覚化するのは面倒なので普通はグラフを使う
Copyright (c) 2011 Ransui Iso, All rights reserved.
音の3要素
音量
周期
●
音量
– 波の高さ
●
音高
– 波の周波数
●
音色
– 波の形
この3つの要素をコントロールできればOK
Copyright (c) 2011 Ransui Iso, All rights reserved.
音を出す装置
●
信号を空気の粗密波に変換する
Analog
Source
Amplifier Speaker
DACDigital
Sou...
Copyright (c) 2011 Ransui Iso, All rights reserved.
楽器とかの場合
●
全部を通してアナログ信号の変換
Instrument Amplifier
Speaker
微小電圧信号
電流信号
Eff...
Copyright (c) 2011 Ransui Iso, All rights reserved.
アンプとスピーカー
●
最終段は「電流」で制御する
F(t) = q E(t, r(t)) + qv(t) × B(t, r(t))
要する...
Copyright (c) 2011 Ransui Iso, All rights reserved.
コンピュータと音
Copyright (c) 2011 Ransui Iso, All rights reserved.
デジタル化された音
●
サンプリング周波数
– 1秒あたりの分割数
●
量子化
– 振幅方向の分割数
CD音質の場合
– サンプリング周波数...
Copyright (c) 2011 Ransui Iso, All rights reserved.
PCの場合
●
プログラムから信号を送り込むことができる
Amplifier
Output
Terminal
DAC
Device
Driv...
Copyright (c) 2011 Ransui Iso, All rights reserved.
音の入出力
●
APIに対してバイナリ列でやりとりする
●
16bit符号付き量子化・ステレオの時
– インタリーブ形式
– エンディアンに...
Copyright (c) 2011 Ransui Iso, All rights reserved.
コンポーネント構成
Copyright (c) 2011 Ransui Iso, All rights reserved.
コンポーネントとデータの流れ
●
入力・演算・出力の繰り返し
– データを加工しながら次のプロセスに送る
Device
Driver
OS
...
Copyright (c) 2011 Ransui Iso, All rights reserved.
Capture / Playback Server
●
OS / デバイスドライバとのやりとり
OS
Sound API
ALSA
Capt...
Copyright (c) 2011 Ransui Iso, All rights reserved.
ZeroMQ
●
ネットワーク通信を簡単に
import zmq
def publisher():
context = zmq.Contex...
Copyright (c) 2011 Ransui Iso, All rights reserved.
エフェクト処理部分
●
QtのSIGNAL/SLOTを使う
Capture
Client
ZMQ
output
Effector
input...
Copyright (c) 2011 Ransui Iso, All rights reserved.
コードで見ると……
●
outputをinputにつなぐだけでOK
from component import CaptureClient,...
Copyright (c) 2011 Ransui Iso, All rights reserved.
Effects
Copyright (c) 2011 Ransui Iso, All rights reserved.
Overdrive
●
音に歪みを付加する
– 元々はアンプへの過大入力による「音割れ」
– クリッピングと増幅でもっと歪ませる
Copyright (c) 2011 Ransui Iso, All rights reserved.
StereoEnhancer
●
音に広がりを持たせる
– 左右チャネルで波形を反転
– どちらかのチャネルの位相をずらす
def inpu...
Copyright (c) 2011 Ransui Iso, All rights reserved.
Thank you for listening
Happy Hacking with Python!
Upcoming SlideShare
Loading in …5
×

Pythonで作る俺様サウンドエフェクター

4,933 views

Published on

PyConJP2015でお話しした際に使用したスライドです。
スライドはトークの頭出しだけでネタはほとんど話のほうにありますので、スライド最後に埋め込んである映像をご覧ください。

Published in: Software
  • Be the first to comment

Pythonで作る俺様サウンドエフェクター

  1. 1. Copyright (c) 2011 Ransui Iso, All rights reserved. Pytnonで作る 俺様Sound Effector 2015-10-10 Python Conference JP 2015 Ransui Iso
  2. 2. Copyright (c) 2011 Ransui Iso, All rights reserved. おまえ誰よ? http://www.facebook.com/ransui @ransui Ransui Iso (磯 蘭水) Pythonは1998年から使っています。E-Commerceエンジンやサーチエンジンの開 発、Zopeを用いたWebサイト開発、ネット広告配信システムについての研究開発 などを経て、今はクラウドシステム関連のお仕事をしています。
  3. 3. Copyright (c) 2011 Ransui Iso, All rights reserved. Demo Programのありか ● デモプログラムは以下のURLで入手できます http://alpa.homeip.net/files/PyConJP2015/pyconjp2015_soundeffector.tar.bz2
  4. 4. Copyright (c) 2011 Ransui Iso, All rights reserved. 音って何だ?
  5. 5. Copyright (c) 2011 Ransui Iso, All rights reserved. 音ってなんだ? ● 空気の密度の時間変化 – 粗密波として視覚化するのは面倒なので普通はグラフを使う
  6. 6. Copyright (c) 2011 Ransui Iso, All rights reserved. 音の3要素 音量 周期 ● 音量 – 波の高さ ● 音高 – 波の周波数 ● 音色 – 波の形 この3つの要素をコントロールできればOK
  7. 7. Copyright (c) 2011 Ransui Iso, All rights reserved. 音を出す装置 ● 信号を空気の粗密波に変換する Analog Source Amplifier Speaker DACDigital Source 微小電圧信号 電流信号 微小電圧信号 エンコードされた 数値信号
  8. 8. Copyright (c) 2011 Ransui Iso, All rights reserved. 楽器とかの場合 ● 全部を通してアナログ信号の変換 Instrument Amplifier Speaker 微小電圧信号 電流信号 EffectorEffector Effector
  9. 9. Copyright (c) 2011 Ransui Iso, All rights reserved. アンプとスピーカー ● 最終段は「電流」で制御する F(t) = q E(t, r(t)) + qv(t) × B(t, r(t)) 要するに、強い地場の中で大電流が流れれば より多くの力が発生するということ
  10. 10. Copyright (c) 2011 Ransui Iso, All rights reserved. コンピュータと音
  11. 11. Copyright (c) 2011 Ransui Iso, All rights reserved. デジタル化された音 ● サンプリング周波数 – 1秒あたりの分割数 ● 量子化 – 振幅方向の分割数 CD音質の場合 – サンプリング周波数 44100Hz – 量子化ビット数 16bit (65536段階)
  12. 12. Copyright (c) 2011 Ransui Iso, All rights reserved. PCの場合 ● プログラムから信号を送り込むことができる Amplifier Output Terminal DAC Device Driver OS Sound API Application 1:送り込むデータの形式を設定 2:音声信号を数値データとして送り込む データは数値列なのでプログラムで 好き放題作成可能
  13. 13. Copyright (c) 2011 Ransui Iso, All rights reserved. 音の入出力 ● APIに対してバイナリ列でやりとりする ● 16bit符号付き量子化・ステレオの時 – インタリーブ形式 – エンディアンに気をつける Left Channel 2bytes Right Channel 2bytes Left Channel 2bytes Right Channel 2bytes ・・・ これで1サンプル分
  14. 14. Copyright (c) 2011 Ransui Iso, All rights reserved. コンポーネント構成
  15. 15. Copyright (c) 2011 Ransui Iso, All rights reserved. コンポーネントとデータの流れ ● 入力・演算・出力の繰り返し – データを加工しながら次のプロセスに送る Device Driver OS Sound API Capture PlaybackEffector Effector EffectorCapture
  16. 16. Copyright (c) 2011 Ransui Iso, All rights reserved. Capture / Playback Server ● OS / デバイスドライバとのやりとり OS Sound API ALSA Capture UI ZMQ EndPoint OS Sound API ALSA Playback UI ZMQ EndPoint ● 独立したプログラムとして動作 ● ネットワークを使って送受信 ● 通信にはZeroMQを利用
  17. 17. Copyright (c) 2011 Ransui Iso, All rights reserved. ZeroMQ ● ネットワーク通信を簡単に import zmq def publisher(): context = zmq.Context() zmq_socket = context.socket(zmq.PUB) zmq_socket.bind(“tcp://localhost:9999”) zmq_socket.send(“Hello World”) def subscriber(): Context = zmq.Context() zmq_socket = context.socket(zmq.SUB) zmq_socket.setsockopt(zmq.SUBSCRIBE, b””) zmq_socket.connect(“tcp://localhost:9999”) print(zmq_socket.recv()) import zmq def publisher(): context = zmq.Context() zmq_socket = context.socket(zmq.PUB) zmq_socket.bind(“tcp://localhost:9999”) zmq_socket.send(“Hello World”) def subscriber(): Context = zmq.Context() zmq_socket = context.socket(zmq.SUB) zmq_socket.setsockopt(zmq.SUBSCRIBE, b””) zmq_socket.connect(“tcp://localhost:9999”) print(zmq_socket.recv())
  18. 18. Copyright (c) 2011 Ransui Iso, All rights reserved. エフェクト処理部分 ● QtのSIGNAL/SLOTを使う Capture Client ZMQ output Effector input output Effector input output Playback Client ZMQ input
  19. 19. Copyright (c) 2011 Ransui Iso, All rights reserved. コードで見ると…… ● outputをinputにつなぐだけでOK from component import CaptureClient, PlaybackClient from overdrive import Overdrive from chorus import Chorus capture_client = CaptureClient() playback_client = PlaybackClient() overdrive = Overdrive() chorus = Chorus() captureClient.output.connect(overdrive.input) overdrive.output.connect(chorus.input) chorus.output.connect(playback_client.input) from component import CaptureClient, PlaybackClient from overdrive import Overdrive from chorus import Chorus capture_client = CaptureClient() playback_client = PlaybackClient() overdrive = Overdrive() chorus = Chorus() captureClient.output.connect(overdrive.input) overdrive.output.connect(chorus.input) chorus.output.connect(playback_client.input)
  20. 20. Copyright (c) 2011 Ransui Iso, All rights reserved. Effects
  21. 21. Copyright (c) 2011 Ransui Iso, All rights reserved. Overdrive ● 音に歪みを付加する – 元々はアンプへの過大入力による「音割れ」 – クリッピングと増幅でもっと歪ませる
  22. 22. Copyright (c) 2011 Ransui Iso, All rights reserved. StereoEnhancer ● 音に広がりを持たせる – 左右チャネルで波形を反転 – どちらかのチャネルの位相をずらす def input(self, channels_data):     if self.effect_on is True:         right = channels_data[1].tolist()         delayed_right = scipy.array(             self.delay_queue + right[:self.depth])         self.delay_queue = right[self.depth:]         self.output.emit((channels_data[0],                           delayed_right * ­1))     else:         self.output.emit(channels_data) def input(self, channels_data):     if self.effect_on is True:         right = channels_data[1].tolist()         delayed_right = scipy.array(             self.delay_queue + right[:self.depth])         self.delay_queue = right[self.depth:]         self.output.emit((channels_data[0],                           delayed_right * ­1))     else:         self.output.emit(channels_data)
  23. 23. Copyright (c) 2011 Ransui Iso, All rights reserved. Thank you for listening Happy Hacking with Python!

×