From c28d7209fef5660a4f10f317e988132301d3902c Mon Sep 17 00:00:00 2001 From: silverhawk184 Date: Sun, 31 Dec 2017 23:32:28 -0500 Subject: [PATCH 1/4] overdue fixes -Fixed first note not playing (#165) -Fixed issue where progress bar would skip silent lead-in --- js/midi/player.js | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/js/midi/player.js b/js/midi/player.js index 08f298fb..3c03fd90 100644 --- a/js/midi/player.js +++ b/js/midi/player.js @@ -1,6 +1,6 @@ /* ---------------------------------------------------------- - MIDI.Player : 0.3.1 : 2015-03-26 + MIDI.Player : 0.3.2 : 2017-12-31 ---------------------------------------------------------- https://github.com/mudcube/MIDI.js ---------------------------------------------------------- @@ -19,6 +19,9 @@ midi.playing = false; midi.timeWarp = 1; midi.startDelay = 0; midi.BPM = 120; +midi.playingStartTime = 0; +midi.ctxStartTime = 0; +midi.lastCallbackTime = 0; midi.start = midi.resume = function(onsuccess) { @@ -82,22 +85,23 @@ midi.setAnimation = function(callback) { currentTime = midi.currentTime; } /// - var endTime = midi.endTime; - var percent = currentTime / endTime; - var total = currentTime / 1000; - var minutes = total / 60; - var seconds = total - (minutes * 60); - var t1 = minutes * 60 + seconds; - var t2 = (endTime / 1000); - /// - if (t2 - t1 < -1.0) { - return; - } else { - callback({ - now: t1, - end: t2, - events: noteRegistrar - }); + if(currentTime == 0 && midi.playing) currentTime = ((Date.now() - midi.ctxStartTime * 10) - midi.playingStartTime) / 100 * MIDI.Player.BPM; + if(midi.lastCallbackTime!=currentTime){ + var endTime = midi.endTime; + //var percent = currentTime / endTime; + var t1 = currentTime / 1000; + var t2 = endTime / 1000; + /// + if (t2 - t1 < -1.0) { + return; + } else { + callback({ + now: t1, + end: t2, + events: noteRegistrar + }); + } + midi.lastCallbackTime = currentTime; } }; /// @@ -285,13 +289,16 @@ var startAudio = function(currentTime, fromCache, onsuccess) { ctx.currentTime = (now - __now) / 1000; } /// - startTime = ctx.currentTime; + midi.ctxStartTime = startTime = ctx.currentTime; + midi.playingStartTime = Date.now() - midi.ctxStartTime*10 ; /// for (var n = 0; n < length && messages < 100; n++) { var obj = data[n]; if ((queuedTime += obj[1]) <= currentTime) { offset = queuedTime; - continue; + + if (obj[0].event.type !== 'channel') + continue; } /// currentTime = queuedTime - offset; From 2fe8b291725f93d85fdd4a5aa29d0089ceab885e Mon Sep 17 00:00:00 2001 From: silverhawk184 Date: Mon, 1 Jan 2018 01:14:44 -0500 Subject: [PATCH 2/4] fixed auto looping and add end of track callback --- js/midi/player.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/js/midi/player.js b/js/midi/player.js index 3c03fd90..db27c816 100644 --- a/js/midi/player.js +++ b/js/midi/player.js @@ -22,11 +22,10 @@ midi.BPM = 120; midi.playingStartTime = 0; midi.ctxStartTime = 0; midi.lastCallbackTime = 0; - midi.start = midi.resume = function(onsuccess) { - if (midi.currentTime < -1) { - midi.currentTime = -1; + if (midi.currentTime < 0) { + midi.currentTime = 0; } startAudio(midi.currentTime, null, onsuccess); }; @@ -102,6 +101,11 @@ midi.setAnimation = function(callback) { }); } midi.lastCallbackTime = currentTime; + + if(currentTime > endTime){ + stopAudio(); + if(typeof midi.onEnd != 'undefined') midi.onEnd(); + } } }; /// From 069bf82b961d01c628d5d1447fb36ce9305074c8 Mon Sep 17 00:00:00 2001 From: silverhawk184 Date: Fri, 12 Jan 2018 21:08:58 -0500 Subject: [PATCH 3/4] Fix position indicator on resume from pause --- js/midi/player.js | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/js/midi/player.js b/js/midi/player.js index db27c816..1b5c3f47 100644 --- a/js/midi/player.js +++ b/js/midi/player.js @@ -82,30 +82,30 @@ midi.setAnimation = function(callback) { } } else { // paused currentTime = midi.currentTime; + tOurTime = Date.now(); + tTheirTime = midi.currentTime; } /// if(currentTime == 0 && midi.playing) currentTime = ((Date.now() - midi.ctxStartTime * 10) - midi.playingStartTime) / 100 * MIDI.Player.BPM; - if(midi.lastCallbackTime!=currentTime){ - var endTime = midi.endTime; - //var percent = currentTime / endTime; - var t1 = currentTime / 1000; - var t2 = endTime / 1000; - /// - if (t2 - t1 < -1.0) { - return; - } else { - callback({ - now: t1, - end: t2, - events: noteRegistrar - }); - } - midi.lastCallbackTime = currentTime; - - if(currentTime > endTime){ - stopAudio(); - if(typeof midi.onEnd != 'undefined') midi.onEnd(); - } + var endTime = midi.endTime; + //var percent = currentTime / endTime; + var t1 = currentTime / 1000; + var t2 = endTime / 1000; + /// + if (t2 - t1 < -1.0) { + return; + } else { + callback({ + now: t1, + end: t2, + events: noteRegistrar + }); + } + midi.lastCallbackTime = currentTime; + + if(currentTime > endTime){ + stopAudio(); + if(typeof midi.onEnd != 'undefined') midi.onEnd(); } }; /// @@ -301,7 +301,7 @@ var startAudio = function(currentTime, fromCache, onsuccess) { if ((queuedTime += obj[1]) <= currentTime) { offset = queuedTime; - if (obj[0].event.type !== 'channel') + if (currentTime>0 || obj[0].event.type !== 'channel') continue; } /// From 242b20fb6d8bcf2803e672989ed940c78ac96970 Mon Sep 17 00:00:00 2001 From: silverhawk184 Date: Sun, 28 Jan 2018 22:46:33 -0500 Subject: [PATCH 4/4] Event in callback was off by an octave --- js/midi/player.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/midi/player.js b/js/midi/player.js index 1b5c3f47..16a456fd 100644 --- a/js/midi/player.js +++ b/js/midi/player.js @@ -1,6 +1,6 @@ /* ---------------------------------------------------------- - MIDI.Player : 0.3.2 : 2017-12-31 + MIDI.Player : 0.3.3 : 2018-01-28 ---------------------------------------------------------- https://github.com/mudcube/MIDI.js ---------------------------------------------------------- @@ -202,6 +202,7 @@ var startTime = 0; // to measure time elapse var noteRegistrar = {}; // get event for requested note var onMidiEvent = undefined; // listener var scheduleTracking = function(channel, note, currentTime, offset, message, velocity, time) { + note -= 12; // off by one octave ??? return setTimeout(function() { var data = { channel: channel,