문제
로드된 내용을 되돌리는 처리 프로그램을 만들어야 합니다. .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
, 즉. 전체 소리의 일부.따라서 모든 것을 되돌릴 수는 없습니다.
이 작업을 수행하는 방법을 알고 있나요?
해결책
좋아, 나는 결국 더 간단한 과정을 통해 그 일을 해냈습니다.
원본 샘플의 채널을 가져와 직접 조작합니다.먼저, 새로운 건물을 건설하세요. 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