SDL_mixer. Jak tu się dobrać do próbek?

0

Cześć

Piszę już trochę zrezygnowany. Nie mam pojęcia jak tu się dobrać do próbek odtwarzanego dźwięku. Posiadam kod, który faktycznie jest przykładem z jakiegoś tutoriala ale ogarniam co się w nim dzieje. W zasadzie ten kod mi wystarcza do tego co chcę zrobić a mianowicie odtworzyć dźwięk jakoś odpowiednio zmodulowany. Problem tylko w tym, że nie wiem jak dobrać się do próbek. Jeśli macie jakiś pomysł bardzo prosiłbym o jakąś podpowiedź.

 #include <SDL.h>
#include <windows.h>
#include <SDL_mixer.h>
//#include <SDL_thread.h>
#include <iostream>

int main( int argc, char * args[] )
{
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0) {
	fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
	return 1;
}
 
int audio_rate =22050;
Uint16 audio_format = AUDIO_S16SYS;
int audio_channels = 2;
int audio_buffers = 4096;
 
if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) != 0) {
	fprintf(stderr, "Unable to initialize audio: %s\n", Mix_GetError());
	exit(1);
}

Mix_Chunk *sound = NULL;
 
sound = Mix_LoadWAV("D:/Program files/TeamSpeak 3 Client/sound/default_male/your_channel_was_edited.wav");
if(sound == NULL) {
	fprintf(stderr, "Unable to load WAV file: %s\n", Mix_GetError());
}

SDL_Surface *screen;
 
screen = SDL_SetVideoMode(320, 240, 0, SDL_ANYFORMAT);
if (screen == NULL) {
	fprintf(stderr, "Unable to set video mode: %s\n", SDL_GetError());
	return 1;
}


int channel;
 
channel = Mix_PlayChannel(-1, sound, 0);
if(channel == -1) {
	fprintf(stderr, "Unable to play WAV file: %s\n", Mix_GetError());
}


while(Mix_Playing(channel) != 0);

Mix_FreeChunk(sound);
 
Mix_CloseAudio();
SDL_Quit();

    return 0;
}
0

http://sdl.beuc.net/sdl.wiki/Mix_Chunk

Wskaźnik abuf w strukturze.

0

przepraszam za noobostwo ale w dalszym ciągu nie wiem jak mogę to wyrzucić do tablicy int'ów. bo jeśli chodzi o modulację to zdaje się to muszę zrobić.

0

Jeśli chcesz dobrać się do próbek, to przez wskaźnik o którym napisałem: i bynajmniej nie będzie to tablica int'ow, a raczej signed short'ów.
Jeśli natomiast chodzi Ci o możliwość odtwarzania własnego wymodulowanego dźwięku, to przyda się http://sdl.beuc.net/sdl.wiki/Mix_QuickLoad_RAW.
Korzystając z tej funkcji musisz mieć pewność że format dźwięku jaki zrobiłeś zgadza się z tym, którym zainicjalizowałeś mixer.

0

No muszę niestety znowu się trochę skompromitować. Wydaje mi się, że tak naprawdę to tego QuickLoad'a nie potrzebuję bo ja bym chciał tylko operować już na samym chunku. No i teraz dla przykładu kod:

signed short zmienna;
for(int i=0;i<200000;i++)
{
	zmienna=sound->abuf[i];
	zmienna=zmienna*0.65;
	sound->abuf[i]=zmienna;
}

nie spełnia moich oczekiwań (dostaje po tym zaszumiony sygnał). Wydawało mi się, że nie ma nic prostszego niż zrobienie "anonimowego głosu" za pomocą takiego przemnożenia. A może źle zinterpretowałem rady Flakera?

0
unsigned n = sound->alen / 2; // przez 2, bo sample są 2 bajtowe -> AUDIO_S16SYS
short* data = (short*)sound->abuf;

for(unsigned i = 0; i < n; i++)
{
	data[i] *= 0.65;
}
0

Hmm no dobra. Dzięki za te info o dwubajtowych probkach. Ogólnie to już nie szumi przynajmniej :) Ale popełniam zdaje się błąd merytoryczny? Jedyne czym to poskutkowało we wrażeniach słuchowych to po prostu przyciszenie. Czyli że obniżenie wartości próbek o 35% nie zmienia barwy głosu?

0

Nie, nie zmienia. Jedynie ścisza.

0

Ok, to może jakieś propozycje? Bo wszystkie operacje, które ja sobie na tym wykonuje to jedynie mi dodają jakiś szum albo 'metalizują' głos. Z góry zaznaczam, że szukałem po internecie ale większość co znalazłem to były dla mnie rzeczy albo niezrozumiałe albo zbędne. Tak naprawdę od wczoraj przez cały czas. No;p z przerwą na sen oczywiście.

0

Propozycje odnośnie czego? Modulacji? A o jaką modulację Ci chodzi?

0

Tak, racja. Nie sprecyzowałem się. Jakieś propozycje odnośnie sensownej modulacji. Pod kontem wrażeń słuchowym. Zmiana głosu męskiego na damski, anonimowy, jakiś robot. Takie sprawy. Tylko, że nie wiem właśnie czy modulacja amplitudowa mi to udostępnia. A fajnie by było bo przynajmniej wiem już jak na tych próbkach operować.

0

Poszukaj sobie w sieci jakichś implementacji pitch shiftera, vocodera lub nawet chorusa, bo sam na pewno nie napiszesz tego typu efektów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1