Pergunta

Preciso fazer um programa em Processing que reverta um carregado .mp3 arquivo, evitando funções abstratas já implementadas (por exemplo, um Minim função que inverte um determinado som, embora ainda não tenha encontrado).Já tentei de várias maneiras e ainda não funciona.

Minha última abordagem usa o Minim.loadFileIntoBuffer() função para obter um float[] e então eu inverto o buffer usando Processing's reverse() função.Eu então crio um AudioSample com o mesmo float array e o formato do arquivo original.Eu então prossigo para tocar a amostra usando trigger().

Aqui está um trecho:

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

Eu também tentei algumas soluções diferentes.Ou seja, importar diretamente o arquivo para um AudioSample.O problema com a maioria das formas que já usei, acredito, é que só consigo acessar um AudioBuffer, ou seja uma parte de todo o som.Assim, não posso reverter tudo.

Você conhece alguma maneira de fazer isso?

Foi útil?

Solução

Ok, finalmente consegui fazer isso, por meio de um processo mais simples.

Eu pego os canais do sample original e os manipulo diretamente.Primeiro, construa um novo floatmatriz com o mesmo tamanho dos canais.Em seguida, coloque os valores de volta no original usando o mesmo procedimento.

Está longe de ser uma implementação bonita e provavelmente é mais complexa em termos de tempo do que poderia ser.Mas funciona, já que eu estava limitado a não usar funções de alto nível 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top