Solved

=== Microsoft Synthesizer ===

Posted on 2002-07-03
4
668 Views
Last Modified: 2009-12-16
How to use [b]Microsoft Synthesizer[/b] in Delphi ? It is not a standart MIDI Out Device as far as I understood...
0
Comment
Question by:LukA_YJK
  • 2
4 Comments
 
LVL 14

Expert Comment

by:sudhakar_koundinya
ID: 7192511
Is this helps u?

 from http://www.delphi-fundgrube.de/faq13.htm


uses
  MMSystem;

procedure MakeSound(Frequency, Duration : integer);
{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
  with WaveFormatEx do begin
    wFormatTag := WAVE_FORMAT_PCM;
    nChannels := Mono;
    nSamplesPerSec := SampleRate;
    wBitsPerSample := $0008;
    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
    nBlockAlign := (nChannels * wBitsPerSample) div 8;
    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
      // wt = w *i /SampleRate
      SoundValue := 127 + trunc(127 * sin(i * w / SampleRate));
      Write(SoundValue, SizeOf(Byte));
    end;
    // you could save the wave tone to file with :
    // MS.Seek(0, soFromBeginning);
    // MS.SaveToFile('C:\MyFile.wav');
    // then reload and play them without having to
    // construct them each time.
    {now play the sound}
    sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
    MS.Free;
  end;
end; {Alan Lloyd}
0
 
LVL 3

Author Comment

by:LukA_YJK
ID: 7193692
Sorry, I asked about MIDI, not WAVE audio. Anyway thanks... I got answer from www.programmersheaven.com. Seems I need DirectMusic to use MS Synthesizer, so need DirectX headers:

//plays normal midi or SGT/SGP(DirectMusic Producer) files
procedure PlayFile(FileName: string);
var
Name: string;
Path: string;
begin
Name := ExtractFileName(FileName);
Path := ExtractFilePath(FileName);
DMusicLoader.SetSearchDirectory(GUID_DirectMusicAllTypes,StringToOleStr(Path),True);
DMusicLoader.LoadObjectFromFile(CLSID_DirectMusicSegment,IID_IDirectMusicSegment8,StringToOleStr(Name),DMusicSegment);
if ExtractFileExt(Name) = '.mid' then
DMusicSegment.SetParam(GUID_StandardMIDIFile,$FFFFFFFF,DMUS_SEG_ALLTRACKS,0,nil);
DMusicSegment.Download(DMusicPerformance);
DMusicPerformance.PlaySegment(DMusicSegment,0,0,nil);
end;
0
 
LVL 14

Expert Comment

by:sudhakar_koundinya
ID: 7195236
OK no problem
:-)

0
 
LVL 6

Accepted Solution

by:
Mindphaser earned 0 total points
ID: 7264921
Points refunded and moved to PAQ

** Mindphaser - Community Support Moderator **
0

Featured Post

Enterprise Mobility and BYOD For Dummies

Like “For Dummies” books, you can read this in whatever order you choose and learn about mobility and BYOD; and how to put a competitive mobile infrastructure in place. Developed for SMBs and large enterprises alike, you will find helpful use cases, planning, and implementation.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
delphi exception 7 64
Using idhttp to login to instagram 2 89
Dev express lookupcombo 3 28
enhance the following code 3 32
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question