Pregunta

Necesito hacer un programa en Processing que invierta una carga .mp3 archivo, evitando funciones abstractas ya implementadas (por ejemplo, un Minim función que invierte un sonido determinado, aunque todavía no lo he encontrado).Ya lo he intentado de muchas maneras y todavía no funciona.

Mi último enfoque utiliza el Minim.loadFileIntoBuffer() función para obtener un float[] y luego invierto el buffer usando Processing reverse() función.Luego creo un AudioSample con el mismo float matriz y el formato del archivo original.Luego procedo a reproducir la muestra usando trigger().

Aquí hay un fragmento:

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();
} 

También probé algunas soluciones diferentes.Es decir, importar directamente el archivo a un AudioSample.Creo que el problema con la mayoría de las formas que ya he usado es que solo puedo acceder a una AudioBuffer, es decir. una parte del sonido total.Por lo tanto, no puedo revertirlo todo.

¿Conoces alguna forma de hacer esto?

¿Fue útil?

Solución

Ok, finalmente logré hacerlo mediante un proceso más simple.

Obtengo los canales de la muestra original y los manipulo directamente.Primero, construir un nuevo floatmatriz del mismo tamaño que los canales.Luego, vuelva a colocar los valores en el original utilizando el mismo procedimiento.

Está lejos de ser una implementación hermosa y probablemente sea más compleja en términos de tiempo de lo que podría ser.Pero funciona, ya que estaba limitado a no utilizar funciones de alto nivel implementadas.

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];
  }  
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top