Как я могу получить уведомление о достижении определенного тика в миди-последовательности?
Я использую javax.sound.midi.Sequencer для воспроизведения последовательности, и мне нужно перейти к другой части последовательности, когда достигнут определенный тик. Представьте себе цикл, который, когда мы достигаем тикового числа "у", мы возвращаемся к тиковому числу "х". Но я не делаю цикл, поэтому встроенные методы циклов не будут работать для меня.
В данный момент я использую таймер колебания, который запускает getTickPosition() каждую миллисекунду, пока не достигну желаемого тика, но это дает мне слегка противоречивые результаты, и у меня возникает ощущение, что для довольно простой задачи используется много ЦП.
Хотелось бы, чтобы был прослушиватель событий, который бы уведомил меня, когда секвенсор обрабатывает определенный тик, но не AFAIK. Любые предложения будут ценны.
2 ответа
У меня мало идей о миди, но меня всегда интересовала компьютерная музыка, поэтому я немного осмотрелся и обнаружил, что, возможно, можно добавить MetaMessage к одному из треков в желаемом тике и использовать MetaEventListener, чтобы получать уведомления при получении сообщения. обрабатывается?
Я бы посоветовал вам уменьшить
getTickPosition() каждую миллисекунду
который = 1000 х секунд - это слишком часто. Вы можете уменьшить его в 100–10 раз в секунду. Это уменьшит загрузку процессора (до 1% от того, что есть в настоящее время?)
MIDI-сообщения синхронизации (при 120 бит / мин) имеют только два удара в секунду, что составляет (при 24 тактах на четвертную ноту) 1/50 секунды (20 мсек) для захвата интервалов суббитов - это то, что вам нужно сделать?
Лучшее решение может быть для Sequencer, чтобы сказать вам, когда он прибыл, но я не знаю, существует ли механизм для этого
Мне было бы интересно узнать, какое исправление работает для вас