Аудио программирование, создание гармонии

Я пытаюсь разработать приложение, похожее на tonematrix на C#. Я пробовал сначала с .net и библиотекой NAudio, теперь я пытаюсь с XNA, но похоже, что все, что я могу получить, это какофония.


С помощью NAudio я генерирую 8 простых синусоид с разными частотами от (440 Гц * 1) до (440 Гц * 8).

С XNA я использую несколько экземпляров SoundEffectInstance одного и того же аудиофайла (например, ноты D4 на фортепиано), каждый из которых имеет разное значение высоты тона; Значение высоты тона может увеличиваться или уменьшаться максимум на октаву.

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

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

У меня плохой подход к созданию гармонии? У вас есть представление о том, что именно происходит с синусоидами, используемыми тональной матрицей?


person vainheim    schedule 18.06.2011    source источник
comment
Вы устанавливаете высоту тона на что-то другое, кроме 12 полутонов?   -  person Ignacio Vazquez-Abrams    schedule 18.06.2011
comment
В NAudio все частоты кратны 440 Гц. В XNA интервал основного тона (-1 1) разделен на 17 звуков, поэтому должен быть нормальный звук, 8 верхних полутонов и 8 нижних, заполняющих верхнюю и нижнюю октаву.   -  person vainheim    schedule 18.06.2011


Ответы (2)


У меня есть возможность ответить на ваши вопросы о музыке, но такие вопросы, вероятно, лучше задавать на https://music.stackexchange.com/.

Прежде всего масштаб. Эти вещи обычно используют пентатонику (из Википедии: "любая высота тона такой гаммы может быть воспроизводится в любом порядке или комбинации без конфликтов»). Согласно комментариям, в приведенном вами примере используется ре мажорная пентатоника от A до A.

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

Насколько я могу судить, он не делает ничего особенного при микшировании волновых форм. Скорее всего, он делает простое сложение.

Что касается реализации, если у вас есть метод генерации синусоидальных волн, а не попытка сдвига высоты тона сэмпла, почему бы не использовать DynamicSoundEffectInstance и не подать на него свою синусоидальную волну?

Встроенное в XNA изменение высоты тона не совсем подходит для этой задачи. Вы уверены, что используете правильные значения для настройки?

person Andrew Russell    schedule 18.06.2011
comment
Похоже, что XNA SoundEffect не является хорошим выбором даже для прототипа, так как метод Play кажется чрезвычайно тяжелым, а звуки, которые должны начать играть вместе, на самом деле имеют задержку между ними. Я собираюсь применить всю информацию к потокам NAudio или к DynamicSoundEffectInstance, спасибо за различные советы и информацию. - person vainheim; 18.06.2011

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

person Mark Heath    schedule 19.06.2011