На самом деле в Java есть что-то вроде этого. Вам просто нужно понять, что сам звук этого не делает. Если вы просто установите положение динамика на одно значение и оставьте его, вы услышите максимум короткий импульс, а затем ничего.
Если вы хотите, чтобы он делал шум, он должен был двигаться. Поэтому вы не просто устанавливаете одну позицию. Вы устанавливаете связку, изменяя значение с течением времени. Вот пример:
/** Generates a tone.
@param hz Base frequency (neglecting harmonic) of the tone in cycles per second
@param msecs The number of milliseconds to play the tone.
@param volume Volume, form 0 (mute) to 100 (max).
@param addHarmonic Whether to add an harmonic, one octave up. */
public static void generateTone(int hz,int msecs, int volume, boolean addHarmonic)
throws LineUnavailableException {
float frequency = 44100;
byte[] buf;
AudioFormat af;
if (addHarmonic) {
buf = new byte[2];
af = new AudioFormat(frequency,8,2,true,false);
} else {
buf = new byte[1];
af = new AudioFormat(frequency,8,1,true,false);
}
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl = AudioSystem.getSourceDataLine(af);
sdl.open(af);
sdl.start();
for(int i=0; i<msecs*frequency/1000; i++){
double angle = i/(frequency/hz)*2.0*Math.PI;
buf[0]=(byte)(Math.sin(angle)*volume);
if(addHarmonic) {
double angle2 = (i)/(frequency/hz)*2.0*Math.PI;
buf[1]=(byte)(Math.sin(2*angle2)*volume*0.6);
sdl.write(buf,0,2);
} else {
sdl.write(buf,0,1);
}
}
sdl.drain();
sdl.stop();
sdl.close();
}
От https://community.oracle.com/thread/1273219
SourceDataLine.write()
используется здесь не сильно отличается от Speaker.setPosition()
вы воображаемого. Массив байтов (или только один байт при выключении гармоники) записывается в SourceDataLine каждый раз, когда он петли. Величина байта равна амплитуде. В этом случае он колеблется от -100 до 100. Позиция, которую использует динамик, будет прямо пропорциональна этому значению в идеальном динамике. В реальной динамиком это с учетом физической спикеры частотной характеристики:
Частотная характеристика идеального оратора была бы горизонтальная линия от 0 Гц до бесконечности. Если вы играете музыку для собак или горбатых китов, это может быть проблемой. Для большинства людей, хотя это достаточно близко к идеалу для того, что мы способны слышать. Особенно, если вы добавите немного основания и высоких частот, чтобы сгладить его. Тем не менее, это означает, что ваша способность контролировать положение динамика точно ограничена диапазоном частот.
В приведенном выше списке они используют математику для создания очень простого тона звука. В частности, синусоида. Это не будет потрясающе. На самом деле это звучит так, как вы слышите, когда слушаете тест на слух. Но верьте или нет, все, что вы когда-либо слышали, - это действительно много простых звуков, подобных этому. Вот что учит нас http://en.wikipedia.org/wiki/Fourier_transform.
generateTone()
метод из списка выше, будет в том, что анализ Фурье называет Frequency Domain. Здесь звуковой сигнал определяется на основе частоты (ов). Математика внутри generateTone()
преобразует это определение в Time Domain. Здесь аудиосигнал определяется в зависимости от позиций в любой момент времени.SourceDataLine.write()
просит, чтобы положение динамиков было поднято до определенного положения.
Таким образом, способ формирования вашего вопроса: какие методы java управляют звуком из домена времени? SourceDataLine.write()
является лишь одним из многих, которые работают таким образом. Любой метод, который может воспроизводить sampled audio (записанный с помощью микрофона), работает во временном домене. В любой момент времени он имеет желаемое значение для положения динамиков.
Другие аудио API, такие как MIDI, работают в частотной области. Когда вы нажимаете конкретный ключ на фортепиано, вы просите частоты. Есть детали, которые усложняют это (гармоники, атака, сустейн и т. Д.), Но это основная идея. Попытка построить интересные звуки из математики, как показано выше, - это то, что делают синтезаторы.
Существуют и другие аудиоформаты, в которых байт непосредственно не отражает положение динамика в определенное время. Некоторые делают компрессию. Некоторые из них потеряли. Но, безусловно, существует много аудиоформатов, в которых байт непосредственно отражает положение динамиков. У них есть частота дискретизации, которая просто показывает, как часто измерялась позиция.
В любом случае все это должно в конечном итоге перевести на то, чтобы диафрагма динамиков попала в определенное положение в определенное время.
Java работает примерно на шесть уровней абстракции над контролем громкоговорителей, который работает на магнитных полях, а не непосредственно на позиции динамика. – chrylis