ホームに戻る
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;
}
*/