PDA

View Full Version : سوال: ايجاد صدا ويا نواختن نت موسيقي



shpegah
شنبه 24 مهر 1389, 09:40 صبح
سلام دوستان
در تالار دلفي نت موسيقي را جستجو كردم چيزي پيدا نكرد.
ميخواستم بدانم چطور ميشود هر صدايي را ويا نتي را در دلفي ايجاد كرد؟
در دلفي تابعي نداريم كه مانند بيسيك فركانس ودامنه وزمان را بگيرد وصدا توليد كند؟

Saeed_m_Farid
شنبه 24 مهر 1389, 10:13 صبح
فکر نمیکنم دقیقاً همچین تابعی وجود داشته باشه، تابعی مثل sndPlaySound برای پخش از فایل یا مموری استریم استفاده میشه، و یا مثلاً messagebeep و windows.beep برای تولید یک فرکانس مدت دار وجود دارند؛ ولی برای چیزی که شما میخواهید، میتونید از کدی مثل زیر استفاده کنید:
uses
MMSystem;
type
TVolumeLevel = 0..127;

procedure MakeSound(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel);
{writes tone to memory and plays it}
var
WaveFormatEx: TWaveFormatEx;
MS: TMemoryStream;
i, TempInt, DataCount, RiffCount: integer;
SoundValue: byte;
w: double; // omega ( 2 * pi * frequency)
const
Mono: Word = $0001;
SampleRate: Integer = 11025; // 8000, 11025, 22050, or 44100
RiffId: string = 'RIFF';
WaveId: string = 'WAVE';
FmtId: string = 'fmt ';
DataId: string = 'data';
begin
if Frequency > (0.6 * SampleRate) then
begin
ShowMessage(Format('Sample rate of %d is too Low to play a tone of %dHz',
[SampleRate, Frequency]));
Exit;
end;
with WaveFormatEx do
begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := Mono;
nSamplesPerSec := SampleRate;
wBitsPerSample := $0008;
nBlockAlign := (nChannels * wBitsPerSample) div 8;
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
cbSize := 0;
end;
MS := TMemoryStream.Create;
with MS do
begin
{Calculate length of sound data and of file data}
DataCount := (Duration * SampleRate) div 1000; // sound data
RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +
SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // file data
{write out the wave header}
Write(RiffId[1], 4); // 'RIFF'
Write(RiffCount, SizeOf(DWORD)); // file data size
Write(WaveId[1], Length(WaveId)); // 'WAVE'
Write(FmtId[1], Length(FmtId)); // 'fmt '
TempInt := SizeOf(TWaveFormatEx);
Write(TempInt, SizeOf(DWORD)); // TWaveFormat data size
Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
Write(DataId[1], Length(DataId)); // 'data'
Write(DataCount, SizeOf(DWORD)); // sound data size
{calculate and write out the tone signal} // now the data values
w := 2 * Pi * Frequency; // omega
for i := 0 to DataCount - 1 do
begin
SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate)); // wt = w * i / SampleRate
Write(SoundValue, SizeOf(Byte));
end;
{now play the sound}
sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
MS.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MakeSound(1200, 1000, 60);
end;


در این مورد اینجا (http://sheepdogguides.com/dt2g.htm) رو هم ببینید بد نیست ...

BORHAN TEC
شنبه 24 مهر 1389, 20:36 عصر
در دلفي تابعي نداريم كه مانند بيسيك فركانس ودامنه وزمان را بگيرد وصدا توليد كند؟
مگه میشه بیسیک داشته باشه ولی دلفی نداشته باشه؟!!! در ضمن این یک تابع API است و ربطی به زبان برنامه نویسی ندارد. :متفکر:
از کد زیر استفاده کنید:

windows.Beep(100,2000)