Аудио программирование, генерирующее гармонию - PullRequest
3 голосов
/ 18 июня 2011

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


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

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

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

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

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

Ответы [ 2 ]

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

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

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

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

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

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

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

1 голос
/ 19 июня 2011

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

...