Odtwarzanie tablicy jako dzwięk

Odpowiedz Nowy wątek
2009-03-04 22:01
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.

Pozostało 580 znaków

2009-03-04 23:29
nav
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ć.


utf-8 rlz! ٩(ಥ_ಥ)۶

Pozostało 580 znaków

2009-03-05 00:09
0

Dodaj to do Gotowców bo fajne =]


delphi procedure TProgram.Wybredz(Zawartosc:array of TObject; const Pomysl=nil); virtual; abstract;

Pozostało 580 znaków

2009-03-05 00:43
0

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

Pozostało 580 znaków

2009-03-05 07:59
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");

Pozostało 580 znaków

2009-03-05 12:21
nav
0

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


utf-8 rlz! ٩(ಥ_ಥ)۶

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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