2017.12.06 Wed |

Pythonを使ってWindowsのビープ音で遊んでみる(その3)

shutterstock_606667244

 

過去2回にわたり,Windowsのビープ音はプログラムで周波数と長さを制御できるという発見から,Pythonを使ってWindowsのビープ音で録音再生機能付きのピアノを作ってみた話をしてきました.

初回はプログラムコード全体を見せ,ビープ音を鳴らすためのコードと,音程を決めるための手法の話をしました.

前回は実際に作ったアプリの機能について説明をしたと思います.

過去の記事については以下のリンクをご参照ください.

その1

Pythonを使ってWindowsのビープ音で遊んでみる

その2

Pythonを使ってWindowsのビープ音で遊んでみる(その2)

 

今回はようやくプログラムの中身の説明に入っていきます.

全体のコードは初回の記事に載せたので参考にしてください.

動作環境はPython2.7,Windows8.1です.
※Windowsのビープ音と書いてある通り,Macなど他のOSでの動作は確認できていません.

 

まず最初に5~7行目で3つのモジュールをインポートしています.

 

インポート

 

winsoundは初回の記事で説明しました,ビープ音を鳴らすためのモジュールです.

msvcrtはPCキーボードの入力を取得するための関数を利用するためにインポートしています.先ほどのwinsoundと並んでこのアプリの核をなす大切なモジュールです.
このアプリでは常にユーザーのキー入力を待っており,その入力が生じた際,押されたキーが何であったかを元に鳴らす音や行う処理を決めています.
入力が生じたこと,および入力されたキーの種類を取得するのがmsvcrtモジュールになります.

timeは録音モード時のカウントダウン音を構成するために使われます.音と音の間の休符をtime.sleep関数を用いて表現するのです.

 

インポートの先,プログラムは大まかに3つの部分に分けられます.

 

15行目~189行目の録音モード部分

195行目~273行目の再生モード部分

281行目~418行目の通常モード部分


録音モード,通常モードでは基本のプログラムは共通しています.再生モードのみプログラムの形式が異なっています.

この基本プログラムについて通常モード部分で説明をします.

 

通常モード

 

281行目の

while 1

で,ブレークされない限り以下のプログラムを回し続けます.

 

次に変数”key”に格納されている現在のオクターブ情報を取得します.デフォルトは9行目の表記に伴いkey:0 となっています.

key:-1なら283行目からの処理へ

key:0なら328行目からの処理へ

key:+1なら376行目からの処理へ

それぞれ進みます.この進んだ先で,PCキーボードの鍵盤キーに対する音の割り当てがオクターブ異なるというわけです.以下,key:0の場合に進んで説明します.

 

この先ではまず328行目の

if ms.kbhit()

という処理で,キー入力の有無を確認します.
キー入力がなければ372行目のelseに進み,passで何もせず通過→プログラム頭に戻りオクターブ情報の取得から繰り返し,という流れになります.

キー入力があった場合は,329行目の

note = ms.getwch()

で押されたキーを変数”note”に格納します.

以下,その変数に応じて処理を変えます.

 

330~355行目,鍵盤に相当するキー(中段A~K,上段W~U,R以外)が押された場合,キーごとにその音をws.Beep関数で鳴らします.

356~361行目,オクターブ調整キー(X,C)が押された場合,その変更されたオクターブを画面にプリントし,変数”key”を変更します.この変更可能なオクターブは現在のオクターブに依存します.

362行目,“@”キーが押されたらプログラムの終了

364行目,“M”キーが押されたらチュートリアルを表示します.

366行目,”V”キーが押された場合,”prepare to record”と画面上に表示し,15行目からの録音モード部分である”recording()”関数を実行します.

369行目,”B”キーが押された場合,”playing music”と画面上に表示し,195行目からの再生モード部分である”playing()”関数を実行します.

 

また少し長くなったので,録音モードと再生モードのコード説明は次回に回します.

 

shutterstock_577183882

 

次の記事はこちらです.

Pythonを使ってWindowsのビープ音で遊んでみる(その4)

 

K.M
東京大学大学院 工学系研究科 修士課程1年

entry! page top