質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

407閲覧

openFrameworksのアドオン"ofxMidi"について質問

harekyon

総合スコア17

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/06/13 10:49

前提・実現したいこと

プログラムを書くのはあまり慣れてないので、おかしな言葉を使うかもしれませんが見逃してください。openFrameworksのアドオン"ofxMidi"について質問です。
ofxMidiライブラリをダウンロードすると4種類のExampleデータが付いてきます。その中にmidiInputExampleというものがあり、それを実行すると、MIDI鍵盤を押した際の入力詳細が画面に出力されます。出力される入力詳細は以下の通りです。
イメージ説明
0. - Note On/Off:これは鍵盤を押したらONになり、離したらOFFになる
0. - chan :これはmidiのチャンネル値
0. - pitch:これは鍵盤の位置を示す値
0. - vel :これは鍵盤を押した時の強さの値
※deltaという項目もありますが、今回は関係ないので置いておきます。

発生している問題・エラーメッセージ

この中で、2~4の項目はプログラム中の値(message.channelやmessage.pitchやmessage.valueなど)から条件式の値として使用できるのですが、1の項目だけそれができません。項目1は鍵盤を押しているか、離しているかの判別をしています。押したらON、離したらOFFと出力されます。この項目の出力、判定はofApp.cppの55行目にあります。

該当のソースコード

void ofApp::draw() { for(unsigned int i = 0; i < midiMessages.size(); ++i) {      ofxMidiMessage &message = midiMessages[i];      stringstream text;      //下の行でONOFFの出力をしています。出力内容はmassage.statusを使用しています。      text << ofxMidiMessage::getStatusString(message.status);      //以下for文続き

ONOFFの判別はmassage.statusによってされています。

試したこと

massage.statusの値をコンソールに出力したくて、(例) printf("m = %s",massage.status);のように入力したのですが、charを使えとエラーが出ました。なので(例) printf("m = %c",massage.status);としたところ、「m = ?m = ?m = ?m = ?...m = ?」というように出力されました。これは一体どういうことなのでしょうか?ON/OFFという値はどこから手に入るのでしょうか?
回答よろしくお願いします。
(それと、「m = ?m = ?m = ?m = ?...m = ?」のようにたくさん出力されるのではなく、一回だけ出力させるのはどうすれば良いでしょうか...。プログラミング初心者なので教えていただけると幸いです。)

補足情報(FW/ツールのバージョンなど)

oprnFrameworksバージョン:0.10.1
環境:Mac, ターミナル
実行状況:make, make runで実行

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2019/06/13 19:52

massage.status の型は? それをまず調べよ。闇雲にコード書くな。
guest

回答1

0

ベストアンサー

値をコンソールに表示する場合、openFrameworksではofLogを使うのが良いと思います。

c++

1ofLog() << message.status;

こうするとONの時に144、OFFの時に128が出力されるはずです。
これらの定義はofxMidiConstants.hで見られます。
サンプルではこちらをofxMidiMessage::getStatusString関数に渡し"Note On"、"Note Off"という文字列に変換しています。
ON/OFFを判定したいのであれば

c++

1if(message.status == MIDI_NOTE_ON) { 2 // ONの時の処理 3} else if(message.status == MIDI_NOTE_OFF) { 4 // OFFの時の処理 5}

とすれば良いと思います。

midiInputExampleのサンプルコードは新しいMIDIメッセージが来る度に配列に追加し(一定数以上になると古いものを消し)、その中身を常にdraw関数で読み出しています。
draw関数は毎フレーム実行されるので、そのまま出力の処理を書くと毎フレーム出力されます。
MIDIメッセージが来た時だけ出力したい、というのであればnewMidiMessage関数の中にofLogを書くのが適切かと思います。

投稿2019/08/04 14:15

hysysk

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問