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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

1回答

1131閲覧

電子ドラムで叩いた音の楽譜の描画

zakky79

総合スコア23

C++

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

0グッド

0クリップ

投稿2018/01/10 08:04

編集2018/01/10 08:05

五線譜を表示させ、模範演奏となるmidiファイルを読み込ませ、その楽譜を五線譜に表示させようと思っています。そこに、電子ドラムで叩いた音をリアルタイムに表示させて、模範演奏と自分の演奏のタイミングのずれを可視化させようと考えています。midiファイルを読み込んで、模範演奏を流すことはできますが、楽譜の描画がうまくいきません。電子ドラムも同様に、リアルタイムにドラムからメッセージ0x99 0x2B 0x00といった3バイトが送られてきます。(何も叩かないときは常に0xF8、たまに0xFEが送られてきます。)元々はピアノで実装されていたプログラムで、それを使ってドラム用に変更させようとしています。ピアノの場合はmidiファイルの演奏の楽譜の表示はうまくいっていました。

ピアノで実行したときの画像です

問題となっている部分のプログラムだけ抜粋して貼り付けています。

c++

1void PutNote(cv::Mat& sheet, unsigned char status, unsigned char data1, unsigned char data2, long duration, cv::Scalar color, int note_x, int& index) { //音符の配置 2 3 if ((status & 0xF0) == 0x90 && ((status & 0x0F) == 9 || data2 != 0x00)) { 4 5 if (data1 == (0x18 + NOTE_OFFSET)) { // Do C 6 index = 0; 7 } 8 else if (data1 == (0x1A + NOTE_OFFSET)) { // Re D 9 index = 1; 10 } 11 else if (data1 == (0x1C + NOTE_OFFSET)) { // Mi E 12 index = 2; 13 } 14 else if (data1 == (0x1D + NOTE_OFFSET)) { // Fa F 15 index = 3; 16 } 17 else if (data1 == (0x26 + NOTE_OFFSET)) { // So G 18 index = 4; 19 } 20 else if (data1 == (0x21 + NOTE_OFFSET)) { // Ra 21 index = 5; 22 } 23 else if (data1 == (0x23 + NOTE_OFFSET)) { //Shi 24 index = 6; 25 } 26 else if (data1 == (0x24 + NOTE_OFFSET)) { // Do 27 index = 7; 28 } 29 else if (data1 == (0x1F + NOTE_OFFSET)) { // Re 30 index = 8; 31 } 32 else if (data1 == (0x28 + NOTE_OFFSET)) { 33 index = 9; 34 } 35 else if (data1 == (0x19 + NOTE_OFFSET)) { 36 index = 10; 37 } 38 if (index != -1) { 39 if (duration == 120) { 40 cv::ellipse(sheet, cv::Point(note_x, note_y[index]), cv::Size(NOTE_W, NOTE_H / 2), NOTE_ANGLE, 0, 360, color, -1); 41 } 42 else if (duration == 240) { 43 cv::ellipse(sheet, cv::Point(note_x, note_y[index]), cv::Size(NOTE_W, NOTE_H / 2), NOTE_ANGLE, 0, 360, color, 2); 44 } 45 else { 46 } 47 } 48 } 49 else if (status == 0x80 || data2 == 0x00) { 50 } 51} 52

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

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

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

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

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

guest

回答1

0

ベストアンサー

この関数の動作を支配する情報をデバッグプリントし、「何が期待動作であるか」に対して「実際にどのように動作しているか」を調べることをお勧めします。

動作を支配する情報のうちとりあえずopencvに関係しない部分

status
data1
data2
duration
index

の値の「関数が呼び出された際の値」「if文による判定後の値」がどうなっているかを確認しましょう。またopencvに関する以下の値については「期待通りの情報が渡ってきているかどうか」も大切です。極端な話colorが透明色なら論理が正しくてもNoteの音符は描画されませんし、note_xが画面外の座標を示していればこれまた期待通りの位置には描画されません。

楽譜の描画がうまくいきません

この表現では閲覧者には「うまくいかないのだろう」ということは分かりますが具体的に「何が期待通りでないか」が分かりません。音符がまったく描画されないのか、位置がおかしいのかタイミングがおかしいのか等々の手掛かりがありません。

投稿2018/01/10 23:48

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問