2011-10-12 5 views
9

मैं समय के साथ बदलते विशिष्ट आवृत्तियों और आयामों के साथ एक निरंतर ध्वनि उत्पन्न करना और खेलना चाहता हूं। मैं आवाजों के बीच देरी नहीं करना चाहता। मैं डेल्फी या सी ++ बिल्डर के साथ ऐसा कैसे कर सकता हूं?मैं विभिन्न आवृत्तियों के निरंतर स्वर कैसे उत्पन्न कर सकता हूं?

+0

देखें [waveOutXXX फ़ंक्शन परिवार] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd757715 (v = vs.85) .aspx) –

+1

चूंकि आपने मेरा जवाब स्वीकार नहीं किया है, मुझे लगता है कि यह आपकी मदद नहीं करता है। शायद आप समझा सकते हैं कि यह आपकी मदद क्यों नहीं करता? –

उत्तर

1

WaveAudio लाइब्रेरी का उपयोग कर यह एक सतत cosinus लहर उत्पन्न करने के लिए संभव है के द्वारा।

मैं कुछ कोड पोस्ट करने वाला था लेकिन मैं यह नहीं समझ सकता कि इसे ठीक से कैसे किया जाए, इसलिए मैं नहीं करूँगा।

लेकिन आपको केवल इतना करना है कि TLiveAudioPlayer का उपयोग करें और फिर ऑनडाटा ईवेंट ओवरराइड करें।

और यदि कोई संदेश पंप नहीं है तो असिंक को भी सत्य पर सेट करें।

17

यह बहुत ही सरल उदाहरण आपको शुरू करना चाहिए।

विशेष साफ इंटरफ़ेस में
program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, Windows, MMSystem; 

type 
    TWaveformSample = integer; // signed 32-bit; -2147483648..2147483647 
    TWaveformSamples = packed array of TWaveformSample; // one channel 

var 
    Samples: TWaveformSamples; 
    fmt: TWaveFormatEx; 

procedure InitAudioSys; 
begin 
    with fmt do 
    begin 
    wFormatTag := WAVE_FORMAT_PCM; 
    nChannels := 1; 
    nSamplesPerSec := 44100; 
    wBitsPerSample := 32; 
    nAvgBytesPerSec := nChannels * nSamplesPerSec * wBitsPerSample div 8; 
    nBlockAlign := nChannels * wBitsPerSample div 8; 
    cbSize := 0; 
    end; 
end; 
              // Hz      // msec 
procedure CreatePureSineTone(const AFreq: integer; const ADuration: integer; 
    const AVolume: double { in [0, 1] }); 
var 
    i: Integer; 
    omega, 
    dt, t: double; 
    vol: double; 
begin 
    omega := 2*Pi*AFreq; 
    dt := 1/fmt.nSamplesPerSec; 
    t := 0; 
    vol := MaxInt * AVolume; 
    SetLength(Samples, Round((ADuration/1000) * fmt.nSamplesPerSec)); 
    for i := 0 to high(Samples) do 
    begin 
    Samples[i] := round(vol*sin(omega*t)); 
    t := t + dt; 
    end; 
end; 

procedure PlaySound; 
var 
    wo: integer; 
    hdr: TWaveHdr; 
begin 

    if Length(samples) = 0 then 
    begin 
    Writeln('Error: No audio has been created yet.'); 
    Exit; 
    end; 

    if waveOutOpen(@wo, WAVE_MAPPER, @fmt, 0, 0, CALLBACK_NULL) = MMSYSERR_NOERROR then 
    try 

     ZeroMemory(@hdr, sizeof(hdr)); 
     with hdr do 
     begin 
     lpData := @samples[0]; 
     dwBufferLength := fmt.nChannels * Length(Samples) * sizeof(TWaveformSample); 
     dwFlags := 0; 
     end; 

     waveOutPrepareHeader(wo, @hdr, sizeof(hdr)); 
     waveOutWrite(wo, @hdr, sizeof(hdr)); 
     sleep(500); 

     while waveOutUnprepareHeader(wo, @hdr, sizeof(hdr)) = WAVERR_STILLPLAYING do 
     sleep(100); 

    finally 
     waveOutClose(wo); 
    end; 


end; 


begin 

    try 
    InitAudioSys; 
    CreatePureSineTone(400, 1000, 0.7); 
    PlaySound; 
    except 
    on E: Exception do 
    begin 
     Writeln(E.Classname, ': ', E.Message); 
     Readln; 
    end; 
    end; 

end. 

सूचना आपको मिलेगा:

InitAudioSys; 
    CreatePureSineTone(400, 1000, 0.7); 
    PlaySound; 
संबंधित मुद्दे