Created
June 11, 2015 03:27
-
-
Save pateketrueke/36416022019783f05ba0 to your computer and use it in GitHub Desktop.
Custom build for ReLoop KeyPad on BitWig
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global loadAPI, sendSysex, host */ | |
| loadAPI(1); | |
| var RL; | |
| var KeyPad = require('./keypad'); | |
| var exports = new Function('return this')(); | |
| var defaultActions = require('./default/actions'), | |
| defaultMappings = require('./default/mappings'); | |
| exports.DEBUG = false; | |
| exports.init = function() { | |
| sendSysex(KeyPad.ID3); | |
| var keys = host.getMidiInPort(0).createNoteInput('Keys', '?0????', '?1????', '?2????'), | |
| pads = host.getMidiInPort(0).createNoteInput('Pads', '?4????'); | |
| keys.setShouldConsumeEvents(false); | |
| pads.setShouldConsumeEvents(false); | |
| RL = new KeyPad() | |
| .initialize() | |
| .add(defaultActions) | |
| .set(defaultMappings); | |
| }; | |
| exports.exit = function() { | |
| RL.teardown(); | |
| }; | |
| host.defineMidiPorts(1, 1); | |
| host.defineController(KeyPad.VENDOR, KeyPad.PRODUCT, KeyPad.VERSION, KeyPad.GUID); | |
| host.addDeviceNameBasedDiscoveryPair([KeyPad.ID1], [KeyPad.ID1]); | |
| host.addDeviceNameBasedDiscoveryPair([KeyPad.ID2], [KeyPad.ID2]); | |
| host.defineSysexIdentityReply(KeyPad.ID4); | |
| },{"./default/actions":2,"./default/mappings":3,"./keypad":8}],2:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global sendMidi */ | |
| module.exports = { | |
| scenePlay: function(e) { | |
| this.trackBank.launchScene(e.scene); | |
| this.set('currentScene', e); | |
| this.all.forEach(function(cc) { | |
| sendMidi(cc.channel, cc.index, cc.scene === e.scene ? 127 : 0); | |
| }); | |
| e.notify = 'Scene ' + (e.scene + 1); | |
| }, | |
| setDevice: function(e) { | |
| this.cursorDevice[e.range > 0 ? 'selectNext' : 'selectPrevious'](); | |
| e.notify = this.get('primaryDevice'); | |
| }, | |
| setTrack: function(e) { | |
| var track = this.get('activeTrack'), | |
| total = this.get('currentTracks.length') - 1; | |
| if (e.range > 0) { | |
| track += 1; | |
| } else { | |
| track -= 1; | |
| } | |
| var index = Math.min(total, Math.max(0, track)); | |
| this.trackBank.getTrack(index).select(); | |
| e.notify = this.get('currentTracks', index); | |
| }, | |
| sendLevel: function(e) { | |
| this.trackBank.getTrack(e.track).getSend(e.send).set(e.value, 128); | |
| e.notify = e.value ? Math.round(e.value / 1.27) + '%' : 'OFF'; | |
| }, | |
| volumeLevel: function(e) { | |
| this.trackBank.getTrack(e.track).getVolume().set(e.value, 128); | |
| }, | |
| toggleMute: function(e) { | |
| this.trackBank.getTrack(e.track).getMute().set(e.toggle); | |
| }, | |
| toggleSolo: function(e) { | |
| if (e.toggle) { | |
| this.trackBank.getTrack(e.track).getSolo().toggle(); | |
| } | |
| }, | |
| toggleArm: function(e) { | |
| if (e.toggle) { | |
| this.trackBank.getTrack(e.track).getArm().toggle(); | |
| } | |
| }, | |
| onStop: function() { | |
| var cc = this.get('currentScene'); | |
| if (cc) { | |
| sendMidi(cc.channel, cc.index, 0); | |
| } | |
| } | |
| }; | |
| },{}],3:[function(require,module,exports){ | |
| 'use strict'; | |
| var PAGE_1 = [ | |
| [ | |
| { channel: 177, index: 57, type: 'encoder', command: 'setTrack' }, | |
| { channel: 177, index: 89, type: 'knob' }, | |
| { channel: 177, index: 97, type: 'knob' }, | |
| { channel: 177, index: 8, type: 'button', inverted: true, command: 'toggleMute', track: 0, shift: { channel: 177, index: 16, grouped: true, command: 'scenePlay', scene: 0 } }, | |
| { channel: 177, index: 24, type: 'button', command: 'toggleSolo', track: 0 }, | |
| { channel: 177, index: 40, type: 'button', command: 'toggleArm', track: 0 }, | |
| { channel: 177, index: 0, type: 'fader' } | |
| ], | |
| [ | |
| { channel: 177, index: 58, type: 'encoder', command: 'setDevice' }, | |
| { channel: 177, index: 90, type: 'knob' }, | |
| { channel: 177, index: 98, type: 'knob' }, | |
| { channel: 177, index: 9, type: 'button', inverted: true, command: 'toggleMute', track: 1, shift: { channel: 177, index: 17, grouped: true, command: 'scenePlay', scene: 1 } }, | |
| { channel: 177, index: 25, type: 'button', command: 'toggleSolo', track: 1 }, | |
| { channel: 177, index: 41, type: 'button', command: 'toggleArm', track: 1 }, | |
| { channel: 177, index: 1, type: 'fader' } | |
| ], | |
| [ | |
| { channel: 177, index: 59, type: 'encoder' }, | |
| { channel: 177, index: 91, type: 'knob' }, | |
| { channel: 177, index: 99, type: 'knob' }, | |
| { channel: 177, index: 10, type: 'button', inverted: true, command: 'toggleMute', track: 2, shift: { channel: 177, index: 18, grouped: true, command: 'scenePlay', scene: 2 } }, | |
| { channel: 177, index: 26, type: 'button', command: 'toggleSolo', track: 2 }, | |
| { channel: 177, index: 42, type: 'button', command: 'toggleArm', track: 2 }, | |
| { channel: 177, index: 2, type: 'fader' } | |
| ], | |
| [ | |
| { channel: 177, index: 60, type: 'encoder' }, | |
| { channel: 177, index: 92, type: 'knob' }, | |
| { channel: 177, index: 100, type: 'knob' }, | |
| { channel: 177, index: 11, type: 'button', inverted: true, command: 'toggleMute', track: 3, shift: { channel: 177, index: 19, grouped: true, command: 'scenePlay', scene: 3 } }, | |
| { channel: 177, index: 27, type: 'button', command: 'toggleSolo', track: 3 }, | |
| { channel: 177, index: 43, type: 'button', command: 'toggleArm', track: 3 }, | |
| { channel: 177, index: 3, type: 'fader' } | |
| ], | |
| [ | |
| { channel: 177, index: 61, type: 'encoder' }, | |
| { channel: 177, index: 93, type: 'knob' }, | |
| { channel: 177, index: 101, type: 'knob' }, | |
| { channel: 177, index: 12, type: 'button', inverted: true, command: 'toggleMute', track: 4, shift: { channel: 177, index: 20, grouped: true, command: 'scenePlay', scene: 4 } }, | |
| { channel: 177, index: 28, type: 'button', command: 'toggleSolo', track: 4 }, | |
| { channel: 177, index: 44, type: 'button', command: 'toggleArm', track: 4 }, | |
| { channel: 177, index: 4, type: 'fader' } | |
| ], | |
| [ | |
| { channel: 177, index: 62, type: 'encoder' }, | |
| { channel: 177, index: 94, type: 'knob' }, | |
| { channel: 177, index: 102, type: 'knob' }, | |
| { channel: 177, index: 13, type: 'button', inverted: true, command: 'toggleMute', track: 5, shift: { channel: 177, index: 21, grouped: true, command: 'scenePlay', scene: 5 } }, | |
| { channel: 177, index: 29, type: 'button', command: 'toggleSolo', track: 5 }, | |
| { channel: 177, index: 45, type: 'button', command: 'toggleArm', track: 5 }, | |
| { channel: 177, index: 5, type: 'fader' } | |
| ], | |
| [ | |
| { channel: 177, index: 63, type: 'encoder' }, | |
| { channel: 177, index: 95, type: 'knob' }, | |
| { channel: 177, index: 103, type: 'knob' }, | |
| { channel: 177, index: 14, type: 'button', inverted: true, command: 'toggleMute', track: 6, shift: { channel: 177, index: 22, grouped: true, command: 'scenePlay', scene: 6 } }, | |
| { channel: 177, index: 30, type: 'button', command: 'toggleSolo', track: 6 }, | |
| { channel: 177, index: 46, type: 'button', command: 'toggleArm', track: 6 }, | |
| { channel: 177, index: 6, type: 'fader' } | |
| ], | |
| [ | |
| { channel: 177, index: 64, type: 'encoder' }, | |
| { channel: 177, index: 96, type: 'knob' }, | |
| { channel: 177, index: 104, type: 'knob' }, | |
| { channel: 177, index: 15, type: 'button', inverted: true, command: 'toggleMute', track: 7, shift: { channel: 177, index: 23, grouped: true, command: 'scenePlay', scene: 7 } }, | |
| { channel: 177, index: 31, type: 'button', command: 'toggleSolo', track: 7 }, | |
| { channel: 177, index: 47, type: 'button', command: 'toggleArm', track: 7 }, | |
| { channel: 177, index: 7, type: 'fader' } | |
| ] | |
| ]; | |
| var PAGE_2 = []; | |
| module.exports = [PAGE_1, PAGE_2]; | |
| },{}],4:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global host, println, DEBUG */ | |
| function dump(obj) { | |
| if (obj === null) { | |
| return 'null'; | |
| } | |
| if (obj === true) { | |
| return 'true'; | |
| } | |
| if (obj === false) { | |
| return 'false'; | |
| } | |
| if (typeof obj === 'function') { | |
| return obj.toString().replace(/[\r\n\t\s]+/g, ' '); | |
| } | |
| if (typeof obj !== 'object') { | |
| return obj; | |
| } | |
| var out = []; | |
| for (var k in obj) { | |
| var v = dump(obj[k]); | |
| out.push(obj instanceof Array ? v : (k + ': ' + v)); | |
| } | |
| if (obj instanceof Array) { | |
| return '[ ' + out.join(', ') + ' ]'; | |
| } | |
| return '{ ' + out.join(', ') + ' }'; | |
| } | |
| module.exports.copy = function(obj) { | |
| if (obj instanceof Array) { | |
| return obj.slice(); | |
| } | |
| if (typeof obj !== 'object') { | |
| return obj; | |
| } | |
| var target = {}; | |
| for (var key in obj) { | |
| target[key] = obj[key]; | |
| } | |
| return target; | |
| }; | |
| module.exports.debug = function() { | |
| if (typeof DEBUG !== 'undefined' && DEBUG === true) { | |
| var out = []; | |
| for (var i = 0, a; typeof (a = arguments[i]) !== 'undefined'; i += 1) { | |
| out.push(dump(a)); | |
| } | |
| println('> ' + out.join(' ')); | |
| } | |
| }; | |
| module.exports.notify = function(action) { | |
| var text = ''; | |
| switch (action.type) { | |
| case 'encoder': | |
| text += action.level; | |
| break; | |
| case 'fader': | |
| case 'knob': | |
| text += (action.level ? Math.round(action.level / 1.27) + '%' : 'OFF'); | |
| break; | |
| case 'pad': | |
| if (action.toggle) { | |
| text += action.level; | |
| } else if (typeof action.toggle === 'undefined') { | |
| if (action.level === 127) { | |
| text += 'ON'; | |
| } else { | |
| text += 'OFF'; | |
| } | |
| } | |
| break; | |
| case 'play': | |
| if (action.toggle) { | |
| text += !action.state ? 'PLAY' : 'PAUSE'; | |
| } | |
| break; | |
| case 'record': | |
| case 'overdub': | |
| if (action.toggle) { | |
| text += action.type.toUpperCase() + ' ' + (!action.state ? 'ON' : 'OFF'); | |
| } | |
| break; | |
| default: | |
| switch (action.command) { | |
| case 'mute': | |
| if (action.toggle) { | |
| text += 'MUTE'; | |
| } else { | |
| text += 'UNMUTE'; | |
| } | |
| break; | |
| case 'solo': | |
| case 'arm': | |
| if (action.toggle) { | |
| text += action.command.toUpperCase() + ' ' + (!action.state ? 'ON' : 'OFF'); | |
| } | |
| break; | |
| default: | |
| if (action.toggle) { | |
| text += action.type.replace(/-/g, ' ').toUpperCase(); | |
| } | |
| break; | |
| } | |
| break; | |
| } | |
| if (text) { | |
| if (typeof action.offset === 'number') { | |
| text = 'CC' + (action.offset + 1) + ' ' + text; | |
| } | |
| host.showPopupNotification(text); | |
| } | |
| }; | |
| },{}],5:[function(require,module,exports){ | |
| 'use strict'; | |
| module.exports = function(status, data1, data2) { | |
| var on = data2 > 65; | |
| if (data1 === this.PLAY) { | |
| return { type: 'play', toggle: on, state: this.IS_PLAYING }; | |
| } if (data1 === this.PLAYS) { | |
| return { type: 'play-all', toggle: on }; | |
| } else if (data1 === this.STOP) { | |
| return { type: 'stop', toggle: on }; | |
| } else if (data1 === this.STOPS) { | |
| return { type: 'stop-all', toggle: on }; | |
| } else if (data1 === this.RECORD) { | |
| return { type: 'record', toggle: on, state: this.IS_RECORDING }; | |
| } else if (data1 === this.RECORDS) { | |
| return { type: 'overdub', toggle: on, state: this.OVERDUB }; | |
| } | |
| if (this.CC_MAPPINGS[status + '#' + data1]) { | |
| var ref = this.CC_MAPPINGS[status + '#' + data1], | |
| copy = {}; | |
| for (var k in ref) { | |
| copy[k] = ref[k]; | |
| } | |
| return copy; | |
| } | |
| }; | |
| },{}],6:[function(require,module,exports){ | |
| 'use strict'; | |
| var initActions = require('./util/init-actions'); | |
| module.exports = function(actions) { | |
| initActions(this, actions); | |
| return this; | |
| }; | |
| },{"./util/init-actions":13}],7:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global sendMidi, host */ | |
| var $ = require('../helpers'); | |
| module.exports = function(action) { | |
| if (typeof action.value === 'undefined') { | |
| action.value = [127, 0][+action.toggle] || action.level || 0; | |
| } | |
| switch (action.type) { | |
| case 'overdub': | |
| if (action.toggle) { | |
| this.host.transport.toggleOverdub(); | |
| } | |
| break; | |
| case 'record': | |
| if (action.toggle) { | |
| this.host.transport.record(); | |
| this.IS_RECORDING = !this.IS_RECORDING; | |
| } | |
| break; | |
| case 'play': | |
| if (action.toggle) { | |
| this.host.transport.play(); | |
| } | |
| break; | |
| case 'play-all': | |
| for (var i = 0; i < 8; i += 1) { | |
| this.host.trackBank.getClipLauncherScenes().launch(i); | |
| } | |
| break; | |
| case 'stop': | |
| if (action.toggle) { | |
| if (this.IS_RECORDING) { | |
| this.host.transport.record(); | |
| } | |
| this.IS_RECORDING = false; | |
| this.IS_PLAYING = false; | |
| this.host.transport.stop(); | |
| } | |
| break; | |
| case 'stop-all': | |
| this.host.trackBank.getClipLauncherScenes().stop(); | |
| break; | |
| default: | |
| if (typeof action.offset === 'number') { | |
| this.host.userControls.getControl(action.offset).set(action.value, 128); | |
| } | |
| break; | |
| } | |
| var callback = this.CC_USER_ACTIONS[action.command]; | |
| if (!callback) { | |
| var proxy = ('on-' + action.type).replace(/-[a-z]/g, function(match) { | |
| return match.substr(1).toUpperCase(); | |
| }); | |
| callback = this.CC_USER_ACTIONS[proxy]; | |
| } | |
| if (typeof callback === 'function') { | |
| var api = $.copy(this.host); | |
| if (action.grouped) { | |
| api.all = this.CC_STATE.commonMappings[action.command].map($.copy); | |
| } | |
| callback.call(api, action); | |
| if (typeof this.CC_STATE.commonValues[action.channel + '#' + action.index] !== 'undefined') { | |
| action.state = this.CC_STATE.commonValues[action.channel + '#' + action.index]; | |
| } | |
| if (!action.toggle && action.state && action.command) { | |
| sendMidi(action.channel, action.index, 127); | |
| } | |
| } | |
| if (typeof action.notify === 'string') { | |
| host.showPopupNotification(action.notify); | |
| } else if (action.notify !== false) { | |
| $.notify(action); | |
| } | |
| return this; | |
| }; | |
| },{"../helpers":4}],8:[function(require,module,exports){ | |
| 'use strict'; | |
| var KeyPad = module.exports = function() { | |
| this.PLAY = 105; | |
| this.PLAYS = 108; | |
| this.STOP = 106; | |
| this.STOPS = 109; | |
| this.RECORD = 107; | |
| this.RECORDS = 110; | |
| this.OCTAVE_DOWNS = 111; | |
| this.OCTAVE_UPS = 112; | |
| this.CHANNEL1 = 177; | |
| this.TRACKS = 16; | |
| this.OVERDUB = false; | |
| this.IS_PLAYING = false; | |
| this.IS_RECORDING = false; | |
| this.CC_STATE = {}; | |
| this.CC_TRACKS = []; | |
| this.CC_MAPPINGS = {}; | |
| this.CC_USER_STATE = {}; | |
| this.CC_USER_ACTIONS = {}; | |
| }; | |
| KeyPad.VENDOR = 'Reloop'; | |
| KeyPad.PRODUCT = 'KeyPad'; | |
| KeyPad.VERSION = '1.0'; | |
| KeyPad.ID1 = 'Reloop KeyPad'; | |
| KeyPad.ID2 = 'Reloop KeyPad MIDI 1'; | |
| KeyPad.ID3 = 'F0 AD F5 01 11 02 F7'; | |
| KeyPad.ID4 = 'F0 7E ?? 06 02 AD F5 ?? ?? F7'; | |
| KeyPad.GUID = 'BD3405A8-9C77-449F-BA6D-2E91D9873878'; | |
| KeyPad.prototype.actionFor = require('./action-for'); | |
| KeyPad.prototype.execute = require('./execute'); | |
| KeyPad.prototype.initialize = require('./initialize'); | |
| KeyPad.prototype.teardown = require('./teardown'); | |
| KeyPad.prototype.add = require('./add'); | |
| KeyPad.prototype.set = require('./set'); | |
| },{"./action-for":5,"./add":6,"./execute":7,"./initialize":9,"./set":10,"./teardown":11}],9:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global println, printSysex, host */ | |
| var $ = require('../helpers'); | |
| var makeHost = require('./util/make-host'), | |
| initTracks = require('./util/init-tracks'); | |
| module.exports = function() { | |
| println('CONNECTED'); | |
| var RL = this; | |
| makeHost(RL); | |
| initTracks(RL); | |
| host.getMidiInPort(0).setMidiCallback(function(status, data1, data2) { | |
| var action = RL.actionFor(status, data1, data2); | |
| if (!action) { | |
| $.debug('MIDI', status, data1, data2); | |
| } else { | |
| if (action.inverted) { | |
| if (typeof action.toggle === 'boolean') { | |
| action.toggle = !action.toggle; | |
| } | |
| data2 = 127 - data2; | |
| delete action.inverted; | |
| } | |
| switch (action.type) { | |
| case 'button': | |
| action.toggle = data2 > 65; | |
| break; | |
| case 'encoder': | |
| if (!RL.CC_STATE.encoderValues) { | |
| RL.CC_STATE.encoderValues = {}; | |
| } | |
| var old = RL.CC_STATE.encoderValues[action.channel + '#' + action.index] || 0; | |
| if (old !== data2) { | |
| action.range = data2 < old ? -1 : 1; | |
| } | |
| if (data2 === 0 || data2 === 127) { | |
| action.range = data2 ? 1 : -1; | |
| } | |
| RL.CC_STATE.encoderValues[action.channel + '#' + action.index] = data2; | |
| default: | |
| action.level = data2; | |
| } | |
| $.debug('CC', action); | |
| RL.execute(action); | |
| } | |
| }); | |
| host.getMidiInPort(0).setSysexCallback(function(data) { | |
| println('SYSEX'); | |
| printSysex(data); | |
| }); | |
| host.getMidiOutPort(0).setShouldSendMidiBeatClock(true); | |
| return this; | |
| }; | |
| },{"../helpers":4,"./util/init-tracks":15,"./util/make-host":16}],10:[function(require,module,exports){ | |
| 'use strict'; | |
| var $ = require('../helpers'); | |
| var initMappings = require('./util/init-mappings'); | |
| function reduce(set, fn) { | |
| if (!(set instanceof Array)) { | |
| fn(set); | |
| } else { | |
| set.forEach(function(value) { | |
| if (value !== null) { | |
| reduce(value, fn); | |
| } | |
| }); | |
| } | |
| } | |
| module.exports = function(mappings) { | |
| var map = [], | |
| count = 0; | |
| function push(data) { | |
| if (typeof data.channel === 'number' && typeof data.index === 'number') { | |
| if (!data.command) { | |
| data.offset = count; | |
| count += 1; | |
| } | |
| if (data.shift) { | |
| var copy = $.copy(data.shift); | |
| copy.type = data.type; | |
| copy.shift = true; | |
| delete data.shift; | |
| push(copy); | |
| } | |
| map.push(data); | |
| } | |
| } | |
| reduce(mappings, push); | |
| initMappings(this, map, count); | |
| return this; | |
| }; | |
| },{"../helpers":4,"./util/init-mappings":14}],11:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global println */ | |
| module.exports = function() { | |
| println('DISCONNECTED'); | |
| }; | |
| },{}],12:[function(require,module,exports){ | |
| 'use strict'; | |
| module.exports = function(RL, key) { | |
| return function() { | |
| return RL[key]; | |
| }; | |
| }; | |
| },{}],13:[function(require,module,exports){ | |
| 'use strict'; | |
| module.exports = function(RL, map) { | |
| for (var key in map) { | |
| RL.CC_USER_ACTIONS[key] = map[key]; | |
| } | |
| }; | |
| },{}],14:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global host */ | |
| var stateObserver = require('./state-observer'); | |
| module.exports = function(RL, set, length) { | |
| RL.host.userControls = host.createUserControls(length); | |
| RL.CC_STATE.commonMappings = {}; | |
| RL.CC_STATE.commonValues = {}; | |
| RL.CC_MAPPINGS = {}; | |
| set.forEach(function(e) { | |
| RL.CC_MAPPINGS[e.channel + '#' + e.index] = e; | |
| if (e.grouped && e.command) { | |
| if (!RL.CC_STATE.commonMappings[e.command]) { | |
| RL.CC_STATE.commonMappings[e.command] = []; | |
| } | |
| RL.CC_STATE.commonMappings[e.command].push(e); | |
| } | |
| switch (e.command) { | |
| case 'toggleMute': RL.CC_TRACKS[e.track].getMute().addValueObserver(stateObserver(RL, 'commonValues', e, 'io')); break; | |
| case 'toggleSolo': RL.CC_TRACKS[e.track].getSolo().addValueObserver(stateObserver(RL, 'commonValues', e, 'io')); break; | |
| case 'toggleArm': RL.CC_TRACKS[e.track].getArm().addValueObserver(stateObserver(RL, 'commonValues', e, 'io')); break; | |
| } | |
| if (typeof e.offset === 'number') { | |
| var cc = RL.host.userControls.getControl(e.offset); | |
| cc.setLabel('CC' + (e.offset + 1)); | |
| cc.setIndication(true); | |
| } | |
| }); | |
| }; | |
| },{"./state-observer":18}],15:[function(require,module,exports){ | |
| 'use strict'; | |
| var stateObserver = require('./state-observer'); | |
| module.exports = function(RL) { | |
| for (var i = 0, c = RL.TRACKS; i < c; i += 1) { | |
| RL.CC_TRACKS[i] = RL.host.trackBank.getTrack(i); | |
| RL.CC_TRACKS[i].addIsSelectedObserver(stateObserver(RL, 'activeTrack', i, 'scalar')); | |
| RL.CC_TRACKS[i].addNameObserver(20, '', stateObserver(RL, 'currentTracks', i, 'list')); | |
| } | |
| }; | |
| },{"./state-observer":18}],16:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global sendMidi, host */ | |
| var stateObserver = require('./state-observer'), | |
| stateGetter = require('./state-getter'), | |
| stateSetter = require('./state-setter'), | |
| getterFor = require('./getter-for'); | |
| module.exports = function(RL) { | |
| RL.host = { | |
| trackBank: host.createTrackBank(16, 2, 8), | |
| transport: host.createTransport(), | |
| cursorTrack: host.createCursorTrack(16, 2), | |
| cursorDevice: host.createCursorDevice() | |
| }; | |
| RL.host.cursorDevice.addNameObserver(20, '', stateObserver(RL, 'primaryDevice', false, 'scalar')); | |
| RL.host.transport.addIsRecordingObserver(function (on) { | |
| sendMidi(RL.CHANNEL1, RL.RECORD, (RL.IS_RECORDING = on) ? 127 : 0); | |
| }); | |
| RL.host.transport.addIsPlayingObserver(function (on) { | |
| sendMidi(RL.CHANNEL1, RL.PLAY, (RL.IS_PLAYING = on) ? 127 : 0); | |
| }); | |
| RL.host.transport.addOverdubObserver(function(on) { | |
| if (!RL.IS_RECORDING) { | |
| sendMidi(RL.CHANNEL1, RL.RECORD, 0); | |
| } | |
| sendMidi(RL.CHANNEL1, RL.RECORDS, (RL.OVERDUB = on) ? 127 : 0); | |
| }); | |
| RL.host.get = stateGetter(RL); | |
| RL.host.set = stateSetter(RL); | |
| RL.host.isPlaying = getterFor(RL, 'IS_PLAYING'); | |
| RL.host.isRecording = getterFor(RL, 'IS_RECORDING'); | |
| }; | |
| },{"./getter-for":12,"./state-getter":17,"./state-observer":18,"./state-setter":19}],17:[function(require,module,exports){ | |
| 'use strict'; | |
| var $ = require('../../helpers'); | |
| module.exports = function(RL) { | |
| return function(from, key) { | |
| if (from.indexOf('.') > 0) { | |
| key = from.split('.')[1]; | |
| from = from.split('.')[0]; | |
| } | |
| var obj; | |
| if (typeof RL.CC_STATE[from] !== 'undefined') { | |
| obj = $.copy(RL.CC_STATE[from]); | |
| } | |
| if (typeof RL.CC_USER_STATE[from] !== 'undefined') { | |
| obj = $.copy(RL.CC_USER_STATE[from]); | |
| } | |
| if (typeof key !== 'undefined') { | |
| return obj ? obj[key] : null; | |
| } | |
| return obj; | |
| }; | |
| }; | |
| },{"../../helpers":4}],18:[function(require,module,exports){ | |
| 'use strict'; | |
| /* global sendMidi */ | |
| module.exports = function(RL, label, index, type) { | |
| if (typeof RL.CC_STATE[label] === 'undefined') { | |
| switch (type) { | |
| case 'scalar': RL.CC_STATE[label] = index; break; | |
| case 'list': RL.CC_STATE[label] = []; break; | |
| default: RL.CC_STATE[label] = {}; break; | |
| } | |
| } | |
| return function(value) { | |
| if (type === 'io') { | |
| if (index.inverted) { | |
| value = !value; | |
| } | |
| RL.CC_STATE[label][index.channel + '#' + index.index] = value; | |
| sendMidi(index.channel, index.index, value ? 127 : 0); | |
| } else if (!value) { | |
| switch (type) { | |
| case 'list': Array.prototype.splice.call(RL.CC_STATE[label], index, 1); break; | |
| case 'scalar': | |
| if (typeof value === 'string') { | |
| RL.CC_STATE[label] = index; | |
| } | |
| break; | |
| } | |
| } else { | |
| switch (type) { | |
| case 'scalar': RL.CC_STATE[label] = index !== false ? index : value; break; | |
| default: RL.CC_STATE[label][index] = value; break; | |
| } | |
| } | |
| }; | |
| }; | |
| },{}],19:[function(require,module,exports){ | |
| 'use strict'; | |
| module.exports = function(RL) { | |
| return function(key, value) { | |
| RL.CC_USER_STATE[key] = value; | |
| }; | |
| }; | |
| },{}]},{},[1]); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment