Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/midi/midimapping.h

Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines