Модуляция музыкальной частоты: передача файла pcm .wav через AudioDevice в LibGDX или что-то похожее на изменение частоты музыки (не Pitch) - PullRequest
0 голосов
/ 17 мая 2019

*** Предыстория: я создал клавиатуру пианино с 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 (true);

И при повторном нажатии музыка останавливается.

*** Итак, как я могу модулировать частоты нот в файлах .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();
        }

}
...