laclac
@laclac

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

processingとMIDIデバイスの同期ができません

[追記]
processing3.4.5で実行してみましたところ、添付した画像のようにvoid noteOn(int channel, int pitch, int velocity)内のプログラムが実行されました。大学側がprocessing3.4.5の使用の許可がありましたので、1の問題は解決されたことになります。私の回答に少しでも時間を使ってくださった方々に感謝申し上げます。ありがとうございました。

私は9月の中旬にある大学の発表に向けて、電子ドラムとパソコンをMIDIで接続してプログラムを作りたいと思っております。電子ドラムでたたくことをマウスのクリックにみたて、太鼓の達人のような音楽ゲームやVJを作りたいと思っております。

扱う電子ドラムはyamahaのDD75で扱うMIDIインターフェースはMIDIMATE eXです。

そのために、私はまず電子ドラムでの出力データをprocessing4で標準出力させたいと考えています。

現段階ではprocessing上でMIDIデバイスを使用するために必要なMidiBusのインストールは完了し、pocketMIDIというアプリケーションを使用して電子ドラムをたたくとPCに信号が入力されていることが確認できています。以下はその信号が出ている時の画像です。
スクリーンショット 2024-08-15 132255.png

参照ページに記載されているプログラムを参考にして、標準出力をするプログラムを以下のように書きました。出力した時の画像も添付しておきます。
import themidibus.*;
MidiBus myBus; // MidiBusインスタンス
void setup() {
size(300, 300); //ウインドウのサイズ
background(0); //ウインドウ背景の色
MidiBus.list(); //MIDIデバイスのリストを表示
myBus = new MidiBus(new java.lang.Object(), 2, 5); //MIDIデバイスのinput,outputを指定
}

void draw() {
}

void noteOn(int channel, int pitch, int velocity) {
// Receive a noteOn
println();
println("Note On:");
println("--------");
println("Channel:"+channel);
println("Pitch:"+pitch);
println("Velocity:"+velocity);
}
void noteOff(int channel, int pitch, int velocity) {
// Receive a noteOff
println();
println("Note Off:");
println("--------");
println("Channel:"+channel);
println("Pitch:"+pitch);
println("Velocity:"+velocity);
}
void controlChange(int channel, int number, int value) {
println("Control Change Received");
println("Channel: " + channel);
println("Number: " + number);
println("Value: " + value);
スクリーンショット 2024-08-15 125700.png

参照ページ:https://github.com/sparks/themidibus/blob/master/examples/Basic/Basic.pde

問題点として以下の3点があります。

1.void controllerChange(int channel, int number,int value)、void noteOn(int channel, int pitch, int velocity)、void noteOff(int channel, int pitch, int velocity)のコードが読み込まれない。エラーは出ていないが、関数内に標準出力のコードを入力しても標準出力されない。

2.そもそも、上記の引数であるchannel,number,value,pitch,velcityが扱う電子ドラムDD75とどう関係しているのかわからない。

3.アプリケーションpocketMIDIの使用方法が不明。音の出力は分かるが、表示の意味が分からない。

そこで以下の三つについてお伺いしたいです。

1.void controllerChange(int channel, int number,int value)、void noteOn(int channel, int pitch, int velocity)、void noteOff(int channel, int pitch, int velocity)のコードが読み込まれない理由は何だと考えられますか?
(追記)
myBus = new MidiBus(new java.lang.Object(), 2, 5);の部分を
myBus = new MidiBus();
myBus.registerParent(this);
myBus.addInput(2);
myBus.addOutput(5);
に書き換える方法を試してみました。エラーメッセージは表示されませんが電子ドラムを叩いても信号を出力しません。
また、inPutの指定番号を1、outPutの指定番号を4にした場合、以下のような表示がされてしまいます。
スクリーンショット 2024-08-16 124120.png
スクリーンショット 2024-08-16 124057.png

2.void controllerChange(int channel, int number, int value) 、void noteOn(int channel, int pitch, int velocity)、void noteOff(int channel, int pitch, int velocity)のコードが意味する内容は何ですか?MIDIの知識不足のためchannel,number,value,pitch,velocityについてもよく分かっておりません。(追記)pitchは音の高さ、velocityは音の大きさを表すことがわかりました。

3.pocket MIDI を利用して表示された文字は何を意味しますか?上のchannel,number,valuesに対応しているのでしょうか?
(追記)pocket midiのfile>preference>detailsで詳細を表示することができました。
ですが、channel,number,valuesに対応しているかどうかは分かっておりません。

回答をよろしくお願いします。

補足情報
電子ドラム(DD75)の取扱説明書
https://jp.yamaha.com/files/download/other_assets/6/892376/dd75_ja_om_c0.pdf
DD75のMIDI同期リファレンス
https://jp.yamaha.com/files/download/other_assets/5/892625/dd75_ja_mr_a0_web.pdf
pocketMIDIの説明ページ
https://www.morson.jp/pocketmidi-webpage/manual/pocketmidimobile/pocketmidimobile_operation_manual_ja.html

またこの投稿はマルチポストをしています。
以下がそのリンクです。

https://teratail.com/questions/scj53hc626chtq
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12302479777
分かったことがあり次第、この投稿を編集させていただきます。

0

2Answer

  1. まったくの勘ですが、 myBus = new MidiBus(new java.lang.Object(), 2, 5); の第1引数は参考元のように this であるべきでは。それからコードで controlChange となっている箇所がありますが controllerChange です。
  2. channel, number, value は種々の制御情報を伝える MIDI コントロールチェンジメッセージのパラメータです。 pitch と velocity は音の高さと音量です。メソッドはそれらの入力を受け取ったときに呼ばれるようです。
  3. 一部はそのようです。値の意味はメニューの File -> Preferences で Details をオンにすると表示されるようになります。なおリンク先は Pocket MIDI Mobile のマニュアルになっていますが Windows 版のものを見た方が分かりやすいです。
1Like

Comments

  1. @laclac

    Questioner

    ご返信、誠にありがとうございます。

    1,もともとthisにしていたのですが、添付した画像のようにえたーメッセージが出てしまいます。(controllChangeをcontrollerChangeに変更してもこのエラーが出ました。)以下のサイトを参考にして、thisの部分をnullやnew java.lang.Object() にするとエラーメッセージがなくなったのでそのようにコードを書きました。(理由はいまだにわかっておりませんので、そこに関してご教授頂けると幸いです。)
    スクリーンショット 2024-08-15 225446.png

    2,勉強になります。ありがとうございます。

    3,申し訳ありません、添付するリンクが間違っておりました。一部というのは具体的にはどこの部分を指すのでしょうか。

    1. this の変更とは無関係に、 controlChangecontrollerChange に変えるとエラーが出るということですか? MidiBus のソースを読むと controllerChange という名前でなければ呼ばれないように見えますが。 NullPointerException については手元に実行環境がないのでこれ以上は分かりません。
    2. 参考になれば幸いです。今 MIDI についてまったく無知のところからめちゃ調べています。
    3. 99 28 6A がコントロールメッセージの channel, number, values に対応すると思って一部と言いましたが、これは間違いで Note On メッセージを表していました。他、たとえば F8 は Timing Clock です。詳細は Details をオンにして名前を確認した後、その種の MIDI メッセージについて検索して調べてください。
  2. 1についてですが、 MIDIMATE eX の in/out が 2, 5 のほかに 1, 4 にもあるようですがこちらは試しましたか?

  3. @laclac

    Questioner

    1についてですが、伝え方が不適切でした。申し訳ありません。thisにした場合エラーが発生してしまうということです。

  4. タブを閉じて再び開くとpocket midiからの表示が一切なくなりました。

    よく分かりませんが開いた後に入力されたデータしか表示されないのでは。

  5. @laclac

    Questioner

    申し訳ありません。一晩たったらpocketmidiからの表示ができました。何か接触が悪かったのだったと思います。

  6. 一晩たったら表示ができました。何か接触が悪かったのだったと思います。

    それで問題はなくなったということでしたたらこのスレッドはクローズ願います。

    そして、他のすべてのポスト先にもその旨書いて、クローズ願います。

  7. @laclac

    Questioner

    伝え方が不適切でした。申し訳ありません。
    MIDIデバイス入出力の確認をするアプリケーションであるpocketMIDIの表示ができたということです。processingの出力ができたという意味ではありません。

  8. processingの出力ができたという意味ではありません。

    new MidiBus(new java.lang.Object(), 2, 5);new MidiBus(new java.lang.Object(), 1, 4); にするのは試しましたか?

  9. @laclac

    Questioner

    はい。試しました。
    やはり以下の出力で電子ドラムを叩いても変化がありません。
    スクリーンショット 2024-08-16 114008.png

  10. MidiBus のコードをちゃんと読んだところ、やはり自分で定義した noteOn などが呼ばれるのは new MidiBus()this を渡したときだけです。

    これで NullPointerException が出るとき、 Processing の(コンソールタブではなく)エラータブにエラーが発生した行が出るはずですが、それはどうなっていますか?

  11. @laclac

    Questioner

    スクリーンショット 2024-08-16 122616.png
    このような表示が出てしまいます。
    また(追記)にも記述しましたが、

    エラーの原因と考えられる
    myBus = new MidiBus(this, 1, 4)

    myBus = new MidiBus();
    myBus.addInput(1);
    myBus.addOutput(4);
    myBus.registerParent(this);
    に書き換えるとエラーメッセージが消えます。
    ですが、その場合でも電子ドラムを叩いても出力はありません。
    以下がその出力状態です。
    image.png

    加えて疑問なのですが、myBus = new MidiBus(this, 1, 4)を(1,4)にした理由は何ですか?

  12. このような表示が出てしまいます。

    Processing 最下部の「コンソール」と「エラー」タブをエラーに切り替えた方を見せてください。

    加えて疑問なのですが、myBus = new MidiBus(this, 1, 4)を(1,4)にした理由は何ですか?

    Available MIDI Devices のリストで (1, 4) にも ESI MIDIMATE eX の名前があるため、そちらで動く可能性を確かめたかったからです。しかし最後のスクリーンショットで ...it is not available と警告が出ているのを見ると、 (2, 5) が正しそうです。

  13. @laclac

    Questioner

    processing3.4.5で実行してみましたところ、thisの場合においてプログラムが実行されました。大学側がprocessing3.4.5の使用を許可するかどうかはわからないのですが、もし許可された場合、問題が解決されたことになります。

    お忙しいところ、質問に多くの時間を取らせてしまい申し訳ありませんでした。
    今まで、質問のご回答誠にありがとうございました。

  14. @laclac

    Questioner

    許可が下りました。
    繰り返しになりますが、質問のご回答誠にありがとうございました。

質問の1番についてですが、別のソフトウェアなどが制御権を握っていてうまく信号を送れていない可能性はないでしょうか?ブラウザやほかのソフトウェアを閉じてもう一度実行してみてください。
コード自体が正しく動くのか、MIDI機器が原因なのかを判断するためにloopmidiなどの仮想MIDIを入力にして動作するかどうかを確認してみてください。Rainbow KeyboardやSynthesiaで信号を流せると思います。

また一点気になったのが、addOutputで出力先が入力のMIDI機器になっていて、エコーで信号が増幅する可能性があるのかなと思います。(今のところIn,Outで信号を送っていないようなので関係はなさそうですが)

myBus = new MidiBus();
myBus.registerParent(this);
myBus.addInput(2);
myBus.addOutput(5); // ここ
1Like

Comments

  1. @laclac

    Questioner

    ご返答誠にありがとうございます。
    processing3.4.5でInput指定番号、Output指定番号をそれぞれESI MIDIMATE eXの該当する番号にして、実行してみましたところ、noteOn関数内のプログラムが呼ばれました。
    もし大学側がprocessing3.4.5の使用を許可した場合、問題1が解決されたことになります。
    私の質問の検討に時間をかけて下さりありがとうございました。

    もし、大学側がprocessing3.4.5の使用を許可せず、processing4で実行する場合を考えて返信いたします。

    >質問の1番についてですが、別のソフトウェアなどが制御権を握っていてうまく信号を送れていない可能性はないでしょうか?

    ほかのソフトウェアを閉じて、processing4のみで実行した場合でも、MIDIデバイスの出力データは表示されませんでした。

    >コード自体が正しく動くのか、MIDI機器が原因なのかを判断するためにloopmidiなどの仮想MIDIを入力にして動作するかどうかを確認してみてください。

    loopmidiのダウンロードをしてみたのですが、使い方がよくわかりません。
    調べてみますが、もしお時間あればどのようにして音源を流せるのかご教授いただけたら幸いです。

    >addOutputで出力先が入力のMIDI機器になっていて、エコーで信号が増幅する可能性があるのかなと思います。
    processing4で出力先と入力先いずれもESI MIDIMATE eXに指定した場合でも、標準出力は入力先と出力先のデバイスが表示されるだけで、noteOn関数内のコードは呼ばれませんでした。

Your answer might help someone💌