문제

저는 Java로 오디오 신디사이저를 작성하려고 하는데, 그러한 프로그램을 작성하기 위한 조언이나 좋은 리소스가 있는지 궁금합니다.저는 원시 음파 생성, 이를 사용 가능한 형식(스피커를 통해 재생)으로 출력하는 방법 및 주제에 대한 일반 이론에 대한 정보를 찾고 있습니다.고마워요.

도움이 되었습니까?

해결책

  1. 이 문제는 기본적으로 함수를 숫자 배열에 매핑하는 것에 관한 것입니다.여기서는 일류 기능을 지원하는 언어가 정말 유용할 것입니다.

  2. 확인해 보세요http://www.harmony-central.com/Computer/Programming 그리고http://www.developer.com/java/other/article.php/3071021 Java 관련 정보를 확인하세요.

  3. 사운드 데이터 인코딩의 기본 개념을 모른다면 다음을 읽으십시오. http://en.wikipedia.org/wiki/Sampling_rate

  4. 표준 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 기반 모듈형 신시사이저를 만드는 것이었고, 내가 공부한 대학에서는 내 보고서를 공개적으로 공개하는 것이 적합하다고 판단했습니다.

Java의 소프트웨어 기반 모듈식 합성기

도움이 될지는 모르겠지만 MIDI를 어떤 용도로든 사용할 수 있다면 확인해 보세요. JFuge.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top