質問
ロードされた .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
、 i.e。の一部にのみアクセスできることです。したがって、私はそれをすべて逆転させることはできません。
これを行う方法はわかりますか?
解決
OK私は最終的にそれを実行することができ、より単純なプロセスによって管理されています。
元のサンプルのチャンネルを入手し、私は直接それらを操作します。まず、チャンネルと同じサイズの新しいfloat
Arrayを構築します。その後、同じ手順を使用して、値を元の元に戻す。
それは美しい実装であることからはるかに多く、それはおそらくより多くの時間的な複雑であるかもしれません。しかし、私は実装された高レベル関数を使用しないことに限られていたのでそれはトリックをします。
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