簡體   English   中英

通過處理和最小化反轉聲音

[英]Reversing a sound with Processing and Minim

我需要在Processing中制作一個程序來反轉加載的.mp3文件,避免使用已經實現的抽象函數(例如,一個Minim函數,它反轉給定的聲音,盡管我還沒有找到)。 到目前為止,我已經嘗試了許多方法,但仍然無法正常運行。

我的最后一種方法是使用Minim.loadFileIntoBuffer()函數獲取float[] ,然后使用Processing的reverse()函數反轉緩沖區。 然后,我使用相同的float數組和原始文件的格式創建一個AudioSample 然后,我繼續使用trigger()播放示例。

這是一個片段:

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

我也嘗試了一些不同的解決方案。 即直接將文件導入AudioSample 我相信,我已經使用的大多數方法都存在問題,就是我只能訪問AudioBuffer整個聲音的一部分。 因此,我無法全部扭轉。

你知道這樣做嗎?

好的,我最終通過一個簡單的過程成功做到了。

我得到了原始樣本的通道,然后直接對其進行操作。 首先,構造一個與通道大小相同的新float數組。 然后,使用相同的步驟將值放回原始值。

這遠不是一個完美的實現,而且可能比它更復雜。 但這確實有用,因為我僅限於不使用任何已實現的高級功能。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM