2012-02-04 16 views
10

Seslerin nasıl oluşturulacağına dair örnekler, öğreticiler, örnekler bulmaya çalışıyorum. Tüm ilginç şeyleri gizleyecek bir kütüphane kullanmadan demek istiyorum.Kitaplıksız sesler mi üretiyorsunuz?

Ses konusunda ilginçim ve onunla bir şeyler yapmaya başlamak istiyorum ama nereden başlayacağımı bilmiyorum.

Yanlış mıyım, yoksa ses üretecek en düşük düzey, İşletim Sistemine bağlı olarak bunlardan biridir (DirectSound , CoreAudio, ALSA, OSS). Bu yüzden bir işletim sistemi seçmeli ve uygun ses sistemini öğrenmeliyim?

Bu gerçekten değer mi yoksa sadece yukarıdakileri tamamlayan ve çapraz platform uyumluluğu sunan bir kitaplık öğrenmem gerekiyor mu?

Belki de bu soru çok net değil ve bunun için üzgünüm ama ortaya çıktıkça, ne istediğimi bile bilmiyorum. Sadece tezim için ilginç bir şey bulmaya çalışıyorum.

+1

SDL'ye bir şans vermelisiniz. –

+0

Bu, sorunuzu doğrudan yanıtlamıyor, çünkü ses çıkarmak için yapılmayan bir bilgisayarla ses çıkaran bir müzisyen hakkında ilginç bir factoid: http://en.wikipedia.org/wiki/Aphex_Twin#ZX81_competition –

+0

@AlexReynolds Bu ilham verici. – kechapito

cevap

7

Başlamanız için size bir örnek.

// filename "wf.cpp" (simple wave-form generator) 

    #include <iostream> 
    #include <cmath> 
    #include <stdint.h> 

int main() 
    { 

    const double R=8000; // sample rate (samples per second) 
    const double C=261.625565; // frequency of middle-C (hertz) 
    const double F=R/256; // bytebeat frequency of 1*t due to 8-bit truncation (hertz) 
    const double V=127; // a volume constant 

    for (int t=0; ; t++) 
     { 
     uint8_t temp = (sin(t*2*M_PI/R*C)+1)*V; // pure middle C sine wave 
    // uint8_t temp = t/F*C; // middle C saw wave (bytebeat style) 
    // uint8_t temp = (t*5&t>>7)|(t*3&t>>10); // viznut bytebeat composition 
     std::cout<<temp; 
     } 

    } 

derleme ve ile Linux üzerinde ALSA arayüz:

make wf && ./wf |aplay 

derleme ve ile Linux üzerinde Gstreamer arayüz:

make wf && ./wf |gst-launch-0.10 -v filesrc location=/dev/stdin ! 'audio/x-raw-int,rate=8000,channels=1,depth=8' ! autoaudiosink 

GStreamer istemler platformlar arası olmak . Buradaki en önemli özellik, ses filtrelerinden oluşan bir boru hattı oluşturmak için (veya mevcut olan) eklentileri oluşturabilmenizdir.

+0

Benim örneğim 8-bit mono kullanır, ancak diğer formatları (örneğin 16-bit stereo) kullanmak için kolayca değiştirilebilir. – nobar

+0

İhtiyacım olan buydu. Teşekkür ederim. – kechapito

+0

Bir CD çal: 'bul/çalıştır/kullanıcı/$ {USER}/gvfs/cdd * -iname" * .wav "-print0 | xargs -0 aplay' – nobar

5

Bazı Unix (ish) sistemlerinde just write audio data to /dev/audio (or /dev/dsp) yapabilir ve oynayacaktır. ALSA kullanan modern Linux sistemlerinde, bunun yerine aplay adresine aktarmanız gerekebilir. Her iki durumda da, belirli bir ses kütüphanesini — kullanmanız gerekmez, sadece bir çıkış akışını açın ve buna yazın. Tüm bu bytebeat tek liner bunu böyle yapar.

+0

+1. Burada bytebeaters büyük bir bakış: http://www.metafilter.com/tags/bytebeat –

2

i OpenAL önerebilir ... Ses donanımı comunicate gerekir, ama zaman hangi doğrudan geride kaldı yapabilir?

2

Diğer tüm cevaplar sadece bazı soyutlama veya kütüphane önermektedir. Doğrudan donanıma geri dönme olasılığı her zaman vardır. (Bunun iyi bir fikir olup olmadığı tamamen farklı bir sorudur ve tamamen karar vermenize bağlıdır)

Ses sürücü koduna bakmanızı önerebilir miyim? Emu10k1 sürücüsü, linux kaynaklarında sadece bir örnektir.

Ayrıca bir göz değer şudur: bazı komik ahbap (ab-) Floppy drive stepper motor as an audio output kullanılan bir program oluşturdu nerede " Creating a Kernel Driver for the PC-Speaker"

Ben de Amigada günleri hatırlıyorum.

İlgili konular