PythonとMIDIで電子楽器を鳴らそう
この記事は PyLadies Advent Calendar 2018 12月14日の記事です。
Advent Calendarもそろそろ折返しということで、ちょっと一服。
本日は実用性の薄いニッチなネタを書かせていただきます。
詳しい方からはマサカリが飛んで来そうですが、、ご家庭のキーボード(楽器のほう)などで自動演奏してみたい!という酔狂な方はご一読いただければ幸いです。
[自己紹介]
- 「自動演奏&自動作曲をやろう!」という試みの一環で、TENORI-ONという電子楽器にPythonでMIDI信号を作って流してます。(2018年8月〜)
- 若い頃にテレビで明和電機を見て「こんな大人になりたい」と思った結果、何かを間違えました。
[今日のお品書き]
はい。本題入ります。
●そもそもMIDIってなんぞ?(超絶ざっくり)
主に音楽演奏や制作に使われる、MIDIプロトコルという規格。「Musical Instrument Digital Interface」の略。
=>キーボード、シンセサイザー等、ドレミファソの音をデジタルな音階で持っている楽器は概ねMIDIに対応している、と捉えてください。
※奥が深すぎるので豪快に割愛します。
●電子楽器にMIDIファイルを流して自動演奏してみよう
Pythonは関係ないです。簡単に、既存のMIDIファイルを電子楽器に流す方法を紹介します。
<用意するもの>
・MIDI端子があるorUSB接続可能な電子楽器(主にキーボード)
=> 製品マニュアル要確認ですが、、本体外周を見回して、外部接続できそうな端子をチェックして見てください。(ヘッドホン端子
以外)
今回のサンプルは、USB接続可能な「ポケットミク」です。
・(入出力がMIDI端子の場合)USB-MIDIインターフェース
=> 製品の相性があるようですが、、ヤマハのUX-16など。
・(入出力がUSBの場合)USBケーブル
=>本体-PC接続可能なもの。旧型のtype-Bなどの場合もあり。
・MIDI音源 => ゲーム音楽が数多め。検索 "MIDI {ゲームのタイトル}"や"MIDI フリー素材" でhitします。
・MIDIプレーヤーソフト => フリーソフト「MidiTrail」がおすすめです。
<MidiTrailで流す!>
1)PCと電子楽器をUSB接続。両方とも電源ONにしておく
2)MidiTrailを起動
3)メニュー "Option" -> "MIDI OUT"でdefault portに"NSX-39"を指定
4)メニュー "File" -> "Open"で、MIDI音源を選択
5)メニュー "PlayBack" -> "Play/Pause" 、または スペース で音源再生
流してみました。
FF5 「ビッグブリッジの死闘」をかなり忠実に再現できることが判明。
— pj-hack-tenorion (@hack_tnr) 2018年12月13日
しかし、ミクさん歌わない。#ポケットミク pic.twitter.com/rCpzCek00r
●Pythonで作ったMIDI信号を楽器に流してみよう
<ライブラリについて>
・ガチ音楽なMIDIのファイルを作成する場合
=> ライブラリ「pretty_midi」が良さげ。音色がデフォルトで何種類か選べる。
ドレミは[60, 62, 64]などノートナンバーで定義する必要はあり。
※リアルタイムでのMIDI信号生成には不向きな様子
・とりあえず気楽にリアルタイムで単音を出したい場合
=> ライブラリ「pygame.midi」がおすすめ。動的に信号を出して遊べる。
※自分はもっぱらこちらを使用。
<音の出し方>
・ざっくり言うと、note_onで音がでる。note_offになるまで残る。
・ピッチ(音の高さ)は60でド。1増えるごとに半音上がる。
・ベロシティ(音の立ち上がりまでの速度)は、とりあえず80ぐらいで設定して、あとはお好みで。
下記、欽ちゃんの仮装大賞のような音が作れるPythonのサンプルコードです。
肝心なPython部分がざっくりすぎるのでアレですが、正直Python書くよりも環境周りの知識のなさにものすごく苦戦しました。。
楽器さえ繋げられればあとは楽しみながら試行錯誤できるはず!!
一応、来年のMaker Faire Tokyo2019に向けて、これらを使った新作を予定しております。ひとまず勉強せねばです。
合間にRaspberry Piもくもく会向けにライトなものも考えているので、どこかでTENORI-ONを持って出没するかもしれません。
「アドベントカレンダー14日目」と言いたかったのに、MeCabが単語を認識できずに落ちたので、仕方なく全部カタカナで入力させた。 pic.twitter.com/ehoLd7fLNh
— pj-hack-tenorion (@hack_tnr) 2018年12月13日