MIDIキーボードからMIDI INしたのを検知したい
Posted: 2010年6月04日(金) 18:55
こんにちは、1ヶ月以上前に、
14歳からはじめるC言語ゲームプログラミングを見ながらDXライブラリを使用して、
十字キーでキャラを左右に動かすプログラムを書いたのですが、これをキーボード等から単音のMIDIデータを入力することで、
例えばドを入力したら左に歩くといった感じに動かせるようにしたいと考え、
まずはどうすれば入力されたMIDIデータを認識できるようになるのかを教えていただきたい
と質問をしてさらにわざわざプログラムを書いてもらったのですが、返事が遅くなってしまった者です。
そしてそのプログラムのコンパイルをしてみて、
LINK : warning LNK4199: /DELAYLOAD:OleAcc.dll は無視されます。OleAcc.dll にインポートがありません。
>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数___tmainCRTStartup で参照されました。
といったものが出てきてうまく行きません。
これらのことを解決しようといろいろ考え、
未解決の外部シンボル~というのが出るからどこか書きミスがあると思って
色々と試していたのですが、
解決できずに一ヶ月以上返事もしないで時間を消費してしまいわざわざ教えてくれた方々に大変失礼してしまったと感じていますが、
今一度お力を貸していただけないでしょうか?
書いていただいたソースは次の通りです
#include <windows.h>
#ifndef __MIDI_IN_H__
#define __MIDI_IN_H__
#ifdef __HEADER_ITSELF__
#define EXT
#else
#define EXT extern
#endif
#pragma comment(lib, "winmm.lib")
EXT int OpenMidiIn(int id);
EXT void CloseMidiIn();
EXT void StartMidiIn();
EXT void StopMidiIn();
#endif //__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){
UINT rc;
StopMidiIn();
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;
}
OS:Windows XP
開発環境:Visual c++
ライブラリ:DXライブラリ
大変あつかましいとは思いますが、どうかよろしくお願いします。
14歳からはじめるC言語ゲームプログラミングを見ながらDXライブラリを使用して、
十字キーでキャラを左右に動かすプログラムを書いたのですが、これをキーボード等から単音のMIDIデータを入力することで、
例えばドを入力したら左に歩くといった感じに動かせるようにしたいと考え、
まずはどうすれば入力されたMIDIデータを認識できるようになるのかを教えていただきたい
と質問をしてさらにわざわざプログラムを書いてもらったのですが、返事が遅くなってしまった者です。
そしてそのプログラムのコンパイルをしてみて、
LINK : warning LNK4199: /DELAYLOAD:OleAcc.dll は無視されます。OleAcc.dll にインポートがありません。
>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数___tmainCRTStartup で参照されました。
といったものが出てきてうまく行きません。
これらのことを解決しようといろいろ考え、
未解決の外部シンボル~というのが出るからどこか書きミスがあると思って
色々と試していたのですが、
解決できずに一ヶ月以上返事もしないで時間を消費してしまいわざわざ教えてくれた方々に大変失礼してしまったと感じていますが、
今一度お力を貸していただけないでしょうか?
書いていただいたソースは次の通りです
#include <windows.h>
#ifndef __MIDI_IN_H__
#define __MIDI_IN_H__
#ifdef __HEADER_ITSELF__
#define EXT
#else
#define EXT extern
#endif
#pragma comment(lib, "winmm.lib")
EXT int OpenMidiIn(int id);
EXT void CloseMidiIn();
EXT void StartMidiIn();
EXT void StopMidiIn();
#endif //__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){
UINT rc;
StopMidiIn();
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;
}
OS:Windows XP
開発環境:Visual c++
ライブラリ:DXライブラリ
大変あつかましいとは思いますが、どうかよろしくお願いします。