Я создал код javascript, который генерирует MIDI-файлы на основе пройденной ноты и октавы. По большей части он работает довольно хорошо. Проблема в том, что примечание C (примечание = 0) играет гораздо меньше, чем любая другая заметка (от 1 (C#) до 11 (B)).generated midi note length
Вот мой код:
function play(note, octave, program){
var note = (octave*12 + note).toString(16);
var velocity = 'ff';
var MIDI_DATA =
'MThd%00%00%00%06%00%01%00%01%00%C0' + // midi header
'MTrk%00%00%00%0E' + // track header
'%00%C0%'+program+
'%00%90%'+note+'%'+velocity+
'%70%30%00' +
'%00%FF%2F%00';
MIDI_DATA = btoa(unescape(MIDI_DATA));
var e = document.createElement('embed');
e.src = "data:audio/mid;base64,"+MIDI_DATA;
e.type = "video/quicktime";
document.body.appendChild(e);
return e;
}
Почему С банкнота - играть (0, 4, '18') звучит так гораздо короче, чем любой другой - играть (1, 4, '18') ? Шаг кажется правильным, просто длина игры в ноте.
Я думаю, что это может иметь какое-то отношение к тому, что C имеет значение 0, но я недостаточно знаю о том, что я делаю здесь с миди, чтобы обнаружить проблему.
ПРИМЕЧАНИЕ. Этот код не работает в IE (любая версия).
А что происходит, когда вы звоните миди файл непосредственно в браузере/quicktime без использования встроенного тега? Играет ли он правильное время? – epascarello
Я не могу воспроизвести это поведение - все ноты играют за такое же количество времени. Обновите версию QT? – LesterDove
Кажется, это проблема с моей звуковой картой. Я тестировал несколько комбинаций OS/браузера, но не несколько компьютеров. Спасибо, что привлек это к моему вниманию. Я должен был проверить это раньше. – marshallpenguin