qambi
Version:
MIDI sequencer, loads MIDI files, can record and playback MIDI, uses WebMIDI and WebAudio
244 lines (211 loc) • 7.67 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Part = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @ flow
var _util = require('./util');
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var instanceIndex = 0;
var Part = exports.Part = function () {
function Part() {
var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Part);
this.id = this.constructor.name + '_' + instanceIndex++ + '_' + new Date().getTime();
var _settings$name = settings.name;
this.name = _settings$name === undefined ? this.id : _settings$name;
var _settings$muted = settings.muted;
this.muted = _settings$muted === undefined ? false : _settings$muted;
this._track = null;
this._song = null;
this._events = [];
this._eventsById = new Map();
this._needsUpdate = false;
this._createEventArray = false;
this._start = { millis: 0, ticks: 0 };
this._end = { millis: 0, ticks: 0 };
var events = settings.events;
if (typeof events !== 'undefined') {
this.addEvents.apply(this, _toConsumableArray(events));
}
}
_createClass(Part, [{
key: 'copy',
value: function copy() {
var p = new Part(this.name + '_copy'); // implement getNameOfCopy() in util (see heartbeat)
var events = [];
this._events.forEach(function (event) {
var copy = event.copy();
console.log(copy);
events.push(copy);
});
p.addEvents.apply(p, events);
p.update();
return p;
}
}, {
key: 'transpose',
value: function transpose(amount) {
this._events.forEach(function (event) {
event.transpose(amount);
});
this._needsUpdate = true;
}
}, {
key: 'move',
value: function move(ticks) {
this._events.forEach(function (event) {
event.move(ticks);
});
if (this._song) {
var _song$_movedEvents;
(_song$_movedEvents = this._song._movedEvents).push.apply(_song$_movedEvents, _toConsumableArray(this._events));
}
this._needsUpdate = true;
}
}, {
key: 'moveTo',
value: function moveTo(ticks) {
this._events.forEach(function (event) {
event.moveTo(ticks);
});
if (this._song) {
var _song$_movedEvents2;
(_song$_movedEvents2 = this._song._movedEvents).push.apply(_song$_movedEvents2, _toConsumableArray(this._events));
}
this._needsUpdate = true;
}
}, {
key: 'addEvents',
value: function addEvents() {
var _this = this,
_events;
//console.log(events)
var track = this._track;
for (var _len = arguments.length, events = Array(_len), _key = 0; _key < _len; _key++) {
events[_key] = arguments[_key];
}
events.forEach(function (event) {
event._part = _this;
_this._eventsById.set(event.id, event);
if (track) {
event._track = track;
if (track._song) {
event._song = track._song;
}
}
});
(_events = this._events).push.apply(_events, events);
if (track) {
var _track$_events;
(_track$_events = track._events).push.apply(_track$_events, events);
track._needsUpdate = true;
}
if (this._song) {
var _song$_newEvents;
(_song$_newEvents = this._song._newEvents).push.apply(_song$_newEvents, events);
this._song._changedParts.push(this);
}
this._needsUpdate = true;
}
}, {
key: 'removeEvents',
value: function removeEvents() {
var _this2 = this;
var track = this._track;
for (var _len2 = arguments.length, events = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
events[_key2] = arguments[_key2];
}
events.forEach(function (event) {
event._part = null;
_this2._eventsById.delete(event.id);
if (track) {
event._track = null;
track._eventsById.delete(event.id);
if (track._song) {
event._song = null;
}
}
});
if (track) {
track._needsUpdate = true;
track._createEventArray = true;
}
if (this._song) {
var _song$_removedEvents;
(_song$_removedEvents = this._song._removedEvents).push.apply(_song$_removedEvents, events);
this._song._changedParts.push(this);
}
this._createEventArray = true;
this._needsUpdate = true;
}
}, {
key: 'moveEvents',
value: function moveEvents(ticks) {
for (var _len3 = arguments.length, events = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
events[_key3 - 1] = arguments[_key3];
}
events.forEach(function (event) {
event.move(ticks);
});
if (this._song) {
var _song$_movedEvents3;
this._song._changedParts.push(this);
(_song$_movedEvents3 = this._song._movedEvents).push.apply(_song$_movedEvents3, _toConsumableArray(this._events));
}
this._needsUpdate = true;
}
}, {
key: 'moveEventsTo',
value: function moveEventsTo(ticks) {
for (var _len4 = arguments.length, events = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
events[_key4 - 1] = arguments[_key4];
}
events.forEach(function (event) {
event.moveTo(ticks);
});
if (this._song) {
var _song$_movedEvents4;
this._song._changedParts.push(this);
(_song$_movedEvents4 = this._song._movedEvents).push.apply(_song$_movedEvents4, _toConsumableArray(this._events));
}
this._needsUpdate = true;
}
}, {
key: 'getEvents',
value: function getEvents() {
var filter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
// can be use as findEvents
if (this._needsUpdate) {
this.update();
}
return [].concat(_toConsumableArray(this._events)); //@TODO implement filter -> filterEvents() should be a utility function (not a class method)
}
}, {
key: 'mute',
value: function mute() {
var flag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (flag) {
this.muted = flag;
} else {
this.muted = !this.muted;
}
}
}, {
key: 'update',
value: function update() {
if (this._needsUpdate === false) {
return;
}
if (this._createEventArray) {
this._events = Array.from(this._eventsById.values());
this._createEventArray = false;
}
(0, _util.sortEvents)(this._events);
this._needsUpdate = false;
//@TODO: calculate part start and end, and highest and lowest note
}
}]);
return Part;
}();