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

midi

开发平台:

Visual C++

  1. /*
  2.   ShortMsg.cpp
  3.   Implementation for the CShortMsg class
  4.   Copyright (C) 2002 Leslie Sanford
  5.   This library is free software; you can redistribute it and/or
  6.   modify it under the terms of the GNU Lesser General Public
  7.   License as published by the Free Software Foundation; either
  8.   version 2.1 of the License, or (at your option) any later version.
  9.   This library is distributed in the hope that it will be useful,
  10.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.   Lesser General Public License for more details.
  13.   You should have received a copy of the GNU Lesser General Public
  14.   License along with this library; if not, write to the Free Software
  15.   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 
  16.   USA
  17.   Contact: Leslie Sanford (jabberdabber@hotmail.com)
  18.   Last modified: 08/19/2003
  19. */
  20. //---------------------------------------------------------------------
  21. // Dependencies
  22. //---------------------------------------------------------------------
  23. #include "midi.h"
  24. #include "ShortMsg.h"
  25. #include "MIDIOutDevice.h"
  26. #include "MIDIInDevice.h"
  27. // Using declaration
  28. using midi::CShortMsg;
  29. //---------------------------------------------------------------------
  30. // CShortMsg implementation
  31. //---------------------------------------------------------------------
  32. // Constructor
  33. CShortMsg::CShortMsg(DWORD TimeStamp) :
  34. m_Msg(0),
  35. m_MsgNoStatus(0)
  36. {
  37.     SetTimeStamp(TimeStamp);
  38. }
  39. // Constructor
  40. CShortMsg::CShortMsg(DWORD Msg, DWORD TimeStamp) : 
  41. m_Msg(Msg)
  42. {
  43.     unsigned char DataByte1 = GetData1();
  44.     unsigned char DataByte2 = GetData2();
  45.     m_MsgNoStatus = PackShortMsg(DataByte1, DataByte2);
  46.     SetTimeStamp(TimeStamp);
  47. }
  48. // Constructor
  49. CShortMsg::CShortMsg(unsigned char Status, unsigned char Data1, 
  50.                      unsigned char Data2, DWORD TimeStamp)
  51. {
  52.     SetMsg(Status, Data1, Data2);
  53.     m_MsgNoStatus = PackShortMsg(Data1, Data2);
  54.     SetTimeStamp(TimeStamp);
  55. }
  56. // Constructor
  57. CShortMsg::CShortMsg(unsigned char Command, unsigned char Channel, 
  58.                      unsigned char Data1, unsigned char Data2,
  59.                      DWORD TimeStamp)
  60. {
  61.     SetMsg(Command, Channel, Data1, Data2);
  62.     m_MsgNoStatus = PackShortMsg(Data1, Data2);
  63.     SetTimeStamp(TimeStamp);
  64. }
  65. // Sends message
  66. void CShortMsg::SendMsg(midi::CMIDIOutDevice &OutDevice)
  67. {
  68.     OutDevice.SendMsg(m_Msg);
  69. }
  70. // Sends message without status byte
  71. void CShortMsg::SendMsgNoStatus(midi::CMIDIOutDevice &OutDevice)
  72. {
  73.     OutDevice.SendMsg(m_MsgNoStatus);
  74. }
  75. // Gets message
  76. const char *CShortMsg::GetMsg() const
  77. {
  78.     return reinterpret_cast<const char *>(&m_Msg);
  79. }
  80. // Gets status byte
  81. unsigned char CShortMsg::GetStatus() const
  82. {
  83.     unsigned char Status;
  84.     unsigned char Dummy;
  85.     UnpackShortMsg(m_Msg, Status, Dummy, Dummy);
  86.     return Status;
  87. }
  88. // Gets MIDI channel
  89. unsigned char CShortMsg::GetChannel() const
  90. {
  91.     unsigned char Channel;
  92.     unsigned char Dummy;
  93.     UnpackShortMsg(m_Msg, Dummy, Channel, Dummy, Dummy);
  94.     return Channel;
  95. }
  96. // Gets command code
  97. unsigned char CShortMsg::GetCommand() const
  98. {
  99.     unsigned char Command;
  100.     unsigned char Dummy;
  101.     UnpackShortMsg(m_Msg, Command, Dummy, Dummy, Dummy);
  102.     return Command;
  103. }
  104. // Gets data byte 1
  105. unsigned char CShortMsg::GetData1() const
  106. {
  107.     unsigned char Data1;
  108.     unsigned char Dummy;
  109.     UnpackShortMsg(m_Msg, Dummy, Dummy, Data1, Dummy);
  110.     return Data1;
  111. }
  112. // Gets data byte 2
  113. unsigned char CShortMsg::GetData2() const
  114. {
  115.     unsigned char Data2;
  116.     unsigned char Dummy;
  117.     UnpackShortMsg(m_Msg, Dummy, Dummy, Dummy, Data2);
  118.     return Data2;
  119. }
  120. // Sets message
  121. void CShortMsg::SetMsg(unsigned char Status, unsigned char Data1,
  122.                        unsigned char Data2)
  123. {
  124.     m_Msg = PackShortMsg(Status, Data1, Data2);
  125.     m_MsgNoStatus = PackShortMsg(Data1, Data2);
  126. }
  127. // Sets message
  128. void CShortMsg::SetMsg(unsigned char Command, unsigned char Channel,
  129.                        unsigned char Data1, unsigned char Data2)
  130. {
  131.     m_Msg = PackShortMsg(Command, Channel, Data1, Data2);
  132.     m_MsgNoStatus = PackShortMsg(Data1, Data2);
  133. }
  134. // Packs data into short message without status byte
  135. DWORD CShortMsg::PackShortMsg(unsigned char DataByte1,
  136.                               unsigned char DataByte2)
  137. {
  138.     DWORD Msg = DataByte1;
  139.     Msg |= DataByte2 << midi::SHORT_MSG_SHIFT;
  140.     return Msg;
  141. }
  142. // Packs data into short message with status byte
  143. DWORD CShortMsg::PackShortMsg(unsigned char Status,
  144.                               unsigned char DataByte1,
  145.                               unsigned char DataByte2)
  146. {
  147.     DWORD Msg = Status;
  148.     Msg |= DataByte1 << midi::SHORT_MSG_SHIFT;
  149.     Msg |= DataByte2 << midi::SHORT_MSG_SHIFT * 2;
  150.     return Msg;
  151. }
  152. // Packs data into short channel message
  153. DWORD CShortMsg::PackShortMsg(unsigned char Command,
  154.                               unsigned char Channel,
  155.                               unsigned char DataByte1,
  156.                               unsigned char DataByte2)
  157. {
  158.     DWORD Msg = Command | Channel;
  159.     Msg |= DataByte1 << midi::SHORT_MSG_SHIFT;
  160.     Msg |= DataByte2 << midi::SHORT_MSG_SHIFT * 2;
  161.     return Msg;
  162. }
  163. // Unpacks short message
  164. void CShortMsg::UnpackShortMsg(DWORD Msg, unsigned char &Status,
  165.                                unsigned char &DataByte1,
  166.                                unsigned char &DataByte2)
  167. {
  168.     Status = static_cast<unsigned char>(Msg);
  169.     DataByte1 = static_cast<unsigned char>
  170.                                    (Msg >> midi::SHORT_MSG_SHIFT);
  171.     DataByte2 = static_cast<unsigned char>
  172.                                    (Msg >> midi::SHORT_MSG_SHIFT * 2);
  173. }
  174. // Unpacks short channel message
  175. void CShortMsg::UnpackShortMsg(DWORD Msg, unsigned char &Command,
  176.                                unsigned char &Channel,
  177.                                unsigned char &DataByte1,
  178.                                unsigned char &DataByte2)
  179. {
  180.     Command = static_cast<unsigned char>(Msg & ~midi::SHORT_MSG_MASK);
  181.     Channel = static_cast<unsigned char>(Msg & midi::SHORT_MSG_MASK);
  182.     DataByte1 = static_cast<unsigned char>
  183.                                    (Msg >> midi::SHORT_MSG_SHIFT);
  184.     DataByte2 = static_cast<unsigned char>
  185.                                    (Msg >> midi::SHORT_MSG_SHIFT * 2);
  186. }