Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Разметка октав не совсем верная — первые две ноты слева — нулевая октава. С первой ноты До (обозначена как C) начинается первая октава.
В зарубежной литературе применяется другая, научная нотация, которой мы в итоге и будем пользоваться:
ноты обозначаются латинскими буквами С (До), D (Ре), E (Ми), F (Фа), G (Соль), A (Ля), B (Си).
Нота в нотной записи может иметь полый или закрашенный кружок (головку), иметь вертикальную палку (штиль) и флажок. Это определяет, какую часть такта по времени занимает нота — весь такт, полтакта и так далее. [...] Например, 1/8 с точкой звучит на протяжении 1/8 + 1/16 = 3/16 доли такта.
Если кому интересно, то собственно абсолютная длина x определяется по указанию темпа (Adagio Sostenuto), метрической доле (половина), принятым соглашениям, ну и собственно личному вкусу и настроению исполнителя.
С размерностями и длительностями было непросто, так как нот 12, и каждая — 1/8.
Кроме того, в пятом и шестом тактах после двенадцати восьмых нот (четырех триолей) еще идет 1/16, «не влезающая» в такт.
сегодня в музыкальном ПО совсем не хочется ссылаться на «вкус и настроение исполнителя».
plugin.webmidi.js:69
Uncaught (in promise) TypeError: plugin.outputs is not a function
at navigator.requestMIDIAccess.then.opts.api
// first bar
100 player.play('C2', 1);
// second bar
116 player.play('B1', 1);
// линия времени
var delay = 0;
...
// длительность ноты
var gap = 0.6;
MIDI.setVolume(0, 80);
// первый такт
// начинаем играть ноту 49 в момент времени 0
MIDI.noteOn(0, 49, velocity, delay);
// перестаем играть ноту 49 в момент времени (0 + 4 длительности ноты)
MIDI.noteOff(0, 49, delay + 4 * gap);
// так как процесс происходит в "отдельном потоке", сразу пишем другую ноту
// начинаем играть ноту 37 так же в момент времени 0
MIDI.noteOn(0, 37, velocity, delay);
// перестаем играть ноту 37 в момент времени (0 + 4 длительности ноты)
MIDI.noteOff(0, 37, delay + 4 * gap);
// опять же, т.к. поток другой, запускаем уже третью ноту №56 в момент времени 0
MIDI.noteOn(0, 56, velocity, delay);
// перестаем играть ее в момент времени (0 + 1 длительность ноты)
MIDI.noteOff(0, 56, delay +gap);
// сдвигаем координату времени до начала звучания следующей по времени ноты
// время = 0 + 1 длительность ноты
delay += gap;
// нота 56 перестала звучать, ноты 37 и 49 продолжают играть
// начинаем играть ноту 61 в момент времени (1 длительность ноты)
MIDI.noteOn(0, 61, velocity, delay);
// престаем играть ноту в момент времени (1 длительность ноты + 1 длительность ноты)
MIDI.noteOff(0, 61, delay + duration);
// сдвигаем координату времени до начала звучания следующей по времени ноты
// время = 1 длительность ноты + 1 длительность ноты
delay += gap;
// нота 61 тоже перестала звучать, а ноты 37 и 49 будут играть еще два такта
// first bar
// тоже самое, только время является полем player'а
//начинаем играть C2 в время=0 и прекращаем в время=1
player.play('C2', 1);
// начинаем играть C1 в время=0 и прекращаем время=1
player.play('C1', 1);
// начинаем играть G3 в время=0 и прекращаем время=1/12
// true здесь приведет к время = время + 1/12
player.play('G3', 1/12, true);
// начинаем играть C4 в время=1/12 и прекращаем время=2/12
// true здесь тоже подвинет временную координату внутри player'а
player.play('C4', 1/12, true);
начинаем играть в время=0 и прекращаем в время=1
player.play('G3', 1/12, true);
player.play('C4', 1/12, true);
player.play('G3', 1/12);
player.move(1/12);
player.play('C4', 1/12);
player.move(1/12);
Пишем Бетховена на Javascript или немного о MIDI.js