ホームに戻る
MIDI OUTプログラム
// ヘッダ (midi_out.h)
#ifndef __MIDI_OUT_H__
#define __MIDI_OUT_H__
#ifdef __MIDI_OUT_ITSELF__
#define EXT
#else
#define EXT extern
#endif
EXT int OpenMidiOut(int id);
EXT void CloseMidiOut();
EXT void SendShortMessage(int channel, int status, int data1, int data2);
EXT void SendLongMessage(unsigned char *message, int size);
EXT void EndLongMessage();
EXT void StopMidiOut();
#endif //__MIDI_OUT_H__
// 本文 (midi_out.cpp)
#include <windows.h>
#define __MIDI_OUT_ITSELF__
#include "midi_out.h"
static HMIDIOUT hMidiOut = NULL;
static MIDIHDR* MidiHdr;
// MIDI ロングメッセージの送信終了
void CALLBACK MidiOutProc(
HMIDIOUT hMidiOut,
UINT wMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
// ショートメッセージを送る
void SendShortMessage(int channel, int status, int data1, int data2){
midiOutShortMsg(hMidiOut, (DWORD)(channel | status | (data1<<8) | (data2<<16)));
}
// ロングメッセージを送る
void SendLongMessage(unsigned char *message, int size){
MidiHdr->dwFlags = 0;
MidiHdr->lpData = (LPSTR)message;
MidiHdr->dwBufferLength = size;
MidiHdr->dwBytesRecorded = size;
midiOutPrepareHeader(hMidiOut, MidiHdr, sizeof(MIDIHDR));
midiOutLongMsg(hMidiOut, MidiHdr, sizeof(MIDIHDR));
}
// ロングメッセージを終了
void EndLongMessage(){
midiOutUnprepareHeader(hMidiOut, MidiHdr, sizeof(MIDIHDR));
}
// すべての MIDI デバイスに「すべてのキーを離す」を送る
void StopMidiOut(){
midiOutReset(hMidiOut);
}
// MIDI OUT デバイスを閉じる
void CloseMidiOut(){
StopMidiOut();
HeapFree(GetProcessHeap(), 0, MidiHdr);
midiOutClose(hMidiOut);
hMidiOut = 0;
}
// MIDI OUT デバイスを開く
int OpenMidiOut(int id){
StopMidiOut();
UINT rc = midiOutOpen(&hMidiOut, id, (DWORD)MidiOutProc, 0, CALLBACK_FUNCTION);
if(rc != MMSYSERR_NOERROR){
char msg[255];
midiOutGetErrorText(rc, msg, sizeof(msg));
return 0;
}
MidiHdr = (MIDIHDR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MIDIHDR));
return 1;
}
// 単品で使用する場合は /* と */ をはずす
/*
#include <stdio.h>
void CALLBACK MidiOutProc(
HMIDIOUT hMidiOut,
UINT wMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
){
if(wMsg == 969){
EndLongMessage();
printf("%s\n", "Long Message Finished!");
}
return;
}
int main(){
int n, i;
static unsigned char long_message[6] = {0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7};
MIDIOUTCAPS OutCaps;
n = midiOutGetNumDevs();
for(i = 0; i < n; i++){
midiOutGetDevCaps(i, (LPMIDIOUTCAPS)&OutCaps,sizeof(OutCaps));
printf("%d:%s\n", i, OutCaps.szPname);
}
if(!OpenMidiOut(1))return -1;
Sleep(1000);
SendLongMessage(long_message, 6);
Sleep(1000);
SendShortMessage(0x00, 0x90, 0x3c, 0x7F);
Sleep(1000);
StopMidiOut();
CloseMidiOut();
return 0;
}
*/