แน่ใจว่าคุณทำได้มันไม่ใช่เรื่องง่ายที่จะฟังดู "ดี"
ฉันไม่รู้ว่าจะทำอย่างไรใน 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 มี)
ขอให้สังเกตว่าจนถึงขณะนี้ผมได้รับเพียงการใช้คลื่นไซน์ แต่สังเคราะห์เก่ายังสนับสนุนตาราง , สามเหลี่ยมและเห็นคลื่นเช่นกันแต่ละคนมีคุณสมบัติของตัวเองเสียงที่น่าสนใจ การใช้สิ่งเหล่านี้ค่อนข้างตรงไปตรงมา
สิ่งอื่น ๆ ที่คุณสามารถทำได้เพื่อเพิ่มความหลากหลายของเสียงที่คุณสามารถสร้างคือ:
- Amplitude modulation : การเปลี่ยนแอมพลิจูดของคลื่นตลอดบัฟเฟอร์
- การปรับความถี่ : การเปลี่ยนความถี่ของคลื่นตลอดบัฟเฟอร์
- พัดโบก : ทำซ้ำตัวอย่างโดยเปลี่ยนรูปร่างและตำแหน่งในบัฟเฟอร์ เป็นหัวข้อที่ซับซ้อนมาก
- การห่อหุ้ม : การเปลี่ยนแอมพลิจูดของตัวอย่างเพื่อให้มีชีวิตมากขึ้น
ประเด็นที่นี่คือเทคนิคต่าง ๆ นั้นไม่ยากดังนั้นคุณไม่จำเป็นต้องมีห้องสมุดเพื่อทำให้เป็นนามธรรมสำหรับคุณ พวกเขาใช้มันเพื่อสร้างเสียงที่น่าสนใจว่าอะไรยาก
โน้ตตัวสุดท้าย เมื่อทำการทดสอบด้วยเสียงเช่นนี้อาจเป็นประโยชน์จริง ๆ ในการบันทึกข้อมูลของคุณไปยังไฟล์ WAV แล้วแสดงภาพในซอฟต์แวร์บางอย่างเช่น Audacity ด้วยวิธีนี้คุณจะเห็นสิ่งที่คุณกำลังทำชัดเจนยิ่งขึ้น