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

Python

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

環境:
・ Windows パソコン
・ Python 3、pygame (および、Anaconda)をインストール済み。
※ 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 がド(C4)ですので、61 はドのシャープ(C4#、または、D4♭)、62 がレ (D4) 、63 がレのシャープ(D4#)、64 がミ(E4)、…、69がラ(A4、440.0Hz)、…、72 が1オクターブ上のド(C5)、… に対応しています。
・ 加えて、オクターブは oct1 で設定しています。うまく動いたら、oct1 = 1, -1 等としてみてください。1オクターブ単位で音階を上下できます。
スクリプト内部では、oct1 の値を参照し、音階を1オクターブに対応する 12 ずつ(1オクターブ = 12×半音に対応)増減させています。スクリプトを修正することで、転調なども容易です。
・ 音の長さについては、len1 = 1.0 としたところで、1拍分の長さを設定しています。len1 を変えることで、すべての音の長さを一括で係数倍できます。全体の速度を微調整できるようにしています。
・ 楽器の種類は 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 進行 【コード進行】
・ 指定範囲を繰り返し再生する音楽プレーヤー【Python】
・ ブラウザで動く音楽プレーヤー 【JavaScript & Python】
・ Pygame をインストールする手順
・ Anaconda 環境で Pygame をインストールする手順【Python】
・ 音声データの音量レベルを一括で変換する
・ 動画ファイルから音声データを一括で引き抜く 【Python & ffmpeg】

外部リンク
・ 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をコピーしました