diff options
Diffstat (limited to 'libs/midi++2/midi++/mmc.h')
-rw-r--r-- | libs/midi++2/midi++/mmc.h | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/libs/midi++2/midi++/mmc.h b/libs/midi++2/midi++/mmc.h new file mode 100644 index 0000000000..7b51b33a72 --- /dev/null +++ b/libs/midi++2/midi++/mmc.h @@ -0,0 +1,261 @@ +/* + Copyright (C) 2000 Paul Barton-Davis + + 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. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +#ifndef __midipp_mmc_h_h__ +#define __midipp_mmc_h_h__ + +#include <sigc++/sigc++.h> +#include <midi++/types.h> + +namespace MIDI { + +class Port; +class Parser; + +class MachineControl : public sigc::trackable + +{ + public: + typedef byte CommandSignature[60]; + typedef byte ResponseSignature[60]; + + enum Command { + cmdStop = 0x1, + cmdPlay = 0x2, + cmdDeferredPlay = 0x3, + cmdFastForward = 0x4, + cmdRewind = 0x5, + cmdRecordStrobe = 0x6, + + cmdRecordExit = 0x7, + cmdRecordPause = 0x8, + cmdPause = 0x9, + cmdEject = 0xA, + cmdChase = 0xB, + cmdCommandErrorReset = 0xC, + cmdMmcReset = 0xD, + + cmdIllegalMackieJogStart = 0x20, + cmdIllegalMackieJogStop = 0x21, + + cmdWrite = 0x40, + cmdMaskedWrite = 0x41, + cmdRead = 0x42, + cmdUpdate = 0x43, + cmdLocate = 0x44, + cmdVariablePlay = 0x45, + cmdSearch = 0x46, + + cmdShuttle = 0x47, + cmdStep = 0x48, + cmdAssignSystemMaster = 0x49, + cmdGeneratorCommand = 0x4A, + cmdMtcCommand = 0x4B, + cmdMove = 0x4C, + cmdAdd = 0x4D, + + cmdSubtract = 0x4E, + cmdDropFrameAdjust = 0x4F, + cmdProcedure = 0x50, + cmdEvent = 0x51, + cmdGroup = 0x52, + cmdCommandSegment = 0x53, + cmdDeferredVariablePlay = 0x54, + + cmdRecordStrobeVariable = 0x55, + + cmdWait = 0x7C, + cmdResume = 0x7F, + }; + + MachineControl (Port &port, + float MMCVersion, + CommandSignature &cs, + ResponseSignature &rs); + + Port &port() { return _port; } + + void set_device_id (byte id); + static bool is_mmc (byte *sysex_buf, size_t len); + + /* Signals to connect to if you want to run "callbacks" + when certain MMC commands are received. + */ + + sigc::signal<void,MachineControl &> Stop; + sigc::signal<void,MachineControl &> Play; + sigc::signal<void,MachineControl &> DeferredPlay; + sigc::signal<void,MachineControl &> FastForward; + sigc::signal<void,MachineControl &> Rewind; + sigc::signal<void,MachineControl &> RecordStrobe; + sigc::signal<void,MachineControl &> RecordExit; + sigc::signal<void,MachineControl &> RecordPause; + sigc::signal<void,MachineControl &> Pause; + sigc::signal<void,MachineControl &> Eject; + sigc::signal<void,MachineControl &> Chase; + sigc::signal<void,MachineControl &> CommandErrorReset; + sigc::signal<void,MachineControl &> MmcReset; + + sigc::signal<void,MachineControl &> JogStart; + sigc::signal<void,MachineControl &> JogStop; + + sigc::signal<void,MachineControl &> Write; + sigc::signal<void,MachineControl &> MaskedWrite; + sigc::signal<void,MachineControl &> Read; + sigc::signal<void,MachineControl &> Update; + sigc::signal<void,MachineControl &> VariablePlay; + sigc::signal<void,MachineControl &> Search; + sigc::signal<void,MachineControl &> AssignSystemMaster; + sigc::signal<void,MachineControl &> GeneratorCommand; + sigc::signal<void,MachineControl &> MidiTimeCodeCommand; + sigc::signal<void,MachineControl &> Move; + sigc::signal<void,MachineControl &> Add; + sigc::signal<void,MachineControl &> Subtract; + sigc::signal<void,MachineControl &> DropFrameAdjust; + sigc::signal<void,MachineControl &> Procedure; + sigc::signal<void,MachineControl &> Event; + sigc::signal<void,MachineControl &> Group; + sigc::signal<void,MachineControl &> CommandSegment; + sigc::signal<void,MachineControl &> DeferredVariablePlay; + sigc::signal<void,MachineControl &> RecordStrobeVariable; + sigc::signal<void,MachineControl &> Wait; + sigc::signal<void,MachineControl &> Resume; + + /* The second argument is the shuttle speed, the third is + true if the direction is "forwards", false for "reverse" + */ + + sigc::signal<void,MachineControl &,float,bool> Shuttle; + + /* The second argument specifies the desired track record enabled + status. + */ + + sigc::signal<void,MachineControl &,size_t,bool> + TrackRecordStatusChange; + + /* The second argument points to a byte array containing + the locate target value in MMC Standard Time Code + format (5 bytes, roughly: hrs/mins/secs/frames/subframes) + */ + + sigc::signal<void,MachineControl &, const byte *> Locate; + + /* The second argument is the number of steps to jump */ + + sigc::signal<void,MachineControl &, int> Step; + + protected: + +#define MMC_NTRACKS 48 + + /* MMC Information fields (think "registers") */ + + CommandSignature commandSignature; + ResponseSignature responseSignature; + + byte updateRate; + byte responseError; + byte commandError; + byte commandErrorLevel; + + byte motionControlTally; + byte velocityTally; + byte stopMode; + byte fastMode; + byte recordMode; + byte recordStatus; + bool trackRecordStatus[MMC_NTRACKS]; + bool trackRecordReady[MMC_NTRACKS]; + byte globalMonitor; + byte recordMonitor; + byte trackSyncMonitor; + byte trackInputMonitor; + byte stepLength; + byte playSpeedReference; + byte fixedSpeed; + byte lifterDefeat; + byte controlDisable; + byte trackMute; + byte failure; + byte selectedTimeCode; + byte shortSelectedTimeCode; + byte timeStandard; + byte selectedTimeCodeSource; + byte selectedTimeCodeUserbits; + byte selectedMasterCode; + byte requestedOffset; + byte actualOffset; + byte lockDeviation; + byte shortSelectedMasterCode; + byte shortRequestedOffset; + byte shortActualOffset; + byte shortLockDeviation; + byte resolvedPlayMode; + byte chaseMode; + byte generatorTimeCode; + byte shortGeneratorTimeCode; + byte generatorCommandTally; + byte generatorSetUp; + byte generatorUserbits; + byte vitcInsertEnable; + byte midiTimeCodeInput; + byte shortMidiTimeCodeInput; + byte midiTimeCodeCommandTally; + byte midiTimeCodeSetUp; + byte gp0; + byte gp1; + byte gp2; + byte gp3; + byte gp4; + byte gp5; + byte gp6; + byte gp7; + byte shortGp0; + byte shortGp1; + byte shortGp2; + byte shortGp3; + byte shortGp4; + byte shortGp5; + byte shortGp6; + byte shortGp7; + byte procedureResponse; + byte eventResponse; + byte responseSegment; + byte wait; + byte resume; + + private: + byte _device_id; + MIDI::Port &_port; + + void process_mmc_message (Parser &p, byte *, size_t len); + + int do_masked_write (byte *, size_t len); + int do_locate (byte *, size_t len); + int do_step (byte *, size_t len); + int do_shuttle (byte *, size_t len); + + void write_track_record_ready (byte *, size_t len); +}; + +}; /* namespace MIDI */ + +#endif /* __midipp_mmc_h_h__ */ |