题
我需要在处理中制作一个程序来反转加载的 .mp3 文件,避免已经实现的抽象函数(例如, Minim
反转给定声音的函数,尽管我还没有找到这样的)。目前我已经尝试了很多方法,仍然无法播放。
我的最后一种方法使用 Minim.loadFileIntoBuffer()
函数得到一个 float[]
然后我使用处理反转缓冲区 reverse()
功能。然后我创建一个 AudioSample
与相同的 float
数组和原始文件的格式。然后我继续使用以下命令播放示例 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
, IE。 整个声音的一部分。因此,我无法扭转这一切。
你知道有什么方法可以做到这一点吗?
解决方案
好吧,我最终通过一个更简单的过程成功做到了。
我获取原始样本的通道并直接操作它们。首先,构建一个新的 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];
}
}
不隶属于 StackOverflow