#include "myWin.h" #pragma comment(lib,"winmm.lib") #define SMSG(st, ch,d1,d2)((DWORD)(st<<4)|ch|(d1<<8)|(d2<<16)) #define MAXLEN 100 #define NUMCHAN 3 #define PCH 9 typedef struct{ int Len; //音の長さ。0で終わり。 BYTE note; //音の高さ。休符のとき無視。 //ただし、CH=09HすなわちCH番号10を使うので打楽器の種類。 BYTE vel; //音の強さ。休符のときは0を入れる。 }MY_SCALE_DATA; static MY_SCALE_DATA scale[NUMCHAN][MAXLEN]={ {{2,36,60},{2,36,60},{2,36,60},{2,36,60}, {2,36,60},{2,36,60},{2,36,60},{2,36,60}, {2,36,60},{2,36,60},{2,36,60},{2,36,60}, {2,36,60},{2,36,60},{2,36,60},{2,36,60}}, {{2,74,40},{2,73,20},{2,37,60},{2, 0, 0}, {2, 0, 0},{2, 0, 0},{2,37,60},{2, 0, 0}, {2,74,40},{2,73,20},{2,37,60},{2, 0, 0}, {2, 0, 0},{2, 0, 0},{2,37,60},{2, 0, 0}}, {{2,43,90},{2, 0, 0},{2, 0, 0},{2, 0, 0}, {2,43,90},{2,43,90},{2, 0, 0},{2, 0, 0}, {2,43,90},{2,43, 0},{2, 0, 0},{2, 0, 0}, {2,43,90},{2,43,90},{4,57,90}} }; static MY_SCALE_DATA Temp[NUMCHAN][MAXLEN]; static int ID[NUMCHAN];static int prog[NUMCHAN]={0x09,0x09,0x9}; static HMIDIOUT hM; void procRButtonUp(HWND hw, WPARAM wp,LPARAM lp){ KillTimer(hw,1); midiOutReset(hM); } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ for(int j=0;j0){ Temp[j][ID[j]].Len--; if(Temp[j][ID[j]].Len==0){ midiOutShortMsg(hM,SMSG(0x9,PCH,Temp[j][ID[j]].note,0)); midiOutShortMsg(hM,SMSG(0xC,PCH,prog[j],0)); ID[j]++; if(Temp[j][ID[j]].note>0) midiOutShortMsg(hM,SMSG(0x9,PCH,Temp[j][ID[j]].note,Temp[j][ID[j]].vel)); if(Temp[j][ID[j]].Len==0)ID[j]=0; } } } BOOL endCH=TRUE; for(int j=0;j0)endCH=FALSE; if(endCH) procLButtonUp(hw,wp,lp); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ MoveWindow(hw,0,0,250,100,TRUE); SetWindowText(hw,TEXT("Drum pattern")); midiOutOpen(&hM,MIDIMAPPER,NULL,0,CALLBACK_NULL); procLButtonUp(hw,wp,lp); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : midiOutReset(hM); midiOutClose(hM); PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; case WM_LBUTTONUP : procLButtonUp(hw,wp,lp);return 0; case WM_RBUTTONUP : procRButtonUp (hw,wp,lp);return 0; case WM_TIMER : procTimer (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); }