Mercurial > hg > touchkeys
diff Source/Mappings/Control/TouchkeyControlMappingFactory.cpp @ 0:3580ffe87dc8
First commit of TouchKeys public pre-release.
author | Andrew McPherson <andrewm@eecs.qmul.ac.uk> |
---|---|
date | Mon, 11 Nov 2013 18:19:35 +0000 |
parents | |
children | e8965409903e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Mappings/Control/TouchkeyControlMappingFactory.cpp Mon Nov 11 18:19:35 2013 +0000 @@ -0,0 +1,235 @@ +/* + TouchKeys: multi-touch musical keyboard control software + Copyright (c) 2013 Andrew McPherson + + 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 3 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, see <http://www.gnu.org/licenses/>. + + ===================================================================== + + TouchkeyControlMappingFactory.cpp: factory for the TouchKeys control + mapping, which converts an arbitrary touch parameter into a MIDI or + OSC control message. +*/ + +#include "TouchkeyControlMappingFactory.h" +#include "TouchkeyControlMappingShortEditor.h" + +const int TouchkeyControlMappingFactory::kDefaultController = 1; +const float TouchkeyControlMappingFactory::kDefaultOutputRangeMin = 0.0; +const float TouchkeyControlMappingFactory::kDefaultOutputRangeMax = 127.0; +const float TouchkeyControlMappingFactory::kDefaultOutputDefault = 0.0; + +TouchkeyControlMappingFactory::TouchkeyControlMappingFactory(PianoKeyboard &keyboard, MidiKeyboardSegment& segment) : +TouchkeyBaseMappingFactory<TouchkeyControlMapping>(keyboard, segment), +inputParameter_(TouchkeyControlMapping::kInputParameterYPosition), +inputType_(TouchkeyControlMapping::kTypeAbsolute), +outputRangeMin_(kDefaultOutputRangeMin), outputRangeMax_(kDefaultOutputRangeMax), +outputDefault_(kDefaultOutputDefault), threshold_(0.0), +ignoresTwoFingers_(TouchkeyControlMapping::kDefaultIgnoresTwoFingers), +ignoresThreeFingers_(TouchkeyControlMapping::kDefaultIgnoresThreeFingers), +direction_(TouchkeyControlMapping::kDefaultDirection) +{ + setController(kDefaultController); +} + +// ***** Destructor ***** + +TouchkeyControlMappingFactory::~TouchkeyControlMappingFactory() { + +} + +// ***** Accessors / Modifiers ***** + +void TouchkeyControlMappingFactory::setInputParameter(int inputParameter) { + inputParameter_ = inputParameter; +} + +void TouchkeyControlMappingFactory::setInputType(int inputType) { + inputType_ = inputType; +} + +void TouchkeyControlMappingFactory::setController(int controller) { + // Before changing the controller, check if we were going to or from the pitch wheel. + // If so, we should scale the value to or from a 14-bit value + if(midiControllerNumber_ == MidiKeyboardSegment::kControlPitchWheel && + controller != MidiKeyboardSegment::kControlPitchWheel) { + outputRangeMax_ = outputRangeMax_ / 128.0; + if(outputRangeMax_ > 127.0) + outputRangeMax_ = 127.0; + outputRangeMin_ = outputRangeMin_ / 128.0; + if(outputRangeMin_ > 127.0) + outputRangeMin_ = 127.0; + outputDefault_ = outputDefault_ / 128.0; + if(outputDefault_ > 127.0) + outputDefault_ = 127.0; + } + else if(midiControllerNumber_ != MidiKeyboardSegment::kControlPitchWheel && + controller == MidiKeyboardSegment::kControlPitchWheel) { + if(outputRangeMax_ == 127.0) + outputRangeMax_ = 16383.0; + else + outputRangeMax_ = outputRangeMax_ * 128.0; + if(outputRangeMin_ == 127.0) + outputRangeMin_ = 16383.0; + else + outputRangeMin_ = outputRangeMin_ * 128.0; + if(outputDefault_ == 127.0) + outputDefault_ = 16383.0; + else + outputDefault_ = outputDefault_ * 128.0; + } + + setMidiParameters(controller, inputRangeMin_, inputRangeMax_, inputRangeCenter_, + outputDefault_, outputRangeMin_, outputRangeMax_); + + // Listen to incoming controls from the keyboard too, if this is enabled + // in MidiKeyboardSegment + if(midiConverter_ != 0) { + midiConverter_->listenToIncomingControl(midiControllerNumber_); + } +} + +/*void TouchkeyControlMappingFactory::setRange(float inputMin, float inputMax, float inputCenter, float outputMin, float outputMax, float outputDefault) { + // All possible input parameters are in the range [-1, 1], + // and actually in the range [0, 1] if absolute values are used + // (though we don't check this here) + if(inputMin < -1.0) + inputRangeMin_ = -1.0; + else if(inputMin > 1.0) + inputRangeMin_ = 1.0; + else + inputRangeMin_ = inputMin; + if(inputMax < -1.0) + inputRangeMax_ = -1.0; + else if(inputMax > 1.0) + inputRangeMax_ = 1.0; + else + inputRangeMax_ = inputMax; + if(inputCenter < -1.0) + inputRangeCenter_ = -1.0; + else if(inputCenter > 1.0) + inputRangeCenter_ = 1.0; + else + inputRangeCenter_ = inputCenter; + outputRangeMin_ = outputMin; + outputRangeMax_ = outputMax; + outputDefault_ = outputDefault; + + // Update control + if(midiConverter_ == 0) + return; + midiConverter_->removeAllControls(); + midiConverter_->addControl(controlName_.c_str(), 1, inputRangeMin_, inputRangeMax_, inputRangeCenter_, OscMidiConverter::kOutOfRangeClip); +}*/ + +void TouchkeyControlMappingFactory::setRangeInputMin(float inputMin) { + if(inputMin < -1.0) + inputRangeMin_ = -1.0; + else if(inputMin > 1.0) + inputRangeMin_ = 1.0; + else + inputRangeMin_ = inputMin; + + // Update control + //if(midiConverter_ == 0) + // return; + //midiConverter_->setControlMinValue(controlName_.c_str(), inputRangeMin_); + setMidiParameters(midiControllerNumber_, inputRangeMin_, inputRangeMax_, inputRangeCenter_, + outputDefault_, outputRangeMin_, outputRangeMax_); +} + +void TouchkeyControlMappingFactory::setRangeInputMax(float inputMax) { + if(inputMax < -1.0) + inputRangeMax_ = -1.0; + else if(inputMax > 1.0) + inputRangeMax_ = 1.0; + else + inputRangeMax_ = inputMax; + + // Update control + //if(midiConverter_ == 0) + // return; + //midiConverter_->setControlMaxValue(controlName_.c_str(), inputRangeMax_); + setMidiParameters(midiControllerNumber_, inputRangeMin_, inputRangeMax_, inputRangeCenter_, + outputDefault_, outputRangeMin_, outputRangeMax_); +} + +void TouchkeyControlMappingFactory::setRangeInputCenter(float inputCenter) { + if(inputCenter < -1.0) + inputRangeCenter_ = -1.0; + else if(inputCenter > 1.0) + inputRangeCenter_ = 1.0; + else + inputRangeCenter_ = inputCenter; + + // Update control + //if(midiConverter_ == 0) + // return; + //midiConverter_->setControlCenterValue(controlName_.c_str(), inputRangeCenter_); + setMidiParameters(midiControllerNumber_, inputRangeMin_, inputRangeMax_, inputRangeCenter_, + outputDefault_, outputRangeMin_, outputRangeMax_); +} + +void TouchkeyControlMappingFactory::setRangeOutputMin(float outputMin) { + outputRangeMin_ = outputMin; + + setMidiParameters(midiControllerNumber_, inputRangeMin_, inputRangeMax_, inputRangeCenter_, + outputDefault_, outputRangeMin_, outputRangeMax_); +} + +void TouchkeyControlMappingFactory::setRangeOutputMax(float outputMax) { + outputRangeMax_ = outputMax; + + setMidiParameters(midiControllerNumber_, inputRangeMin_, inputRangeMax_, inputRangeCenter_, + outputDefault_, outputRangeMin_, outputRangeMax_); +} + +void TouchkeyControlMappingFactory::setRangeOutputDefault(float outputDefault) { + outputDefault_ = outputDefault; + + setMidiParameters(midiControllerNumber_, inputRangeMin_, inputRangeMax_, inputRangeCenter_, + outputDefault_, outputRangeMin_, outputRangeMax_); +} + +void TouchkeyControlMappingFactory::setThreshold(float threshold) { + threshold_ = threshold; +} + +void TouchkeyControlMappingFactory::setIgnoresTwoFingers(bool ignoresTwo) { + ignoresTwoFingers_ = ignoresTwo; +} + +void TouchkeyControlMappingFactory::setIgnoresThreeFingers(bool ignoresThree) { + ignoresThreeFingers_ = ignoresThree; +} + +void TouchkeyControlMappingFactory::setDirection(int direction) { + direction_ = direction; +} + +// ***** GUI Support ***** +MappingEditorComponent* TouchkeyControlMappingFactory::createBasicEditor() { + return new TouchkeyControlMappingShortEditor(*this); +} + +// ***** Private Methods ***** + +void TouchkeyControlMappingFactory::initializeMappingParameters(int noteNumber, TouchkeyControlMapping *mapping) { + // Set parameters + mapping->setInputParameter(inputParameter_, inputType_); + mapping->setRange(inputRangeMin_, inputRangeMax_, outputRangeMin_, outputRangeMax_, outputDefault_); + mapping->setThreshold(threshold_); + mapping->setIgnoresMultipleFingers(ignoresTwoFingers_, ignoresThreeFingers_); + mapping->setDirection(direction_); +}