Odtwarzanie tablicy jako dzwięk

0

No więc wygenerowałem sobie tablice intów reprezentującą jakiś dźwięków i nie wiem właściwie jak to odtworzyć :) Mógłby ktoś polecić mi jakąś bibliotekę najlepiej open source w c# do tego typu operacji.

"Próbkowanie jest procesem zapisu chwilowych wartości sygnału ciągłego." Te inty są właśnie takimi próbkami wygenerowanej sinusoidy. Nie poszczególne inty a ich grupy mają związek z dźwiękami. a konkretnie w tym przypadku 44100 intów (próbek) reprezentuje dźwięk.

Jak by dodać nagłówek to jest to wav, myślałem o tym żeby wav stworzyć ale tego też za bardzo nie wiem jak odtworzyć. Chodzi o odtwarzanie synchroniczne z możliwością zatrzymywania cofania i zaczynania od środka. Znalazłem tylko jakąś bibliotekę która odtwarzała cały plik od początku do końca.

0
graf.zero napisał(a)

LOL, reprezentuje tak naprawde co? Długość trwania, częstotliwość, faze, amplitude? Myślisz, że ta tablica intów reprezentuje klawiature fortepianu, czy jakiś inny masz pomysł?

W tablicy takiej znajdują się amplitudy sygnału w kolejnych chwilach. Myślisz, że jak sygnały są przechowywane w pamięci komputera?

#include <stdlib.h>
#include <iostream>
#include <windows.h>
#include <mmsystem.h>
#include <math.h>

WAVEHDR waveHDR;

int main() {

	const int NUMPTS = 44100 * 10;
	short int waveOut[NUMPTS];
	int sampleRate = 44100;
	HWAVEOUT hWaveOut;

	/* sine wave generator */
	for (int i = 0; i < NUMPTS; ++i){
		waveOut[i] = sin((float)i)*255;
	}

	WAVEFORMATEX pFormat;
	pFormat.wFormatTag = WAVE_FORMAT_PCM;
	pFormat.nChannels = 1;
	pFormat.nSamplesPerSec = sampleRate;
	pFormat.nAvgBytesPerSec = sampleRate * 2;
	pFormat.nBlockAlign = 2;
	pFormat.wBitsPerSample = 16;
	pFormat.cbSize = 0;

	waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, NULL, 0, CALLBACK_NULL);
		
	waveHDR.lpData = (LPSTR)waveOut;
	waveHDR.dwBufferLength = NUMPTS*2;
	waveOutPrepareHeader(hWaveOut, &waveHDR, sizeof(WAVEHDR));
	
	waveOutWrite(hWaveOut, &waveHDR, sizeof(WAVEHDR));

	system("pause");
	waveOutPause(hWaveOut);
	system("pause");
	waveOutRestart(hWaveOut);
	system("pause");
	waveOutUnprepareHeader(hWaveOut, &waveHDR, sizeof(WAVEHDR));
	waveOutClose(hWaveOut);

	return 0;
}

Na szybko napisane, ładnie piszczy :> Dodając odpowiednie funkcje z winapi, można zapewne tym dokładniej sterować.

0

Dodaj to do Gotowców bo fajne =]

0

Dzięki wielkie czegoś takiego właśnie szukałem.

0

ale to nie dziala mam laga rzedu 5-7 sekund zeby cps uslyszec i nie wazne co wsadze tam do tego waveout to i tak slysze to samo :0 i po co ten system("pause");

0

po to, zeby nie robic wszystkiego ciągiem, a zapauzować wtedy gdy się chce. To tylko prosty program testowy.

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