1
/***************************************************************************
5
begin : Sat Jan 17 2009
6
copyright : (C) 2009 Sean M. Pappalardo
7
(C) 2009 Albert Santoni
8
email : pegasus@c64.org
10
***************************************************************************/
12
/***************************************************************************
14
* This program is free software; you can redistribute it and/or modify *
15
* it under the terms of the GNU General Public License as published by *
16
* the Free Software Foundation; either version 2 of the License, or *
17
* (at your option) any later version. *
19
***************************************************************************/
24
#include "mididevice.h"
25
#include "midimessage.h"
26
#include "mixxxcontrol.h"
27
#include "midiinputmapping.h"
28
#include "midioutputmapping.h"
29
#include <QTableWidget>
32
#include "midiscriptengine.h"
35
//Forward declarations
36
class MidiInputMappingTableModel;
37
class MidiOutputMappingTableModel;
39
#define BINDINGS_PATH QDir::homePath().append("/").append(SETTINGS_PATH).append("midi/")
40
// local midi mapping presets
41
#define LPRESETS_PATH QDir::homePath().append("/").append(SETTINGS_PATH).append("presets/")
42
#define MIDI_MAPPING_EXTENSION ".midi.xml"
44
class MidiMapping : public QObject
49
/** Constructor also loads & applies the default XML MIDI mapping file */
50
MidiMapping(MidiDevice* outputMidiDevice=NULL);
52
void setOutputMidiDevice(MidiDevice* outputMidiDevice);
54
void setName(QString name);
56
void loadPreset(bool forceLoad=false);
57
void loadPreset(QString path, bool forceLoad=false);
58
void loadPreset(QDomElement root, bool forceLoad=false);
61
void savePreset(QString path);
65
MidiInputMappingTableModel* getMidiInputMappingTableModel();
66
MidiOutputMappingTableModel* getMidiOutputMappingTableModel();
67
//MixxxControl* getInputMixxxControl(MidiMessage command);
69
static double ComputeValue(MidiOption midioption, double _prevmidivalue, double _newmidivalue);
71
// MIDI Input Mapping Modifiers
72
int numInputMidiMessages();
73
bool isInputIndexValid(int index);
74
bool isMidiMessageMapped(MidiMessage command);
75
MidiMessage getInputMidiMessage(int index);
76
MixxxControl getInputMixxxControl(int index);
77
MixxxControl getInputMixxxControl(MidiMessage command);
78
void setInputMidiMapping(MidiMessage command, MixxxControl control);
79
void clearInputMidiMapping(int index);
80
void clearInputMidiMapping(MidiMessage command);
81
void clearInputMidiMapping(int index, int count);
83
// MIDI Output Mapping Modifiers
84
int numOutputMixxxControls();
85
bool isOutputIndexValid(int index);
86
bool isMixxxControlMapped(MixxxControl control);
87
MixxxControl getOutputMixxxControl(int index);
88
MidiMessage getOutputMidiMessage(int index);
89
MidiMessage getOutputMidiMessage(MixxxControl control);
90
void setOutputMidiMapping(MixxxControl control, MidiMessage command);
91
void clearOutputMidiMapping(int index);
92
void clearOutputMidiMapping(MixxxControl control);
93
void clearOutputMidiMapping(int index, int count);
95
void initializeScripts();
96
void startupScriptEngine();
97
void shutdownScriptEngine();
98
void restartScriptEngine();
99
MidiScriptEngine *getMidiScriptEngine() { return m_pScriptEngine; };
103
void finishMidiLearn(MidiMessage message);
104
void beginMidiLearn(MixxxControl control);
105
void cancelMidiLearn();
106
void slotScriptEngineReady();
107
/** Restarts the script engine and re-applies the mapping
108
to effectively reset the controller */
112
void inputMappingChanged();
113
void inputMappingChanged(int startIndex, int endIndex);
114
void outputMappingChanged();
115
void outputMappingChanged(int startIndex, int endIndex);
116
void midiLearningStarted();
117
void midiLearningFinished(MidiMessage);
118
void midiLearningFinished();
119
void callMidiScriptFunction(QString);
120
void callMidiScriptFunction(QString, QString);
121
void loadMidiScriptFiles(QList<QString>);
122
void initMidiScripts(QList<QString>);
123
void shutdownMidiScriptEngine(QList<QString>);
126
int internalNumInputMidiMessages();
127
bool internalIsInputIndexValid(int index);
128
void internalSetInputMidiMapping(MidiMessage command,
129
MixxxControl control,
131
int internalNumOutputMidiMessages();
132
int internalNumOutputMixxxControls();
133
bool internalIsOutputIndexValid(int index);
134
void internalSetOutputMidiMapping(MixxxControl control,
138
QDomDocument buildDomElement();
139
void addControl(QDomElement& control, QString device);
140
void addOutput(QDomElement& output, QString device);
141
void addMidiScriptInfo(QDomElement &scriptFile, QString device); //Sucks
143
bool addInputControl(MidiStatusByte midiStatus, int midiNo, int midiChannel,
144
QString controlObjectGroup, QString controlObjectKey,
145
QString controlObjectDescription, MidiOption midiOption);
146
bool addInputControl(MidiMessage message, MixxxControl control);
147
void removeInputMapping(MidiStatusByte midiStatus, int midiNo, int midiChannel);
149
#ifdef __MIDISCRIPT__
150
/** Adds a script file name and function prefix to the list to be loaded */
151
void addScriptFile(QString filename, QString functionprefix);
152
/** Actually loads script code from the files in the list */
153
void loadScriptCode();
155
QList<QString> m_scriptFileNames;
156
QList<QString> m_scriptFunctionPrefixes;
157
MidiScriptEngine *m_pScriptEngine;
159
QMutex m_scriptEngineInitializedMutex;
160
QWaitCondition m_scriptEngineInitializedCondition;
162
QMutex m_mappingLock;
163
QDomElement m_Bindings;
164
MidiInputMapping m_inputMapping;
165
MidiOutputMapping m_outputMapping;
166
MidiInputMappingTableModel* m_pMidiInputMappingTableModel;
167
MidiOutputMappingTableModel* m_pMidiOutputMappingTableModel;
168
MixxxControl m_controlToLearn;
169
QString m_deviceName; /** Name of the device to look for in the <controller> XML nodes... */
170
MidiDevice* m_pOutputMidiDevice; /** We need a pointer back to an _output_ MIDI device so our
171
LED handlers know where to fire MIDI messages. Note that
172
this can be NULL if there is no output MIDI device! */