Wrapper for おーぷんMIDIぷろじぇくと
MIDIIOLib0.8_cpp0.3
MIDIIOLib0.8のC++ラッパリファレンス

◆概要

本ライブラリは "(C)2002-2012 くず / おーぷんMIDIぷろじぇくと" のMIDIメッセージ入出力用ライブラリであるMIDIIOライブラリをC++でラッパしたものである。 このライブラリはMIDIデバイスのオープン・クローズ、MIDIメッセージの送信・受信など、 MIDIの入出力を取り扱う上で必要不可欠な機能ををC++のクラスとして提供している。

大きな変更点としては以下の2点である、

なお、MIDIIOLibの詳細な動作についてはくず氏のヘルプが詳しいのでそちらを参照されたい。

◆特筆事項

  1. リスクのある操作はできないように制限を加えている。

・制限の例(代入演算の禁止)

CMIDIIn midiIn;
CMIDIIn midiIn2;
midiIn2 = midiIn; //コンパイルエラー

・制限の例(コピーコンストラクタの禁止)

void func1(CMIDIIn in)  //値渡しはNG
{
    return ;
}

void func2(CMIDIIn &in) //参照渡しはOK
{
    return ;
}

int main()
{
    CMIDIIn midiIn;
    func1(midiIn);  //コンパイルエラー
    func2(midiIn);  //OK
}

◆サンプルコード

1.MIDI入力を実現する

#include <tchar.h>
#include <locale.h> 
#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <stdexcept>

#ifdef _UNICODE
typedef std::wstring tstring;
#else
typedef std::string tstring;
#endif

#include "..\MIDIIOLib0.8_cpp\MIDIIO_cpp.h"


int main()
{
    try{
        _tsetlocale(LC_ALL, _T("")); 

        CMIDIIOLib::SetLanguage(CMIDIIOLib::Japanese);
        CMIDIIOLib::SetIsShowDetail(true);

        // MIDI入力デバイス(No.0)の名前を調べる:
        tstring tstr = CMIDIIn::GetDeviceName(0);

        // MIDI入力デバイスを開く:
        CMIDIIn midiIn;
        midiIn.Open(tstr);
        _tprintf(_T("MIDI入力デバイス「%s」を開きました。\n"), tstr.c_str());
  
        // 10秒間:
        unsigned char byMessage[3];
        while (clock () < 10000) {
            // MIDI入力デバイスからMIDIメッセージを1つ取得する:
            long lRet = midiIn.GetMIDIMessage(byMessage, 256);
            // MIDIメッセージを取得した場合:
            if(lRet > 0){
                for(int i=0; i<lRet; ++i){
                    printf("0x%02X ", byMessage[i]);
                }
                printf("/ ");
            }else{
                Sleep(1);
            }
        }
    }catch(std::exception &e){
        printf("%s\n",e.what());
    }
    return 1;
}

2.MIDI出力を実現する

#include <tchar.h>
#include <locale.h> 
#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <stdexcept>

#ifdef _UNICODE
typedef std::wstring tstring;
#else
typedef std::string tstring;
#endif

#include "..\MIDIIOLib0.8_cpp\MIDIIO_cpp.h"

int main()
{
    try{
        _tsetlocale(LC_ALL, _T("")); 

        CMIDIIOLib::SetLanguage(CMIDIIOLib::Japanese);
        CMIDIIOLib::SetIsShowDetail(true);

        // MIDI出力デバイス(No.0)の名前を調べる:
        tstring strDeviceName = CMIDIOut::GetDeviceName(0);

        // MIDI出力デバイスを開く:
        CMIDIOut midiOut;
        midiOut.Open(strDeviceName);
        _tprintf(_T("MIDI出力デバイス「%s」を開きました。\n"), strDeviceName.c_str());

        // ドの音を発音する:
        unsigned char byMessage[3];
        byMessage[0] = 0x90;
        byMessage[1] = 0x3C;
        byMessage[2] = 0x64;
        midiOut.PutMIDIMessage(byMessage,3);

        // 10秒間消耗する。:
        while (clock() < 10000) {
            Sleep(1);
        }

        // ドの音を消音する:
        byMessage[0] = 0x90;
        byMessage[1] = 0x3C;
        byMessage[2] = 0x00;
        midiOut.PutMIDIMessage(byMessage,3);

    }catch(std::exception &e){
        puts(e.what());
    }
    return 1;
}

3.MIDIスルーを実現する

#include <tchar.h>
#include <locale.h> 
#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <stdexcept>

#ifdef _UNICODE
typedef std::wstring tstring;
#else
typedef std::string tstring;
#endif

#include "..\MIDIIOLib0.8_cpp\MIDIIO_cpp.h"


int main()
{
    try{
        _tsetlocale(LC_ALL, _T("")); 

        CMIDIIOLib::SetLanguage(CMIDIIOLib::Japanese);


        // MIDI入力デバイス(No.0)の名前を調べる:
        tstring strDeviceNameIn = CMIDIIn::GetDeviceName(0);

        // MIDI入力デバイスを開く:
        CMIDIIn midiIn;
        midiIn.Open(strDeviceNameIn);
        _tprintf(_T("MIDI入力デバイス「%s」を開きました。\n"), strDeviceNameIn.c_str());

        // MIDI出力デバイス(No.0)の名前を調べる:
        tstring strDeviceNameOut = CMIDIOut::GetDeviceName(0);

        // MIDI出力デバイスを開く:
        CMIDIOut midiOut;
        midiOut.Open(strDeviceNameOut);
        _tprintf(_T("MIDI出力デバイス「%s」を開きました。\n"), strDeviceNameOut.c_str());

        // 10秒間:
        unsigned char byMessage[256];
        while (clock () < 10000) {
            // MIDI入力デバイスからMIDIメッセージを1つ取得する:
            long lRet = midiIn.GetMIDIMessage(byMessage, 256);

            if(lRet > 0){
                // MIDIメッセージを取得した場合:
                midiOut.PutMIDIMessage(byMessage, lRet);
            }else{
                // MIDIメッセージを取得しなかった場合:
                Sleep(1);
            }
        }

    }catch(std::exception &e){
        puts(e.what());
    }
    return 1;
}

◆使用方法

本ライブラリは単体では使用できません。くず氏のライブラリMIDIIOLibと併用して使用して下さい。 くず氏のライブラリは "(C)2002-2012 くず / おーぷんMIDIぷろじぇくと" からダウンロードできます。

以下のようなフォルダ構成を推奨します。また、あなたのプロジェクトの配布物にはくず氏のdllが必要になります。実行ファイルと共にdllを配布して下さい。

├MIDIIOLib0.8
├MIDIIOLib0.8_cpp(本ライブラリ)
├あなたのプロジェクト

また、Microsoft Visual Studioの場合、下図のように本ライブラリのソースコードをあなたのプロジェクトに追加する必要があります。

◆ダウンロード

ファイル名 対応Ver 対応OSリリース日
MIDIIOLib0.8_cpp0.3.zipMIDIIOLib0.8Win32 2012/12/17
MIDIIOLib0.8_cpp0.2.zipMIDIIOLib0.8Win32 2012/05/06
MIDIIOLib0.8_cpp0.1.zipMIDIIOLib0.8Win32 2012/04/22

◆更新履歴

2012/12/17 Yuusui ver0.3 処理の見直し

2012/05/06 Yuusui ver0.2 C#への変換のために修正

2012/04/22 Yuusui ver0.1 新規作成

◆ライセンス

本ライブラリはBSDライセンスを採用していますが、リンク先のライブラリである MIDIIOLibのライセンス形態はLGPLであるため注意が必要です。 LGPLについては以下を参照して下さい。

LGPL日本語訳:
http://www.opensource.gr.jp/lesser/lgpl.ja.html

※おーぷんMIDIぷろじぇくとに記載されていますがダイナミックリンク形式を利用す ることで、LGPL以外のライセンスで配布することは可能です。詳細はくず氏のWEBサイト "(C)2002-2012 くず / おーぷんMIDIぷろじぇくと" を参照して下さい。

※本ライブラリはくず氏のdllを使用しており。直接コードをコンパイルはしていません。

MIDIIOLibCpp LICENSE
-----------------
Copyright (c) 2012, 友水
All rights reserved.

ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。

・ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。

・バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。

本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、 明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、 またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、 事由のいかんを問わず、 損害発生の原因いかんを問わず、 かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為であるかを問わず、 仮にそのような損害が発生する可能性を知らされていたとしても、 本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪失、 データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損害、間接損害、 偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。

◆本家

(C)2002-2012 くず / おーぷんMIDIぷろじぇくと
http://openmidiproject.sourceforge.jp/index.html

◆謝辞

・MIDIメッセージ入出力用ライブラリ『MIDIIOライブラリ』
http://openmidiproject.sourceforge.jp/index.html
このような便利なライブラリをオープンソースという形で提供して頂いたくず氏にこの場を借りてお礼申し上げます。

・doxygen
http://www.doxygen.jp/
本ヘルプはdoxygenによって生成しています。Dimitri van Heesch氏の便利なツールに感謝します。

◆連絡先

友水
WEB: C++ Wrapper for おーぷんMIDIぷろじぇくと
E-Mail : pchousuuアットyahoo.co.jp