2012-05-23 3 views
7

Я делаю некоторую работу с binaural beats и пытаюсь построить приложение Java, которое может воспроизводить два звука на немного различных частот ... вокруг разницы 25-30Hz.В Java, есть ли способ синтезировать тон определенной частоты?

В идеальном мире я хотел бы дать Java два целочисленных входа, скажем, 440 и 410, и воспроизвести Java 440Hz тон и 410Hz тон.

Учитывая, что я видел в классах javax.sound.*, кажется, что Java поддерживает только эквиваленты фортепианных заметок ... A4 @ 440Hz, затем A-sharp-4 @ 466.164Hz, а в другом направлении G -sharp-4 @ 415,305 Гц. В то время как «смежные», как правило, находятся в пределах диапазона для создания бинаурального ритма, я пытаюсь добиться большего контроля в частоте моих тонов.

С простого аудио синтеза является не более, чем частота, интенсивность и длиной от времени, было бы появляться мне, что где-то в недрах javax.sound.* классов, есть какое-то поиск, который говорит, когда я говорю Java для воспроизведения «A4», это 440 Гц. Вопрос заключается в том, есть ли способ взломать эту таблицу, чтобы сказать, что «A4.1» является эквивалентом 449 Гц.

Я уже возился с javax.sound.midi, еще не изучил javax.sound.sampled; кажется, что мне нужно будет пробовать мои тона для использования классов sampled; Я предпочитаю синтезировать. Держите меня прямо, если я ошибаюсь.

Большинство сторонних интерфейсов, которые я видел, ориентированы конкретно на производство музыки и манипуляции и, как таковые, ограничены в своей способности работать с микротонами. Есть ли у кого-нибудь опыт или рекомендации для решения?

+0

Вы используете 'javax.sound.midi' или' javax.sound.sampled'? –

+0

@LaurenceGonsalves Я возился с 'midi', еще не исследовал' sampled'; кажется, что мне нужно будет пробовать мои тона использовать классы sampled; Я предпочитаю синтезировать. Держите меня прямо, если я ошибаюсь. – dwwilson66

+0

Я бы не ожидал, что midi обеспечит почти точный контроль. Это больше подразумевается как интерфейс управления между различными устройствами и имеет ограниченное количество доступных нот. –

ответ

5

Вы можете сгенерировать образцы и отправить их на звуковую карту, используя классы в javax.sound.sampled.*; в основном создают программный осциллятор.

Это требует некоторых знаний, но может быть очень весело, когда вы получите его на работу;)

я играл с этим классифицировано, когда я создал это: http://bobusumisu.net/testing/bobusynth-alpha1/

Вот учебник, который получил меня начались : http://www.drdobbs.com/jvm/230500178

+0

Аккуратное приложение для синтеза! javax.sound.sampled - это, безусловно, путь. Спасибо за ссылку на учебник, я с нетерпением жду его детального изучения. Кстати, когда я играл на синтезаторе, я «застрял» на треугольной волне. Другие ручки работали хорошо для меня, хотя. –

4

Это просто дополнение к уже предоставленному и принятому ответу (который я дал +1).

Вы можете использовать wavetables как альтернативу запускам триггерных функций на лету - сорт полусэмплированных/полусинтезированных. Я также использую таблицу синусоидальной волны с шестью независимыми курсорами, указывающими на нее для синтеза FM, и дублировал несколько патчей Yamaha DX7 таким образом. Но все это делается через javax.sound.sampled. После того, как был создан программный синтезатор, вы можете контролировать его с помощью классов библиотеки midi.

Предположим, вы заселяете массив 1К с поплавками для синусоидальной волны.

Если вы «играете» волновую таблицу, увеличивая и перебирая ее и извлекая каждый элемент массива поочередно (для записи на звуковую карту через SourceDataLine), вы получите высоту, непосредственно связанную с частотой дискретизации. Для 44100 выборок в секунду, массив из 1024 элементов будет циклически выполнять 44100/1024 = 43.066 ... раз, чтобы заполнить эту «вторую» данными (очень низкий шаг - примерно 43 Гц). Если вы пропустите каждый второй элемент таблицы, шаг будет вдвое больше и т. Д.Чтобы получить шаг 440, нужно найти правильный «приращение», чтобы использовать для шага по массиву волновых таблиц, который можно найти: incr = (размер waveTable * желаемый шаг)/частота дискретизации

Например, (1024 * 440)/44100 дает приращение: 10.21678 ... Таким образом, если первое значение из waveTable находится в местоположении массива 0, второе значение, которое будет использоваться, будет находиться между местоположениями 10 и 11. Чтобы получить значение, которое находится между двумя ячейками массива, использует линейную интерполяцию.

Я использую этот метод с библиотеками javax.sound.sampled для «Термен» по этой ссылке. На клавиатуре отображается клавиатура, но вы можете легко слышать/видеть микротональное управление при перемещении мыши по клавишам.

http://www.hexara.com/VSL/JTheremin.htm

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

return Math.pow(2, ((mouseX + tuningLoc)/(octaveWidth))); 

, где octaveWidth это количество пикселей, которое охватывает октаву.

+0

@philfreihofer - обморок. Я играю на терменве, и я пытаюсь взломать датчик движения xbox kinect для создания входов для программного обеспечения. Эта ссылка просто скалы. Ты дал мне кое-что, чтобы поболтать с этими выходными. Волновой стол - интересная идея. :) – dwwilson66

+0

Рад слышать, что вы наслаждаетесь ссылкой! : D Я должен упомянуть, есть некоторые сложности в обработке потока событий при управлении объемом/шагом, которые я не полностью «решил», - но реализация по-прежнему довольно хороша с точки зрения быстроты реагирования. (Java не предоставляет гарантии «реального времени».) Я рад предоставить дополнительную информацию, когда вы туда доберетесь. Довольно круто, что у вас есть и играйте в Термен! Вы являетесь первым игроком в теменме, чтобы дать мне обратную связь, и я рад услышать предложения. –

 Смежные вопросы

  • Нет связанных вопросов^_^