Обращение звука вспять с обработкой и минимизацией

StackOverflow https://stackoverflow.com//questions/23060784

  •  26-12-2019
  •  | 
  •  

Вопрос

Мне нужно создать программу в процессе обработки, которая переворачивает загруженный .mp3 файл, избегая уже реализованных абстрактных функций (например, a Minim функция, которая изменяет заданный звук на противоположный, хотя я до сих пор не нашел такой).Я уже перепробовал много способов, но это все еще не срабатывает.

Мой последний подход использует Minim.loadFileIntoBuffer() функция для получения float[] и затем я переворачиваю буфер, используя Processing's reverse() функция.Затем я создаю AudioSample с тем же float массив и формат исходного файла.Затем я продолжаю воспроизводить сэмпл, используя trigger().

Вот фрагмент:

Minim minim;
AudioPlayer songPlayer;
MultiChannelBuffer song;
AudioSample reversedSong;
float[] reversedBuffer, mixBuffer;

void setup() {
  size(512, 200);
  minim = new Minim(this);

  songPlayer = minim.loadFile("sound.mp3");

  // loadFileIntoBuffer changes the MultiChannelBuffer's parameters to
  // match the file's, so init values doesn't really matter
  song = new MultiChannelBuffer(10, 3);
  minim.loadFileIntoBuffer("sound.mp3", song);

  mixBuffer = songPlayer.mix.toArray();
  reversedBuffer = reverse(mixBuffer);

 reversedSong = minim.createSample(reversedBuffer, songPlayer.getFormat());
 reversedSong.trigger();
} 

Я также попробовал несколько различных решений.А именно прямой импорт файла в AudioSample.Я полагаю, проблема с большинством способов, которые я уже использовал, заключается в том, что я могу получить доступ только к AudioBuffer, т. е. часть всего звука.Таким образом, я не могу обратить все вспять.

Знаете ли вы какой-нибудь способ сделать это?

Это было полезно?

Решение

Хорошо, в конце концов мне удалось сделать это с помощью более простого процесса.

Я получаю каналы оригинального сэмпла и напрямую манипулирую ими.Во-первых, постройте новый floatмассив того же размера, что и каналы.Затем верните значения в исходное состояние, используя ту же процедуру.

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

void revert() {
  /* sample is an AudioSample, created in setup() */
  float[] leftChannel = sample.getChannel(AudioSample.LEFT);
  float[] rightChannel = sample.getChannel(AudioSample.RIGHT);

  float[] leftReversed = new float[leftChannel.length];
  float[] rightReversed = new float[rightChannel.length];

  int size = leftChannel.length-1;

  /*inverts the array*/
  for(int i=0; i<=size; i++){
    leftReversed[i] = leftChannel[size-i];
    rightReversed[i] = rightChannel[size-i];
  }
  /*copies it to the original array*/
  for(int i=0; i<size; i++){
    leftChannel[i] = leftReversed[i];
    rightChannel[i] = rightReversed[i];
  }  
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top