@@ -83,26 +83,32 @@ class MidiIO {
8383 } ;
8484 return metaObject ;
8585 }
86+ static indexMidiTrack ( track ) {
87+ const indexedTrack = track . reduce (
88+ ( prev , current ) => {
89+ const currentIndex = `${ current . type } _${ current . subtype } ` ;
90+ const updated = Object . assign ( { } , prev ) ;
91+ if ( ! updated [ currentIndex ] ) {
92+ updated [ currentIndex ] = [ ] ;
93+ }
94+ updated [ currentIndex ] . push ( current ) ;
95+ return updated ;
96+ } ,
97+ { } ,
98+ ) ;
99+ return indexedTrack ;
100+ }
86101 static getAllTracks ( parsedMidi ) {
87102 const tracks = parsedMidi . tracks . filter ( ( track , i ) => i >= 1 ) ;
88103
89104 const indexedTracks = tracks . map ( ( track , i ) => {
90- const indexedTrack = track . reduce (
91- ( prev , current ) => {
92- const currentIndex = `${ current . type } _${ current . subtype } ` ;
93- const updated = Object . assign ( { } , prev ) ;
94- if ( ! updated [ currentIndex ] ) {
95- updated [ currentIndex ] = [ ] ;
96- }
97- updated [ currentIndex ] . push ( current ) ;
98- return updated ;
99- } ,
100- { } ,
101- ) ;
105+ let previousNote ;
106+ const indexedTrack = MidiIO . indexMidiTrack ( track ) ;
102107 const instrumentNumber = indexedTrack . channel_programChange [ 0 ] . programNumber ;
103108 const instrumentName = Object . keys ( INSTRUMENT_MIDI_MAPPING ) . find ( instrumentKey => (
104109 INSTRUMENT_MIDI_MAPPING [ instrumentKey ] === instrumentNumber ) ,
105110 ) ;
111+
106112 return {
107113 controller : indexedTrack . channel_controller ,
108114 programChange : indexedTrack . channel_programChange ,
@@ -344,6 +350,7 @@ class MidiIO {
344350 const trackInstrumentName = meta . instrumentNames [ i ] ;
345351 const millisecondsPerTick = meta . millisecondsPerTick ;
346352 let previousEndTime = 0 ;
353+ let previousNote = { } ;
347354 return noteOffs . map ( ( noteOff ) => {
348355 const {
349356 noteNumber,
@@ -360,6 +367,14 @@ class MidiIO {
360367 previousEndTime ,
361368 millisecondsPerTick ,
362369 ) ;
370+ if ( deltaTime === 0 ) {
371+ const note = Object . assign ( { } ,
372+ previousNote ,
373+ { noteNumber, noteName, instrumentName : noteInstrumentName } ,
374+ ) ;
375+ previousNote = note ;
376+ return note ;
377+ }
363378 previousEndTime = endTimeInMS ;
364379 const note = {
365380 noteNumber,
@@ -371,6 +386,7 @@ class MidiIO {
371386 deltaTime,
372387 msPerTick,
373388 } ;
389+ previousNote = note ;
374390 return note ;
375391 } ) ;
376392 } ) ;
0 commit comments