クワマイでもできる

クワマイでもわかる

Sonic Piでポケット・ミクを演奏する

f:id:kuwamai:20190901141544j:plain Sonic PiというRubyで音楽が書けるツールを使い、ポケット・ミク(NSX-39)を演奏した。Sonic Piでランダムな歌詞と音程を生成し、MIDI出力をする。

できたもの

制作の記録

Sonic Piとは

↑開発者のSam Aaronさんの動画。音楽をRubyで書くツール。

公式サイト

インストール等は公式サイトを見ればわかると思う。チュートリアルが充実しているので使い方もすぐわかる。

MIDI

今回書いたコードはこんな感じ。

loop do
  __midi_send_timed("/*/raw", 0xf0, 0x43, 0x79, 0x09, 0x11, 0x0a, 0x00, rrand_i(0, 127), 0xf7)
  midi_note_on rrand(60, 70), channel: 1
  sleep 0.3
end

歌詞を設定する

MIDI規格にSysEx(システムエクスクルーシブメッセージ)というものがあり、これに従って使って歌詞を設定する。

現在(2019/09/01)Sonic Piはv3.1であり、SysExに正式には対応していない。下記スレッドによるとv3.2以降対応する予定とのこと。

同スレッドに__midi_send_timedを用いればv3.1でもできるとのことだったのでこれを使用する。あとはポケット・ミクの仕様に合わせてデータを作成する。

ポケット・ミクカスタマイズガイドに歌詞の設定方法について記述されている。

7ページに歌詞の設定方法、10ページにからまでのMIDIデータ一覧が載っている。下記に簡単に書く。ちなみに数値は16進数。

F0 43 79 09 11 0A 00 + 歌詞データ + F7

歌詞データをF0 43 79 09 11 0A 00F7で挟む感じ。F0 43 79 09 11 0A 00の最後のデータ、00は歌詞スロットを指定する部分で、00にすることでRAMに直接書き込み、リアルタイムな歌詞設定ができる。

歌詞データは00~7F、つまり10進数だと0~127になるため、からをランダムに抽出し、歌詞として設定する処理は下記コードになる。

__midi_send_timed("/*/raw", 0xf0, 0x43, 0x79, 0x09, 0x11, 0x0a, 0x00, rrand_i(0, 127), 0xf7)

設定した歌詞を歌わせる

midi_note_onで歌う。音程は60~70の範囲でランダムに歌うことにした。するとこんな感じになる。

midi_note_on rrand(60, 70), channel: 1

プログラムをStopしても最後の歌詞を歌い続けるので、その際は下記のコードで止める。

midi_all_notes_off

感想

Sonic Piは音楽をコードで表現できるので、比較的簡単にルールに基づいた音楽が生成できた。なので音楽素人の僕でもそれっぽい音楽が作れる。個人的には公式チュートリアルのサンプルを実行した時点で結構好みの曲だったので、また遊んでみたい。

また、RaspberryPiでも使うことができるらしいので、センサとポケット・ミクを組み合わせれば簡単に歌うオリジナル楽器が作れそう。夢が広がる。