2017.12.10 Sun |
Pythonを使ってWindowsのビープ音で遊んでみる(その5)

最初は2回ほどに分けて書く予定だったこの記事も,書いているうちに内容が膨れ上がり,気づけばもう第5回です.
過去4回にわたり,Windowsのビープ音はプログラムで周波数と長さを制御できるという発見から,Pythonを使ってWindowsのビープ音で録音再生機能付きのピアノを作ってみた話をしてきました.
初回はプログラムコード全体を見せ,ビープ音を鳴らすためのコードと,音程を決めるための手法の話をしました.
第2回は実際に作ったアプリの機能について説明をしたと思います.
第3回はようやくプログラムの説明に入り,使用するモジュールや基本部分の説明を行いました.
第4回では,このアプリの録音機能についてプログラムの説明をしました.
今回もその続きで,説明を残していた再生モードのプログラムコードについて書きます.
動作環境はPython2.7,Windows8.1です.
※Windowsのビープ音と書いてある通り,Macなど他のOSでの動作は確認できていません.
過去の記事については以下のリンクをご参照ください.
その1
その2
その3
その4
全体のコードは初回の記事に載せたので参考にしてください.
さて,再生モードのプログラムを見ていきます.再生モードは他の二つのモードと比べて構成が異なります.
コードは以下のようになります.

196行目で”rec”をグローバル変数として宣言しています.これにより,前回録音モードで説明したrecording関数で作った配列”rec”を利用することができます.
197行目から再生モードの核心部です.といっても行っていることはすごくシンプルでして,配列”rec”の要素を197行目
for num in range (0, len(rec))
により最初から順に読み込んでいき,その要素と一致する音を鳴らしているだけです.
配列”rec”にオクターブキーの情報も格納されているため,最初にオクターブごとに場合分けする必要はありません.
再生すべき音は,
各オクターブの構成音12音×3オクターブ+一番高い”ド”の音(次のオクターブの最低音)
の計37音です.
要素が”0”の場合は,休符を再現するためにtime.sleepで1ミリ秒スリープさせる必要があることに注意です.(272~273行目)
再生が終了すると
“finish playing”
という表示とともに自動的に通常モードへ戻ります.
2回目の記事で述べましたが,再生モードの間はmsvcrtモジュールを使っていないので,一切のキー入力を受け付けないところが課題点になっています.
たとえば再生しながら通常モードに入れたら,録音に合わせて演奏,なんてことも可能になります.
ほかにも,普通の再生機能って一時停止や早送りなど備えているので,そういった機能も追加できれば素敵だなあと妄想しています.
とりあえずは現在の再生モード中にキー入力を受け付けるような仕様に変更しなければなりません.
これでプログラム部分の説明もひととおり終わりです.

今回はビープ音をプログラムで操作してみる,というコンセプトのもと簡単なピアノアプリを作ってみました.
このアプリ自体数年前に作ったものなのですが,今回記事を書くにあたりコードや機能などまだまだ洗練されていない部分,足りない部分があることを思い知り,いつか改良版を作ってみたいと思うようになりました.
以上で5回にわたり長々とお送りしてきたPythonを使ってWindowsのビープ音で遊ぶ記事は終了になります.
最後までお付き合いくださりありがとうございました.
K.M
東京大学大学院 工学系研究科 修士課程1年