Domanda

Ho bisogno di effettuare un programma nell'elaborazione che inverte un file caricato .mp3 , evitando già le funzioni astratte implementate (ad esempio, una funzione Minim che inverti un dato suono, anche se non ho ancora trovato tale). Ho provato molti modi ormai e ancora non gioca.

Il mio ultimo approccio utilizza la funzione Minim.loadFileIntoBuffer() per ottenere un float[] e quindi invertire il buffer utilizzando la funzione reverse() di elaborazione. Quindi crei un AudioSample con lo stesso array float e il formato del file originale. Procedo quindi per riprodurre il campione usando trigger().

Ecco uno snippet:

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

Ho anche provato alcune soluzioni diverse. Vale a dire l'importazione direttamente del file in un AudioSample. Il problema con la maggior parte dei modi in cui ho già usato, credo, è che posso accedere solo a un AudioBuffer, I.e. una parte dell'intero suono. Quindi, non riesco a invertire tutto.

Conosci qualche modo per farlo?

È stato utile?

Soluzione

OK Sono finalmente riuscito a farlo, da un processo più semplice.

Prendo i canali del campione originale e li manipolano direttamente.Innanzitutto, costruire un nuovo floatarray con le stesse dimensioni dei canali.Quindi, inserire i valori nell'originale utilizzando la stessa procedura.

È lontano dall'essere una bellissima implementazione ed è probabilmente più complesso di tempo, potrebbe essere.Ma fa il trucco, dal momento che ero limitato all'utilizzo di funzioni di alto livello implementate.

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];
  }  
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top