ShortMsg.cpp
上传用户:fs3633
上传日期:2021-05-14
资源大小:909k
文件大小:6k
- /*
- ShortMsg.cpp
- Implementation for the CShortMsg class
- Copyright (C) 2002 Leslie Sanford
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- USA
- Contact: Leslie Sanford (jabberdabber@hotmail.com)
- Last modified: 08/19/2003
- */
- //---------------------------------------------------------------------
- // Dependencies
- //---------------------------------------------------------------------
- #include "midi.h"
- #include "ShortMsg.h"
- #include "MIDIOutDevice.h"
- #include "MIDIInDevice.h"
- // Using declaration
- using midi::CShortMsg;
- //---------------------------------------------------------------------
- // CShortMsg implementation
- //---------------------------------------------------------------------
- // Constructor
- CShortMsg::CShortMsg(DWORD TimeStamp) :
- m_Msg(0),
- m_MsgNoStatus(0)
- {
- SetTimeStamp(TimeStamp);
- }
- // Constructor
- CShortMsg::CShortMsg(DWORD Msg, DWORD TimeStamp) :
- m_Msg(Msg)
- {
- unsigned char DataByte1 = GetData1();
- unsigned char DataByte2 = GetData2();
- m_MsgNoStatus = PackShortMsg(DataByte1, DataByte2);
- SetTimeStamp(TimeStamp);
- }
- // Constructor
- CShortMsg::CShortMsg(unsigned char Status, unsigned char Data1,
- unsigned char Data2, DWORD TimeStamp)
- {
- SetMsg(Status, Data1, Data2);
- m_MsgNoStatus = PackShortMsg(Data1, Data2);
- SetTimeStamp(TimeStamp);
- }
- // Constructor
- CShortMsg::CShortMsg(unsigned char Command, unsigned char Channel,
- unsigned char Data1, unsigned char Data2,
- DWORD TimeStamp)
- {
- SetMsg(Command, Channel, Data1, Data2);
- m_MsgNoStatus = PackShortMsg(Data1, Data2);
- SetTimeStamp(TimeStamp);
- }
- // Sends message
- void CShortMsg::SendMsg(midi::CMIDIOutDevice &OutDevice)
- {
- OutDevice.SendMsg(m_Msg);
- }
- // Sends message without status byte
- void CShortMsg::SendMsgNoStatus(midi::CMIDIOutDevice &OutDevice)
- {
- OutDevice.SendMsg(m_MsgNoStatus);
- }
- // Gets message
- const char *CShortMsg::GetMsg() const
- {
- return reinterpret_cast<const char *>(&m_Msg);
- }
- // Gets status byte
- unsigned char CShortMsg::GetStatus() const
- {
- unsigned char Status;
- unsigned char Dummy;
- UnpackShortMsg(m_Msg, Status, Dummy, Dummy);
- return Status;
- }
- // Gets MIDI channel
- unsigned char CShortMsg::GetChannel() const
- {
- unsigned char Channel;
- unsigned char Dummy;
- UnpackShortMsg(m_Msg, Dummy, Channel, Dummy, Dummy);
- return Channel;
- }
- // Gets command code
- unsigned char CShortMsg::GetCommand() const
- {
- unsigned char Command;
- unsigned char Dummy;
- UnpackShortMsg(m_Msg, Command, Dummy, Dummy, Dummy);
- return Command;
- }
- // Gets data byte 1
- unsigned char CShortMsg::GetData1() const
- {
- unsigned char Data1;
- unsigned char Dummy;
- UnpackShortMsg(m_Msg, Dummy, Dummy, Data1, Dummy);
- return Data1;
- }
- // Gets data byte 2
- unsigned char CShortMsg::GetData2() const
- {
- unsigned char Data2;
- unsigned char Dummy;
- UnpackShortMsg(m_Msg, Dummy, Dummy, Dummy, Data2);
- return Data2;
- }
- // Sets message
- void CShortMsg::SetMsg(unsigned char Status, unsigned char Data1,
- unsigned char Data2)
- {
- m_Msg = PackShortMsg(Status, Data1, Data2);
- m_MsgNoStatus = PackShortMsg(Data1, Data2);
- }
- // Sets message
- void CShortMsg::SetMsg(unsigned char Command, unsigned char Channel,
- unsigned char Data1, unsigned char Data2)
- {
- m_Msg = PackShortMsg(Command, Channel, Data1, Data2);
- m_MsgNoStatus = PackShortMsg(Data1, Data2);
- }
- // Packs data into short message without status byte
- DWORD CShortMsg::PackShortMsg(unsigned char DataByte1,
- unsigned char DataByte2)
- {
- DWORD Msg = DataByte1;
- Msg |= DataByte2 << midi::SHORT_MSG_SHIFT;
- return Msg;
- }
- // Packs data into short message with status byte
- DWORD CShortMsg::PackShortMsg(unsigned char Status,
- unsigned char DataByte1,
- unsigned char DataByte2)
- {
- DWORD Msg = Status;
- Msg |= DataByte1 << midi::SHORT_MSG_SHIFT;
- Msg |= DataByte2 << midi::SHORT_MSG_SHIFT * 2;
- return Msg;
- }
- // Packs data into short channel message
- DWORD CShortMsg::PackShortMsg(unsigned char Command,
- unsigned char Channel,
- unsigned char DataByte1,
- unsigned char DataByte2)
- {
- DWORD Msg = Command | Channel;
- Msg |= DataByte1 << midi::SHORT_MSG_SHIFT;
- Msg |= DataByte2 << midi::SHORT_MSG_SHIFT * 2;
- return Msg;
- }
- // Unpacks short message
- void CShortMsg::UnpackShortMsg(DWORD Msg, unsigned char &Status,
- unsigned char &DataByte1,
- unsigned char &DataByte2)
- {
- Status = static_cast<unsigned char>(Msg);
- DataByte1 = static_cast<unsigned char>
- (Msg >> midi::SHORT_MSG_SHIFT);
- DataByte2 = static_cast<unsigned char>
- (Msg >> midi::SHORT_MSG_SHIFT * 2);
- }
- // Unpacks short channel message
- void CShortMsg::UnpackShortMsg(DWORD Msg, unsigned char &Command,
- unsigned char &Channel,
- unsigned char &DataByte1,
- unsigned char &DataByte2)
- {
- Command = static_cast<unsigned char>(Msg & ~midi::SHORT_MSG_MASK);
- Channel = static_cast<unsigned char>(Msg & midi::SHORT_MSG_MASK);
- DataByte1 = static_cast<unsigned char>
- (Msg >> midi::SHORT_MSG_SHIFT);
- DataByte2 = static_cast<unsigned char>
- (Msg >> midi::SHORT_MSG_SHIFT * 2);
- }