前回、MIDI音楽を作成、再生するクラスを作りました。前回まではソースコードのなかに音楽データ(音符の順番と音の時間)を書き込んでいましたが、ファイルで定義した音楽を再生できるように、ファイルを読み込んで音楽を再生するGUIプログラムを作成したので紹介しようと思います。

実際に動かしたところはこちら

ビデオ内容の説明

  1. Fileボタンを押して音楽を定義しているエクセルファイルを読み込みます。
  2. Playボタンを押すと演奏が始まります。
  3. speedを2.0にすると倍速で演奏します。
  4. さらにspeedを3.0にして、repeatを2にすると3倍速で2回再生されます。
  5. ※ Stopボタンを押せば、演奏の途中でも再生が止まります。

読み込んでいるファイルはこちら

読み込むエクセルファイルは4列で音の情報を指定します。音符を指定するnote列、オクターブを指定するoctave列、シャープの有無を指定するsharp列、音の持続時間を指定するtime列の4列です。note列は前回同様、「ドレミファソラシ」および「間」のいずれかを指定します。octave列では通常(?)のドレミファソラシが0、そこから1オクターブ高い場合は1、1オクターブ低い場合は-1というように、±整数値でオクターブを指定します。sharp列は#ありが1、ない場合は0というように0/1で指定します。timeは音を鳴らす(もしくは間を取る)時間で、単位は秒です。

「カエルのうた」のファイルと「ドレミのうた」のファイルを作成しました。以下からダウンロードできます。

ソースコードはこちら

ソースコードの説明

前回のmyMIDIクラスを修正、拡張しています。前回のmyMIDIクラスではクラス内でMIDI音楽の情報を生成・保持していましたが、今回はplay_soundメソッドに音階(doremi)、オクターブ(octave)、シャープ(sharp)、時間(tempo)の情報を渡すことで、MIDI音楽を演奏させています。

Fileボタンを押すとread_file関数が呼び出され、エクセルファイルを読み込んでいます。

Playボタンを押すと、play_midi関数が呼び出され、その中で繰り返し回数と演奏速度を指定して、play_midi_thread関数でMIDIの演奏を開始させています。

いかがでしょうか。これなら誰でも作曲できるのではないでしょうか。エクセルファイルに曲を作ったら、共有、コメントいただけると幸いです。