Optage lyd og converte til Beep's

Tags:    c++

<< < 123 > >>
Hey.

Jeg har fået en sær spøjs ide (det gør jeg tit).
Jeg har overvejet at konvertere normalt lyd (f.eks. optaget via mic eller andet på computeren) til pc'ens Buzzer.

Ved godt det lyder lidt absurt men det kunne være ganske morsomt.

Jeg har kigget lidt rundt omkring og har bland andet fundet denne artikkel: http://home20.inet.tele.dk/midgaard/snip/recplay.html
Men denne funktion optager i en form for binær buffer som jeg ikke lige kan se hvordan jeg kan knovertere til at bruge i Beep funktionen.

Beep funktionen i c++ windows lib bruges nemlig: Beep(frekvens, tid);

Nogen der har en ide til hvordan dette kan gøres?

//Darki



Indlæg senest redigeret d. 09.04.2008 20:38 af Bruger #3861
21 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Hvad mener du med at du ikke kan få dem til at virke?

Hvad har du forsøgt?

Jeg strikker lige et eksempel sammen en af dagene når jeg har lidt tid...



Hvad mener du med at du ikke kan få dem til at virke?

Hvad har du forsøgt?

Jeg strikker lige et eksempel sammen en af dagene når jeg har lidt tid...


Kunne ikke helt få dem til at virke. Altså jeg kunne ikke finde ud af hvordan jeg lige skulle bruge dem.

Jeg prøvede at lave min egen funktion:
Fold kodeboks ind/udKode 

Meen den gav bare et lidt for stort ubrugeligt tal (lavede det efter eksemplet på wiki) Men tror jeg har gjort noget forkert hehe (bemærk at jeg stadig kører på eksemplet herfra: http://damb.dk/snip/playtone.html)



Jeg fik lavet et "lille" eksempel:

Fold kodeboks ind/udKode 


fft funktionen er tyvstjålet fra en af de sider du linkede til.

I main starter vi med at lave en tone med den frekvens som brugeren ønsker, tonen genereres af CreateTone funktionen.

Derpå kører vi tonen igennem fft funktionen, den giver os et array med med de forskellige toners amplitude. I loopen i main finder vi den frekvens der har den største amplitude, og gemmer dens index.

Hvis jeg f.eks. beder om frekvensen 1000 får jeg index 93, for frekvensen 2000 får jeg 186 (2*93 = 186), dvs. der er en direkte sammenhæng mellem indexet og den mest dominerende tone.

I praksis vil du nok optage en tone f.eks. med Record funktionen fra http://damb.dk/snip/recplay.html, og køre den optagede lyd gennem fft funktionen og dermed finde den dominerende tone i lyden. Du kan så bruge PlayTone til at afspille tonen.

Bemærk at der i outputtet fra fft funktionen er halvt så mange frekvenser som der er samples i input, og at fft funktionen forventer at antallet af samples er 2^n, hvis ikke du har det kan du sætte de resterende samples til 0.



Altså så i princippet ville jeg kunne gøre sådan her og så få frekvensen?:
Fold kodeboks ind/udKode 


Og så nej ikke aligevel... jeg kan kun få hele 1000 med linien (int)frekvs. og hvis jeg prøver at udskrive frekvs direkte uden (int) forand så låser programmet bare. Hva ske der der?

Foresten diss delete funktioner for også programmet til at crashe:
delete tone;
delete freq;



Du skal gange med 1000 inden du dividerer med 93, maxIdx/93 giver et heltal.

Resten af din kommentar forstår jeg ikke.



davs igen... Lang tid siden jeg har haft tid til at programerer.. Men nu har jeg rodet lidt rundt og er igang med at lave en lyd test funktion som skal blive ved med at spille dem samme tone igen og igen indtil man ændre den.... jeg har følgende kode:

Fold kodeboks ind/udKode 


Det er så meningen at den skal gøre det..... Men jeg laver så et loop der bliver ved med at spille dem samme tone igen... Men jeg kan ikke inde ud af at sætte lyd blokke i kø...

Den kode jeg har nu lagger rimlig meget som du kan hører... Hvad skal jeg gøre for at sætte lydblokkene i kø?



Du kan kalde waveOutWrite flere gange efter hinanden, med forskellige buffere, dvs. du skal have flere WAVEHDR strukturer som du kalder waveOutPrepareHeader med. Disse vil så blive sat i kø.

Hvis hver "tone" varer 1 sekund er det i praksis tilstrækkeligt med 2 buffere som du så kan stå og skifte imellem.



Du kan kalde waveOutWrite flere gange efter hinanden, med forskellige buffere, dvs. du skal have flere WAVEHDR strukturer som du kalder waveOutPrepareHeader med. Disse vil så blive sat i kø.

Hvis hver "tone" varer 1 sekund er det i praksis tilstrækkeligt med 2 buffere som du så kan stå og skifte imellem.


Åhh ja genialt.... Men har nu rodet lidt og jeg kan ikke komme på en ide om hvordan jeg kan gører dette...

Har du en lille ide til hvordan man kan gøre dette?
Tænkte på noget med en vector eller array af headerene men kunne ikke helt finde en måde



Indlæg senest redigeret d. 19.06.2008 23:41 af Bruger #3861
Lidt hurtig utestet kode; hvis vi forestiller os at du vil kalde create til at afspille forskellige toner, uden ophold.

Start med at have to headers:
WAVEHDR WaveHeader[2];

Tilføj et argument til create der fortæller om det er den første eller anden buffer der skal bruges.

void create(int freq, int duration, int buffer)

Så kalder du create to gange med de to buffere,

create(1000, 100, 0);
create(1200, 200, 1);

Og så venter du på at den første tone er afspillet:
while(!(WaveHeader[0].dwFlags & WHDR_DONE))
Sleep(10);
Nu kan du så genbruge denne:
create(1400, 100, 0);

Og så venter du på den anden buffer er færdig:
while(!(WaveHeader[1].dwFlags & WHDR_DONE))
Sleep(10);
Nu kan du så genbruge denne:
create(1600, 100, 1);

Og det putter du bare ind i en løkke.



Jeg har rodet lidt men jeg kan stadig ikke få det til at køre perfekt... man kan stadig høre at den skifter buffer.. Ved ikke helt hvad jeg gør forkert...

Hr brugt en lidt modificeret version af din ide.
Den fungerer således:

Create laver en buffer med den bestemte frekvens og en tid

Så bliver playtone tråden så startet:
Først forbereder den og afspiller tonen første gang.
Så kører den så de forskellige headere igennem via en for løkke i det her tlfælde er der 3.
Så tjekker den så med
if ((WaveHeader.dwFlags & WHDR_DONE))
om det er afspillet og sådan og så ellers sender den igen.


Fold kodeboks ind/udKode 


Men det lagger stadig... Hvad kan der være galt?



<< < 123 > >>
t