Skocz do zawartości

C/C++ Wydobycie Dźwięku/Melodii


Subaru

Rekomendowane odpowiedzi

Witam

 

Googluję już parę minut i nie mogę znaleźć konkretów na taki problem:

Chciałbym napisać prosty programik w C/C++, który co określony czas by zagrał jakiś dźwięk lub melodyjkę (np. na zasadzie podawania wysokości dźwięku/nuty niekoniecznie z pliku).

Odmierzanie czasu to pół biedy, ale sprawa dźwięku jest mi zupełnie niejasna.

Znalazłem jedynie informacje, że tego typu rzeczy prawdopodobnie nie są zapewnione przez standard języka.

 

Programuję oczywiście pod komenderą Fedory i GCC/G++ ;)

 

Z góry dziękuję za pomoc i pozdrawiam

 

Subaru

Odnośnik do komentarza
Udostępnij na innych stronach

Albo piszesz własny syntezator (dźwięk bazowy to sinusoida), lub korzystasz z MIDI to spięcia z wyżej wymienionymi soundfontami, jednak to już nie jest samodzielny program.

Poszukaj trochę o Digital Signal Processing i generalnie jak jest tworzony dźwięk cyfrowy. Dla podstawy, zainstaluj sobie syntezator Yoshimi i w jego opcjach znajdziesz funkcję tworzenia dźwięku od zera (czyli masz tylko sinusoidę z mnóstwem opcji do obróbki jej), może Ci się przydać do zrozumienia tego.

Odnośnik do komentarza
Udostępnij na innych stronach

Wychodzi z tego jednak ta zła wersja zdarzeń...

(...)lub korzystasz z MIDI to spięcia z wyżej wymienionymi soundfontami, jednak to już nie jest samodzielny program.

Spróbujmy więc tą opcję, bowiem tak całkiem swój dźwięk być nie musi, to ma być w formie "alarmu", toteż jeśli nawet z terminala będzie musiało się coś extra odpalić i zamknąć, to nie jest to przeszkoda dla mnie

Odnośnik do komentarza
Udostępnij na innych stronach

Skoro ma tylko dźwięk odpalić to najlepiej niech używa mplayera, to nawet nie wyświetli terminala. Ale musi mieć podane jaki dźwięk odtworzyć. Ale to w przypadku, jeśli to ma być (_na prawdę_ → naprawdę) ORT tylko prosty alarm. Ale to już będzie forma skryptu moim zdaniem. Z GStreamerem byłoby bardziej profesjonalnie, ale więcej roboty.

Odnośnik do komentarza
Udostępnij na innych stronach

Podsumujmy

thof - poradnik wyglada bardzo ciekawie, zajme sie nim od zaraz

DjSpider - czy bedzie to cos w tym kierunku?

mplayer sciezka-do-pliku

morsik - lubie sie bawic do momentu, w którym za nic nie wiem co dalej hehe :P spróbuje póki co ten poradnik, zobaczymy co z tego wyjdzie

Zainstaluje tez develki do ffmpeg, GStreamer i phonon tak na wszelki wypadek

 

EDIT #1

No i zainstalowane, czas na poradnik

 

EDIT #2

Ciekawa ta Anjuta, taki Dev-Cpp ^_^

 

EDIT #3 do postu ponizej

Dzieki bardzo, zainstalowalem develke do Canberra, jutro ciag dalszy przygód bedzie

Odnośnik do komentarza
Udostępnij na innych stronach

Phonon to tak nakładka na Gstreamera, więc lepiej pisać bezpośrednio pod Gstreamerem. Do powiadomień (np. wspomiany alarm) można użyć biblioteki http://developer.gnome.org/platform-overview/stable/canberra'>http://developer.gnome.org/platform-overview/stable/canberra

Jak chcesz pisać pod Gtk to przerób też inne przykłady stąd http://developer.gnome.org/ a poniżej jest pełna dokumentacja, czyli wszystko w jednym miejscu co jest bardzo wygodne, bo nie musisz skakać po różnych, często niepełnych lub nieaktualnych dokumentacjach. Można też korzystać z oficjalnego programu devhelp (pewnie już masz zainstalowany).

Jeśli natomiast chcesz pisać w Qt (ew. KDE) to odpowiednik http://api.kde.org/

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm z chęcią przeglądnę ^_^

Połapałem się mniej więcej w tym kodzie Guitar Tunner, znalazłem tabelkę częstotliwości dźwięków, więc jeśli wszystko dobrze pójdzie to będzie ładny alarmik wygrywający nutkę z Super Mario Bros World 1-1 :D

 

Dziękuję bardzo wszystkim za pomoc, jak tylko skończę to zamieszczę tutaj programik

Odnośnik do komentarza
Udostępnij na innych stronach

Tabelke z czestotliwosciami? Heh... latwiej Ci bedzie wygenerowac po prostu ta tabelke (sam tak kiedys zrobilem). 440Hz to jest A razkreslne, a reszte dzwieków wyliczysz sobie wg wzoru stad: https://secure.wikim...9k_%28muzyka%29 (Zobacz zmiana o pólton i lepiej wygeneruj sobie wszystkie póltony, nie tylko cale. Bedzie Ci latwiej potem cos innego napisac). Generalnie wiesz jak jest. Lecisz forem i uzupelniasz arraya dodajac kolejne wartosci wg tego co podalem powyzej (-;

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Gdyby wszystko było takie proste...popisałem trochę kod i nie jest mu do śmiechu

#include <unistd.h>
#include <stdio.h>
//#include <glib/glib.h>	//ciekawe czy potrzebne mu w koncu bedzie czy nie
#include <gst/gst.h>

#define MNOTE_C4 261.63
#define MNOTE_D4 293.66
#define MNOTE_E4 329.63
#define MNOTE_F4 349.23
#define MNOTE_G4 392.00
#define MNOTE_A4 440.00
#define MNOTE_H4 493.88
#define MNOTE_C5 523.25

int x;

main (int argc, char *argv[])
{
gst_init (&argc, &argv);

printf("Wybierz opcje \n");
printf("1. DMW DS (17,5 min) 2. DMW D/D (30 min) 3. Exit");
scanf("%d", x);
switch(x)
{
	case 1 : sleep(1050); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	case 2 : sleep(1800); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	case 3 : sleep(10); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	default : printf("Zla opcja"); break;
}
}

 

W konsoli widzę same nieśmieszne rzeczy

/tmp/cc0W0fJK.o: In function `main':
dmwtimer.c:(.text+0x8d): undefined reference to `play_sound'
dmwtimer.c:(.text+0x9f): undefined reference to `play_sound'
dmwtimer.c:(.text+0xb1): undefined reference to `play_sound'
dmwtimer.c:(.text+0xd2): undefined reference to `play_sound'
dmwtimer.c:(.text+0xe4): undefined reference to `play_sound'
/tmp/cc0W0fJK.o:dmwtimer.c:(.text+0xf6): more undefined references to `play_sound' follow
collect2: ld returned 1 exit status
make: *** [all] Błąd 1

 

Nie wiem czemu mu nie pasuje to

Wszystko spiąłem przez makefile, bowiem normalną metodą nie znajdywał gst.h

Makefile na obecną chwilę wygląda ni mniej ni więcej tak

CC=gcc
LIBS = -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lxml2
CFLAGS = -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/gstreamer-0.10 -I/usr/include/libxml2

all:
$(CC) $(LIBS) $(CFLAGS) dmwtimer.c

Odnośnik do komentarza
Udostępnij na innych stronach

thof - spróbuję więc tak zrobić, kombinowałem z gedit'a mając cichą nadzieję, że obejdzie się bez tych wszystkich IDE i całej graficznej okładki. Może uda się projektem "Standardowy" miast GTK+ . No i gdzie mam ją dodać tak konkretnie, bowiem próbuję różne miejsca i potem wywala komunikaty, które podam poniżej.

 

morsik - Faktycznie, zasugerowałem się niepotrzebnie rozpiską z Guitar Tuner i przepisałem na dźwięki. Można to faktycznie wyliczać tak jak proponujesz.

 

Komunikaty takie:

/home/Subaru/dmw-alarm/src/src/Makefile.am:5: gstreamer-0.10_CFLAGS: non-POSIX variable name
/home/Subaru/dmw-alarm/src/src/Makefile.am:23: gstreamer-0.10_LIBS: non-POSIX variable name
make[1]: Opuszczenie katalogu `/home/Subaru/dmw-alarm'
/home/Subaru/dmw-alarm/src/Makefile.am:5: bad characters in variable name `dmw_alarmdocSHZakończono niepowodzeniem

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...