#include "myWin.h" #include "stdio.h" #pragma comment(lib,"winmm.lib") #define MPUSH 0x9 #define MCTONE 0xC #define LST_1 1000 #define BT_0 2000 #define SMSG(st, ch, d1, d2) ((DWORD)(st<<4|ch|((d1)<<8)|(d2)<<16)) static HMIDIOUT hM; static BYTE note=0x3C, vel=0x40, prog=0; static HBITMAP hB; static BITMAP bB; static HDC hBuff; static HFONT font; static HWND noSortL; static int keyTab[][2] = {//キーボードと音の対応表 //ド       # レ   # ミ ファ {'A',0},{'Z',0},{'S',1},{'X',2},{'D',3},{'C',4},{'F',5},{'V',5}, //ファ# ソ # ラ    # シ ド # {'G',6},{'B',7},{'H',8},{'N',9},{'J',10},{'M',11},{0xBC,12},{'K',12},{'L',13}, //ド        # レ    # ミ ファ {'1',12},{'Q',12},{'2',13},{'W',14},{'3',15},{'E',16},{'4',17},{'R',17}, //ファ# ソ # ラ    # シ ド {'5',18},{'T',19},{'6',20},{'Y',21},{'7',22},{'U',23},{'8',24},{'I',24},{'9',25}, {-1,-1} }; static TCHAR * instrument[]={ TEXT("■Piano"), TEXT("00 アコースティックピアノ" ), TEXT("01 ブライトピアノ" ), TEXT("02 エレクトリックグランドピアノ" ), TEXT("03 ホンキートンクピアノ" ), TEXT("04 エレクトリックピアノ" ), TEXT("05 エレクトリックピアノ2" ), TEXT("06 ハープシコード" ), TEXT("07 クラビネット" ), TEXT("■Cromatic Percussion"), TEXT("08 チェレスタ" ), TEXT("09 グラッケンシュピール" ), TEXT("0A オルゴール" ), TEXT("0B ヴィブラフォン" ), TEXT("0C マリンバ" ), TEXT("0D シロフォン" ), TEXT("0E チューブラーベル" ), TEXT("0F ダルシマー" ), TEXT("■Organ"), TEXT("10 ドローバオルガン" ), TEXT("11 パーカッシブオルガン" ), TEXT("12 ロックオルガン" ), TEXT("13 チャーチオルガン" ), TEXT("14 リードオルガン" ), TEXT("15 アコーディオン" ), TEXT("16 ハーモニカ" ), TEXT("17 タンゴアコーディオン" ), TEXT("■Guitar"), TEXT("18 アコーティックギター(ナイロン)"), TEXT("19 アコーティックギター(スチール)"), TEXT("1A ジャズギター" ), TEXT("1B クリーンギター" ), TEXT("1C ミュートギター" ), TEXT("1D オーバードライブギター" ), TEXT("1E ディストーションギター" ), TEXT("1F ギターハーモニクス" ), TEXT("■Bass"), TEXT("20 アコーステックべース" ), TEXT("21 フィンガーベース" ), TEXT("22 ピックベース" ), TEXT("23 フレットレスベース" ), TEXT("24 スラップベース1" ), TEXT("25 スラップベース2" ), TEXT("26 シンセベース1" ), TEXT("27 シンセベース2" ), TEXT("■Strings"), TEXT("28 ヴァイオリン" ), TEXT("29 ヴィオラ" ), TEXT("2A チェロ" ), TEXT("2B コントラバス" ), TEXT("2C トレモロ" ), TEXT("2D ピッチカート" ), TEXT("2E ハープ" ), TEXT("2F ティンパニ" ), TEXT("■Ensemble"), TEXT("30 ストリングアンサンブル1" ), TEXT("31 ストリングアンサンブル2" ), TEXT("32 シンセストリングス1" ), TEXT("33 シンセストリングス2" ), TEXT("34 声(あー)" ), TEXT("35 声(うー)" ), TEXT("36 シンセヴォイス" ), TEXT("37 オーケストラヒット" ), TEXT("■Brass"), TEXT("38 トランペット" ), TEXT("39 トロンボーン" ), TEXT("3A チューバ" ), TEXT("3B ミュートトランペット" ), TEXT("3C フレンチホルン" ), TEXT("3D ブラスセクション" ), TEXT("3E シンセブラス1" ), TEXT("3F シンセブラス2" ), TEXT("■Reed"), TEXT("40 ソプラノサックス" ), TEXT("41 アルトサックス" ), TEXT("42 テナーサックス" ), TEXT("43 バリトンサックス" ), TEXT("44 オーボエ" ), TEXT("45 イングリッシュホルン" ), TEXT("46 ファゴット" ), TEXT("47 クラリネット" ), TEXT("■Pipe"), TEXT("48 ピッコロ" ), TEXT("49 フルート" ), TEXT("4A リコーダ" ), TEXT("4B パンフルート" ), TEXT("4C ブロウンボトル(吹きガラス瓶)" ), TEXT("4D 尺八" ), TEXT("4E 口笛" ), TEXT("4F オカリナ" ), TEXT("■Synth Lead"), TEXT("50 矩形波" ), TEXT("51 ノコギリ波" ), TEXT("52 カリオペ" ), TEXT("53 チフ" ), TEXT("54 チャランゴ" ), TEXT("55 声" ), TEXT("56 フィフスズ" ), TEXT("57 バス+リード" ), TEXT("■Synth Pad"), TEXT("58 ファンタジア" ), TEXT("59 ウォーム" ), TEXT("5A ポリシンセ" ), TEXT("5B クワイア" ), TEXT("5C ボウ" ), TEXT("5D メタリック" ), TEXT("5E ハロー" ), TEXT("5F スウィープ" ), TEXT("■Synth Effects"), TEXT("60 雨" ), TEXT("61 サウンドトラック" ), TEXT("62 クリスタル" ), TEXT("63 アトモスフィア" ), TEXT("64 ブライトネス" ), TEXT("65 ゴブリン" ), TEXT("66 エコー" ), TEXT("67 サイファイ" ), TEXT("■Ethnic"), TEXT("68 シタール" ), TEXT("69 バンジョー" ), TEXT("6A 三味線" ), TEXT("6B 琴" ), TEXT("6C カリンバ" ), TEXT("6D バグパイプ" ), TEXT("6E フィドル" ), TEXT("6F シャハナーイ" ), TEXT("■Percussive"), TEXT("70 ティンクルベル" ), TEXT("71 アゴゴ" ), TEXT("72 スチールドラム" ), TEXT("73 ウッドブロック" ), TEXT("74 太鼓" ), TEXT("75 メロディックタム" ), TEXT("76 シンセドラム" ), TEXT("77 逆シンバル" ), TEXT("■Sound effects"), TEXT("78 ギターフレットノイズ" ), TEXT("79 ブレスノイズ" ), TEXT("7A 海岸" ), TEXT("7B 鳥のさえずり" ), TEXT("7C 電話のベル" ), TEXT("7D ヘリコプター" ), TEXT("7E 拍手" ), TEXT("7F 銃声" ) }; static int mouseKey,pushTab[26],ch=0;//チャネル番号:音色を変えるときは、これを変更する;; static int halfTab[]= {1,3,0,6,8,10, 0,13,15, 0,18,20,22, 0,25}; static int wholeTab[]={0,2,4,5,7, 9,11,12,14,16,17,19,21,23,24}; void clearBitmap(){ //■ビットマップクリア SelectObject(hBuff,GetStockObject(NULL_PEN)); HBRUSH brush=CreateSolidBrush(0x77FF); SelectObject(hBuff,brush); Rectangle(hBuff,0,0,340,120); DeleteObject(brush); } void initBitmap(HWND hw){ //■ビットマップ初期設定 HDC hdc=GetDC(hw); hB=CreateCompatibleBitmap(hdc,1000,400); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hB); clearBitmap(); ReleaseDC(hw,hdc); } void drawKeyCom(int X, int Y, int W, int H, int C){ HPEN pen=CreatePen(PS_SOLID,1,0);SelectObject(hBuff,pen); HBRUSH brush=CreateSolidBrush(C); SelectObject(hBuff,brush); RoundRect(hBuff,X,Y,X+W,Y+H,3,3); DeleteObject(pen); DeleteObject(brush); } void drawWKey (int X, int Y){ drawKeyCom(X, Y, 21, 50, 0xFFFFFF);} void drawWKeyPush(int X, int Y){ drawKeyCom(X, Y, 21, 47, 0xFFFF );} void drawBKey (int X, int Y){ drawKeyCom(X, Y, 15, 30, 0 );} void drawBKeyPush(int X, int Y){ drawKeyCom(X, Y, 15, 30, 0xFFF );} void drawPiano(){ clearBitmap(); drawKeyCom(2, 10, 8, 50, 0x5577FF); int X=10; for(int i=0;i<15;i++, X+=20) if(pushTab[wholeTab[i]]) drawWKeyPush(X,10); else drawWKey(X,10); drawKeyCom(X+1, 10, 9, 50, 0x5577FF); X=23; for(int i=0;i<16;i++, X+=20) if(halfTab[i]>0) if(pushTab[halfTab[i]]) drawBKeyPush(X,10); else drawBKey(X,10); } int searchKeyTab(int wp){ for(int i=0;keyTab[i][0]>=0;i++) if(wp==keyTab[i][0]) return keyTab[i][1]; return -1; } void stopMTone(){ midiOutShortMsg(hM,SMSG(MPUSH, ch,mouseKey+note-12,0)); pushTab[mouseKey]=0;mouseKey=-1; } void soundTone(int mK){ mouseKey=mK; pushTab[mouseKey]=1; midiOutShortMsg(hM,SMSG(MPUSH, ch,mouseKey+note-12,vel)); } void stopAndMTone(int mK){ stopMTone(); soundTone(mK); } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ int x=LOWORD(lp), y=HIWORD(lp), mK; if(mouseKey>=0) stopMTone(); if(y>=40 && y<=60){ mK=(x-10)/20; if(mK>=0 || mK<14)soundTone(wholeTab[mK]); } else if(y>=10 && y<=40){ mK=(x-23)/20; if(mK>=0 && mK<15){ if((mK=halfTab[mK])!=0) soundTone(mK); } } drawPiano(); InvalidateRect(hw,NULL,TRUE); } void procMouseMove(HWND hw, WPARAM wp,LPARAM lp){ if(mouseKey<0) return; int x=LOWORD(lp), y=HIWORD(lp), mK; if(y>=40 && y<=60){ mK=(x-10)/20; if(mK>=0 || mK<14) if((mK=wholeTab[mK])!=mouseKey)stopAndMTone(mK); } else if(y>=10 && y<=40){ mK=(x-23)/20; if(mK>=0 && mK<15) if((mK=halfTab[mK])!=0) if(mK!=mouseKey)stopAndMTone(mK); } else stopMTone(); drawPiano(); InvalidateRect(hw,NULL,TRUE); } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ stopMTone(); drawPiano(); InvalidateRect(hw,NULL,TRUE); } void dspProg(HWND hw){ TCHAR str[128]; wsprintf(str,TEXT("強さ:%02X, 音色: %02X, 基準高さ: %2X "), vel, prog, note); SetWindowText(hw,str); } void changeTone(HWND hw){ dspProg(hw); midiOutShortMsg(hM,SMSG(MCTONE,ch,prog,0)); } void soundKTone(int ip){midiOutShortMsg(hM,SMSG(MPUSH, ch,ip+note-12,vel));} void stopKTone (int ip){midiOutShortMsg(hM,SMSG(MPUSH, ch,ip+note-12,0 ));} void procKeyDown(HWND hw, WPARAM wp,LPARAM lp){ switch(wp){ case VK_UP : if(vel<0x07F)vel++ ; dspProg(hw) ; return; case VK_DOWN : if(vel>0 )vel-- ; dspProg(hw) ; return; case VK_LEFT : if(prog<0x7F)prog++; changeTone(hw); return; case VK_RIGHT: if(prog>0 )prog--; changeTone(hw); return; } int ip=searchKeyTab(wp); if(ip<0) return; if(pushTab[ip]==0) soundKTone(ip); pushTab[ip]=1;drawPiano(); InvalidateRect(hw,NULL,TRUE); } void procKeyUp(HWND hw, WPARAM wp,LPARAM lp){ int ip=searchKeyTab(wp); if(ip<0) return; pushTab[ip]=0;drawPiano(); stopKTone(ip); InvalidateRect(hw,NULL,TRUE); } void setFont(HWND hw, HFONT font){ SendMessage(hw, WM_SETFONT,(WPARAM)font,0); } void createButton(HWND hw){ TCHAR *str[]={TEXT("低々音"), TEXT("低音"),TEXT("標準"),TEXT("高音"),TEXT("高々音")}; for(int i=0, X=40; i<5;i++, X+=50){ HWND bt=CreateWindow(TEXT("BUTTON"),str[i],WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, X,65,50,20, hw,(HMENU)(BT_0+i), hInstance,NULL); setFont(bt,font); } } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ //■Create時処理 initBitmap(hw); SetWindowText(hw,TEXT("キーボードをピアノの鍵盤がわりに" )); MoveWindow(hw,0,0,340,510,TRUE); font=CreateFont(11,0,0,0, FW_BOLD, FALSE, FALSE,FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH|FF_MODERN,NULL); createButton(hw); noSortL=CreateWindow(TEXT("LISTBOX"),NULL, WS_CHILD | WS_VISIBLE | WS_BORDER|WS_VSCROLL|LBS_NOTIFY, 2,90, 318,390,hw, (HMENU)LST_1,hInstance, NULL); setFont(noSortL,font); int numArray=(sizeof(instrument)/sizeof(TCHAR *)); for(int i=0; i=BT_0 && LW<(BT_0+5)){ note=0x3C-24; for(int i=BT_0;i