summaryrefslogtreecommitdiffstats
path: root/src/base/MidiTypes.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/MidiTypes.h')
-rw-r--r--src/base/MidiTypes.h224
1 files changed, 224 insertions, 0 deletions
diff --git a/src/base/MidiTypes.h b/src/base/MidiTypes.h
new file mode 100644
index 0000000..10416a9
--- /dev/null
+++ b/src/base/MidiTypes.h
@@ -0,0 +1,224 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ 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