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_);
+}