MIDIKeyboard.cpp
上传用户:fs3633
上传日期:2021-05-14
资源大小:909k
文件大小:4k
源码类别:

midi

开发平台:

Visual C++

  1. // MIDIKeyboard.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MIDIDevDemo v2.h"
  5. #include "MIDIKeyboard.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CMIDIKeyboard MIDI琴键
  13. // Low note end of the piano control range 低音符结束的控制范围
  14. const unsigned char CMIDIKeyboard::LOW_NOTE = 36;
  15. // High note end of the piano control range 高音符结束的控制范围
  16. const unsigned char CMIDIKeyboard::HIGH_NOTE = 100;
  17. // For determining if a key on the computer keyboard is already down
  18. //确定计算机上的琴键是不是已经按下去了
  19. const unsigned short CMIDIKeyboard::KEY_DOWN = 16384;
  20. // Note per octave 音符的每个八分音符
  21. const unsigned char CMIDIKeyboard::NOTE_PER_OCTAVE = 12;
  22. // Size of key map 键映射的大小
  23. const int CMIDIKeyboard::MAP_SIZE = 17;
  24. CMIDIKeyboard::CMIDIKeyboard() :
  25. m_KeyMap(MAP_SIZE),
  26. m_Oct(0)
  27. {
  28.     //
  29.     // Initialize key map for looking up keys and their note values
  30.     //初始化琴键和音符的值,這個應該是鍵盤上面的按鍵,是電腦的鍵盤
  31.     m_KeyMap.SetAt('Z', CPianoCtrl::C);
  32.     m_KeyMap.SetAt('S', CPianoCtrl::C_SHARP);
  33.     m_KeyMap.SetAt('X', CPianoCtrl::D);
  34.     m_KeyMap.SetAt('D', CPianoCtrl::D_SHARP);
  35.     m_KeyMap.SetAt('C', CPianoCtrl::E);
  36.     m_KeyMap.SetAt('V', CPianoCtrl::F);
  37.     m_KeyMap.SetAt('G', CPianoCtrl::F_SHARP);
  38.     m_KeyMap.SetAt('B', CPianoCtrl::G);
  39.     m_KeyMap.SetAt('H', CPianoCtrl::G_SHARP);
  40.     m_KeyMap.SetAt('N', CPianoCtrl::A);
  41.     m_KeyMap.SetAt('J', CPianoCtrl::A_SHARP);
  42.     m_KeyMap.SetAt('M', CPianoCtrl::B);
  43.     // An octave higher 八度音階的音符的高度
  44.     m_KeyMap.SetAt(0xBC, CPianoCtrl::C + NOTE_PER_OCTAVE);
  45.     m_KeyMap.SetAt('L', CPianoCtrl::C_SHARP + NOTE_PER_OCTAVE);
  46.     m_KeyMap.SetAt(0xBE, CPianoCtrl::D + NOTE_PER_OCTAVE);
  47.     m_KeyMap.SetAt(0xBA, CPianoCtrl::D_SHARP + NOTE_PER_OCTAVE);
  48.     m_KeyMap.SetAt(0xBF, CPianoCtrl::E + NOTE_PER_OCTAVE);
  49. }
  50. CMIDIKeyboard::~CMIDIKeyboard()
  51. {
  52. }
  53. // Convert key to note 把鍵盤上的键转换成音符
  54. BOOL CMIDIKeyboard::KeyToNote(UINT Char, unsigned char &NoteId)
  55. {
  56.  
  57.     BOOL Result = m_KeyMap.Lookup(Char, NoteId);
  58.     if(Result)
  59.     {
  60.         NoteId += m_Oct * NOTE_PER_OCTAVE + LOW_NOTE;
  61.     }
  62.     return Result;
  63.     
  64.    
  65.    
  66.     
  67. }
  68. BEGIN_MESSAGE_MAP(CMIDIKeyboard, CWnd)
  69. //{{AFX_MSG_MAP(CMIDIKeyboard)
  70. ON_WM_GETDLGCODE()
  71. ON_WM_KEYDOWN()
  72. ON_WM_KEYUP()
  73. ON_WM_PAINT()
  74. ON_WM_LBUTTONDOWN()
  75. ON_WM_LBUTTONUP()
  76. ON_WM_MOUSEMOVE()
  77. //}}AFX_MSG_MAP
  78. END_MESSAGE_MAP()
  79. /////////////////////////////////////////////////////////////////////////////
  80. // CMIDIKeyboard message handlers 操作琴键的消息
  81. UINT CMIDIKeyboard::OnGetDlgCode() 
  82. {
  83. return CWnd::OnGetDlgCode() | DLGC_WANTALLKEYS;
  84. }
  85. // When client presses a key 当我们按下一个琴键的时候
  86. void CMIDIKeyboard::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  87. {
  88.     switch(nChar)
  89.     {
  90.     // Keys 1-5 are for determining the octave setting
  91.         //确定八度音階的安置
  92.     case '1':
  93.     case '2':
  94.     case '3':
  95.     case '4':
  96.     case '5':
  97.         m_Oct = nChar - '1';
  98.         break;
  99.     default:
  100.         // Make sure the key isn't already down 判断琴键是不是按下去了
  101.         if(!(nFlags & KEY_DOWN))
  102.         {
  103.             unsigned char NoteId;
  104.             // If the key is in range of the piano control, play note
  105.             //如果这个琴键在钢琴控件范围之内按下去的,那么就播放这个音符
  106.             if(KeyToNote(nChar, NoteId))
  107.             {
  108.                 NoteOn(NoteId);
  109.             }
  110.         }
  111.         break;
  112.     }
  113. CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
  114.     
  115.     
  116. }
  117. // Client lifts a key up 当我们松开琴键的时候
  118. void CMIDIKeyboard::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
  119. {
  120. unsigned char NoteId;
  121.     if(KeyToNote(nChar, NoteId))
  122.     {
  123.         NoteOff(NoteId);
  124.     }
  125. CWnd::OnKeyUp(nChar, nRepCnt, nFlags);
  126. }
  127. //
  128. // Messages passed to the parent control
  129. //给控件传递消息
  130. void CMIDIKeyboard::OnPaint() 
  131. {
  132.     CPianoCtrl::OnPaint();
  133. }
  134. void CMIDIKeyboard::OnLButtonDown(UINT nFlags, CPoint point) 
  135. {
  136.     CPianoCtrl::OnLButtonDown(nFlags, point);
  137. }
  138. void CMIDIKeyboard::OnLButtonUp(UINT nFlags, CPoint point) 
  139. {
  140.     CPianoCtrl::OnLButtonUp(nFlags, point);
  141. }
  142. void CMIDIKeyboard::OnMouseMove(UINT nFlags, CPoint point) 
  143. {
  144.     CPianoCtrl::OnMouseMove(nFlags, point);
  145. }