Apakah ada perpustakaan suara untuk C untuk menghasilkan sampel suara dari kode? [Tutup]

10

Saya sedang mengerjakan sebuah mesin untuk permainan gaya retro di C. Saya mencari perpustakaan suara yang akan menghasilkan suara chip dari kode ... Saya ingin membuat pelacak chiptune sederhana saya sendiri untuk mesin untuk membuat musik. Apakah hal semacam itu ada?

Saya juga tertarik pada perpustakaan untuk menggunakan file .nsf dalam proyek saya.

Saya menggunakan Linux untuk pengembangan.

rzrscm
sumber
Saya pikir pertanyaan ini termasuk dalam kategori "Teknologi mana yang harus digunakan". Meskipun, biasanya permintaan khusus ini tidak menghasilkan daftar besar tanggapan, saya pikir itu tidak konstruktif.
MichaelHouse
Nah, masalahnya adalah saya tidak bisa menemukan apa pun. Saya bahkan tidak tahu harus mulai dari mana ... Setiap perpustakaan yang saya temukan berfokus pada memuat dari file seperti .wav. Saya dapat menggunakan libmikmod jika saya ingin memuat modul .mod atau .xm, tetapi bukan itu yang ingin saya lakukan.
rzrscm
Saya tidak berpikir ini benar-benar jatuh dalam pengembangan game. Ini adalah media yang lebih umum daripada game.
PixelArtDragon
Coba cari "pelacak mod" atau mungkin "pelacak demoscene" untuk latar belakang dan sumber daya yang lebih umum.
Patrick Hughes
1
Saya pribadi menemukan pertanyaan ini pertanyaan yang bagus. Karena saya suka memprogram game bergaya retro, sulit untuk menemukan sumber daya untuk hal-hal seperti ini tanpa menjadi bagian dari komunitas yang tidak jelas.
Zack The Human

Jawaban:

3

Mungkin bukan jawaban yang benar tetapi di sini ada perpustakaan berbagai mesin audio

(Gulir ke bawah ke segmen kedua untuk pustaka audio)

Setidaknya 9 dari 12 mesin menggunakan C. Sebagian besar dari mereka juga mendukung file pelacak. Yang tidak jauh berbeda dari file nsf (saya berasumsi ini adalah file musik NES).

Sidar
sumber
16

Tentu Anda bisa, itu tidak sepele untuk membuatnya terdengar "bagus".

Saya tidak tahu bagaimana melakukannya di Linux, tetapi jika Anda dapat memainkan buffer PCM, yang harus Anda lakukan adalah mengisinya dengan apa pun yang Anda inginkan.

Jadi seandainya buffer Anda diatur untuk dimainkan dalam monaural, sampel 16-bit yang ditandatangani, pada 44100 sampel per detik, menciptakan suara A4 (sinusoidal) murni (440 Hz) semudah

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

Namun, suara ini mungkin sangat membosankan untuk minat Anda, jadi Anda harus melakukan beberapa hal yang lebih rumit. Secara umum, ada dua jenis sintesis suara: Aditif dan Subtraktif . Ada banyak yang lain, tetapi keduanya mungkin yang paling sederhana. Hari ini saya hanya akan berbicara tentang sintesis aditif.

Untuk sintesis aditif, Anda melakukan hal yang sama seperti yang saya lakukan di atas sana, tetapi alih-alih hanya menggunakan satu frekuensi pada satu amplitudo, Anda menambahkan beberapa gelombang bersamaan. Ini seperti menekan beberapa tombol pada piano secara bersamaan. Jadi Anda memodifikasi kode Anda agar terlihat seperti ini:

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

dan kemudian gunakan seperti ini:

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

By the way, saya mendapatkan frekuensi saya dari sini (Saya menggunakan temperamen sama , tetapi ada banyak dari lainnya laras tersedia).

Perhatikan bahwa sejauh ini saya hanya menggunakan gelombang sinus, tetapi synthesizer lama juga mendukung gelombang persegi , segitiga dan melihat , masing-masing dengan sifat suara yang menarik. Menerapkan ini sangat mudah.

Hal lain yang dapat Anda lakukan untuk menambah variasi suara yang dapat Anda buat adalah:

  1. Modulasi amplitudo : Mengubah amplitudo gelombang di seluruh buffer
  2. Modulasi frekuensi : Mengubah frekuensi gelombang di seluruh buffer
  3. Reverb : Mengulang sampel dengan mengubah bentuk dan posisinya di buffer. Itu sendiri topik yang sangat kompleks.
  4. Enveloping : Mengubah amplitudo sampel untuk memberikan lebih banyak kehidupan

Intinya di sini adalah bahwa teknik-teknik itu sendiri tidak terlalu sulit, jadi Anda tidak benar-benar membutuhkan perpustakaan untuk mengabstraksikannya untuk Anda. Ini menggunakan mereka untuk membuat suara yang menarik apa yang sulit.

Satu catatan terakhir. Saat bereksperimen dengan suara seperti ini, mungkin sangat berguna untuk menyimpan data Anda ke file WAV, dan kemudian memvisualisasikannya dalam beberapa perangkat lunak seperti Audacity. Dengan begitu Anda bisa melihat apa yang Anda lakukan dengan lebih jelas.

Piyama Panda
sumber
+1 untuk menggulirkan milik Anda sendiri. Saya tidak melihat banyak lib Linux yang akan mendukung NSF. Tapi, inilah spesifikasinya: webcache.googleusercontent.com/...
michael.bartnett
Terima kasih atas informasinya. Saya mungkin tetap dengan membuat file .nsf untuk proyek saya sekarang karena saya menyadari betapa saya perlu memasukkan ke dalam untuk mendapatkan suara terdengar tepat.
rzrscm
+1 Saya menganggap jawaban apa pun untuk pertanyaan ini akan membosankan. Saya tidak tahu banyak tentang AM / FM tetapi umumnya gelombang akan dialihkan ke filter terlebih dahulu, seperti dalam sintesis subtraktif. Juga, contoh beberapa not piano Anda benar, contoh yang lebih baik hanya satu not! Satu not piano akan menciptakan banyak harmonik yang memberikannya warna timbre. Piano akan membuat> 5 gelombang yang ditambahkan bersama-sama sedangkan di sebagian besar synth 2 atau 3 akan baik-baik saja.
Tony
apa cara yang benar untuk memeriksa kelebihan pada fungsi "add_sine_wave"?
eadmaster
@eadmaster: Maksud saya kliping. Pastikan nilainya cocok dengan shortsebelum Anda melemparkannya ke a short.
Panda Pajama
4

Untuk efek suara chiptune, ada satu jawaban yang pasti: sfxr .

Ini adalah aplikasi mandiri yang dapat Anda gunakan untuk menghasilkan sampel, tetapi kode sumber juga tersedia jika Anda ingin mengintegrasikannya ke kode Anda.

Jari Komppa
sumber
3

Saya pribadi dapat merekomendasikan perpustakaan audio Blargg . Sesuatu yang mungkin menarik bagi Anda adalah Blip_Buffer- nya .

Situs Blargg memiliki beberapa synthesizer audio "retro", dan saya aktif menggunakan Game_Music_Emu untuk memutar file NSF dalam klon Mega Man yang saya tulis.

Banyak perpustakaan ditulis dalam C ++ tetapi beberapa menyediakan antarmuka C juga.

Zack Manusia
sumber
Pasti akan mencoba beberapa dari ini ... Mereka mungkin hanya apa yang saya cari sejak saya bekerja pada mesin game yang dimaksudkan untuk meniru tampilan dan nuansa dari game NES.
rzrscm