見出し画像

Max/MSPからMIDIノートとコントロール・チェンジを送信するパッチ。

こんにちは。
前回は Max から OSC 経由で照明ソフトの DoctorMX に照明制御用の(DMX)信号を送りました。

そして今回は、OSCよりも断然古くからある音楽系の制御プロトコルである MIDI を Maxパッチから送れるようになりたいと思います。

・そもそも MIDI とは。

という訳で、読み方は ミディ 。Musical Instrument Digital Interface の略称ということですね。音響さんをやっているとよく 音声(波形)データMIDIデータ の2つの形式のデータを扱います。音声データは、例えば1秒間を44100回に割って各ポイントの音量を全部記録したような、いわゆる波形データ。MIDI データは、主に譜面などのデータで、対応するソフトで再生したり、楽器(音色)を変えてみたりと、音楽的にとても融通のきくものです。

Wiki のある通り、MIDI はハードウェアの規格から、通信プロトコル、ファイル・フォーマットに至るまでかなり広範にわたった包括的な規格ですので、ここで詳細を説明することは避けようと思います。それじゃあ、何を書くのか。という訳で、

・話題を MIDIノート と コントロール・チェンジにしぼる。

MIDI の通信系の部分、いわゆる MIDI メッセージにもいくつかの種類があるのですが、僕がプログラムや制御系を書くときに使い勝手がいいなと思ってよく扱うのが、MIDIノート と コントロール・チェンジ(CC) です。それぞれに想定された使い方があって、

・MIDIノートは、何番のチャンネルの何番目の鍵盤を、これくらいの強さ(音量)で鳴らしてください、みたいな指示。
・コントロール・チェンジは、何番のチャンネルの音量(ボリューム)や定位(パンニング)を、これくらいの量に変更してください、みたいな指示。

となります。
まあプログラマーとしての僕は、そんな種類とかにはあまり頓着せず、だいたい 1bit + 7bit のバイト列だなぁーーて思って見たりいじったりするのですが。
いずれにせよ何かしらの制御を行う上では、送り側と受け側の認識さえ一致していればちゃんと動作するはずなので、ひとまずパッチを見てみましょう。

・MIDIノート とコントロール・チェンジを送信する Maxパッチ。

はい、これですね↓。

スクリーンショット 2020-06-30 21.36.10

それでは前回と同じように、

・Max パッチのオブジェクトを下から順に見ていきましょう。

まず一番下にあるのが「midiout a」というオブジェクト。「midiout」部分がオブジェクト名で「a」が引数(アーギュメント)、つまりオプションみたいなものですね。このオブジェクトは読んでそのまま、MIDI の信号をMaxの外に向けて送信するためのオブジェクトです。「a」の部分は識別子で、対応するMIDIポートをMaxの設定から割り当ててやることができます。↓こんな風に MIDI 設定から、シンボルに対応するポートを選べます。

スクリーンショット 2020-06-30 11.01.54

そして1つ上にあるのが「midiformat 16」ですね。「midiformat」は様々な種類のMIDIメッセージを、分かりやすく作成してくれる、MIDIメッセージ製造機のようなオブジェクトです。「16」の部分の数字は送り先となるMIDIチャンネルです。ここの数字は受け側の機器やアプリの数字(MIDIチャンネル)と一致している必要があります。

さて「midiformat」オブジェクトですが、よく見ると左から1つ目と3つ目のインレットには、その上の(「0 127」と書かれた)メッセージボックスがそれぞれ接続されています。そこで「midiformat」のインレットの役割ですが、
・1番目のインレットは、リストを受け取り、MIDI ノートを出力する。
・3番目のインレットは、リストを受け取り、コントロール・チェンジを出力する。

というような仕様になっています。
そして受け取るリストの中身ですが、それぞれ
・1番目のインレットは、MIDIノートのPitch(音階)とVelocity(強さ)。
・3番目のインレットは、コントロール・チェンジのNumber(番号)とValue(値)。

となっています。MIDIのデータは基本的に1バイト(8bit)単位で構成されているのですが、先頭の1bitがステータスバイトとなっており、データとして扱えるのは7bit、なので設定できる値はどれも 0 - 127 の範囲となっています。

・それでは実際に MIDI ノートを送信してみましょう。

今回のパッチデータですが、「midiformat」オブジェクトから上は大きくふたつに別れており、左半分がMIDIノート、右半分がコントロール・チェンジのデータ作成部分になっています。
先ほど出てきた「0 127」というメッセージですが、MIDIノートを送る場合は、
・「0 」がPitch(音階/C -1)。
・「127 (最大値)」がVelocity(強さ/音量)。
という解釈になります。これを作成するパッチは↓の部分、

スクリーンショット 2020-06-30 17.06.05 2

なおこの「0 127」のメッセージを作成する部分↑は、前回記事の、
・ナンバーオブジェクトの操作でOSCを送る。
の部分と、ほぼ共通になっています。
ユーザーが「number」オブジェクトで選択した値を一時的に「message」に格納し、後からくる「bang」メッセージで「pack」オブジェクトに流して、ふたつの値をリストへと変換する。
前回と異なるのは、ナンバーオブジェクトの右側に送信(Send)用の「button」オブジェクトが追加されていることですね。
前回はナンバーオブジェクトが変更されるタイミングを拾って、同時に「bang」メッセージも送信することで、連続的に OSC のメッセージを送信していました。ですが今回は「例えばどの鍵盤を鳴らそうか選んでいる最中に、鍵盤を鳴らす信号が送られてしまう。」みたいなことを防ぐために、ユーザーが送信用のボタンを押したタイミングでのみ「bang」メッセージが流れ、MIDI ノートが送信されるようになっています。

・さてつぎはコントロールチェンジを送信してみましょう。

ふたたび先ほどの「0 127」というメッセージですが、コントロールチェンジを送る場合は、
「0」が Number (コマンドの種類)
「127 (最大値)」が Value (値)
という解釈になります。これを作成するパッチは↓の部分、

スクリーンショット 2020-06-30 21.36.10 2

MIDI のコントロールチェンジは、例えば音量スライダー(フェーダー)とか、パンポットとか、連続して値の変更が起こる設定などによく使用されます。なのでこのパッチでは、
・Number が変更された時には、メッセージは送信しない。
・Value が変更された時には、そのまま連続してメッセージを送信する。
という動作設定にしています。

・別アプリや実際の機材で受信確認をしてみる。

ここまでで MIDI メッセージを送信するパッチは出来ているはずなので、外部の MIDI 機器や別のアプリ、 MIDI Loupe ↓などの MIDI チェッカーで受信を確認してみましょう。

・関連記事

Max のルールなど基礎的なこともちらほら書き交えているので、記事は執筆順に読むとわかりやすいかと思います。ということで、前回記事はこちら↓です。
・Max/MSPから照明ソフトのDoctorMXにOSC信号を送るパッチ。

・まだまだ続きますよー

さて次回は MIDI メッセージを使って LIVE! か DoctorMX どちらかのシーンを呼び出してみたいとか考えています。それではーー

三橋

この記事が気に入ったらサポートをしてみませんか?