Воспроизвести непрерывный звук, похожий на термен на MIDI - PullRequest
0 голосов
/ 24 июня 2011

Я пытаюсь создать программу, похожую на термен , которая воспроизводит непрерывные ноты в зависимости от положения курсора мыши.Для этого я использую библиотеку MIDI Tools Карла Франклина.

Это фрагмент кода, который я использую для воспроизведения нот.

byte pitch = 0;
while (exit == false)
{
    byte newpitch = (byte)(32 + ((float)Cursor.Position.X / (float)SystemParameters.PrimaryScreenWidth) * 64);

    if (newpitch != pitch)
    {
        instrument.StopNote(pitch,0);
        instrument.PlayNote(newpitch, 53);
        pitch = newpitch;
    }
};

Проблема в том, чтоноты, которые разыгрываются таким образом, звучат отчетливо;есть четкий переход от одной ноты к другой.

Как мне воспроизводить непрерывный звук, похожий на термен, который непрерывно меняет высоту тона?

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Эта проблема не имеет ничего общего с MIDI, и больше связана с синтезатором, генерирующим звук.

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

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

В зависимости от синтезатора, вы можете регулировать его диапазон изменения высоты звука, используя RPN для чувствительности изменения высоты звука. Вы можете прочитать об этом здесь: http://www.hoofjaw.com/forums/Topic946-32-1.aspx#bm1254

Или здесь: http://www.philrees.co.uk/nrpnq.htm

2 голосов
/ 24 июня 2011

Вы должны быть в состоянии сделать это с событием изменения колеса тангажа MIDI.

  • Первый байт - 0xE0 + номер канала MIDI (0 означает канал 1)
  • Второй и третий байты являются значением изменения колеса тангажа. 0x2000 означает в середине, 0x4000 - максимум (часто интерпретируется как +2 полутона, но секвенсор может делать то, что ему нравится с этим сообщением).

Под капотом вполне вероятно, что Карл просто использует midiOutShortMsg для отправки сообщения, в котором три байта преобразуются в DWORD. Возможно, он использует метод, позволяющий вам отправлять DWORD напрямую, если у него нет функции отправки изменения высоты тона.

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

 int pitch = 0x2000; // no pitch change
 byte byte2 = (byte)(pitch & 0x7f));
 byte byte3 = (byte)((pitch >> 7)& 0x7f));
 int shortMessage = 0xE0 + (channelNumber - 1) + (byte2 << 8) + (byte3 << 16);
1 голос
/ 24 июня 2011

Это было давно, но я помню, что MIDI обладает способностью отображать смещение высоты тона, например, вращение колеса изменения высоты тона на MIDI-контроллере (синтезаторе или клавиатуре) передается через MIDI.Вы можете использовать этот тип сообщения для изменения высоты звука постоянно воспроизводимой ноты.

...