Две последовательные миди-ноты одной и той же высоты ведут себя неправильно

В настоящее время я пишу программу на хаскеле, которая имитирует игру гитариста-человека и выдает события Midi. В качестве гитары я использую сэмплированный Telecaster на Fluidsynth/Qsynth.

Чтобы имитировать слайд-ап, я использую изменение высоты тона, но я также хотел добавить немного «щипка», когда палец перемещается по ладу. К моему удивлению, я должен был понять, что когда я играю две последовательные ноты одинаковой высоты по одному и тому же каналу, вторая нота заглушает первую.

Это ожидаемое поведение? Это то, что вы ожидаете от стандарта Midi? Или Fluidsynth плохо себя ведет?

Если это Fluidsynth, кто-нибудь знает, что я могу сделать, чтобы убедиться, что NOTE_ON означает NOTE_ON, а не NOTE_OFF, за которым следует NOTE_ON?

Ваш виртуальный инструмент может пытаться имитировать настоящую гитару. Хотя это прежде всего фортепианное поведение.

Ответы (3)

Это довольно часто. Мой синтезатор тоже так делает.

Перекрывающиеся ноты — это серая область в миди.

Но большинство синтезаторов выполняют неявную ноту, когда нота появляется на этом канале.

Если вы хотите, чтобы он оставался включенным, поместите их на отдельные каналы. Обычно это помогает.

Миди в первую очередь предназначен для фортепиано. И вы найдете множество обозначений, которые показывают аккорд для всего такта с перекрывающимися нотами мелодии.

Итак, как только вы играете ноту мелодии на той же ноте, что и аккорд... Ну, у пианино есть одна клавиша для воспроизведения этой ноты, поэтому ее нужно приглушить, прежде чем вы сможете услышать перекрывающуюся.

Обычно гитара делается поверх миди: у вас есть канал для каждой гитарной струны.

Да, я использую один канал на строку, но это не избавило меня от этой конкретной проблемы. Если у вас есть какие-либо другие (т.е. не миди) идеи о том, как создавать гитарные звуки, я был бы рад услышать о них.
о, да. хм. Итак, ситуация такова, что у вас есть аккорд, скажем, C, E, G, играемый для такта с арпеджио, скажем, во 2-й четвертной ноте на каждой ноте для одного и того же C, E, G, верно? Если вы думаете о том, как бы вы играли это вживую, ноты арпеджио должны были бы подобрать оставшуюся длительность перекрывающегося аккорда. Так что я думаю, если вы хотите короткие перекрывающиеся ноты, вам понадобится 2 канала для каждой гитарной струны, если вы не хотите беспокоиться о том, как это будет играться вживую. Один канал для строки и другой канал для перекрытий одной и той же строки.
Я не думаю, что перекрывающиеся ноты — это особенно серая зона. Комбинация (номер канала + номер ноты) является единственным средством обозначения отдельных нот, подлежащих отмене; таким образом, если будет необходимо отменить одну ноту на заданной высоте, поддерживая другую, две ноты должны быть на разных каналах.
@StephenHazel: контроллер сустейна работает в некоторых ситуациях.

Я не совсем уверен, что понимаю, что происходит, но я уже сталкивался с подобными вещами раньше. Если вы пытаетесь скользить в ноту, вы можете использовать соседнюю ноту, изгибая ее. Таким образом, если вы скользите вверх до G, вместо того, чтобы использовать изменение высоты тона, чтобы G начиналась с мимоля и поднималась вверх, вы могли бы использовать F#, начинающуюся с диеза, и подтягивать ее вверх к G, а затем атаковать G.

Ответ Стивена очень хорош и обеспечивает гораздо более широкое решение проблемы с MIDI-гитарой, но может потребовать небольшой дополнительной работы и более глубокого понимания. Я немного не уверен, как это будет запрограммировано и сможете ли вы эффективно зафиксировать производительность с помощью контроллера, т.е. может быть намного больше программирования.

Что ты имеешь в виду под словом "выщипывать"? Почему нужно снова запускать заметку?

Я предполагаю, что вы имеете в виду изменение звука, которое вызывает скольжение по ладу. Я думаю о динамике слайда, и на самом деле нет особого смысла моделировать его как новую заметку. Думаю, имеет больше смысла думать об этом как об изменении текущего звука, а не как о новом звуке.

То, что делает скольжение по ладу, немного возбуждает струну, но добавляет к текущему состоянию огибающей звука. Вот почему имеет смысл думать об этом как об изменении амплитуды, быстром вверх и более медленном вниз.

Вы можете модулировать звук так, чтобы он менялся, когда он достигает состояния «щипка». Возможно, вам действительно нужна более высокая амплитуда в состоянии «щипка» и более низкая амплитуда, когда звук проходит состояние «щипка».

В состоянии скольжения каждое изменение полутона (каждый раз, когда слайд проходит через лад) должно запускать модуляцию, может быть, огибающую или, может быть, один цикл обратного пилообразного LFO, который формирует динамику амплитуды (и, возможно, тембра?) как скользить по ладу.

Действительная точка. Вы знаете, как я мог добиться этого с помощью миди? Громкость и тембр можно регулировать с помощью контроллеров. Но как насчет конверта? А что, если струна в данный момент не звучит? Я все еще слышал бы шум ладов («щипок»).
@MartinDrautzburg Огибающая (или другая модуляция по вашему выбору) может применяться путем умножения. Если струна в данный момент не звучит, амплитуда будет равна 0, поэтому любая модуляция приведет к изменению амплитуды на 0. Шум ладов не будет слышен, если струна в данный момент не звучит.
@MartinDrautzburg Я не знаю специфики инструментов, которые вы используете (программа haskell или синтезатор), поэтому я не знаю о доступных вам механизмах общения. Что вам нужно, так это MIDI-сообщения, которые запускают события в синтезаторе, которые запускают изменения амплитуды и/или тембра. Возможно, инструменты, которые у вас есть, не предоставляют эти возможности.
@MartinDrautzburg Вы также можете использовать новые создаваемые звуки, но новая огибающая будет частью исходной огибающей во время слайда. Таким образом, каждое изменение полутона во время состояния слайда будет генерировать внезапное увеличение амплитуды, но немного ниже каждый раз, когда будет достигнут новый лад, имитируя потерянную энергию струны, в отличие от того, когда вы возбуждаете струну, защипывая ее.
Я ожидаю, что любой разумный перевод гитары на MIDI должен использовать один канал на струну. Если кто-то сделает это, хаммеровые включения, пулл-оффы и т. д. могут быть выполнены либо с помощью различных комбинаций регуляторов портаменто и высоты тона, либо путем обозначения определенных значений динамической чувствительности как имеющих «специальное» значение (так, например, «нота на» скорость, равная 2, будет представлять собой ладовый палец, который не сопровождается щипком).
@supercat Все мои предложения основаны на этом предположении.