Question

J'ai besoin de créer un programme en traitement qui inverse un fichier chargé .mp3 fichier, en évitant les fonctions abstraites déjà implémentées (par exemple, un Minim fonction qui inverse un son donné, même si je n'en ai toujours pas trouvé).J'ai déjà essayé de nombreuses façons et ça ne fonctionne toujours pas.

Ma dernière approche utilise le Minim.loadFileIntoBuffer() fonction pour obtenir un float[] puis j'inverse le tampon en utilisant Processing reverse() fonction.Je crée ensuite un AudioSample avec le même float tableau et le format du fichier d'origine.Je passe ensuite à la lecture de l'échantillon en utilisant trigger().

Voici un extrait :

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

J'ai également essayé différentes solutions.A savoir importer directement le fichier dans un AudioSample.Le problème avec la plupart des méthodes que j'ai déjà utilisées, je crois, est que je ne peux accéder qu'à un AudioBuffer, c'est à dire. une partie de l'ensemble du son.Je ne peux donc pas tout inverser.

Connaissez-vous un moyen de procéder?

Était-ce utile?

La solution

Ok, j'ai finalement réussi à le faire, par un processus plus simple.

Je récupère les canaux du sample original et je les manipule directement.Tout d’abord, construisez un nouveau floattableau de la même taille que les canaux.Ensuite, remettez les valeurs dans l’original en utilisant la même procédure.

C'est loin d'être une belle implémentation et c'est probablement plus complexe en termes de temps qu'il ne pourrait l'être.Mais cela fait l'affaire, puisque j'étais limité à n'utiliser aucune fonction de haut niveau implémentée.

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];
  }  
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top