2017.12.08 Fri |
Pythonを使ってWindowsのビープ音で遊んでみる(その4)
過去3回にわたり,Windowsのビープ音はプログラムで周波数と長さを制御できるという発見から,Pythonを使ってWindowsのビープ音で録音再生機能付きのピアノを作ってみた話をしてきました.
初回はプログラムコード全体を見せ,ビープ音を鳴らすためのコードと,音程を決めるための手法の話をしました.
2回目は実際に作ったアプリの機能について説明をしたと思います.
前回はようやくプログラムの説明に入り,使用するモジュールや通常モードの説明を行いました.
今回もその続きで,録音モード,再生モードのプログラムコード説明をします.
動作環境はPython2.7,Windows8.1です.
※Windowsのビープ音と書いてある通り,Macなど他のOSでの動作は確認できていません.
過去の記事については以下のリンクをご参照ください.
その1
その2
その3
全体のコードは初回の記事に載せたので参考にしてください.
録音及び再生モードは,プログラムの通常モードより,関数”recording()”および”playing()”により呼び出されます.
そのためそれぞれの関数が終了すると自動的に通常部分へ戻ります.
それではまず録音モードから始めましょう.
コードは以下のようになっています.
16,17行目で,変数”key”および”rec”を,他の関数内でも使用できるよう,グローバル変数として定義しています.
変数”key”は前回説明した,オクターブキーを指定するための変数です.
この録音モードで重要なのが,変数”rec”になります.
変数”rec”は18行目より,配列型で定義されていることがわかります.
仕組みから話してしまうと,録音モードでは1ミリ秒ごとにキー入力の有無を確認し,入力があればそのキー情報を,なければ”0”をこの配列”rec”に格納していきます.
そうすることで,再生モードにおいて分解能1ミリ秒で録音された音を再現できるようになっています.
コードに戻りますと,19から27行目まで,time.sleep関数とws.Beep関数の繰り返しになっています.これらは録音モードが開始されたときに流れるカウントダウン音を構成しています.
29行目からはwhile 1を用いており,通常モードと同じ仕組みです.
押されたキーの音を鳴らすだけでなく,そのキーを配列”rec”に要素として順に格納していくのが録音モードの特徴です.
要素名は,”「キーの値」+「オクターブ情報」”で構成されます.
例えば,オクターブがひとつ高いところ(key : +1)で”ラ”の音(対応するキーは”h”)を録音した場合,配列”rec”には要素として”h1”が格納されます.
また78行目からの,キーが押されなかった場合の処理も異なります.配列”rec”に”0”を格納し,time.sleepで1ミリ秒スリープします.この処理は休符を加えることに相当します.
以上により,1ミリ秒ごとにキーの入力をもとに配列”rec”へ情報を格納することができました.
他に異なる部分は,プログラム終了の”@”キーと再生モード開始の”B”キーが押せないところになります.
75から77行目より,再び“V”キーを押すことで,録音モードのループを抜けて通常モードへと戻ります.
続きまして再生モードのプログラムを見ていきます.
と思いましたが,長くなりそうなので次回に回します.
最初に録音及び再生モードの説明と銘打っておいて申し訳ありませんが,今回は録音モードの説明のみになります.
次の記事はこちらです.
K.M
東京大学大学院 工学系研究科 修士課程1年