ドレミファソラシドを鳴らすサンプル【Python】

Python

Python で、ドレミファソラシドを鳴らすスクリプトをまとめておきます。pygame を使います。
以下の環境で動作確認をしています。

環境:
・ Windows 10 パソコン
・ Anaconda+Python 3、pygame をインストール済み。
※ pygame をインストールしていなければ設定してください。インストール手順を末尾の関連リンクにまとめています。

背景 ~ Python でドレミファソラシド!

Windows パソコンに Python と pygame をインストールすると、Python のプログラミングでパソコン内の MIDI 音源が扱えるようになります。
試しに簡単な音階を鳴らそうと思いましたが、ネット検索をすると、手順やスクリプトを簡潔にまとめたサイトが見当たらないようです。
ということで、ドレミファソラシドを鳴らす Python のスクリプトをまとめ、公開しておくことにします。
音階部分のデータを入れ替えることで、好きなメロディーを演奏できます。

使い方

① デスクトップなどにフォルダを作り、midi1.py 等のテキストファイルを作成してください。
② midi1.py に下記のサンプルスクリプトをコピー&ペーストして保存してください。
③ コマンドプロンプト、又は、Anaconda Prompt を起動し、①のフォルダに移動してください。
大きな音が出る可能性がありますので、パソコンのスピーカーの音量を小さめに調整しておいてください。
④ 以下を例に、コマンドプロンプト上で②のスクリプトを実行してください。
例: ”python midi1.py” [enter] 等と入力

サンプルスクリプトの説明

・ 冒頭で、時間設定に使う time と、pygame.midi を読み込んでいます。pygame をインストールしていない場合は、設定が必要です。
・ def tone1( … ) としたところで、音を鳴らす関数を定義しています。
・ a1 = […] とした行で、音符の長さ(単位、秒)と、各音階(note number)を決めています。
具体的には、それぞれの音を鳴らす時間(0.5秒~1.5秒)を決め、音階を C, D, E, F, G, A, B, C (ド、レ、ミ、ファ、ソ、ラ、シ、ド)に設定しています。
正常に再生ができたら、各音の長さや音階を変えてみてください。
・ 各音階を設定するところで、値 60 が ド (国際式の C4、261.6Hz)に対応しています。値が1つ増減すると、音階が半音だけ増減します
たとえば、60 がドですので、61 はドのシャープ(C4#、または、D4♭)、62 がレ (D4) 、…、69がラ(A4、440.0Hz)に対応しています。
・ 加えて、オクターブは oct1 で設定しています。うまく動いたら、oct1 = 1, -1 等としてみてください。1オクターブ単位で音階を上下できると思います。
スクリプト内部では、oct1 の値を参照し、音階を1オクターブに対応する 12 ずつ(1オクターブ = 12×半音に対応)増減させています。スクリプトを修正することで、転調なども容易です。
・ 音の長さについては、len1 = 1.0 としたところで、一括で係数倍できるようにしています。全体の速度を微調整できるようにするためです。
・ 楽器の種類は ins1 で決めています。ins1 = 0 でピアノです。0以上の整数の範囲で、数値を変えてみてください。
楽器の種類については、下記の関連リンク「キーボードピアノ【本格49鍵!】」にまとめています。興味があるようでしたら、参照してみてください。
・ スクリプトで、上記のパラメータの設定後、midi の初期化処理を行っています。
・ for ループで、関数 tone1() を呼び出し、事前に a1 で定義した各音符を鳴らしています。
・ 末尾の close()、quit() などは、midi の終了処理です。Windows のスピーカーや midi の機能などのリソースを使いますので、プログラムの終了時は解放しておくという理解でよいと思います。

まとめ

Windows パソコン内部の MIDI 音源を使って、ドレミファソラシドを鳴らすスクリプトをまとめました。
非常にベーシックな内容なのですが、ネット検索をしたところ見当たらないようでしたので、スクリプトをまとめ、公開しておくことにします。

これで、パソコン内部の音源、MIDI関連の機能が、Python のプログラミングで自由に扱えるようになります。
なお、上記の内容を発展させ、ピアノのアプリにしたプログラムなどを下記のリンクにまとめています。もしも関心があるようでしたら、参照してみてください。

関連リンク
・ キーボードピアノ 【本格49鍵!】
・ Python で Just the Two of Us 進行 【コード進行】
・ Pygame をインストールする手順
・ Anaconda 環境で Pygame をインストールする手順【Python】
・ 音声データの音量レベルを一括で変換する

外部リンク
・ pygame.midi の仕様: https://www.pygame.org/docs/ref/midi.html

サンプルスクリプト


import time as tm1 
import pygame.midi as pm1 

def tone1( a1 ): 
    global op1 
    global len1 
    global vol1 
    op1.note_on( a1[1]+oct1*12, vol1 )
    tm1.sleep( a1[0]*len1 ) 
    op1.note_off( a1[1]+oct1*12, vol1 )

a1 = [[0.5, 60], [0.5, 62], [0.5, 64], [0.5, 65], [0.5, 67], [0.5, 69], [0.5, 71], [1.5, 72]]     # C, D, E, F, G, A, B, C 

vol1 = 127 
len1 = 1.0 
oct1 = 0 
chn1 = 0 
ins1 = 0 

pm1.init()
op1 = pm1.Output(0)
op1.set_instrument(ins1, chn1)

for a2 in a1:
    tone1( a2 ) 

op1.close()
pm1.quit()


タイトルとURLをコピーしました