drumstick  2.9.0
C++ MIDI libraries using Qt objects, idioms, and style.
rtmidioutput.h
Go to the documentation of this file.
1 /*
2  Drumstick MIDI realtime input-output
3  Copyright (C) 2009-2023 Pedro Lopez-Cabanillas <plcl@users.sf.net>
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 3 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef MIDIOUTPUT_H
20 #define MIDIOUTPUT_H
21 
22 #include <QObject>
23 #include <QString>
24 #include <QStringList>
25 #include <QtPlugin>
26 #include <QSettings>
27 #include "macros.h"
28 
34 #if defined(DRUMSTICK_STATIC)
35 #define DRUMSTICK_RT_EXPORT
36 #else
37 #if defined(drumstick_rt_EXPORTS)
38 #define DRUMSTICK_RT_EXPORT Q_DECL_EXPORT
39 #else
40 #define DRUMSTICK_RT_EXPORT Q_DECL_IMPORT
41 #endif
42 #endif
43 
44 namespace drumstick { namespace rt {
45 
51 const quint8 MIDI_STD_CHANNELS = 16;
52 const quint8 MIDI_GM_STD_DRUM_CHANNEL = (10-1);
53 const quint8 MIDI_CONTROL_MSB_BANK_SELECT = 0x00;
54 const quint8 MIDI_CONTROL_MSB_MAIN_VOLUME = 0x07;
55 const quint8 MIDI_CONTROL_LSB_BANK_SELECT = 0x20;
56 const quint8 MIDI_CONTROL_REVERB_SEND = 0x5b;
57 const quint8 MIDI_CONTROL_ALL_SOUNDS_OFF = 0x78;
58 const quint8 MIDI_CONTROL_ALL_NOTES_OFF = 0x7b;
59 const quint8 MIDI_CONTROL_RESET_CONTROLLERS = 0x79;
60 
61 const quint8 MIDI_STATUS_NOTEOFF = 0x80;
62 const quint8 MIDI_STATUS_NOTEON = 0x90;
63 const quint8 MIDI_STATUS_KEYPRESURE = 0xa0;
64 const quint8 MIDI_STATUS_CONTROLCHANGE = 0xb0;
65 const quint8 MIDI_STATUS_PROGRAMCHANGE = 0xc0;
66 const quint8 MIDI_STATUS_CHANNELPRESSURE = 0xd0;
67 const quint8 MIDI_STATUS_PITCHBEND = 0xe0;
68 const quint8 MIDI_STATUS_SYSEX = 0xf0;
69 const quint8 MIDI_STATUS_ENDSYSEX = 0xf7;
70 const quint8 MIDI_STATUS_REALTIME = 0xf8;
71 
72 const quint8 MIDI_STATUS_MASK = 0xf0;
73 const quint8 MIDI_CHANNEL_MASK = 0x0f;
74 
75 const quint8 MIDI_COMMON_QTRFRAME = 0xF1;
76 const quint8 MIDI_COMMON_SONGPP = 0xF2;
77 const quint8 MIDI_COMMON_SONGSELECT = 0xF3;
78 const quint8 MIDI_COMMON_TUNEREQ = 0xF6;
79 
80 const quint8 MIDI_REALTIME_CLOCK = 0xF8;
81 const quint8 MIDI_REALTIME_START = 0xFA;
82 const quint8 MIDI_REALTIME_CONTINUE = 0xFB;
83 const quint8 MIDI_REALTIME_STOP = 0xFC;
84 const quint8 MIDI_REALTIME_SENSING = 0xFE;
85 const quint8 MIDI_REALTIME_RESET = 0xFF;
86 
92 inline int MIDI_LSB(int x)
93 {
94  return (x % 0x80);
95 }
96 
102 inline int MIDI_MSB(int x)
103 {
104  return (x / 0x80);
105 }
106 
116  typedef QPair<QString,QVariant> MIDIConnection;
117 
121  class DRUMSTICK_RT_EXPORT MIDIOutput : public QObject
122  {
123  Q_OBJECT
124 
125  public:
130  explicit MIDIOutput(QObject *parent = nullptr) : QObject(parent) {}
134  virtual ~MIDIOutput() = default;
139  virtual void initialize(QSettings* settings) = 0;
144  virtual QString backendName() = 0;
149  virtual QString publicName() = 0;
154  virtual void setPublicName(QString name) = 0;
160  virtual QList<MIDIConnection> connections(bool advanced = false) = 0;
165  virtual void setExcludedConnections(QStringList conns) = 0;
170  virtual void open(const MIDIConnection& conn) = 0;
174  virtual void close() = 0;
180 
181  public Q_SLOTS:
188  virtual void sendNoteOff(int chan, int note, int vel) = 0;
189 
196  virtual void sendNoteOn(int chan, int note, int vel) = 0;
197 
204  virtual void sendKeyPressure(int chan, int note, int value) = 0;
205 
212  virtual void sendController(int chan, int control, int value) = 0;
213 
219  virtual void sendProgram(int chan, int program) = 0;
220 
226  virtual void sendChannelPressure(int chan, int value) = 0;
227 
233  virtual void sendPitchBend(int chan, int value) = 0;
234 
239  virtual void sendSysex(const QByteArray& data) = 0;
240 
245  virtual void sendSystemMsg(const int status) = 0;
246  };
247 
250 }} // namespace drumstick::rt
251 
252 Q_DECLARE_INTERFACE(drumstick::rt::MIDIOutput, "net.sourceforge.drumstick.rt.MIDIOutput/2.0")
253 Q_DECLARE_METATYPE(drumstick::rt::MIDIConnection)
254 
255 #endif /* MIDIOUTPUT_H */
The QObject class is the base class of all Qt objects.
The QSettings class provides persistent platform-independent application settings.
MIDI OUT interface.
Definition: rtmidioutput.h:122
virtual ~MIDIOutput()=default
~MIDIOutput destructor
virtual void setExcludedConnections(QStringList conns)=0
setExcludedConnections
MIDIOutput(QObject *parent=nullptr)
MIDIOutput constructor.
Definition: rtmidioutput.h:130
virtual void initialize(QSettings *settings)=0
initialize
virtual QString backendName()=0
backendName
virtual MIDIConnection currentConnection()=0
currentConnection
virtual void sendPitchBend(int chan, int value)=0
sendPitchBend 0xE
virtual void sendNoteOn(int chan, int note, int vel)=0
sendNoteOn 0x9
virtual void sendChannelPressure(int chan, int value)=0
sendChannelPressure 0xD
virtual void sendKeyPressure(int chan, int note, int value)=0
sendKeyPressure 0xA
virtual QString publicName()=0
publicName
virtual void sendController(int chan, int control, int value)=0
sendController 0xB
virtual void open(const MIDIConnection &conn)=0
open the MIDI port by name
virtual void sendProgram(int chan, int program)=0
sendProgram 0xC
virtual void sendNoteOff(int chan, int note, int vel)=0
sendNoteOff 0x8
virtual void close()=0
close the MIDI port
virtual void sendSystemMsg(const int status)=0
sendSystemMsg
virtual void sendSysex(const QByteArray &data)=0
sendSysex
virtual QList< MIDIConnection > connections(bool advanced=false)=0
connections
virtual void setPublicName(QString name)=0
setPublicName
const quint8 MIDI_STATUS_CONTROLCHANGE
MIDI status byte for CONTROL change messages.
Definition: rtmidioutput.h:64
const quint8 MIDI_COMMON_SONGPP
MIDI Song Position status message.
Definition: rtmidioutput.h:76
const quint8 MIDI_GM_STD_DRUM_CHANNEL
Number of the GM percussion channel.
Definition: rtmidioutput.h:52
const quint8 MIDI_COMMON_SONGSELECT
MIDI Song Select status message.
Definition: rtmidioutput.h:77
const quint8 MIDI_CONTROL_ALL_SOUNDS_OFF
MIDI Controller number for All sounds off.
Definition: rtmidioutput.h:57
const quint8 MIDI_REALTIME_CONTINUE
MIDI Continue status message.
Definition: rtmidioutput.h:82
QPair< QString, QVariant > MIDIConnection
MIDIConnection represents a connection identifier.
Definition: rtmidioutput.h:116
const quint8 MIDI_REALTIME_RESET
MIDI Reset status message.
Definition: rtmidioutput.h:85
int MIDI_LSB(int x)
MIDI_LSB is a function to extract the least significative byte of a MIDI value.
Definition: rtmidioutput.h:92
const quint8 MIDI_STATUS_PROGRAMCHANGE
MIDI status byte for PROGRAM change messages.
Definition: rtmidioutput.h:65
const quint8 MIDI_STATUS_SYSEX
MIDI status byte for System Exclusive START messages.
Definition: rtmidioutput.h:68
const quint8 MIDI_STATUS_KEYPRESURE
MIDI status byte for KEY pressure messages.
Definition: rtmidioutput.h:63
const quint8 MIDI_STATUS_NOTEON
MIDI status byte for NOTE ON messages.
Definition: rtmidioutput.h:62
const quint8 MIDI_STD_CHANNELS
Standard number of MIDI channels.
Definition: rtmidioutput.h:51
int MIDI_MSB(int x)
MIDI_MSB is a function to extract the most significative byte of a MIDI value.
Definition: rtmidioutput.h:102
const quint8 MIDI_CONTROL_LSB_BANK_SELECT
MIDI Controller number for LSB Bank number.
Definition: rtmidioutput.h:55
const quint8 MIDI_REALTIME_CLOCK
MIDI Clock status message.
Definition: rtmidioutput.h:80
const quint8 MIDI_CONTROL_MSB_MAIN_VOLUME
MIDI Controller number for MSB volume.
Definition: rtmidioutput.h:54
const quint8 MIDI_STATUS_NOTEOFF
MIDI status byte for NOTE OFF messages.
Definition: rtmidioutput.h:61
const quint8 MIDI_COMMON_TUNEREQ
MIDI Tune Request status message.
Definition: rtmidioutput.h:78
const quint8 MIDI_CONTROL_RESET_CONTROLLERS
MIDI Controller number for Reset all controllers.
Definition: rtmidioutput.h:59
const quint8 MIDI_COMMON_QTRFRAME
MIDI Quarter frame status message.
Definition: rtmidioutput.h:75
const quint8 MIDI_STATUS_CHANNELPRESSURE
MIDI status byte for CHANNEL PRESSURE messages.
Definition: rtmidioutput.h:66
const quint8 MIDI_CONTROL_REVERB_SEND
MIDI Controller number for Reverb send.
Definition: rtmidioutput.h:56
const quint8 MIDI_STATUS_REALTIME
Minimum value for MIDI Realtime messages status.
Definition: rtmidioutput.h:70
const quint8 MIDI_CHANNEL_MASK
Mask to extract the MIDI channel byte from a MIDI message.
Definition: rtmidioutput.h:73
const quint8 MIDI_STATUS_PITCHBEND
MIDI status byte for PITCH bend messages.
Definition: rtmidioutput.h:67
const quint8 MIDI_CONTROL_ALL_NOTES_OFF
MIDI Controller number for All notes off.
Definition: rtmidioutput.h:58
const quint8 MIDI_CONTROL_MSB_BANK_SELECT
MIDI Controller number for MSB Bank number.
Definition: rtmidioutput.h:53
const quint8 MIDI_REALTIME_STOP
MIDI Stop status message.
Definition: rtmidioutput.h:83
const quint8 MIDI_REALTIME_SENSING
MIDI Active Sensing status message.
Definition: rtmidioutput.h:84
const quint8 MIDI_STATUS_ENDSYSEX
MIDI status byte for System Exclusive END messages.
Definition: rtmidioutput.h:69
const quint8 MIDI_STATUS_MASK
Mask to extract the MIDI status byte from a MIDI message.
Definition: rtmidioutput.h:72
const quint8 MIDI_REALTIME_START
MIDI Start status message.
Definition: rtmidioutput.h:81
Drumstick common.
Definition: alsaclient.cpp:68