![]() |
Mixxx
|
00001 /*************************************************************************** 00002 midimapping.h 00003 MIDI Mapping Class 00004 ------------------- 00005 begin : Sat Jan 17 2009 00006 copyright : (C) 2009 Sean M. Pappalardo 00007 (C) 2009 Albert Santoni 00008 email : pegasus@c64.org 00009 00010 ***************************************************************************/ 00011 00012 /*************************************************************************** 00013 * * 00014 * This program is free software; you can redistribute it and/or modify * 00015 * it under the terms of the GNU General Public License as published by * 00016 * the Free Software Foundation; either version 2 of the License, or * 00017 * (at your option) any later version. * 00018 * * 00019 ***************************************************************************/ 00020 00021 #ifndef MIDIMAPPING_H 00022 #define MIDIMAPPING_H 00023 00024 #include "mididevice.h" 00025 #include "midimessage.h" 00026 #include "mixxxcontrol.h" 00027 #include "midiinputmapping.h" 00028 #include "midioutputmapping.h" 00029 #include <QTableWidget> 00030 00031 #ifdef __MIDISCRIPT__ 00032 #include "midiscriptengine.h" 00033 #endif 00034 00035 //Forward declarations 00036 class MidiInputMappingTableModel; 00037 class MidiOutputMappingTableModel; 00038 00039 #define BINDINGS_PATH QDir::homePath().append("/").append(SETTINGS_PATH).append("midi/") 00040 // local midi mapping presets 00041 #define LPRESETS_PATH QDir::homePath().append("/").append(SETTINGS_PATH).append("presets/") 00042 #define MIDI_MAPPING_EXTENSION ".midi.xml" 00043 00044 class MidiMapping : public QObject 00045 { 00046 Q_OBJECT 00047 00048 public: 00050 MidiMapping(MidiDevice* outputMidiDevice=NULL); 00051 ~MidiMapping(); 00052 void setOutputMidiDevice(MidiDevice* outputMidiDevice); 00053 00054 void setName(QString name); 00055 00056 void loadPreset(bool forceLoad=false); 00057 void loadPreset(QString path, bool forceLoad=false); 00058 void loadPreset(QDomElement root, bool forceLoad=false); 00059 00060 void savePreset(); 00061 void savePreset(QString path); 00062 void applyPreset(); 00063 00064 00065 MidiInputMappingTableModel* getMidiInputMappingTableModel(); 00066 MidiOutputMappingTableModel* getMidiOutputMappingTableModel(); 00067 //MixxxControl* getInputMixxxControl(MidiMessage command); 00068 00069 static double ComputeValue(MidiOption midioption, double _prevmidivalue, double _newmidivalue); 00070 00071 // MIDI Input Mapping Modifiers 00072 int numInputMidiMessages(); 00073 bool isInputIndexValid(int index); 00074 bool isMidiMessageMapped(MidiMessage command); 00075 MidiMessage getInputMidiMessage(int index); 00076 MixxxControl getInputMixxxControl(int index); 00077 MixxxControl getInputMixxxControl(MidiMessage command); 00078 void setInputMidiMapping(MidiMessage command, MixxxControl control); 00079 void clearInputMidiMapping(int index); 00080 void clearInputMidiMapping(MidiMessage command); 00081 void clearInputMidiMapping(int index, int count); 00082 00083 // MIDI Output Mapping Modifiers 00084 int numOutputMixxxControls(); 00085 bool isOutputIndexValid(int index); 00086 bool isMixxxControlMapped(MixxxControl control); 00087 MixxxControl getOutputMixxxControl(int index); 00088 MidiMessage getOutputMidiMessage(int index); 00089 MidiMessage getOutputMidiMessage(MixxxControl control); 00090 void setOutputMidiMapping(MixxxControl control, MidiMessage command); 00091 void clearOutputMidiMapping(int index); 00092 void clearOutputMidiMapping(MixxxControl control); 00093 void clearOutputMidiMapping(int index, int count); 00094 #ifdef __MIDISCRIPT__ 00095 void initializeScripts(); 00096 void startupScriptEngine(); 00097 void shutdownScriptEngine(); 00098 void restartScriptEngine(); 00099 MidiScriptEngine *getMidiScriptEngine() { return m_pScriptEngine; }; 00100 #endif 00101 00102 public slots: 00103 void finishMidiLearn(MidiMessage message); 00104 void beginMidiLearn(MixxxControl control); 00105 void cancelMidiLearn(); 00106 void slotScriptEngineReady(); 00109 void reset(); 00110 00111 signals: 00112 void inputMappingChanged(); 00113 void inputMappingChanged(int startIndex, int endIndex); 00114 void outputMappingChanged(); 00115 void outputMappingChanged(int startIndex, int endIndex); 00116 void midiLearningStarted(); 00117 void midiLearningFinished(MidiMessage); 00118 void midiLearningFinished(); 00119 void callMidiScriptFunction(QString); 00120 void callMidiScriptFunction(QString, QString); 00121 void loadMidiScriptFiles(QList<QString>); 00122 void initMidiScripts(QList<QString>); 00123 void shutdownMidiScriptEngine(QList<QString>); 00124 00125 private: 00126 int internalNumInputMidiMessages(); 00127 bool internalIsInputIndexValid(int index); 00128 void internalSetInputMidiMapping(MidiMessage command, 00129 MixxxControl control, 00130 bool shouldEmit); 00131 int internalNumOutputMidiMessages(); 00132 int internalNumOutputMixxxControls(); 00133 bool internalIsOutputIndexValid(int index); 00134 void internalSetOutputMidiMapping(MixxxControl control, 00135 MidiMessage command, 00136 bool shouldEmit); 00137 void clearPreset(); 00138 QDomDocument buildDomElement(); 00139 void addControl(QDomElement& control, QString device); 00140 void addOutput(QDomElement& output, QString device); 00141 void addMidiScriptInfo(QDomElement &scriptFile, QString device); //Sucks 00142 00143 bool addInputControl(MidiStatusByte midiStatus, int midiNo, int midiChannel, 00144 QString controlObjectGroup, QString controlObjectKey, 00145 QString controlObjectDescription, MidiOption midiOption); 00146 bool addInputControl(MidiMessage message, MixxxControl control); 00147 void removeInputMapping(MidiStatusByte midiStatus, int midiNo, int midiChannel); 00148 00149 #ifdef __MIDISCRIPT__ 00150 00151 void addScriptFile(QString filename, QString functionprefix); 00153 void loadScriptCode(); 00154 00155 QList<QString> m_scriptFileNames; 00156 QList<QString> m_scriptFunctionPrefixes; 00157 MidiScriptEngine *m_pScriptEngine; 00158 00159 QMutex m_scriptEngineInitializedMutex; 00160 QWaitCondition m_scriptEngineInitializedCondition; 00161 #endif 00162 QMutex m_mappingLock; 00163 QDomElement m_Bindings; 00164 MidiInputMapping m_inputMapping; 00165 MidiOutputMapping m_outputMapping; 00166 MidiInputMappingTableModel* m_pMidiInputMappingTableModel; 00167 MidiOutputMappingTableModel* m_pMidiOutputMappingTableModel; 00168 MixxxControl m_controlToLearn; 00169 QString m_deviceName; 00170 MidiDevice* m_pOutputMidiDevice; 00173 }; 00174 00175 #endif