Модуляция музыкальной частоты: передача файла pcm .wav через AudioDevice в LibGDX или что-то похожее на изменение частоты музыки (не Pitch)
*** Справочная информация: я создал клавиатуру пианино с 31 клавишами в Intellij Idea с LibGDX. Я создал музыкальный файл, содержащий.wav для КАЖДОЙ клавиши (18 белых клавиш, 13 черных клавиш). Пианино было визуально создано с использованием таблиц для представления каждой клавиши (с черным над белым).
Поэтому, когда кто-то нажимает на самую нижнюю клавишу, которая здесь представляет собой F2, будет воспроизводиться соответствующий файл "2F.wav", который представляет собой сэмплированную ноту PolySaw F2.
*** Теперь моя цель и проблема, с которой я столкнулся:
*** Цель: я добавил ползунок под клавишами пианино. Ползунок должен иметь возможность модулировать частоту каждой ноты или нот, которые воспроизводятся. Перемещение слайдера ниже (его вертикаль) должно сделать звучание нот более басовым, обрезая верхние и средние частоты. В середине, это будет просто вырезать максимумы и оставить средние, низкие и низкие частоты. Все время сэмпл воспроизводится как обычно, со всеми высокими частотами.
Так что сейчас я не беспокоюсь о ползунке настолько, насколько просто пытаюсь закодировать способ повлиять на частоту воспроизведения любого файла wav для каждой ноты. Я думал об использовании AudioDevice, я просто смущен этим и не понимаю, как ввести.wav в него, когда он запрашивает "шорты" или "плавает" в качестве 1-го аргумента. Я пытаюсь лучше понять, как Audio работает в LibGDX и с точки зрения разработки под Android, поэтому приведенный ниже код является примером (не МОЙ код, а то, что я использую для изучения), который я использую, чтобы узнать о AudioDevices, AudioRecorder, Audio и, самое главное, модулирующие частоту.
*** Проблема: мне нужно знать, что является лучшим методом / алгоритмом кодирования для чтения внутренних файлов WAV и воспроизведения их с заданной частотой от 20 до 20000. Я не хочу изменять высоту нот.wav при их воспроизведении / щелчке (они также настроены на циклическое воспроизведение, поэтому при нажатии клавиши она воспроизводится до повторного нажатия), я хочу только изменить частоту таким образом, что сначала постепенно удаляются верхние частоты, затем средние частоты, затем низкие частоты, затем низкие частоты и, в конце концов, все частоты удаляются, как только ползунок достигает дна. И наоборот, при скольжении вверх эти частоты добавляются обратно (при скольжении вверх добавляются суб-бас, бас, середина, а затем максимумы). Все 31 WAV-файлы (по одному на каждую заметку) в моих ресурсах упоминаются с использованием типа переменной Music, поэтому при нажатии на заметку активируется следующий код:
music.play (); music.setLooping (истина);
И при повторном нажатии музыка останавливается.
*** Так как я могу модулировать частоты заметок в файлах.wav в моей программе Intellij/LibGDX? Есть ли лучшая техника, чем использование AudioDevice? Если это так, пожалуйста, пришлите мне в правильном направлении. Если создание AudioDevice[s] работает лучше всего, как мне ввести wav-файл в AudioDevice, чтобы изменить частоту? Пример того, как сделать это вручную в коде, был бы идеальным (то есть, я имею в виду: я сам настраиваю разные частоты, жестко программируя их, а не используя ползунок или позволяя пользователю контроллера изменять частоту). Тогда я уверен, что смогу выяснить, как сделать частоту модулированной пользователем, используя ползунок, связанный с значениями частоты, как только я пойму, КАК писать код для изменения пределов частоты для данного файла.wav.
Большое спасибо за помощь. Это просто стандартная программа для Android, я использую Desktop Launcher Atm, и это все, что мне нужно для работы.
//This is NOT THE CODE for my program. It is coded example of AudioDevice, //AudioRecorder, etc, use and how they work. I just need to learn to apply //frequency modulation/alter-ability to my program and I figured maybe this code //would help.
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Audio;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.AudioDevice;
import com.badlogic.gdx.audio.AudioRecorder;
import sun.audio.AudioData;
public class PcmExample extends ApplicationAdapter {
/** used to signal thread to stop **/
private volatile boolean done;
@Override
public void dispose() {
// stop thread when app closes
done = true;
}
@Override
public void create() {
// create and start a thread where we do the audio processing
new Thread(new Runnable() {
@Override
public void run() {
// create an AudioDevice, to output mono, 44.1khz PCM data
AudioDevice device = Gdx.audio.newAudioDevice(44100, false);
//AudioData audioData = new AudioData();
// create an AudioRecorder, to record mono, 44.1khz PCM
data
AudioRecorder recorder = Gdx.audio.newAudioRecorder(44100, false);
//Audio audio = Gdx.audio.
// we need a buffer of shorts to store the recorded data
// and pass it to the device. This equals 1/10th
// of a second of PCM data.
short[] pcmBuffer = new short[4410];
// read data from the recorder, push it to the device
// until app is closed
while(!done) {
recorder.read(pcmBuffer, 0, pcmBuffer.length);
//recorder.
device.writeSamples(pcmBuffer, 0, pcmBuffer.length);
}
// native resources need to be diposed!
device.dispose();
recorder.dispose();
}
}).start();
}
}