나는 C에서 레트로 스타일 게임을위한 엔진을 개발 중입니다. 코드에서 칩 사운드를 생성하는 사운드 라이브러리를 찾고 있습니다 ... 엔진이 음악을 만들 수있는 간단한 칩 튠 추적기를 만들고 싶습니다. 그런 것이 있습니까?
또한 프로젝트에서 .nsf 파일을 사용하는 라이브러리에 관심이 있습니다.
개발을 위해 Linux를 사용하고 있습니다.
나는 C에서 레트로 스타일 게임을위한 엔진을 개발 중입니다. 코드에서 칩 사운드를 생성하는 사운드 라이브러리를 찾고 있습니다 ... 엔진이 음악을 만들 수있는 간단한 칩 튠 추적기를 만들고 싶습니다. 그런 것이 있습니까?
또한 프로젝트에서 .nsf 파일을 사용하는 라이브러리에 관심이 있습니다.
개발을 위해 Linux를 사용하고 있습니다.
답변:
아마도 정답은 아니지만 다양한 오디오 엔진 라이브러리가 있습니다.
(오디오 라이브러리의 두 번째 세그먼트로 스크롤)
12 개 엔진 중 9 개 이상이 C와 함께 제공됩니다. 이들 중 대부분은 트래커 파일도 지원합니다. nsf (이것은 NES 음악 파일이라고 가정합니다) 파일과 크게 다르지 않습니다.
물론 "좋은"소리를내는 것은 사소한 일이 아닙니다.
리눅스에서 어떻게해야할지 모르겠지만, PCM 버퍼를 재생할 수 있다면 원하는대로 채워 주면됩니다.
따라서 버퍼가 초당 44100 샘플로 모노, 부호있는 16 비트 샘플에서 재생되도록 설정되어 있다고 가정하면 순수한 (정현파) A4 사운드 (440Hz)를 만드는 것은 간단합니다.
int16_t buffer[44100];
float frequency = 440.0f;
float sampling_ratio = 44100.0f;
float amplitude = 0.5f;
float t;
for (int i = 0; i < 44100; i++)
{
float theta = ((float)i / sampling_ratio) * PI;
buffer[i] = (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
그러나이 소리는 아마도 당신의 관심사에 대해 매우 둔하기 때문에 좀 더 복잡한 일을해야합니다. 일반적으로 사운드 합성에는 Additive 와 Subtractive 의 두 가지 유형이 있습니다. 다른 많은 것들이 있지만이 두 가지가 아마도 가장 간단한 것입니다. 오늘은 첨가제 합성에 대해 이야기하겠습니다.
적층 합성의 경우, 당신은저기서했던 것과 같은 일을하지만, 한 진폭에서 하나의 주파수를 사용하는 대신에 여러 개의 파를 더합니다. 이것은 피아노에서 동시에 여러 건반을 누르는 것과 같습니다. 따라서 코드를 다음과 같이 수정하십시오.
void add_sine_wave(int16_t* buffer, int buffer_length, float frequency, float sampling_ratio, float amplitude)
{
for (int i = 0; i < buffer_length; i++)
{
float theta = ((float)i / sampling_ratio) * M_PI;
// make sure to correct for overflows and underflows
buffer[i] += (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
}
다음과 같이 사용하십시오.
int16_t buffer[44100];
memset(buffer, 0, sizeof(buffer));
// Create an A Major chord
add_sine_wave(buffer, 44100, 440.0f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 554.37f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 659.26f, 44100.0f, 0.5f);
그런데, 나는에서 내 주파수를 얻고 여기에 (내가 사용 평균율을 하지만, 거기에 많은 의 다른 가능한 튜닝은).
지금까지 사인파 만 사용했지만 구형 신디사이저는 각각 고유 한 흥미로운 사운드 특성을 가진 구형파 , 삼각파 및 톱 파도 지원 합니다. 이를 구현하는 것은 매우 간단합니다.
만들 수있는 다양한 사운드를 높이기 위해 할 수있는 다른 작업은 다음과 같습니다.
요점은 기술 자체가 그리 어렵지 않기 때문에 실제로 기술을 추상화하기 위해 라이브러리가 필요하지 않다는 것입니다. 어려운 소리를 만들기 위해 그것들을 사용하고 있습니다.
마지막 메모. 이와 같은 사운드를 실험 할 때는 데이터를 WAV 파일로 저장 한 다음 Audacity와 같은 일부 소프트웨어에서 시각화하는 것이 매우 유용 할 수 있습니다. 그렇게하면 더 잘하고있는 것을 볼 수 있습니다.
short
캐스트하기 전에 값이에 맞는지 확인하십시오 short
.
개인적으로 Blargg의 오디오 라이브러리를 추천 할 수 있습니다 . 당신에게 특별한 관심을 가질만한 것은 그의 Blip_Buffer 입니다.
Blargg의 사이트에는 여러 개의 "레트로"오디오 신시사이저가 있으며 필자는 현재 Game_Music_Emu 를 사용하여 내가 쓰고있는 Mega Man 클론에서 NSF 파일을 재생하고 있습니다.
많은 라이브러리가 C ++로 작성되었지만 일부는 C 인터페이스도 제공합니다.