Skip to content

midiEvent fires after event should already be playing when multiple notes are played on the same tick #103

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
bethanrv opened this issue Jan 2, 2024 · 0 comments

Comments

@bethanrv
Copy link

bethanrv commented Jan 2, 2024

Greetings and thanks for sharing this library!

I've noticed an issue with .on midiEvent that is causing some delay in playback (10-15ms).
Looks like every time multiple notes want to play on the same tick, there is a noticeable delay before the event is fired.

I've done a simple experiment to showcase this delay... here is the js:

  Player.on('midiEvent', function(event) {
    if(event.name == "Note on"){
      if(lastTickPlayed == event.tick) {
        return
      }

      // experiment, use tick to determine what time the note should have come in vs what time it really does
      console.log('==========================')
      console.log('scheduled time: ' + ticksToSeconds(event.tick))
      console.log('actual time: ' + audioConext.currentTime)
    }
  });

Upon reviewing the output, it looks like midiEvents usually fire about 40-50ms before their scheduled time.
Unfortunately, I'm also observing that when multiple notes are scheduled for the same tick, the first midiEvent for that tick fires about 10-20ms after the scheduled time.

Notes on input midi:

  • tempo is set to 120, and multiple notes are scheduled for the start of every other new bar... (times, 0,4,8,12,16,20,24,&28, seconds)
    -> When notes are scheduled for a time divisible by 4, then multiple notes are scheduled (chords and bass notes)
  • All notes are quantized
Output:
========================== *Note: Curiously this issue is note apparent at time 0
scheduled time: 0
actual time: 0 
========================== *Note: A single note is scheduled here, and we see that the midi event is fired 50ms early
scheduled time: 0.25
actual time: 0.2
========================== *Note: Another single note is scheduled for this tick, fires early as expected
scheduled time: 1
actual time: 0.9306666666666666
========================== *Note: Again, a single note is fired early... will stop marking these
scheduled time: 1.5
actual time: 1.44
==========================
scheduled time: 1.96875
actual time: 1.912
==========================
scheduled time: 2.01171875
actual time: 1.96
==========================
scheduled time: 2.5
actual time: 2.44
==========================
scheduled time: 2.75
actual time: 2.6906666666666665
==========================
scheduled time: 3
actual time: 2.952
==========================
scheduled time: 3.25
actual time: 3.2
==========================
scheduled time: 3.5
actual time: 3.4506666666666668
==========================
scheduled time: 3.75
actual time: 3.7013333333333334
==========================
scheduled time: 3.796875
actual time: 3.7413333333333334
========================== *Note: Here is the first instance of the issue I've described. The actual time is 10ms ahead now
scheduled time: 4
actual time: 4.010666666666666
========================== *Note: Back to expected behavior when only a single note should fire on this tick
scheduled time: 4.25
actual time: 4.2
==========================
scheduled time: 5
actual time: 4.930666666666666
==========================
scheduled time: 5.5
actual time: 5.450666666666667
==========================
scheduled time: 6
actual time: 5.952
==========================
scheduled time: 6.125
actual time: 6.08
==========================
scheduled time: 6.25
actual time: 6.2
==========================
scheduled time: 6.375
actual time: 6.330666666666667
==========================
scheduled time: 6.5
actual time: 6.450666666666667
==========================
scheduled time: 6.75
actual time: 6.712
==========================
scheduled time: 7
actual time: 6.952
==========================
scheduled time: 7.25
actual time: 7.2
==========================
scheduled time: 7.47265625
actual time: 7.410666666666667
==========================
scheduled time: 7.515625
actual time: 7.472
==========================
scheduled time: 7.75
actual time: 7.701333333333333
==========================
scheduled time: 8
actual time: 8.021333333333333
========================== *Note: Again, this is where multiple notes should fire on the same tick together - 20ms delay
scheduled time: 8.25
actual time: 8.210666666666667
========================== *Note: And back to expected behavior again
scheduled time: 9
actual time: 8.930666666666667
==========================
scheduled time: 9.5
actual time: 9.44
==========================
scheduled time: 9.984375
actual time: 9.912
==========================
scheduled time: 10.02734375
actual time: 9.981333333333334
==========================
scheduled time: 10.5
actual time: 10.450666666666667
==========================
scheduled time: 10.75
actual time: 10.701333333333332
==========================
scheduled time: 11
actual time: 10.952
==========================
scheduled time: 11.25
actual time: 11.2
==========================
scheduled time: 11.5
actual time: 11.450666666666667
==========================
scheduled time: 11.71484375
actual time: 11.650666666666666
==========================
scheduled time: 11.7578125
actual time: 11.712
========================== *Note: Again, multiple notes should play here
scheduled time: 12
actual time: 12.010666666666667
==========================
scheduled time: 12.25
actual time: 12.192
==========================
scheduled time: 13
actual time: 12.930666666666667
==========================
scheduled time: 13.5
actual time: 13.432
==========================
scheduled time: 14
actual time: 13.952
==========================
scheduled time: 14.125
actual time: 14.072
==========================
scheduled time: 14.25
actual time: 14.2
==========================
scheduled time: 14.375
actual time: 14.32
==========================
scheduled time: 14.5
actual time: 14.450666666666667
==========================
scheduled time: 14.75
actual time: 14.701333333333332
==========================
scheduled time: 15
actual time: 14.952
==========================
scheduled time: 15.25
actual time: 15.2
==========================
scheduled time: 15.49609375
actual time: 15.421333333333333
==========================
scheduled time: 15.53515625
actual time: 15.48
==========================
scheduled time: 15.75
actual time: 15.701333333333332
========================== *Note: Again, multiple notes should play here
scheduled time: 16
actual time: 16.021333333333335
==========================
scheduled time: 16.25
actual time: 16.2
==========================
scheduled time: 17
actual time: 16.941333333333333
==========================
scheduled time: 17.5
actual time: 17.461333333333332
==========================
scheduled time: 17.9765625
actual time: 17.912
==========================
scheduled time: 18.015625
actual time: 17.970666666666666
==========================
scheduled time: 18.5
actual time: 18.450666666666667
==========================
scheduled time: 18.75
actual time: 18.701333333333334
==========================
scheduled time: 19
actual time: 18.952
==========================
scheduled time: 19.25
actual time: 19.2
==========================
scheduled time: 19.5
actual time: 19.450666666666667
==========================
scheduled time: 19.72265625
actual time: 19.650666666666666
==========================
scheduled time: 19.76953125
actual time: 19.712
========================== *Note: Again, multiple notes should play here
scheduled time: 20
actual time: 20.010666666666665
==========================
scheduled time: 20.25
actual time: 20.192
==========================
scheduled time: 21
actual time: 20.930666666666667
==========================
scheduled time: 21.5
actual time: 21.450666666666667
==========================
scheduled time: 22
actual time: 21.952
==========================
scheduled time: 22.125
actual time: 22.072
==========================
scheduled time: 22.25
actual time: 22.2
==========================
scheduled time: 22.375
actual time: 22.32
==========================
scheduled time: 22.5
actual time: 22.450666666666667
==========================
scheduled time: 22.75
actual time: 22.701333333333334
==========================
scheduled time: 23
actual time: 22.952
==========================
scheduled time: 23.25
actual time: 23.2
==========================
scheduled time: 23.47265625
actual time: 23.410666666666668
==========================
scheduled time: 23.515625
actual time: 23.472
==========================
scheduled time: 23.75
actual time: 23.712
========================== *Note: Again, multiple notes should play here
scheduled time: 24
actual time: 24.021333333333335
==========================
scheduled time: 24.25
actual time: 24.2
==========================
scheduled time: 25
actual time: 24.941333333333333
==========================
scheduled time: 25.5
actual time: 25.450666666666667
==========================
scheduled time: 25.98828125
actual time: 25.92
==========================
scheduled time: 26.03125
actual time: 25.992
==========================
scheduled time: 26.5
actual time: 26.44
==========================
scheduled time: 26.75
actual time: 26.690666666666665
==========================
scheduled time: 27
actual time: 26.941333333333333
==========================
scheduled time: 27.5
actual time: 27.432
==========================
scheduled time: 27.7109375
actual time: 27.650666666666666
==========================
scheduled time: 27.75390625
actual time: 27.712
========================== *Note: Again, multiple notes should play here
scheduled time: 28
actual time: 28.010666666666665
==========================
scheduled time: 28.25
actual time: 28.2
==========================
scheduled time: 29
actual time: 28.930666666666667
==========================
scheduled time: 29.5
actual time: 29.450666666666667
==========================
scheduled time: 30
actual time: 29.952
==========================
scheduled time: 30.125
actual time: 30.08
==========================
scheduled time: 30.25
actual time: 30.2
==========================
scheduled time: 30.375
actual time: 30.330666666666666
==========================
scheduled time: 30.5
actual time: 30.450666666666667
==========================
scheduled time: 30.75
actual time: 30.701333333333334
==========================
scheduled time: 31
actual time: 30.952
==========================
scheduled time: 31.25
actual time: 31.2
==========================
scheduled time: 31.49609375
actual time: 31.44
==========================
scheduled time: 31.53515625
actual time: 31.48
==========================
scheduled time: 31.75
actual time: 31.701333333333334

Midi:
Couldn't attach .midi file... here is the base64 encoding...
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
Thanks again for sharing this code and best wishes.

@bethanrv bethanrv changed the title midiEvent fires after event should already be playing when multiple notes are played on the same tick [Bug] midiEvent fires after event should already be playing when multiple notes are played on the same tick Jan 2, 2024
@bethanrv bethanrv changed the title [Bug] midiEvent fires after event should already be playing when multiple notes are played on the same tick midiEvent fires after event should already be playing when multiple notes are played on the same tick Jan 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant