Invertire un suono con l'elaborazione e il minimo
-
26-12-2019 - |
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?
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 float
array 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];
}
}
.