Update for the Online Sequencer:
Reverse Tool ->
Reverse Tool ->
Code:
menus[2].items.reverse = {
name: 'Reverse',
action: function () {
var reverseNotes = function (measureLength) {
/* get time index of last note that ends */
var lastNoteEndExact = 0;
for (i = 0; i < song.notes.length; i++) {
var note = song.notes[i];
if (isNumber(note.time) && isNumber(note.length) && note.time + note.length > lastNoteEndExact) {
lastNoteEndExact = note.time + note.length;
}
}
/* determine time index of end of song based on last note and grid measures */
var lastNoteEnd = Math.floor(lastNoteEndExact);
var songEnd = lastNoteEnd - lastNoteEnd % measureLength;
songEnd += lastNoteEndExact > songEnd ? measureLength : 0;
/* reverse all notes in time */
for (i = 0; i < song.notes.length; i++) {
var note = song.notes[i];
if (isNumber(note.time) && isNumber(note.length)) {
var newTime = songEnd - note.time - note.length;
song.moveNote(
note,
note.instrument,
note.instrument,
note.time,
newTime,
note.type,
note.type);
song.update(note);
}
}
keySelect.selectedIndex = 0;
keySelect.onchange();
}
/* grid measure is by default 16 (4 beats of 4 '1/4th' notes) */
/* TODO calculate measureLength from current grid settings */
reverseNotes(16);
}
};
menuContainer = $('#menubar_menus');
menuContainer.empty();
for (var i = 0; i < menus.length; i++) {
(function(i) {
var menu = menus[i];
var menuTitle = menu.name
var menuElement = $('<div id="menu_' + menu.name + '" class="menu_title">' + menu.name + '</div>');
createMenuPopup(menuElement, menuElement, menu);
menuContainer.append(menuElement);
})(i);
}
createMenus();