ホームに戻る
 MIDI INプログラム

// ヘッダ (midi_in.h)

#ifndef __MIDI_IN_H__
#define __MIDI_IN_H__

#ifdef __MIDI_IN_ITSELF__
#define EXT
#else
#define EXT extern
#endif

EXT int OpenMidiIn(int id);
EXT void CloseMidiIn();
EXT void StartMidiIn();
EXT void StopMidiIn();

#endif //__MIDI_IN_H__

// 本文 (midi_in.cpp)

#include <windows.h>

#define __MIDI_IN_ITSELF__

#include "midi_in.h"

#define MIDI_IN_BUFF_SIZE 1024

static HMIDIIN hMidiIn = NULL;
static MIDIHDR* MidiHdr;

// MIDI イベントを受信
void CALLBACK MidiInProc(
  HMIDIIN hMidiIn, 
  UINT wMsg,       
  DWORD dwInstance,
  DWORD dwParam1,  
  DWORD dwParam2   
);

// 受信開始
void StartMidiIn(){
  midiInPrepareHeader(hMidiIn, MidiHdr, sizeof(MIDIHDR));
  midiInAddBuffer(hMidiIn, MidiHdr, sizeof(MIDIHDR));
  midiInStart(hMidiIn);
}

// 受信終了
void StopMidiIn(){
  midiInStop(hMidiIn);
  midiInReset(hMidiIn);
  midiInUnprepareHeader(hMidiIn, MidiHdr, sizeof(MIDIHDR));
}

// MIDI IN デバイスを閉じる
void CloseMidiIn(){
  HeapFree(GetProcessHeap(), 0, MidiHdr->lpData);
  HeapFree(GetProcessHeap(), 0, MidiHdr);

  midiInClose(hMidiIn);

  HMidiIn = 0;
}

// MIDI IN デバイスを開く
int OpenMidiIn(int id){
  StopMidiIn();

  UINT rc = midiInOpen(&hMidiIn, id, (DWORD)MidiInProc, 0, CALLBACK_FUNCTION);

  if(rc != MMSYSERR_NOERROR){
    char msg[255];

    midiInGetErrorText(rc, msg, sizeof(msg));

    return 0;
  }

  MidiHdr = (MIDIHDR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MIDIHDR));
  MidiHdr->lpData = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MIDI_IN_BUFF_SIZE);
  MidiHdr->dwBufferLength = MIDI_IN_BUFF_SIZE;

  return 1;
}

// 単品で使用する場合は /* と */ をはずす

/*
#include <stdio.h>

void CALLBACK MidiInProc(
  HMIDIIN hMidiIn, 
  UINT wMsg,       
  DWORD dwInstance,
  DWORD dwParam1,  
  DWORD dwParam2   
){
  static dp2;

  if(dp2 == dwParam2){
    return;
  }
  else{
    dp2 = dwParam2;
  }

  switch(dwParam1 & 0xf0){
    case 0x90:
      {
        if((dwParam1 >> 16) == 0)break;
        printf("key:%02x\n", (dwParam1 >> 8) & 0xff);
        printf("vel:%02x\n", (dwParam1 >> 16) & 0xff);
      }
      break;
    default:
      break;
  }
}

int main(){
  int n, i;

  MIDIINCAPS InCaps;

  n = midiInGetNumDevs();

  for(i = 0; i < n; i++){
    midiInGetDevCaps(i, (LPMIDIINCAPS)&InCaps,sizeof(InCaps));

    printf("%d:%s\n", i, InCaps.szPname);
  }

  if(!OpenMidiIn(0))return -1;

  StartMidiIn();

  getchar();

  StopMidiIn();

  CloseMidiIn();

  return 0;
}
*/

inserted by FC2 system