C'nin koddan ses örnekleri oluşturması için bir ses kütüphanesi var mı? [kapalı]


10

C'de retro tarzı bir oyun için bir motor üzerinde çalışıyorum. Koddan çip sesleri üretecek bir ses kütüphanesi arıyorum ... Motorun müzik oluşturması için kendi basit chiptune izleyicimi yapmak istiyorum. Böyle bir şey var mı?

Ayrıca projemde .nsf dosyalarını kullanmak için bir kütüphane ile ilgilenirim.

Geliştirme için Linux kullanıyorum.


Bence bu soru "Kullanılacak teknoloji" kategorisine giriyor. Rağmen, tipik olarak bu niş istekleri büyük bir yanıt listesi oluşturmuyor, bence yapıcı değil.
MichaelHouse

Sorun şu ki hiçbir şey bulamıyorum. Nereden başlayacağımı bile bilmiyorum ... Bulduğum her kütüphane .wav gibi dosyalardan yüklemeye odaklanıyor. Bir .mod veya .xm modülünü yüklemek istersem libmikmod'u kullanabilirim, ancak yapmak istediğim bu değil.
rzrscm

Bunun gerçekten oyun geliştirme aşamasında olduğunu düşünmüyorum. Oyunlardan daha genel bir medyadır.
PixelArtDragon

Daha genel bir arka plan ve kaynaklar için "mod tracker" veya belki "demoscene tracker" aramayı deneyin.
Patrick Hughes

1
Şahsen bu soruyu iyi bir soru olarak görüyorum. Retro tarzı oyunlar programlamayı sevdiğim için, böyle belirsiz bir topluluğun parçası olmadan böyle şeyler için kaynak bulmak zor.
Zack The Human

Yanıtlar:



16

Tabii ki, bunu "güzel" geliyor almak sadece önemsiz değil.

Linux'ta nasıl yapılacağını bilmiyorum, ancak bir PCM tamponu oynayabilirseniz, tek yapmanız gereken onu istediğinizle doldurmaktır.

Yani tamponunuzun mono, imzalı 16 bitlik örneklerde, saniyede 44100 örnekte çalmaya ayarlandığını varsayarak, saf (sinüzoidal) bir A4 sesi (440 Hz) oluşturmak kadar basittir.

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

Ancak, bu ses muhtemelen ilgi alanlarınız için çok sıkıcıdır, bu yüzden daha karmaşık şeyler yapmanız gerekir. Genel olarak, iki tür ses sentezi vardır: Toplama ve Çıkarma . Başka pek çok şey var, ama bu ikisi muhtemelen en basit olanlar. Bugün sadece katkı sentezi hakkında konuşacağım.

Katkı sentezi için, orada yaptığımla aynı şeyi yaparsınız, ancak bir genlikte bir frekans kullanmak yerine, birlikte birkaç dalga eklersiniz. Bu aynı anda bir piyanoda birkaç tuşa basmak gibidir. Kodunuzu aşağıdaki gibi görünecek şekilde değiştirirsiniz:

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

ve sonra şu şekilde kullanın:

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

Bu arada, benim frekansları alıyorum burada (kullanıyorum eşit mizaç , ama orada çok ait diğer mevcut ayarlamalar).

Şimdiye kadar sadece sinüs dalgalarını kullandığımı fark ettim, ancak eski sentezleyicilerin her biri kendi ilginç ses özelliklerine sahip kare , üçgen ve testere dalgalarını da destekliyor . Bunları uygulamak oldukça basittir.

Oluşturabileceğiniz ses çeşitliliğini artırmak için yapabileceğiniz diğer şeyler şunlardır:

  1. Genlik modülasyonu : Tampon boyunca dalganın genliğini değiştirme
  2. Frekans modülasyonu : Tampon boyunca dalganın frekansını değiştirme
  3. Yankı : Bir örneği tampondaki şeklini ve konumunu değiştirerek tekrarlama. Kendisi çok karmaşık bir konu.
  4. Zarflama : Daha fazla ömür sağlamak için bir örneğin genliğini değiştirme

Buradaki nokta, tekniklerin kendilerinin çok zor olmadığıdır, bu yüzden onları sizin için soyutlamak için gerçekten bir kütüphaneye ihtiyacınız yoktur. Onları zor olan ilginç sesler yaratmak için kullanıyor.

Son bir not. Böyle bir sesle deneme yaparken verilerinizi WAV dosyalarına kaydetmek ve daha sonra Audacity gibi bazı yazılımlarda görselleştirmek gerçekten yararlı olabilir. Bu şekilde ne yaptığınızı daha net görebilirsiniz.


Kendinizi yuvarlamak için +1. NSF'yi destekleyecek birçok Linux kütüphanesi görmüyorum. Ancak, işte teknik özellik
michael.bartnett

Bilgi için teşekkürler. Sesleri doğru bir şekilde duymak için ne kadar koymam gerektiğini anladığım için projem için .nsf dosyaları oluşturmaya devam edebilirim.
rzrscm

+1 Bu soruya verilecek herhangi bir cevabın can sıkıcı olacağını düşündüm. AM / FM hakkında çok şey bilmiyorum ama genellikle dalgalar çıkarıcı sentezde olduğu gibi önce bir filtreye yönlendirilir. Ayrıca, birden fazla piyano notası örneğiniz doğrudur, daha iyi bir örnek sadece bir nota olacaktır! Tek bir piyano notası, ona tını veren birden fazla harmonik yaratacaktır. Bir piyano, 5'ten fazla dalga eklenirken çoğu sentezde 2 veya 3 iyi olur.
Tony

"add_sine_wave" fonksiyonundaki taşmaları kontrol etmenin doğru yolu nedir?
eadmaster

@eadmaster: Kırpmak istedim. A'ya shortatmadan önce değerin a'ya uyduğundan emin olun short.
Panda Pijama

4

Chiptune ses efektleri için kesin bir cevap var: sfxr .

Örnek oluşturmak için kullanabileceğiniz bağımsız bir uygulamadır, ancak kodunuza entegre etmek istiyorsanız kaynak kodu da kullanılabilir.


3

Kişisel olarak Blargg'in ses kütüphanelerini tavsiye edebilirim . Sizi özellikle ilgilendirebilecek bir şey onun Blip_Buffer'ı .

Blargg sitesi birkaç "retro" ses sentezleyicisine sahiptir ve yazdığım bir Mega Man klonunda NSF dosyalarını oynatmak için aktif olarak Game_Music_Emu kullanıyorum .

Kütüphanelerin çoğu C ++ ile yazılmıştır, ancak bazıları C arayüzü de sağlar.


Kesinlikle bunlardan bazılarını deneyeceğim ... NES oyununun görünüşünü ve hissini taklit etmeyi amaçlayan bir oyun motoru üzerinde çalıştığım için bunlar sadece aradığım şey olabilir.
rzrscm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.