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

inserted by FC2 system