Mercurial > hg > touchkeys
diff Source/Mappings/KeyDivision/TouchkeyKeyDivisionMappingFactory.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 | 353276611036 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Mappings/KeyDivision/TouchkeyKeyDivisionMappingFactory.cpp Mon Nov 11 18:19:35 2013 +0000 @@ -0,0 +1,176 @@ +/* + 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/>. + + ===================================================================== + + TouchkeyKeyDivisionMappingFactory.cpp: factory for the split-key mapping + which triggers different actions or pitches depending on where the key + was struck. +*/ + +#include "TouchkeyKeyDivisionMappingFactory.h" + +const float TouchkeyKeyDivisionMappingFactory::kDefaultPitchWheelRangeSemitones = 2.0; + +// Yarman-24 Turkish microtonal tuning: +/* 1/1 RAST C + 84.360 Nim Zengule C#/Db + 145.112 Zengule Cᵻ/Dƀ + 192.180 Dik Zengule Dd + 9/8 DUGAH D + 292.180 Kurdi D#/Eb + 60/49 Dik Kurdi Dᵻ/Eƀ + 364.735 Nerm Segah Ed + 5/4 SEGAH E + 415.677 Buselik E‡ + 4/3 CHARGAH F + 584.359 Nim Hijaz F#/Gb + 635.300 Hijaz/Saba Fᵻ/Gƀ + 696.090 Dik Hijaz/Saba Gd + 3/2 NEVA G + 788.270 Nim Hisar G#/Ab + 854.924 Hisar Gᵻ/Aƀ + 888.270 Dik Hisar Ad + 27/16 HUSEYNI A 440hz + 16/9 Ajem A#/Bb + 11/6 Dik Ajem Aᵻ/Bƀ + 1074.547 Nerm Evdj Bd + 15/8 EVDJ B + 1125.488 Mahur B‡ + 2/1 GERDANIYE C */ +/*const float TouchkeyKeyDivisionMappingFactory::kDefaultTuningsCents[24] = { + 0, 84.36, 145.112, 192.18, 203.9, 292.18, 350.62, 364.74, 386.31, 415.677, 498.04, 584.359, + 635.3, 696.09, 701.95, 788.27, 854.92, 888.27, 905.87, 996.1, 1049.36, 1074.55, 1088.27, 1125.488 +};*/ + +// Yarman-24c Turkish microtonal tuning: +/* 0: 1/1 C Dbb unison, perfect prime RAST ♥ + 1: 83.059 cents C# Db nim zengule + 2: 143.623 cents zengule + 3: 191.771 cents C## Dd dik zengule + 4: 9/8 D Ebb major whole tone DÜGAH ♥ + 5: 292.413 cents D# Eb kürdi + 6: 348.343 cents D#| Eb- dik kürdi + 7: 362.503 cents nerm segah + 8: 156/125 cents E SEGAH ♥ + 9: 415.305 cents E| Buselik + 10: 4/3 F Gbb perfect fourth ÇARGAH ♥ + 11: 581.382 cents F# Gb nim hicaz + 12: 634.184 cents hicaz + 13: 695.885 cents F## Gd dik hicaz + 14: 3/2 G Abb perfect fifth NEVA ♥ + 15: 788.736 cents G# Ab nim hisar + 16: 853.063 cents hisar + 17: 887.656 cents G## Ad dik hisar + 18: 27/16 A Bbb Pyth. major sixth HÜSEYNİ ♥ + 19: 16/9 A# Bb Pyth. minor seventh acem + 20: 1043.623 cents A#| Bb- dik acem + 21: 1071.942 cents nerm eviç + 22: 234/125 cents B EVİÇ ♥ + 23: 1124.744 cents B| mahur + 24: 2/1 C Dbb octave GERDANİYE ♥ +*/ + +/*const float TouchkeyKeyDivisionMappingFactory::kDefaultTuningsCents[24] = { + 0, 83.059, 143.623, 191.771, 203.9, 292.413, 348.343, 362.503, 383.54, 415.305, 498.04, 581.382, + 634.184, 695.885, 701.95, 788.736, 853.063, 887.656, 905.87, 996.1, 1043.623, 1071.942, 1085.49, 1124.744 +};*/ + +/* Yarman-24c as above but arranged for performance */ +const float TouchkeyKeyDivisionMappingFactory::kDefaultTuningsCents[24] = { + 0, (1124.744 - 1200.0), 83.059, 143.623, 203.9, 191.771, 292.413, 348.343, + 383.54, 362.503, 498.04, 415.305, 581.382, 634.184, 695.885, 648.682, + 788.736, 853.063, 905.87, 887.656, 996.1, 1043.623, 1085.49, 1071.942, +}; + +/*const float TouchkeyKeyDivisionMappingFactory::kDefaultTuningsCents[24] = { + 0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, + 750, 800, 850, 900, 950, 1000, 1050, 1100, 1150 +};*/ + +/*const float TouchkeyKeyDivisionMappingFactory::kDefaultTuningsCents[36] = { + 0, 33.3, 66.6, 100, 133.3, 166.6, 200, 233.3, 266.6, 300, 333.3, 366.6, + 400, 433.3, 466.6, 500, 533.3, 566.6, 600, 633.3, 666.6, 700, 733.3, 766.6, + 800, 833.3, 866.6, 900, 933.3, 966.6, 1000, 1033.3, 1066.6, 1100, 1133.3, 1166.6 +};*/ + +/* As arranged: + * + * B| Db/ Dd Eb/ Ed E| Gb/ Gd Ab/ Ad Bb/ Bd + * C C# D D# E F F# G G# A A# B + */ + +TouchkeyKeyDivisionMappingFactory::TouchkeyKeyDivisionMappingFactory(PianoKeyboard &keyboard, MidiKeyboardSegment& segment) +: TouchkeyBaseMappingFactory<TouchkeyKeyDivisionMapping>(keyboard, segment), + pitchWheelRangeSemitones_(kDefaultPitchWheelRangeSemitones), + numSegmentsPerKey_(TouchkeyKeyDivisionMapping::kDefaultNumberOfSegments), + timeout_(TouchkeyKeyDivisionMapping::kDefaultDetectionTimeout), + detectionParameter_(TouchkeyKeyDivisionMapping::kDefaultDetectionParameter), + retriggerable_(false), + retriggerNumFrames_(TouchkeyKeyDivisionMapping::kDefaultRetriggerNumFrames), + retriggerKeepsVelocity_(true), + referenceNote_(0), globalOffsetCents_(0) +{ + //setName("/touchkeys/segmentpitch"); + setBendParameters(); +} + +void TouchkeyKeyDivisionMappingFactory::setMIDIPitchWheelRange(float maxBendSemitones) { + if(maxBendSemitones <= 0) + return; + pitchWheelRangeSemitones_ = maxBendSemitones; + + setBendParameters(); +} + +void TouchkeyKeyDivisionMappingFactory::setName(const string& name) { + TouchkeyBaseMappingFactory<TouchkeyKeyDivisionMapping>::setName(name); + setBendParameters(); +} + +// Set the initial parameters for a new mapping +void TouchkeyKeyDivisionMappingFactory::initializeMappingParameters(int noteNumber, TouchkeyKeyDivisionMapping *mapping) { + // KLUDGE: testing Maqam tunings. Go from absolute tunings in cents to pitch bends in semitones + float tunings[2]; + int index = (noteNumber + 12 - referenceNote_) % 12; + float standardTuning = (float)index * 100.0; + tunings[0] = (kDefaultTuningsCents[index*2] - standardTuning + globalOffsetCents_) * .01; + tunings[1] = (kDefaultTuningsCents[index*2 + 1] - standardTuning + globalOffsetCents_) * .01; + mapping->setSegmentPitchBends(tunings, 2); + /*float tunings[3]; + int index = (noteNumber + 12 - referenceNote_) % 12; + float standardTuning = (float)index * 100.0; + tunings[0] = (kDefaultTuningsCents[index*3] - standardTuning + globalOffsetCents_) * .01; + tunings[1] = (kDefaultTuningsCents[index*3 + 1] - standardTuning + globalOffsetCents_) * .01; + tunings[2] = (kDefaultTuningsCents[index*3 + 2] - standardTuning + globalOffsetCents_) * .01; + mapping->setSegmentPitchBends(tunings, 3);*/ + + + mapping->setNumberOfSegments(numSegmentsPerKey_); + mapping->setTimeout(timeout_); + mapping->setDetectionParameter(detectionParameter_); + mapping->setRetriggerable(retriggerable_, retriggerNumFrames_, retriggerKeepsVelocity_); +} + +void TouchkeyKeyDivisionMappingFactory::setBendParameters() { + setMidiParameters(MidiKeyboardSegment::kControlPitchWheel, -pitchWheelRangeSemitones_, pitchWheelRangeSemitones_, 0.0); + + if(midiConverter_ != 0) { + midiConverter_->setMidiPitchWheelRange(pitchWheelRangeSemitones_); + midiConverter_->listenToIncomingControl(MidiKeyboardSegment::kControlPitchWheel); + } +} \ No newline at end of file