ドレミファソラシドを鳴らす Python のスクリプトについてまとめておきます。
以下の環境で動作確認をしています。
環境:
・ Windows パソコン
・ Python 3、pygame (および、Anaconda)をインストール済み。
※ pygame を使います。インストール手順を末尾の関連リンクにまとめています。
背景 ~ Python でドレミファソラシド!
Windows パソコンに Python と pygame をインストールすると、Python からパソコン内の MIDI 音源が扱えるようになります。
ためしに簡単な音階を鳴らそうと思いましたが、ネット検索をすると、手順やスクリプトを簡潔にまとめたサイトが見当たらないようです。
ということで、ドレミファソラシドを鳴らす Python のスクリプトをまとめ、公開しておくことにします。
音階部分のデータを入れ替えることで、好きなメロディーを演奏できます。
プログラミングに興味のある方、音楽に詳しい方は遊んでみてください。
使い方
① パソコン内に音楽を扱うためのフォルダ(例: “deskitop_music1″)を作ってください。
例: c:\user\desktop_music1\
② ①のフォルダ内に midi1.py という名前でテキストファイルを作成し、下記のサンプルスクリプトをコピー&ペーストして保存してください。
以下で、プログラムを実行すると音が出ます。事前にパソコンのスピーカーの音量を(小さめに)調整しておいてください。
③ パソコンのコマンドプロンプト(または、Anaconda Prompt)を起動して、②のスクリプトを実行してください。
例: python c:\user\desktop_music1\midi1.py
→ ドレミファソラシドの音が鳴ったら成功です!
うまく動いたら
・ うまく動いたら、メロディーを設定している部分を変更してみてください。
a1 = [ … ] としているところで、音の長さと音程を設定しています。
・ 簡単な曲、好きな曲を設定してみるなど、自由にアレンジしてみてください。
・ このスクリプトをパソコンのタスクスケジューラやバッチファイルなどから呼び出すことで、指定時間に音楽を鳴らす、なども可能です。
・ プログラミングに興味のある方、音楽に詳しい方は、もっと洗練した内容にアレンジしてみてください。
スクリプトの説明
・ 冒頭で、時間設定に使う time と、pygame.midi を読み込んでいます。
pygame をインストールしていない場合は、設定が必要です。
・ def tone1( … ) としたところで、音を鳴らす関数を定義しています。
・ a1 = […] とした行で、音符の長さ(単位、秒)と、各音階(note number、MIDI のノートナンバー)を設定しています。
・ 具体的には、それぞれの音を鳴らす時間(0.5秒~1.5秒)を決め、C、D、E、F、G、A、B、C (ド、レ、ミ、ファ、ソ、ラ、シ、ド)の音階を設定しています。
正常に再生ができたら、各音の長さや音階、音符の数を変えてみてください。
・ 加えて、オクターブは oct1 で設定しています。うまく動いたら、oct1 = 1, -1 等としてみてください。1オクターブ単位で音階を上下できます。
スクリプト内部では、oct1 の値を参照し、音階を1オクターブに対応する 12 ずつ(1オクターブ = 12×半音に対応)増減させています。スクリプトを修正することで、転調させることも可能です。
・ 音の長さは、len1 = 1.0 とした行で設定しています。
len1 は1拍分の時間(秒)に対応しています。len1 を変えることで、a1 = […] で指定している各音の長さを一括で係数倍するようにしています。全体の速度を変えることができます。
・ 楽器の種類は ins1 で設定しています。ins1 = 0 でピアノです。0以上の整数の範囲で、数値を変えてみてください。
楽器の種類については、下記の関連リンク「キーボードピアノ【本格49鍵!】」にまとめています。興味があるようでしたら、参照してみてください。
・ スクリプトでは、上記のパラメータの設定後、midi の初期化処理を行っています。
・ for ループで、関数 tone1() を呼び出し、事前に a1 で定義した各音符を鳴らしています。
・ 末尾の close()、quit() などは、midi の終了処理です。Windows のスピーカーや midi の機能などのリソースを使いますので、プログラムの終了時はリソースを解放しておきます。
MIDI のノートナンバーについて
・ スクリプトの各音階を設定するところで、MIDI (Musical Instrument Digital Interface)のノートナンバーを使っています。
・ ノートナンバーは、MIDI 規格での音程(ピッチ)に対応する数値です。ピアノやシンセサイザーなどのデバイスで使用されています。
・ ノートナンバーの値 60 が ド (国際式の C4、261.6Hz)の音階に対応しています。
・ ノートナンバーの値が1つ増減すると、音階が半音だけ増減します。
・ たとえば、60 がド(C4)ですので、61 はドのシャープ(C4#、または、D4♭)に対応します。
・ 同様に、62 がレ (D4) 、63 がレのシャープ(D4#)、64 がミ(E4)、…、69がラ(A4、440.0Hz)、…に対応しています。
・ ピアノの鍵盤は半音ずつ音階が上下する並びになっており、各鍵盤がノートナンバーの数値に1:1で対応しています。ピアノの鍵盤でドから右方向に黒鍵、白鍵…をたどっていくと、12個めに1オクターブ上のドに至ります。
したがって、ド(C4)のノートナンバー 60 に 12 を足した 72 が、1オクターブ上のド(C5) に対応しています。ノートナンバーの +12 が、音の周波数の2倍(波長でいえば半分)に対応しています。
・ 音階を数値で指定できることから、MIDI のノートナンバーを使うことで、Python などのプログラムで音楽を扱うことが可能、容易となります。
まとめ
Windows パソコン内部の MIDI 音源を使って、ドレミファソラシドを鳴らすスクリプトをまとめました。
非常にベーシックな内容なのですが、ネット検索をしたところ見当たらないようでしたので、スクリプトをまとめ、公開しておくことにします。
これで、パソコン内部の音源、MIDI関連の機能が、Python のプログラミングで自由に扱えるようになります。
なお、上記の内容を発展させて、ピアノのアプリを作っています。
また、MIDI のノートナンバーに関し、和音・コード進行を再生するプログラムもまとめています。
電子ドラムを鳴らす試みもしています。
もし、音楽やプログラミングに興味があるようでしたら、下記の関連リンクなども参照してみてください。
関連リンク
・ キーボードピアノ 【本格49鍵!】
・ ブラウザで電子ドラムを鳴らす 【JavaScript】
・ 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
サンプルスクリプト midi1.py
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()