Ardour  8.12
mmc.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2000-2017 Paul Davis <paul@linuxaudiosystems.com>
3  * Copyright (C) 2005-2006 Taybin Rutkin <taybin@taybin.com>
4  * Copyright (C) 2009-2010 David Robillard <d@drobilla.net>
5  * Copyright (C) 2010-2012 Carl Hetherington <carl@carlh.net>
6  * Copyright (C) 2015-2019 Robin Gareus <robin@gareus.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #ifndef __midipp_mmc_h_h__
24 #define __midipp_mmc_h_h__
25 
26 #include "temporal/time.h"
27 
28 #include "pbd/signals.h"
29 #include "pbd/ringbuffer.h"
30 
32 #include "midi++/types.h"
33 #include "midi++/parser.h"
34 
35 namespace ARDOUR {
36  class PortEngine;
37 }
38 
39 namespace MIDI {
40 
41 class Port;
42 class Parser;
43 class MachineControlCommand;
44 
47 {
48  public:
49  typedef PBD::Signal1<void,MachineControl&> MMCSignal;
50 
51  enum Command {
52  cmdStop = 0x1,
53  cmdPlay = 0x2,
54  cmdDeferredPlay = 0x3,
55  cmdFastForward = 0x4,
56  cmdRewind = 0x5,
57  cmdRecordStrobe = 0x6,
58 
59  cmdRecordExit = 0x7,
60  cmdRecordPause = 0x8,
61  cmdPause = 0x9,
62  cmdEject = 0xA,
63  cmdChase = 0xB,
64  cmdCommandErrorReset = 0xC,
65  cmdMmcReset = 0xD,
66 
67  cmdIllegalMackieJogStart = 0x20,
68  cmdIllegalMackieJogStop = 0x21,
69 
70  cmdWrite = 0x40,
71  cmdMaskedWrite = 0x41,
72  cmdRead = 0x42,
73  cmdUpdate = 0x43,
74  cmdLocate = 0x44,
75  cmdVariablePlay = 0x45,
76  cmdSearch = 0x46,
77 
78  cmdShuttle = 0x47,
79  cmdStep = 0x48,
80  cmdAssignSystemMaster = 0x49,
81  cmdGeneratorCommand = 0x4A,
82  cmdMtcCommand = 0x4B,
83  cmdMove = 0x4C,
84  cmdAdd = 0x4D,
85 
86  cmdSubtract = 0x4E,
87  cmdDropFrameAdjust = 0x4F,
88  cmdProcedure = 0x50,
89  cmdEvent = 0x51,
90  cmdGroup = 0x52,
91  cmdCommandSegment = 0x53,
92  cmdDeferredVariablePlay = 0x54,
93 
94  cmdRecordStrobeVariable = 0x55,
95 
96  cmdWait = 0x7C,
97  cmdResume = 0x7F
98  };
99 
101 
102  void set_ports (MIDI::Port* input, MIDI::Port* output);
103 
104  Port* input_port() { return _input_port; }
105  Port* output_port() { return _output_port; }
106 
107  void set_receive_device_id (byte id);
108  void set_send_device_id (byte id);
109  byte receive_device_id () const { return _receive_device_id; }
110  byte send_device_id () const { return _send_device_id; }
111  void enable_send (bool);
112  bool send_enabled () const { return _enable_send; }
113  void send (MachineControlCommand const &, timestamp_t when);
114 
115  static bool is_mmc (byte *sysex_buf, size_t len);
116 
117  /* Signals to connect to if you want to run "callbacks"
118  when certain MMC commands are received.
119  */
120 
157 
158  PBD::Signal0<void> SPPStart;
159  PBD::Signal0<void> SPPContinue;
160  PBD::Signal0<void> SPPStop;
161 
162  /* The second argument is the shuttle speed, the third is
163  true if the direction is "forwards", false for "reverse"
164  */
165 
166  PBD::Signal3<void,MachineControl&,float,bool> Shuttle;
167 
168  /* The second argument specifies the desired track record enabled
169  status.
170  */
171 
172  PBD::Signal3<void,MachineControl &,size_t,bool>
174 
175  /* The second argument specifies the desired track record enabled
176  status.
177  */
178 
179  PBD::Signal3<void,MachineControl &,size_t,bool>
181 
182  /* The second argument points to a byte array containing
183  the locate target value in MMC Standard Time Code
184  format (5 bytes, roughly: hrs/mins/secs/frames/subframes)
185  */
186 
187  PBD::Signal2<void,MachineControl &, const byte *> Locate;
188 
189  /* The second argument is the number of steps to jump */
190 
191  PBD::Signal2<void,MachineControl &, int> Step;
192 
193 #define MMC_NTRACKS 48
194 
195  /* note: these are not currently in use */
196 
201 
204  byte stopMode;
205  byte fastMode;
208  bool trackRecordStatus[MMC_NTRACKS];
209  bool trackRecordReady[MMC_NTRACKS];
219  byte trackMute[MMC_NTRACKS];
220  byte failure;
235  byte chaseMode;
246  byte gp0;
247  byte gp1;
248  byte gp2;
249  byte gp3;
250  byte gp4;
251  byte gp5;
252  byte gp6;
253  byte gp7;
254  byte shortGp0;
255  byte shortGp1;
256  byte shortGp2;
257  byte shortGp3;
258  byte shortGp4;
259  byte shortGp5;
260  byte shortGp6;
261  byte shortGp7;
265  byte wait;
266  byte resume;
267 
268  private:
274 
275  void process_mmc_message (Parser &p, byte *, size_t len);
277 
278  int do_masked_write (byte *, size_t len);
279  int do_locate (byte *, size_t len);
280  int do_step (byte *, size_t len);
281  int do_shuttle (byte *, size_t len);
282 
283  void write_track_status (byte *, size_t len, byte reg);
284  void spp_start ();
285  void spp_continue ();
286  void spp_stop ();
287 };
288 
294 {
295 public:
296  MachineControlCommand () : _command (MachineControl::Command (0)) {}
299 
301 
302 private:
305 };
306 
307 } // namespace MIDI
308 
309 #endif /* __midipp_mmc_h_h__ */
MIDI::byte * fill_buffer(MachineControl *mmc, MIDI::byte *) const
MachineControlCommand(MachineControl::Command)
Timecode::Time _time
Definition: mmc.h:304
MachineControl::Command _command
Definition: mmc.h:303
MachineControlCommand(Timecode::Time)
byte selectedTimeCode
Definition: mmc.h:221
int do_shuttle(byte *, size_t len)
byte send_device_id() const
Definition: mmc.h:110
byte eventResponse
Definition: mmc.h:263
MMCSignal Search
Definition: mmc.h:141
byte responseError
Definition: mmc.h:198
PBD::Signal3< void, MachineControl &, float, bool > Shuttle
Definition: mmc.h:166
MMCSignal Pause
Definition: mmc.h:129
byte shortSelectedMasterCode
Definition: mmc.h:230
MMCSignal AssignSystemMaster
Definition: mmc.h:142
PBD::Signal3< void, MachineControl &, size_t, bool > TrackRecordStatusChange
Definition: mmc.h:173
MMCSignal DropFrameAdjust
Definition: mmc.h:148
void write_track_status(byte *, size_t len, byte reg)
MMCSignal CommandErrorReset
Definition: mmc.h:132
byte generatorUserbits
Definition: mmc.h:240
byte commandError
Definition: mmc.h:199
byte trackSyncMonitor
Definition: mmc.h:212
bool send_enabled() const
Definition: mmc.h:112
byte shortMidiTimeCodeInput
Definition: mmc.h:243
MMCSignal Rewind
Definition: mmc.h:125
int do_locate(byte *, size_t len)
MMCSignal Update
Definition: mmc.h:139
void enable_send(bool)
MMCSignal MmcReset
Definition: mmc.h:133
byte trackInputMonitor
Definition: mmc.h:213
bool _enable_send
true if MMC sending is enabled
Definition: mmc.h:273
byte velocityTally
Definition: mmc.h:203
MMCSignal MidiTimeCodeCommand
Definition: mmc.h:144
byte recordStatus
Definition: mmc.h:207
MMCSignal Subtract
Definition: mmc.h:147
MMCSignal FastForward
Definition: mmc.h:124
byte commandErrorLevel
Definition: mmc.h:200
PBD::Signal2< void, MachineControl &, int > Step
Definition: mmc.h:191
byte procedureResponse
Definition: mmc.h:262
PBD::Signal0< void > SPPStart
Definition: mmc.h:158
MMCSignal VariablePlay
Definition: mmc.h:140
byte selectedTimeCodeUserbits
Definition: mmc.h:225
byte selectedMasterCode
Definition: mmc.h:226
byte actualOffset
Definition: mmc.h:228
void set_ports(MIDI::Port *input, MIDI::Port *output)
Port * input_port()
Definition: mmc.h:104
MMCSignal CommandSegment
Definition: mmc.h:152
byte _receive_device_id
Definition: mmc.h:269
PBD::Signal0< void > SPPContinue
Definition: mmc.h:159
byte globalMonitor
Definition: mmc.h:210
MMCSignal MaskedWrite
Definition: mmc.h:137
byte generatorTimeCode
Definition: mmc.h:236
byte playSpeedReference
Definition: mmc.h:215
byte recordMonitor
Definition: mmc.h:211
byte shortSelectedTimeCode
Definition: mmc.h:222
MMCSignal RecordStrobe
Definition: mmc.h:126
MMCSignal Eject
Definition: mmc.h:130
byte requestedOffset
Definition: mmc.h:227
MMCSignal Write
Definition: mmc.h:136
byte motionControlTally
Definition: mmc.h:202
MMCSignal Chase
Definition: mmc.h:131
PBD::Signal0< void > SPPStop
Definition: mmc.h:160
static bool is_mmc(byte *sysex_buf, size_t len)
byte timeStandard
Definition: mmc.h:223
byte _send_device_id
Definition: mmc.h:270
MMCSignal RecordPause
Definition: mmc.h:128
MMCSignal GeneratorCommand
Definition: mmc.h:143
byte shortGeneratorTimeCode
Definition: mmc.h:237
byte receive_device_id() const
Definition: mmc.h:109
MMCSignal Play
Definition: mmc.h:122
Port * _output_port
Definition: mmc.h:272
void set_send_device_id(byte id)
byte lifterDefeat
Definition: mmc.h:217
PBD::Signal2< void, MachineControl &, const byte * > Locate
Definition: mmc.h:187
byte shortLockDeviation
Definition: mmc.h:233
PBD::ScopedConnectionList port_connections
connections to our parser for incoming data
Definition: mmc.h:276
byte controlDisable
Definition: mmc.h:218
byte responseSegment
Definition: mmc.h:264
Port * output_port()
Definition: mmc.h:105
int do_masked_write(byte *, size_t len)
byte midiTimeCodeInput
Definition: mmc.h:242
MMCSignal Event
Definition: mmc.h:150
void process_mmc_message(Parser &p, byte *, size_t len)
MMCSignal Add
Definition: mmc.h:146
byte vitcInsertEnable
Definition: mmc.h:241
MMCSignal Wait
Definition: mmc.h:155
MMCSignal RecordExit
Definition: mmc.h:127
byte lockDeviation
Definition: mmc.h:229
byte shortActualOffset
Definition: mmc.h:232
byte resolvedPlayMode
Definition: mmc.h:234
byte midiTimeCodeCommandTally
Definition: mmc.h:244
byte selectedTimeCodeSource
Definition: mmc.h:224
Port * _input_port
Definition: mmc.h:271
MMCSignal Group
Definition: mmc.h:151
byte shortRequestedOffset
Definition: mmc.h:231
PBD::Signal1< void, MachineControl & > MMCSignal
Definition: mmc.h:49
MMCSignal DeferredVariablePlay
Definition: mmc.h:153
MMCSignal DeferredPlay
Definition: mmc.h:123
void send(MachineControlCommand const &, timestamp_t when)
MMCSignal Resume
Definition: mmc.h:156
byte generatorSetUp
Definition: mmc.h:239
MMCSignal JogStart
Definition: mmc.h:134
MMCSignal Move
Definition: mmc.h:145
MMCSignal RecordStrobeVariable
Definition: mmc.h:154
PBD::Signal3< void, MachineControl &, size_t, bool > TrackMuteChange
Definition: mmc.h:180
byte midiTimeCodeSetUp
Definition: mmc.h:245
MMCSignal JogStop
Definition: mmc.h:135
byte generatorCommandTally
Definition: mmc.h:238
MMCSignal Read
Definition: mmc.h:138
int do_step(byte *, size_t len)
MMCSignal Procedure
Definition: mmc.h:149
MMCSignal Stop
Definition: mmc.h:121
void set_receive_device_id(byte id)
#define LIBMIDIPP_API
#define MMC_NTRACKS
Definition: mmc.h:193
uint32_t timestamp_t