Mercurial > hg > touchkeys
diff Source/Mappings/MultiFingerTrigger/TouchkeyMultiFingerTriggerMappingFactory.cpp @ 42:1526d2fbe01e
Updates to multi-finger trigger mapping, and a fix for control-change retransmission on loading presets.
author | Andrew McPherson <andrewm@eecs.qmul.ac.uk> |
---|---|
date | Thu, 21 Aug 2014 17:02:39 +0100 |
parents | 0deac2806a7b |
children | 90ce403d0dc5 |
line wrap: on
line diff
--- a/Source/Mappings/MultiFingerTrigger/TouchkeyMultiFingerTriggerMappingFactory.cpp Sat Jun 21 23:32:33 2014 +0100 +++ b/Source/Mappings/MultiFingerTrigger/TouchkeyMultiFingerTriggerMappingFactory.cpp Thu Aug 21 17:02:39 2014 +0100 @@ -23,6 +23,89 @@ */ #include "TouchkeyMultiFingerTriggerMappingFactory.h" +#include "TouchkeyMultiFingerTriggerMappingShortEditor.h" + +TouchkeyMultiFingerTriggerMappingFactory::TouchkeyMultiFingerTriggerMappingFactory(PianoKeyboard &keyboard, MidiKeyboardSegment& segment) +: TouchkeyBaseMappingFactory<TouchkeyMultiFingerTriggerMapping>(keyboard, segment), +numTouchesForTrigger_(TouchkeyMultiFingerTriggerMapping::kDefaultNumTouchesForTrigger), +numFramesForTrigger_(TouchkeyMultiFingerTriggerMapping::kDefaultNumFramesForTrigger), +numConsecutiveTapsForTrigger_(TouchkeyMultiFingerTriggerMapping::kDefaultNumConsecutiveTapsForTrigger), +maxTapSpacing_(TouchkeyMultiFingerTriggerMapping::kDefaultMaxTapSpacing), +needsMidiNoteOn_(true), +triggerOnAction_(TouchkeyMultiFingerTriggerMapping::kDefaultTriggerOnAction), +triggerOffAction_(TouchkeyMultiFingerTriggerMapping::kDefaultTriggerOffAction), +triggerOnNoteNum_(TouchkeyMultiFingerTriggerMapping::kDefaultTriggerOnNoteNum), +triggerOffNoteNum_(TouchkeyMultiFingerTriggerMapping::kDefaultTriggerOffNoteNum), +triggerOnNoteVel_(TouchkeyMultiFingerTriggerMapping::kDefaultTriggerOnNoteVel), +triggerOffNoteVel_(TouchkeyMultiFingerTriggerMapping::kDefaultTriggerOffNoteVel) +{ + +} + +void TouchkeyMultiFingerTriggerMappingFactory::setTouchesForTrigger(int touches) { + if(touches < 1) + touches = 1; + if(touches > 3) + touches = 3; + numTouchesForTrigger_ = touches; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setFramesForTrigger(int frames) { + if(frames < 1) + frames = 1; + numFramesForTrigger_ = frames; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setConsecutiveTapsForTrigger(int taps) { + if(taps < 1) + taps = 1; + numConsecutiveTapsForTrigger_ = taps; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setMaxTimeBetweenTapsForTrigger(timestamp_diff_type timeDiff) { + if(timeDiff < 0) + timeDiff = 0; + maxTapSpacing_ = timeDiff; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setNeedsMidiNoteOn(bool needsMidi) { + needsMidiNoteOn_ = needsMidi; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setTriggerOnAction(int action) { + if(action > 0 && action < TouchkeyMultiFingerTriggerMapping::kActionMax) + triggerOnAction_ = action; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setTriggerOffAction(int action) { + if(action > 0 && action < TouchkeyMultiFingerTriggerMapping::kActionMax) + triggerOffAction_ = action; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setTriggerOnNoteNumber(int note) { + triggerOnNoteNum_ = note; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setTriggerOffNoteNumber(int note) { + triggerOffNoteNum_ = note; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setTriggerOnNoteVelocity(int velocity) { + if(velocity > 127) + velocity = 127; + triggerOnNoteVel_ = velocity; +} + +void TouchkeyMultiFingerTriggerMappingFactory::setTriggerOffNoteVelocity(int velocity) { + if(velocity > 127) + velocity = 127; + triggerOffNoteVel_ = velocity; +} + +// ***** GUI Support ***** +MappingEditorComponent* TouchkeyMultiFingerTriggerMappingFactory::createBasicEditor() { + return new TouchkeyMultiFingerTriggerMappingShortEditor(*this); +} // ****** Preset Save/Load ****** XmlElement* TouchkeyMultiFingerTriggerMappingFactory::getPreset() { @@ -30,7 +113,17 @@ storeCommonProperties(properties); - // No properties for now + properties.setValue("numTouchesForTrigger", numTouchesForTrigger_); + properties.setValue("numFramesForTrigger", numFramesForTrigger_); + properties.setValue("numConsecutiveTapsForTrigger", numConsecutiveTapsForTrigger_); + properties.setValue("maxTapSpacing", maxTapSpacing_); + properties.setValue("needsMidiNoteOn", needsMidiNoteOn_); + properties.setValue("triggerOnAction", triggerOnAction_); + properties.setValue("triggerOffAction", triggerOffAction_); + properties.setValue("triggerOnNoteNum", triggerOnNoteNum_); + properties.setValue("triggerOffNoteNum", triggerOffNoteNum_); + properties.setValue("triggerOnNoteVel", triggerOnNoteVel_); + properties.setValue("triggerOffNoteVel", triggerOffNoteVel_); XmlElement* preset = properties.createXml("MappingFactory"); preset->setAttribute("type", "MultiFingerTrigger"); @@ -48,7 +141,46 @@ if(!loadCommonProperties(properties)) return false; - // Nothing specific to do for now + // Load specific properties + if(properties.containsKey("numTouchesForTrigger")) + numTouchesForTrigger_ = properties.getIntValue("numTouchesForTrigger"); + if(properties.containsKey("numFramesForTrigger")) + numFramesForTrigger_ = properties.getIntValue("numFramesForTrigger"); + if(properties.containsKey("numConsecutiveTapsForTrigger")) + numConsecutiveTapsForTrigger_ = properties.getIntValue("numConsecutiveTapsForTrigger"); + if(properties.containsKey("maxTapSpacing")) + maxTapSpacing_ = properties.getDoubleValue("maxTapSpacing"); + if(properties.containsKey("needsMidiNoteOn")) + needsMidiNoteOn_ = properties.getBoolValue("needsMidiNoteOn"); + if(properties.containsKey("triggerOnAction")) + triggerOnAction_ = properties.getBoolValue("triggerOnAction"); + if(properties.containsKey("triggerOffAction")) + triggerOffAction_ = properties.getBoolValue("triggerOffAction"); + if(properties.containsKey("triggerOnNoteNum")) + triggerOnNoteNum_ = properties.getBoolValue("triggerOnNoteNum"); + if(properties.containsKey("triggerOffNoteNum")) + triggerOffNoteNum_ = properties.getBoolValue("triggerOffNoteNum"); + if(properties.containsKey("triggerOnNoteVel")) + triggerOnNoteVel_ = properties.getBoolValue("triggerOnNoteVel"); + if(properties.containsKey("triggerOffNoteVel")) + triggerOffNoteVel_ = properties.getBoolValue("triggerOffNoteVel"); return true; } + +// ***** Private Methods ***** + +// Set the initial parameters for a new mapping +void TouchkeyMultiFingerTriggerMappingFactory::initializeMappingParameters(int noteNumber, TouchkeyMultiFingerTriggerMapping *mapping) { + mapping->setTouchesForTrigger(numTouchesForTrigger_); + mapping->setFramesForTrigger(numFramesForTrigger_); + mapping->setConsecutiveTapsForTrigger(numConsecutiveTapsForTrigger_); + mapping->setMaxTimeBetweenTapsForTrigger(maxTapSpacing_); + mapping->setNeedsMidiNoteOn(needsMidiNoteOn_); + mapping->setTriggerOnAction(triggerOnAction_); + mapping->setTriggerOffAction(triggerOffAction_); + mapping->setTriggerOnNoteNumber(triggerOnNoteNum_); + mapping->setTriggerOffNoteNumber(triggerOffNoteNum_); + mapping->setTriggerOnNoteVelocity(triggerOnNoteVel_); + mapping->setTriggerOffNoteVelocity(triggerOffNoteVel_); +}