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

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

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

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

Q&A

1回答

824閲覧

電子ドラムからMIDI出力するには。。。

zakky79

総合スコア23

C++

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

0グッド

0クリップ

投稿2017/11/02 10:47

おーぷんMIDIぷろじぇくと(http://openmidiproject.osdn.jp/)のライブラリを使用して、電子ドラムで叩いた音をMIDIファイルとして出力したいと考えています。
現在試行錯誤しながらドラムのデバイス認識を行うところまでできました。
現在の進行中のプログラムは下記のとおりです。
ビルドも通り、デバックすると、
MIDI入力デバイス~~を開きました。
MIDI出力ファイル~~を開きました。
miと出ました。あとは電子ドラムを叩いて、その音をMIDI出力させることが現状の目的なんですが、これはどのようにしたらよいのですか?
ヒントかアドバイスでも頂けると嬉しいです。よろしくお願いします。
ライブラリを見たところ、MIDIIOライブラリだけでは実装できない?ので今現状としてはMIDIDataライブラリを見ている段階です。

c++#include

1#include <tchar.h> 2#include <iostream> 3#include <windows.h> 4#include <time.h> 5 6#include "..\MIDIIOLib1.1-x64\MIDIIO.h" 7#include "..\MIDIDataLib3.4\MIDIData.h" 8#include "..\MIDIClockLib1.0\MIDIClock.h" 9#include <opencv2/opencv.hpp> 10 11#define USE_DRUM 1 //0なら電子ドラム不使用、1なら電子ドラム使用 12 13MIDIIn* pMIDIIn; //MIDIの初期化 14MIDIOut* pMIDIOut; 15 16int main(int argc, char* argv[]) { 17 18 TCHAR szDeviceName[32]; 19 20 /* */ 21 long lRet; 22 23#if USE_DRUM 24 lRet = MIDIIn_GetDeviceNum(); 25 std::cerr << "Connected MIDI Device Num = " << lRet << std::endl; 26 27 lRet = MIDIIn_GetDeviceName(0, szDeviceName, 32); 28 if (lRet == 0) { 29 printf("利用できるMIDI入力デバイスはありません。\n"); 30 system("PAUSE"); 31 return 0; 32 } 33 34 pMIDIIn = MIDIIn_Open(szDeviceName); 35 36 if (pMIDIIn == NULL) { 37 std::cerr << "MIDI入力デバイス「" << szDeviceName << "」を開けません。" << std::endl; 38 return 0; 39 } 40 41 std::cerr << "MIDI入力デバイス「" << szDeviceName << "」を開きました。" << std::endl; 42 43#endif 44 45 /* MIDI出力デバイス(No.0)の名前を調べる */ 46 lRet = MIDIOut_GetDeviceName(0, szDeviceName, 32); 47 if (lRet == 0) { 48 std::cerr << "利用できるMIDI出力デバイスはありません。" << std::endl; 49 return 0; 50 } 51 /* MIDI出力デバイスを開く */ 52 pMIDIOut = MIDIOut_Open(szDeviceName); 53 if (pMIDIOut == NULL) { 54 std::cerr << "MIDI出力デバイス「" << szDeviceName << "」を開けません。" << std::endl; 55 return 0; 56 } 57 std::cerr << "MIDI出力デバイス「" << szDeviceName << "」を開きました。" << std::endl; 58 59}

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

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

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

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

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

guest

回答1

0

次のような考え方になると思います。

(1) ドラムのMIDI-OUTをPCのMIDI-INへ接続
ひょっとしたらこのアプリケーション以外で接続状態になっているのかも知れませんが・・・その辺り詳しくありません。(ハードを繋いだことがないので・・・)

(2) ドラムが繋がったMIDI-INをオープン
(最初の回答でこれ書き忘れてました)

(3) Windows内臓シンセサイザーのMIDI-OUTをオープン
これは以前すでにできていますね?

(4) プログラムでMIDI-INからドラムからのMIDIメッセージをリアルタイムに受信
受信メッセージで肝心なのはNOTE ON/NOTE OFFであることはご存知ですね?

(5) ドラムから受信したNOTE ON/NOTE OFFを(2)のシンセサイザーへ中継
つまりシンセサイザーへメッセージを流し込んでやればシンセサイザーから音がでます。

・・・ただし、キーボードと違ってドラムはちょっと難しく、ひょっとしたら「スネアをたたいたのに全然違う音が鳴る><」といったことになるかも知れません。そのあたりは悩むよりまず音を出すのが先決なのでやってみるとよいと思います。

もしうまくならないようなら、とりあえずプログラムチェンジで1番(ピアノ)を選んでおき、そこへドラムのNOTE ON/NOTE OFFを流すとテストとしてはよいと思います。


追記:コンソールアプリケーションで作っておられるので比較的(4)はやりやすい気がしますが、プログラムをビジーループさせないように気を付けた方がよいかも知れません。

C

1int main(...) { 2 MIDI-OUTオープン(シンセサイザー) // (2) 3 MIDI-INオープン(ドラム) // (3) 4 MIDI-OUTへプログラムチェンジ送信 // CH#1の音色を#1に。 5 for (;;) { // 無限ループ 6 Sleep(10); // <===これを挟んでおいた方がよいかも 7 MIDI-INから(受信できている分を全て)読み込み // (4) 8 // ドラムからはCH#10のメッセージが届くかも知れません。 9 // うまくならないようならドラムからのMIDIメッセージのCH#を#1に変えて 10 // MIDI-OUTへ送信するとピアノの音がCH#1から鳴らせます。 11 MIDI-OUTへ送信(受信できたのを全て) // (5) 12 } 13}

蛇足なコメントがあるかも知れません。その辺りはスルーしてください。

投稿2017/11/02 11:43

編集2017/11/02 12:07
KSwordOfHaste

総合スコア18392

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

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

zakky79

2017/11/02 12:47

ありがとうございます!試してみます!助かります!(T_T)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問