2012-02-04 29 views
10

Próbuję znaleźć dokumentację, samouczki, przykłady generowania dźwięków. Mam na myśli bez użycia biblioteki, która ukryje wszystkie interesujące rzeczy.Generowanie dźwięków bez biblioteki?

Ciekawi mnie dźwięk i chcę zacząć coś z tym robić, ale nie wiem od czego zacząć.

Popraw mnie, jeśli się mylę, ale najniższy poziom generowania dźwięku jest jednym z nich (DirectSound , CoreAudio, ALSA, OSS) w zależności od systemu operacyjnego. Więc muszę wybrać system operacyjny i nauczyć się odpowiedniego systemu dźwiękowego?

Czy to naprawdę jest warte, czy powinienem po prostu nauczyć się biblioteki, która owija wszystkie powyższe elementy i oferuje kompatybilność między platformami?

Może to pytanie nie jest zbyt jasne i przykro mi z tego powodu, ale jak się okazało, nie wiem nawet, czego chcę. Próbuję znaleźć coś interesującego dla mojej pracy magisterskiej.

+1

Powinieneś dać SDL strzał. –

+0

To nie odpowiada bezpośrednio na twoje pytanie, z wyjątkiem tego, że jest to interesujący faktor o muzyce, który nagrał dźwięk z komputerem, który nie został zbudowany w celu generowania dźwięku: http://en.wikipedia.org/wiki/Aphex_Twin#ZX81_competition –

+0

@AlexReynolds To inspirujące. – kechapito

Odpowiedz

7

Oto przykład na dobry początek.

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

    } 

skompilować i uruchomić na Linuksie poprzez ALSA interfejs:

make wf && ./wf |aplay 

skompilować i uruchomić na Linuksie poprzez GStreamer interfejs:

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

GStreamer twierdzi, że jest cross-platform . Jego główną cechą jest to, że możesz tworzyć (lub używać istniejących) wtyczek, aby zbudować potok filtrów audio.

+0

Mój przykład wykorzystuje 8-bitowe mono, ale można go łatwo zmodyfikować, aby korzystać z innych formatów (na przykład stereo 16-bitów). – nobar

+0

Tego właśnie potrzebowałem. Dziękuję Ci. – kechapito

+0

Odtwórz płytę CD: 'find/run/user/$ {USER}/gvfs/cdd * -iname" * .wav "-print0 | xargs -0 aplay' – nobar

5

W niektórych systemach Unix (ish) można just write audio data to /dev/audio (or /dev/dsp) i będzie on odtwarzany. W przypadku nowoczesnych systemów Linux używających ALSA może być konieczne zastąpienie go numerem aplay. W obu przypadkach nie trzeba jednak używać żadnej konkretnej biblioteki dźwiękowej, tylko otworzyć strumień wyjściowy i napisać do niego. Tak robią wszystkie te jednolinijki bytebeat.

+0

+1. Doskonały przegląd betebeaters tutaj: http://www.metafilter.com/tags/bytebeat –

2

trzeba komunikować się ze sprzętem audio, ale czasy, w których można to zrobić bezpośrednio są już dawno za nami ...

Mogę zaproponować OpenAL?

2

Wszystkie inne odpowiedzi sugerują tylko abstrakcję lub bibliotekę. Zawsze istnieje możliwość cofnięcia się bezpośrednio na sprzęcie. (Niezależnie od tego, czy jest to dobry pomysł, to zupełnie inne pytanie i całkowicie zależy to od Ciebie)

Czy mogę zaproponować przeglądanie kodu sterownika audio? Sterownik Emu10k1 jest tylko jednym z przykładów dostępnych w źródłach linuksowych.

także warte obejrzenia to: „Creating a Kernel Driver for the PC-Speaker

Pamiętam też dni na Amidze gdzie jakiś śmieszny koleś stworzył program, który (ab-) wykorzystała Floppy drive stepper motor as an audio output.

Powiązane problemy