C가 코드에서 사운드 샘플을 생성하는 사운드 라이브러리가 있습니까? [닫은]


10

나는 C에서 레트로 스타일 게임을위한 엔진을 개발 중입니다. 코드에서 칩 사운드를 생성하는 사운드 라이브러리를 찾고 있습니다 ... 엔진이 음악을 만들 수있는 간단한 칩 튠 추적기를 만들고 싶습니다. 그런 것이 있습니까?

또한 프로젝트에서 .nsf 파일을 사용하는 라이브러리에 관심이 있습니다.

개발을 위해 Linux를 사용하고 있습니다.


이 질문은 "사용할 기술"범주에 속한다고 생각합니다. 일반적으로 이러한 틈새 요청은 많은 응답 목록을 생성하지 않지만 건설적인 것은 아니라고 생각합니다.
MichaelHouse

글쎄, 문제는 아무것도 찾을 수 없다는 것입니다. 어디서부터 시작해야할지 모르겠습니다 ... 내가 찾은 모든 라이브러리는 .wav와 같은 파일에서로드하는 데 중점을 둡니다. .mod 또는 .xm 모듈을로드하려는 경우 libmikmod를 사용할 수 있지만 그렇게하고 싶지 않습니다.
rzrscm

나는 이것이 실제로 게임 개발에 속한다고 생각하지 않습니다. 게임보다 더 일반적인 미디어입니다.
PixelArtDragon

보다 일반적인 배경과 리소스를 보려면 "mod tracker"또는 "demoscene tracker"를 검색하십시오.
Patrick Hughes

1
개인적으로이 질문은 좋은 질문입니다. 나는 레트로 스타일의 게임을 프로그래밍하는 것을 좋아하기 때문에 모호한 커뮤니티의 일원이 아닌 이런 것들에 대한 리소스를 찾기가 어렵습니다.
Zack The Human

답변:


3

아마도 정답은 아니지만 다양한 오디오 엔진 라이브러리가 있습니다.

(오디오 라이브러리의 두 번째 세그먼트로 스크롤)

12 개 엔진 중 9 개 이상이 C와 함께 제공됩니다. 이들 중 대부분은 트래커 파일도 지원합니다. nsf (이것은 NES 음악 파일이라고 가정합니다) 파일과 크게 다르지 않습니다.


16

물론 "좋은"소리를내는 것은 사소한 일이 아닙니다.

리눅스에서 어떻게해야할지 모르겠지만, 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);
}

그러나이 소리는 아마도 당신의 관심사에 대해 매우 둔하기 때문에 좀 더 복잡한 일을해야합니다. 일반적으로 사운드 합성에는 AdditiveSubtractive 의 두 가지 유형이 있습니다. 다른 많은 것들이 있지만이 두 가지가 아마도 가장 간단한 것입니다. 오늘은 첨가제 합성에 대해 이야기하겠습니다.

적층 합성의 경우, 당신은저기서했던 것과 같은 일을하지만, 한 진폭에서 하나의 주파수를 사용하는 대신에 여러 개의 파를 더합니다. 이것은 피아노에서 동시에 여러 건반을 누르는 것과 같습니다. 따라서 코드를 다음과 같이 수정하십시오.

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);

그런데, 나는에서 내 주파수를 얻고 여기에 (내가 사용 평균율을 하지만, 거기에 많은 다른 가능한 튜닝은).

지금까지 사인파 만 사용했지만 구형 신디사이저는 각각 고유 한 흥미로운 사운드 특성을 가진 구형파 , 삼각파 파도 지원 합니다. 이를 구현하는 것은 매우 간단합니다.

만들 수있는 다양한 사운드를 높이기 위해 할 수있는 다른 작업은 다음과 같습니다.

  1. 진폭 변조 : 버퍼 전체의 파형 진폭 변경
  2. 주파수 변조 : 버퍼 전체의 파동 주파수 변경
  3. 리버브 : 버퍼에서 모양과 위치를 변경하여 샘플을 반복합니다. 그 자체는 매우 복잡한 주제입니다.
  4. 엔 벨로 핑 : 더 많은 생명을주기 위해 샘플의 진폭 변경

요점은 기술 자체가 그리 어렵지 않기 때문에 실제로 기술을 추상화하기 위해 라이브러리가 필요하지 않다는 것입니다. 어려운 소리를 만들기 위해 그것들을 사용하고 있습니다.

마지막 메모. 이와 같은 사운드를 실험 할 때는 데이터를 WAV 파일로 저장 한 다음 Audacity와 같은 일부 소프트웨어에서 시각화하는 것이 매우 유용 할 수 있습니다. 그렇게하면 더 잘하고있는 것을 볼 수 있습니다.


자신의 롤링에 +1 NSF를 지원하는 많은 Linux 라이브러리가 보이지 않습니다. 그러나 다음은 사양입니다. webcache.googleusercontent.com/…
michael.bartnett

정보 주셔서 감사합니다. 소리를 제대로 들으려면 얼마나 많이 넣어야하는지 알기 때문에 프로젝트에 .nsf 파일을 만들 수 있습니다.
rzrscm

+1이 질문에 대한 답은 지루할 것이라고 생각했습니다. AM / FM에 대해서는 많이 알지 못하지만 일반적으로 감산 합성 에서처럼 웨이브가 먼저 필터로 라우팅됩니다. 또한 여러 피아노 음표의 예가 정확합니다. 더 좋은 예는 하나의 음표입니다! 하나의 피아노 음은 여러 고조파를 생성하여 음색을 제공합니다. 피아노는 합쳐진> 5 개의 파동을 생성하지만 대부분의 신디사이저에서는 2 또는 3이 좋습니다.
Tony

"add_sine_wave"함수에서 오버플로를 확인하는 올바른 방법은 무엇입니까?
eadmaster

@ eadmaster : 나는 클리핑을 의미했다. 에 short캐스트하기 전에 값이에 맞는지 확인하십시오 short.
Panda Pajama

4

chiptune 사운드 효과의 경우 sfxr이라는 확실한 대답이 있습니다.

샘플을 생성하는 데 사용할 수있는 독립형 응용 프로그램이지만 코드에 통합하려는 경우 소스 코드도 사용할 수 있습니다.


3

개인적으로 Blargg의 오디오 라이브러리를 추천 할 수 있습니다 . 당신에게 특별한 관심을 가질만한 것은 그의 Blip_Buffer 입니다.

Blargg의 사이트에는 여러 개의 "레트로"오디오 신시사이저가 있으며 필자는 현재 Game_Music_Emu 를 사용하여 내가 쓰고있는 Mega Man 클론에서 NSF 파일을 재생하고 있습니다.

많은 라이브러리가 C ++로 작성되었지만 일부는 C 인터페이스도 제공합니다.


분명히 이것들 중 일부를 시험해 볼 것입니다 ... NES 게임의 모양과 느낌을 모방하려는 게임 엔진을 개발하고 있기 때문에 내가 찾고있는 것일 수도 있습니다.
rzrscm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.