มีไลบรารีเสียงสำหรับ C เพื่อสร้างตัวอย่างเสียงจากรหัสหรือไม่ [ปิด]


10

ฉันกำลังทำงานกับเอ็นจิ้นสำหรับเกมสไตล์ย้อนยุคในซีฉันกำลังมองหาคลังเสียงที่จะผลิตเสียงชิปจากรหัส ... ฉันต้องการสร้างแทร็คเสียงติดตามชิปของตัวเองสำหรับเครื่องยนต์เพื่อสร้างเพลง สิ่งนั้นมีอยู่จริงหรือไม่?

ฉันยังสนใจห้องสมุดที่จะใช้ไฟล์. nsf ในโครงการของฉัน

ฉันใช้ Linux เพื่อการพัฒนา


ฉันคิดว่าคำถามนี้อยู่ในหมวดหมู่ "เทคโนโลยีที่จะใช้" แม้ว่าโดยทั่วไปแล้วคำขอเฉพาะกลุ่มเหล่านี้จะไม่สร้างรายการคำตอบจำนวนมาก
MichaelHouse

ปัญหาคือฉันไม่สามารถหาอะไรได้เลย ฉันไม่รู้ด้วยซ้ำว่าจะเริ่มต้นที่ไหน ... ห้องสมุดทุกแห่งที่ฉันพบมุ่งเน้นไปที่การโหลดจากไฟล์เช่น. wav ฉันสามารถใช้ libmikmod ถ้าฉันต้องการเพียงแค่โหลดโมดูล. mod หรือ. xm แต่นั่นไม่ใช่สิ่งที่ฉันต้องการจะทำ
rzrscm

ฉันไม่คิดว่ามันจะตกอยู่ในการพัฒนาเกม เป็นสื่อทั่วไปมากกว่าเกม
PixelArtDragon

ลองค้นหา "mod tracker" หรืออาจจะ "demoscene tracker" เพื่อหาพื้นหลังและแหล่งข้อมูลทั่วไปเพิ่มเติม
Patrick Hughes

1
ฉันพบว่าคำถามนี้เป็นคำถามที่ดี เนื่องจากฉันชอบเขียนโปรแกรมเกมย้อนยุคมันเป็นการยากที่จะหาแหล่งข้อมูลสำหรับสิ่งนี้โดยไม่ได้เป็นส่วนหนึ่งของชุมชนที่ไม่ชัดเจน
Zack The Human

คำตอบ:


3

อาจไม่ใช่คำตอบที่ถูกต้อง แต่นี่คือไลบรารีของเอ็นจิ้นเสียงต่างๆ

(เลื่อนลงไปที่ส่วนที่สองสำหรับไลบรารีเสียง)

อย่างน้อย 9 จาก 12 เอ็นจิ้นไปด้วย C ส่วนใหญ่ยังรองรับไฟล์ติดตาม ซึ่งไม่แตกต่างจากไฟล์ nsf (ฉันคิดว่าไฟล์เหล่านี้เป็นไฟล์เพลง NES)


16

แน่ใจว่าคุณทำได้มันไม่ใช่เรื่องง่ายที่จะฟังดู "ดี"

ฉันไม่รู้ว่าจะทำอย่างไรใน Linux แต่ถ้าคุณสามารถเล่นบัฟเฟอร์ PCM สิ่งที่คุณต้องทำคือเติมสิ่งที่คุณต้องการ

ดังนั้นการสมมติว่าบัฟเฟอร์ของคุณถูกตั้งค่าให้เล่นเป็นโมโนตัวอย่างที่มีลายเซ็น 16 บิตที่ 44100 ตัวอย่างต่อวินาทีการสร้างเสียง A4 บริสุทธิ์ (ซายน์) ที่ 440 (เฮิรตซ์) นั้นง่ายพอ ๆ

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

อย่างไรก็ตามเสียงนี้อาจน่าเบื่อสำหรับความสนใจของคุณดังนั้นคุณต้องทำสิ่งที่ซับซ้อนมากขึ้น โดยทั่วไปมีสองประเภทของการสังเคราะห์เสียง: สารเติมแต่งและ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);

โดยวิธีการที่ฉันได้รับความถี่ของฉันจากที่นี่ (ฉันใช้อารมณ์เท่ากันแต่มีจำนวนมาก ของ อื่น ๆ tunings มี)

ขอให้สังเกตว่าจนถึงขณะนี้ผมได้รับเพียงการใช้คลื่นไซน์ แต่สังเคราะห์เก่ายังสนับสนุนตาราง , สามเหลี่ยมและเห็นคลื่นเช่นกันแต่ละคนมีคุณสมบัติของตัวเองเสียงที่น่าสนใจ การใช้สิ่งเหล่านี้ค่อนข้างตรงไปตรงมา

สิ่งอื่น ๆ ที่คุณสามารถทำได้เพื่อเพิ่มความหลากหลายของเสียงที่คุณสามารถสร้างคือ:

  1. Amplitude modulation : การเปลี่ยนแอมพลิจูดของคลื่นตลอดบัฟเฟอร์
  2. การปรับความถี่ : การเปลี่ยนความถี่ของคลื่นตลอดบัฟเฟอร์
  3. พัดโบก : ทำซ้ำตัวอย่างโดยเปลี่ยนรูปร่างและตำแหน่งในบัฟเฟอร์ เป็นหัวข้อที่ซับซ้อนมาก
  4. การห่อหุ้ม : การเปลี่ยนแอมพลิจูดของตัวอย่างเพื่อให้มีชีวิตมากขึ้น

ประเด็นที่นี่คือเทคนิคต่าง ๆ นั้นไม่ยากดังนั้นคุณไม่จำเป็นต้องมีห้องสมุดเพื่อทำให้เป็นนามธรรมสำหรับคุณ พวกเขาใช้มันเพื่อสร้างเสียงที่น่าสนใจว่าอะไรยาก

โน้ตตัวสุดท้าย เมื่อทำการทดสอบด้วยเสียงเช่นนี้อาจเป็นประโยชน์จริง ๆ ในการบันทึกข้อมูลของคุณไปยังไฟล์ WAV แล้วแสดงภาพในซอฟต์แวร์บางอย่างเช่น Audacity ด้วยวิธีนี้คุณจะเห็นสิ่งที่คุณกำลังทำชัดเจนยิ่งขึ้น


+1 สำหรับการกลิ้งของคุณเอง ฉันไม่เห็น libs Linux จำนวนมากที่สนับสนุน NSF แต่นี่คือข้อมูลจำเพาะ: webcache.googleusercontent.com/…
michael.bartnett

ขอบคุณสำหรับข้อมูล ฉันอาจจะยึดติดกับการสร้างไฟล์. nsf สำหรับโครงการของฉันในตอนนี้ซึ่งฉันรู้ว่าต้องใช้เสียงมากแค่ไหน
rzrscm

+1 ฉันคิดว่าคำตอบของคำถามนี้น่าเบื่อ ฉันไม่รู้มากเกี่ยวกับ AM / FM แต่โดยทั่วไปคลื่นจะถูกส่งไปที่ตัวกรองก่อนเช่นเดียวกับการสังเคราะห์การลบ นอกจากนี้ตัวอย่างของโน้ตเปียโนหลายใบของคุณนั้นถูกต้องแล้วตัวอย่างที่ดีกว่าก็คือโน้ตตัวเดียว! โน้ตเปียโนเดี่ยวจะสร้างเสียงประสานที่หลากหลายซึ่งให้เสียงต่ำ เปียโนจะสร้าง> 5 คลื่นที่รวมเข้าด้วยกันใน synths ส่วนใหญ่ 2 หรือ 3 จะไม่เป็นไร
Tony

วิธีที่ถูกต้องในการตรวจสอบโอเวอร์โฟลว์ในฟังก์ชั่น "add_sine_wave" คืออะไร?
eadmaster

@eadmaster: ฉันหมายถึงการตัด ตรวจสอบให้แน่ใจพอดีคุ้มค่าในก่อนที่คุณจะโยนมันทิ้งไปshort short
แพนด้าชุดนอน

4

สำหรับผลกระทบเสียง Chiptune มีหนึ่งคำตอบที่ชัดเจน: SFXR

มันเป็นแอพพลิเคชั่นแบบสแตนด์อโลนที่คุณสามารถใช้ในการสร้างตัวอย่างได้ แต่ยังมีซอร์สโค้ดไว้ให้ด้วยหากคุณต้องการรวมเข้ากับโค้ดของคุณ


3

ฉันสามารถแนะนำห้องสมุดเสียงของ Blarggเป็นการส่วนตัวห้องสมุดเสียงบางสิ่งบางอย่างที่อาจเป็นที่น่าสนใจโดยเฉพาะกับคุณคือเขาBlip_Buffer

ไซต์ของ Blargg มีซินธิไซเซอร์เสียง "ย้อนยุค" หลายแห่งและฉันใช้มันอย่างแข็งขัน Game_Music_Emuเพื่อเล่นไฟล์ NSF ใน Mega Man โคลนที่ฉันเขียน

ห้องสมุดหลายแห่งเขียนด้วยภาษา C ++ แต่บางแห่งก็มีอินเตอร์เฟส C เช่นกัน


จะลองทำสิ่งเหล่านี้อย่างแน่นอน ... พวกเขาอาจเป็นเพียงสิ่งที่ฉันกำลังมองหาเนื่องจากฉันทำงานกับเอ็นจิ้นเกมที่ตั้งใจจะเลียนแบบรูปลักษณ์ของเกม NES
rzrscm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.