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

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

ただいまの
回答率

91.03%

  • C++

    2928questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 273

zakky79

score 7

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

#include <tchar.h>
#include <iostream>
#include <windows.h>
#include <time.h>

#include "..\MIDIIOLib1.1-x64\MIDIIO.h"
#include "..\MIDIDataLib3.4\MIDIData.h"
#include "..\MIDIClockLib1.0\MIDIClock.h"
#include <opencv2/opencv.hpp>

#define USE_DRUM 1 //0なら電子ドラム不使用、1なら電子ドラム使用

MIDIIn* pMIDIIn; //MIDIの初期化
MIDIOut* pMIDIOut;

int main(int argc, char* argv[]) {

    TCHAR szDeviceName[32];

    /* */
    long lRet;

#if USE_DRUM
    lRet = MIDIIn_GetDeviceNum();
    std::cerr << "Connected MIDI Device Num = " << lRet << std::endl;

    lRet = MIDIIn_GetDeviceName(0, szDeviceName, 32);
    if (lRet == 0) {
        printf("利用できるMIDI入力デバイスはありません。\n");
        system("PAUSE");
        return 0;
    }

    pMIDIIn = MIDIIn_Open(szDeviceName);

    if (pMIDIIn == NULL) {
        std::cerr << "MIDI入力デバイス「" << szDeviceName << "」を開けません。" << std::endl;
        return 0;
    }

    std::cerr << "MIDI入力デバイス「" << szDeviceName << "」を開きました。" << std::endl;

#endif

    /* MIDI出力デバイス(No.0)の名前を調べる */
    lRet = MIDIOut_GetDeviceName(0, szDeviceName, 32);
    if (lRet == 0) {
        std::cerr << "利用できるMIDI出力デバイスはありません。" << std::endl;
        return 0;
    }
    /* MIDI出力デバイスを開く */
    pMIDIOut = MIDIOut_Open(szDeviceName);
    if (pMIDIOut == NULL) {
        std::cerr << "MIDI出力デバイス「" << szDeviceName << "」を開けません。" << std::endl;
        return 0;
    }
    std::cerr << "MIDI出力デバイス「" << szDeviceName << "」を開きました。" << std::endl;

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2017/11/02 21:28

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 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)はやりやすい気がしますが、プログラムをビジーループさせないように気を付けた方がよいかも知れません。

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/02 21:47

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

    キャンセル

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

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    opencvのcvConvertScaleAbs関数エラーを直したい

    こんにちは。 どうしても解決できず、ずっと悩んでいるのでご助力いただけないかと思い投稿しました。 前提・実現したいこと XcodeでC++、opencvを用いて行列操作を

  • 解決済

    opencvでの画像の読み込み

    opencvで画像の読み込みを行い、テンプレートマッチングを行いたいと考えています。 外部のソフト(IC Imaging Contorol)というアルゴ社のカメラソフトを使い

  • 解決済

    opencv 動画 再生

    #include <stdio.h> #include <cv.h> #include <highgui.h> int main(int argc, char* argv[])

  • 受付中

    カメラで青い円を検出

    #include <stdio.h> #include <stdlib.h> #include <highgui.h> #include <cv.h> #include <cxco

  • 解決済

    OpenCVで連番の静止画から動画を作成するには

    C++初心者です. ただいまOpenCVを用いて,連番のJpegファイルを繋ぎ合わせて1つの動画(mp4)を作成しようとしています. サンプルプログラムを参考にし, 「C:

  • 解決済

    OpenCVによる画像マッチング

    前提・実現したいこと VisualStudio15 2017上でOpenCVを動かし、SIFT特徴量を用いた画像マッチングに取り組もうと思っています。 しかし、コンパイルで以下のエ

  • 解決済

    OpenCVを使った笑顔検出での問題

    前提・実現したいこと OpenCVで元からあるサンプルコード「smiledetect.cpp」を用いて笑顔検出のシステムを作っています。 検出機能を実装中に以下の問題が発生しました

  • 解決済

    OpenCVを使って動画の書き出しができない

    aviファイルを読み込み,1フレームずつ間隔をSleep関数を用いて変化させて再生速度を変えるプログラムを作っています. 0倍速,等倍速,2倍速,3倍速,4倍速,5倍速の速度を行き

同じタグがついた質問を見る

  • C++

    2928questions

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