You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
4.9 KiB
222 lines
4.9 KiB
/*
|
|
Rosegarden
|
|
A sequencer and musical notation editor.
|
|
|
|
This program is Copyright 2000-2008
|
|
Guillaume Laurent <glaurent@telegraph-road.org>,
|
|
Chris Cannam <cannam@all-day-breakfast.com>,
|
|
Richard Bown <bownie@bownie.com>
|
|
|
|
The moral right of the authors to claim authorship of this work
|
|
has been asserted.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version. See the file
|
|
COPYING included with this distribution for more information.
|
|
*/
|
|
|
|
#ifndef _MIDI_TYPES_H_
|
|
#define _MIDI_TYPES_H_
|
|
|
|
#include <list>
|
|
|
|
#include "Event.h"
|
|
#include "Instrument.h"
|
|
|
|
// Internal representation of some very MIDI specific event types
|
|
// that fall clearly outside of NotationTypes and still require
|
|
// representation.
|
|
//
|
|
|
|
|
|
namespace Rosegarden
|
|
{
|
|
|
|
class MIDIValueOutOfRange : public Exception {
|
|
public:
|
|
MIDIValueOutOfRange(std::string name) :
|
|
Exception("Value of " + name + " out of byte range") { }
|
|
MIDIValueOutOfRange(std::string name, std::string file, int line) :
|
|
Exception("Value of " + name + " out of byte range", file, line) { }
|
|
};
|
|
|
|
|
|
// Rosegarden's internal represetation of MIDI PitchBend
|
|
//
|
|
class PitchBend
|
|
{
|
|
public:
|
|
static const std::string EventType;
|
|
static const int EventSubOrdering;
|
|
|
|
static const PropertyName MSB;
|
|
static const PropertyName LSB;
|
|
|
|
PitchBend(MidiByte msb, MidiByte lsb);
|
|
PitchBend(const Event &);
|
|
~PitchBend();
|
|
|
|
MidiByte getMSB() const { return m_msb; }
|
|
MidiByte getLSB() const { return m_lsb; }
|
|
|
|
/// Returned event is on heap; caller takes responsibility for ownership
|
|
Event *getAsEvent(timeT absoluteTime) const;
|
|
|
|
private:
|
|
MidiByte m_msb;
|
|
MidiByte m_lsb;
|
|
};
|
|
|
|
|
|
// Controller
|
|
//
|
|
|
|
class Controller
|
|
{
|
|
public:
|
|
static const std::string EventType;
|
|
static const int EventSubOrdering;
|
|
|
|
static const PropertyName NUMBER; // controller number
|
|
static const PropertyName VALUE; // and value
|
|
|
|
Controller(MidiByte number,
|
|
MidiByte value);
|
|
|
|
Controller(const Event &);
|
|
~Controller();
|
|
|
|
MidiByte getNumber() const { return m_number; }
|
|
MidiByte getValue() const { return m_value; }
|
|
|
|
/// Returned event is on heap; caller takes responsibility for ownership
|
|
Event *getAsEvent(timeT absoluteTime) const;
|
|
|
|
private:
|
|
MidiByte m_number;
|
|
MidiByte m_value;
|
|
|
|
};
|
|
|
|
|
|
// Key pressure
|
|
//
|
|
|
|
class KeyPressure
|
|
{
|
|
public:
|
|
static const std::string EventType;
|
|
static const int EventSubOrdering;
|
|
|
|
static const PropertyName PITCH;
|
|
static const PropertyName PRESSURE;
|
|
|
|
KeyPressure(MidiByte pitch, MidiByte pressure);
|
|
KeyPressure(const Event &event);
|
|
~KeyPressure();
|
|
|
|
MidiByte getPitch() const { return m_pitch; }
|
|
MidiByte getPressure() const { return m_pressure; }
|
|
|
|
/// Returned event is on heap; caller takes responsibility for ownership
|
|
Event *getAsEvent(timeT absoluteTime) const;
|
|
|
|
private:
|
|
MidiByte m_pitch;
|
|
MidiByte m_pressure;
|
|
};
|
|
|
|
|
|
// Channel pressure
|
|
//
|
|
|
|
class ChannelPressure
|
|
{
|
|
public:
|
|
static const std::string EventType;
|
|
static const int EventSubOrdering;
|
|
|
|
static const PropertyName PRESSURE;
|
|
|
|
ChannelPressure(MidiByte pressure);
|
|
ChannelPressure(const Event &event);
|
|
~ChannelPressure();
|
|
|
|
MidiByte getPressure() const { return m_pressure; }
|
|
|
|
/// Returned event is on heap; caller takes responsibility for ownership
|
|
Event *getAsEvent(timeT absoluteTime) const;
|
|
|
|
private:
|
|
MidiByte m_pressure;
|
|
};
|
|
|
|
|
|
// Program Change
|
|
//
|
|
|
|
class ProgramChange
|
|
{
|
|
public:
|
|
static const std::string EventType;
|
|
static const int EventSubOrdering;
|
|
|
|
static const PropertyName PROGRAM;
|
|
|
|
ProgramChange(MidiByte program);
|
|
ProgramChange(const Event &event);
|
|
~ProgramChange();
|
|
|
|
MidiByte getProgram() const { return m_program; }
|
|
|
|
/// Returned event is on heap; caller takes responsibility for ownership
|
|
Event *getAsEvent(timeT absoluteTime) const;
|
|
|
|
private:
|
|
MidiByte m_program;
|
|
};
|
|
|
|
|
|
// System exclusive
|
|
//
|
|
|
|
class SystemExclusive
|
|
{
|
|
public:
|
|
static const std::string EventType;
|
|
static const int EventSubOrdering;
|
|
|
|
struct BadEncoding : public Exception {
|
|
BadEncoding() : Exception("Bad SysEx encoding") { }
|
|
};
|
|
|
|
static const PropertyName DATABLOCK;
|
|
|
|
SystemExclusive(std::string rawData);
|
|
SystemExclusive(const Event &event);
|
|
~SystemExclusive();
|
|
|
|
std::string getRawData() const { return m_rawData; }
|
|
std::string getHexData() const { return toHex(m_rawData); }
|
|
|
|
/// Returned event is on heap; caller takes responsibility for ownership
|
|
Event *getAsEvent(timeT absoluteTime) const;
|
|
|
|
static std::string toHex(std::string rawData);
|
|
static std::string toRaw(std::string hexData);
|
|
static bool isHex(std::string data);
|
|
|
|
private:
|
|
std::string m_rawData;
|
|
static unsigned char toRawNibble(char);
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|