Frage

Ich muss in der Verarbeitung ein Programm erstellen, das einen geladenen Vorgang umkehrt .mp3 Datei, wobei bereits implementierte abstrakte Funktionen vermieden werden (z. B. a Minim Funktion, die einen bestimmten Ton umkehrt, obwohl ich eine solche noch nicht gefunden habe).Ich habe mittlerweile viele Möglichkeiten ausprobiert und es funktioniert immer noch nicht.

Mein letzter Ansatz verwendet die Minim.loadFileIntoBuffer() Funktion, um eine zu erhalten float[] und dann kehre ich den Puffer mithilfe von Processing um reverse() Funktion.Ich erstelle dann eine AudioSample mit dem gleichen float Array und das Format der Originaldatei.Anschließend spiele ich das Sample mit ab trigger().

Hier ist ein Ausschnitt:

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

Ich habe auch verschiedene Lösungen ausprobiert.Nämlich das direkte Importieren der Datei in eine AudioSample.Das Problem bei den meisten Methoden, die ich bereits verwendet habe, ist meiner Meinung nach, dass ich nur auf eine zugreifen kann AudioBuffer, d.h. ein Teil des Gesamtklangs.Daher kann ich nicht alles rückgängig machen.

Kennen Sie eine Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Ok, ich habe es schließlich geschafft, durch einen einfacheren Prozess.

Ich erhalte die Kanäle des Original-Samples und manipuliere sie direkt.Konstruieren Sie zunächst ein neues floatArray mit der gleichen Größe wie die Kanäle.Setzen Sie dann die Werte auf die gleiche Weise wieder in das Original ein.

Es ist alles andere als eine schöne Implementierung und wahrscheinlich zeitaufwändiger, als es sein könnte.Aber es funktioniert, da ich darauf beschränkt war, keine implementierten High-Level-Funktionen zu verwenden.

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];
  }  
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top