1

midi ファイルを再生する必要があるアプリケーションを作成しています。私はこのコードを試しました:

SoundPlayer^ player = gcnew SoundPlayer();
player->SoundLocation = path2+"\\aw.mid";
player->Load();
player->PlaySync();

再生できるのは wave ファイルのみであることがわかります。どうにかしてMIDIファイルを再生させることはできますか? または、別のコードを使用できますか?
E: これで NAudio ライブラリができましたが、MIDI を再生するコードが見つかりません。

4

2 に答える 2

1

NAudio は良い解決策かもしれませんが、私の経験では、コードはスパゲッティのようなもので、うまく説明できないことがわかりました。これは、OpenMidiProject の midi プレーヤーのコードのサンプルです。ソース ファイル (ヘッダー、ライブラリ、および dll) をダウンロードする必要がありますが、私はそれらを使って作業するのが大好きです。基本的に、このライブラリが行うことは、自動的に midi イベントを解析して再生することです。

このコードの操作について質問がある場合は、遠慮なく質問してください。これコンパイルされるので、これをコンパイルするのに問題がある場合は、自分で行う必要があります。

#include <stdio.h>
#include <windows.h>
#include "..\\MIDIIO\\MIDIIO.h"
#include "..\\MIDIData\\MIDIData.h"
#include "..\\MIDIClock\\MIDIClock.h"
/* Don't forget to add MIDIIO(d).lib to your project */
/* Don't forget to add MIDIData(d).lib to your project */
/* Don't forget to add MIDIClock(d).lib to your project */

int main () {
  long lTimeMode = 0;
  long lTimeResolution = 0;
  long lTempo = 60000000 / 120; /* [microsec/quarter note] */
  long lEndTime = 0;
  long lOldTime = 0;
  long lCurTime = 0;
  MIDIOut* pMIDIOut = NULL;
  MIDIData* pMIDIData = NULL;
  MIDITrack* pMIDITrack = NULL;
  MIDIEvent* pMIDIEvent = NULL;
  MIDIClock* pMIDIClock = NULL;

  pMIDIOut = MIDIOut_Open ("Microsoft GS Wavetable Synth");
  if (pMIDIOut == NULL) {
    printf ("MIDIOut Open failed.\n");
    return 0;
  }

  pMIDIData = MIDIData_LoadFromSMF ("test.mid");
  if (pMIDIData == NULL) {
    printf ("MIDIData Load failed.\n");
    return 0;
  }

  lTimeMode = MIDIData_GetTimeMode (pMIDIData);
  lTimeResolution = MIDIData_GetTimeResolution (pMIDIData);
  lEndTime = MIDIData_GetEndTime (pMIDIData);

  pMIDIClock = MIDIClock_Create (lTimeMode, lTimeResolution, lTempo);
  if (pMIDIClock == NULL) {
    printf ("MIDIClock_Create failed.\n");
    return 0;
  }

  printf ("Now playing...\n");
  MIDIClock_Start (pMIDIClock);

  while (lCurTime <= lEndTime) {
    lCurTime = MIDIClock_GetTickCount (pMIDIClock);
    forEachTrack (pMIDIData, pMIDITrack) {
      forEachEvent (pMIDITrack, pMIDIEvent) {
        long lTime = MIDIEvent_GetTime (pMIDIEvent);
        if (lOldTime <= lTime && lTime < lCurTime) {
          if (MIDIEvent_IsTempo (pMIDIEvent)) {
            long lTempo = MIDIEvent_GetTempo (pMIDIEvent);
            MIDIClock_SetTempo (pMIDIClock, lTempo);
          }
          if (MIDIEvent_IsMIDIEvent (pMIDIEvent) ||
            MIDIEvent_IsSysExEvent (pMIDIEvent)) {
            unsigned char byMessage[256];
            long lLen = MIDIEvent_GetLen (pMIDIEvent);
            MIDIEvent_GetData (pMIDIEvent, byMessage, 256);
            MIDIOut_PutMIDIMessage (pMIDIOut, byMessage, lLen);
          }
        }
      }
    }
    lOldTime = lCurTime;
    Sleep (5);
  }
  MIDIClock_Stop (pMIDIClock);
  printf ("Now end.\n");

  MIDIClock_Delete (pMIDIClock);
  MIDIData_Delete (pMIDIData);
  MIDIOut_Close (pMIDIOut);
  return 1;
}
于 2016-04-04T00:02:51.507 に答える
1

私の知る限り、.net フレームワークだけで midi ファイルを再生できるものはありません。代わりに、オープン ソースのNAudio ライブラリを使用してみてください。彼らのホームページから:

NAudio はオープン ソースの .NET オーディオおよび MIDI ライブラリであり、.NET でのオーディオ関連ユーティリティの開発を加速することを目的とした、多数の有用なオーディオ関連クラスが含まれています。

于 2012-08-17T20:36:49.283 に答える