2017年4月16日日曜日

Tkinter でGUI音遊びソフト作り(4) - Python で音を出す

外部ソフトに頼らず、Python だけで音を出す方法について調べ、実践します。

1. どんなモジュールがあるか

Python には標準ライブラリで wave モジュールがあり、.wav ファイルの読み書きができます。ただし音の再生はできません。調べた感じ、いくつか音の再生ができるモジュールがあったので使用感をメモしておきます。

2. winsound モジュール

winsound モジュールは標準ライブラリなので、とくにインストールなど必要なく使えるのが魅力です。再生するために必要なメソッドも簡単です。
import winsound

winsound.PlaySound("test.wav", winsound.SND_FILENAME)

これだけ。試験段階だとこれで十分でした。ただ、音を重ねて鳴らしたい場合は不便です。1チャンネルしかないのか、1度にならせる音は1音のみのようでした。

  • よいところ:標準ライブラリ。簡単に再生できる。
  • わるいところ:複数トラックは再生できない?

3. pyaudio モジュール

ググった感じ音声関係のプログラムには必ずといっていいほど出てくるのがこの pyaudio モジュールでした。実際かなりいろいろなことができます。これ単体で音を鳴らすこともできます。
参考:pythonで和音を鳴らそう - すこしふしぎ.
また、winsound のように wav ファイルを読み込むこともできます。
参考:Python/Pyaudioでwavファイルの再生
チャンネルもあるので複数音にも対応していそうです。しかし、wave モジュールも必要で少しコードが長く感じたので、今回の使用は見送っています。
  • よいところ:音声プログラミングにおいて万能。音が出せるし再生もできる。
  • わるいところ:万能なぶんいろいろな設定が必要。

4. pygame モジュール

今回のプログラムではこれに落ち着きました。pygame モジュールはゲーム制作のいろいろに使えるようですが、今回はそのうちの pygame.mixer モジュールという音声に関する機能だけを使います。
pygame.init() //初期化 最初だけでOK
test = pygame.mixer.Sound("test.wav")
test.play()
これで音が鳴らせます。同時に鳴らすと同時に複数チャンネルに分けてくれるので、複数トラック再生にも対応しています!今回のような用途だとちょうどよかったので、採用としました。
参考:pygameで音を鳴らす - とあるアプリデベロッパの備忘録ノート
  • よいところ:簡潔なコードで複数トラック再生ができる。
  • わるいところ:いまのところなし!

多分普通に考えたら pyaudio が一番いいのですが、なめてるのでお手軽に使える pygame を使います。これで音も出せるようになりました。
今回のソフトを作るうえで知っておきたいツールの使い方はこれでだいたい書いた感じです。あとはこまごまとした部分を調整するだけの地味~な作業でした。今こんな感じになってます。

リズムのズレが気になりますので今これをなんとかしようとしていますが、なんともならないかもしれません。頑張ります。

0 件のコメント:

コメントを投稿