MIDI.la durée de la note js ne change pas

Comme documentation pour mudcube MIDI.js semble manquer à cet égard, j’espère qu’il y a quelqu’un qui pourrait me diriger dans la bonne direction. Pour le dire clairement, en utilisant midi.js, comment ajustez-vous la durée et la fin des notes midi?

Pour un peu d’arrière-plan, j’ai créé un widget de personnel musical avec des notes glissables et droppables (jQuery-ui), qui peuvent être ajoutées ou supprimées, pour former des séquences qui peuvent être appelées pour lire du midi. Tout fonctionne jusqu’à présent comme il se doit, cependant, alors que j’essaie d’étendre les fonctionnalités de ce widget avec un timing plus complexe, j’ai rencontré quelques problèmes.

Il semble que je ne puisse jouer les notes qu’à une durée définie et, malgré tous mes efforts, je n’ai pas été en mesure de mettre en œuvre des changements qui pourraient faire varier cette durée pour dire, demi-notes, quarts de notes, huit notes, etc. Aussi, et cela peut être l’une des causes, MIDI.noteOff n’a aucun effet perceptible sur la sortie. On pourrait penser qu’une note donnée jouerait indéfiniment jusqu’à MIDI.noteOff est appelé, cependant, ladite note sera lue, puis s’arrêtera, que noteOff soit appelé ou non.

Permettez-moi de dire ici que j’ai fait des recherches approfondies sur SO et le Web en général pour aller au fond des choses. J’ai trouvé des personnes ayant des problèmes similaires et appliqué leurs correctifs, mais leurs réponses ne fonctionnent pas pour moi. Voyez comment jouer des notes arbitraires en Midi avec javascript et MIDI.noteOff ne semble pas fonctionner de manière fiable

J’ai une séquence de notes appelée noteSequence où chaque note est un objet avec noteValue (c’est-à-dire ‘C4’) et noteDuration qui sont converties en midiSequence dans la fonction convertToMidiSequence. Tout fonctionne bien avec les séquences mélodiques et les accords, je veux juste ajouter la fonctionnalité de durée. Je dois également dire que l’ajustement de la variable ‘delay’ ou de la propriété noteDuration ne fait qu’ajouter au temps avant la lecture de la séquence. Ensuite, après le délai initial, la séquence joue avec le même timing qu’auparavant.

Merci d’avoir pris le temps de regarder cela et, espérons-le, d’aider. Ce serait très apprécié.

Voici le code applicable qui exécute mon MIDI :

$(document).ready(function() { MIDI.loadPlugin({ soundfontUrl: GLOBALS.SOUNDFONT_URL, instrument: 'acoustic_grand_piano', callback: function() { var channel = 0, instrument = 0, velocity = 127, delay = 1; MIDI.programChange(0, instrument); } });});function playCurrentSequence() { playSequence(noteSequence);}function playSequence(sequence) { var midiSequence = convertToMidiSequence(sequence); for (var i = 0; i < midiSequence.length; i++) { if (!(midiSequence instanceof Array)) { playNote(midiSequence, i); } else { playChord(midiSequence, i); } }}function playNote(midiNote, notePositionInMeasure) { var channel = 0, velocity = 127, delay = 1; MIDI.noteOn(channel, midiNote, velocity, delay + notePositionInMeasure + 1); MIDI.noteOff(channel, midiNote, delay + midiNote.noteDuration + notePositionInMeasure + 1); MIDI.Player.stop();}function playChord(midiChord, notePositionInMeasure) { var channel = 0, velocity = 127, delay = 1; for (var i = 0; i < midiChord.length; i++) { MIDI.noteOn(channel, midiChord, velocity, delay + notePositionInMeasure + 1); MIDI.noteOff(channel, midiChord, delay + midiChord.noteDuration + notePositionInMeasure + 1); MIDI.Player.stop(); }}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.