Модуляция музыкальной частоты: передача файла 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();
        }

}

0 ответов

Другие вопросы по тегам