前回、MIDI音楽を作成、再生するプログラムをPythonで作りましたが、そのプログラムでは再生中、他の処理がストップしてしまうという問題があります。今回は、スレッド処理を用いることで、他の処理を止めることなく音楽を演奏できるプログラムを作成してみました。

ソースコードはこちら

ソースコードの説明

今回もMIDI演奏はpygameを用いています。インストールしていない人は以下のコマンドでインストールしてください。

まずmyMIDIというクラスを作成しています。このクラスはthreading.Threadを継承しており、MIDIの再生、停止などを行います。threading.Threadのstartメソッドを実行してスレッドを開始します。startメソッドを複数回実行するとエラーになるので注意してください。スレッド開始後、音楽の停止はpauseメソッド、再開(再生)はresumeメソッドを使います。

また、このクラスにあるsoundメソッドで3つの音楽(?)を作成しています。1つ目は前回同様「カエルの歌」、2つ目と3つ目は適当な3音「ミファソ」と「ドソミ」です。set_soundメソッドで1~3を切り替えられるようにしています。さらにset_paceメソッドで音の速さを5段階で調節できるようになっています。set_paceメソッドの引数は1~5の整数を取ります。

このスクリプトを実行すると、カウントが20のときに「カエルの歌」の演奏が始まり、カウントが200のときにペースが速くなります。そしてカウント270でいったん演奏を止めたあと、300から別の音(ミファソ)、さらに350から別の音(ドソミ)に切り替わります。

実際に実行した様子はこちら

音が鳴っているときも数字がカウントアップされており、処理が止まっていないことが分かります。

いかがだったでしょうか。今回は最初から再生できる音を3つだけにしていましたが、次回は音楽データ(音符と長さ)を書いたファイルを読み込んでMIDI演奏するGUIプログラムを紹介したいと思います。