문제
저는 Java로 오디오 신디사이저를 작성하려고 하는데, 그러한 프로그램을 작성하기 위한 조언이나 좋은 리소스가 있는지 궁금합니다.저는 원시 음파 생성, 이를 사용 가능한 형식(스피커를 통해 재생)으로 출력하는 방법 및 주제에 대한 일반 이론에 대한 정보를 찾고 있습니다.고마워요.
해결책
이 문제는 기본적으로 함수를 숫자 배열에 매핑하는 것에 관한 것입니다.여기서는 일류 기능을 지원하는 언어가 정말 유용할 것입니다.
확인해 보세요http://www.harmony-central.com/Computer/Programming 그리고http://www.developer.com/java/other/article.php/3071021 Java 관련 정보를 확인하세요.
사운드 데이터 인코딩의 기본 개념을 모른다면 다음을 읽으십시오. http://en.wikipedia.org/wiki/Sampling_rate
표준 WAVE 형식은 매우 간단합니다. http://www.lightlink.com/tjweber/StripWav/Canon.html.헤더(처음 44바이트) + 웨이브 데이터.이를 구현하는 데 라이브러리가 필요하지 않습니다.
C/C++에서 해당 데이터 구조는 다음과 같습니다.
typedef struct _WAVstruct
{
char headertag[4];
unsigned int remnantlength;
char fileid[4];
char fmtchunktag[4];
unsigned int fmtlength;
unsigned short fmttag;
unsigned short channels;
unsigned int samplerate;
unsigned int bypse;
unsigned short ba;
unsigned short bipsa;
char datatag[4];
unsigned int datalength;
void* data; //<--- that's where the raw sound-data goes
}* WAVstruct;
Java에 대해 잘 모르겠습니다."struct"를 "class"로, "void* data"를 "char[] data" 또는 "short[] data" 또는 "int[] data"로 대체해야 할 것 같습니다. 샘플은 bipsa 필드에 정의된 대로입니다.
데이터로 채우려면 C/C++에서 다음과 같은 것을 사용합니다.
int data2WAVstruct(unsigned short channels, unsigned short bipsa, unsigned int samplerate, unsigned int datalength, void* data, WAVstruct result)
{
result->headertag[0] = 'R';
result->headertag[1] = 'I';
result->headertag[2] = 'F';
result->headertag[3] = 'F';
result->remnantlength = 44 + datalength - 8;
result->fileid[0] = 'W';
result->fileid[1] = 'A';
result->fileid[2] = 'V';
result->fileid[3] = 'E';
result->fmtchunktag[0] = 'f';
result->fmtchunktag[1] = 'm';
result->fmtchunktag[2] = 't';
result->fmtchunktag[3] = ' ';
result->fmtlength = 0x00000010;
result->fmttag = 1;
result->channels = channels;
result->samplerate = samplerate;
result->bipsa = bipsa;
result->ba = channels*bipsa / 8;
result->bypse = samplerate*result->ba;
result->datatag[0] = 'd';
result->datatag[1] = 'a';
result->datatag[2] = 't';
result->datatag[3] = 'a';
result->datalength = datalength;
result->data = data; // <--- that's were the data comes in
return 0; // an error code, not implemented, yet ...; in Java: return result
}
다시 말하지만, Java에 대해서는 잘 모르겠지만 void 포인터를 비트 전송률에 해당하는 배열로 변환하면 변환이 간단해집니다.
그런 다음 전체 구조를 파일에 작성하면 재생 가능한 웨이브 파일을 얻을 수 있습니다.
다른 팁
확인해 보세요 프리니카.Java(오픈 소스)로 구현된 모든 기능을 갖춘 뮤직 워크스테이션입니다.API를 사용하면 신디사이저를 통해 midi 이벤트를 실행하고 원시 사운드 출력을 읽고 이를 WAV 파일에 쓸 수 있습니다(아래 소스 코드 링크 참조).
추가 정보:
학위 과정을 공부하는 동안 나의 논문 프로젝트는 Java 기반 모듈형 신시사이저를 만드는 것이었고, 내가 공부한 대학에서는 내 보고서를 공개적으로 공개하는 것이 적합하다고 판단했습니다.
도움이 될지는 모르겠지만 MIDI를 어떤 용도로든 사용할 수 있다면 확인해 보세요. JFuge.