MidiStreamを演奏するには?

解決


たっく  2005-02-09 22:42:42  No: 13132

Delphi6personal使用の初心者です

midiデータをリソースとしてexeに組み込みこれを再生したいのですが
どのようにしたら良いのかはわかりません。
現在リソースをexeに組み込むまでは出来ました。
private
 sound1 :TResourceStream;
という名前でリソースに格納しています。

これを再生するにはどうしたらよいのでしょうか?


半蔵  2005-02-09 23:18:18  No: 13133

一番簡単なのは、MediaPlayerコンポーネントです。
このコンポーネントでは、MIDI,MP3,WAV,AVI,CDのファイルが再生できます。
使い方は、Filenameプロパティに再生するファイルを指定し、
Openメソッドで開いた後、Playメソッドで再生します。
MediaPlayerコンポーネントのVisibleをFalseにしておけば実装できるのではないでしょうか。
例)
 mediaplayer1.FileName := 'c:\winnt\media\tada.wav';
 mediaplayer1.Open;
 mediaplayer1.Play;


たっく  2005-02-10 07:26:06  No: 13134

半蔵さんお返事ありがとうございます。

行ないたい事は、ファイルにあるmidiファイルを再生するのではなく、
アプリケーションのexe内に、プログラムiconのようにmidiデータを格納してこのデータを取り出してmidiデータを再生したいのです
現在、exe内にmidiデータは収納できたのですが、これを取り出して利用する方法がわかりません。

MediaPlayerを使用する場合にも、
MediaPlayer1.FileNameにResourceStreamを指定しても、stringとTresourceStreamは違うとコンパイラーに怒られてしまいました。


...  2005-02-10 07:38:07  No: 13135

WinapiのPlaySoundでできませんか?


Mr.XRAY  URL  2005-02-10 10:01:29  No: 13136

>sound1 :TResourceStream;
>という名前でリソースに格納しています。
>MediaPlayer1.FileNameにResourceStreamを指定しても...

とありますが,具体的なコードが見えませんので,何とも言えませんが,

http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N008.html

のList6は参考になりませんか?


たっく  2005-02-10 23:39:02  No: 13137

...さん、調べましたら、Winapiのplaysoundでは、midiは鳴らせないようなのです。
http://www.interq.or.jp/moonstone/person/del/sound.htm参照しました
●MIDIで鳴らした音のループを制御
にかかれていました。

MR.XRAYさん、そちらの記載を参考に、exeに埋め込みました。
ここまでは良かったのですが、Midiを鳴らす手立てがわかりません。

uses
  MMSYSTEM;

procedure TForm1.Button1Click(Sender: TObject);
var
  RS:TResourceStream;
begin
  RS := TResourceStream.Create(hInstance,'MySound','Midi');
  try
    sndPlaySound(RS.Memory,SND_MEMORY or SND_SYNC);
  finally
    RS.Free;
  end;
end;

等としても、音がでません。
exe内部に格納されているのは、リソースハッカー等のソフトを使用して確認してみました。


Mr.XRAY  URL  2005-02-11 05:27:43  No: 13138

>等としても、音がでません。

MIDIはPlaySoundでは再生できませんね.
でしたら同じページのList7の様に,一度ファイルに書き出す方法では
どうですか.例えば(ちょっと空しい... )
もし,見られるのが嫌だったら不可視にしてしまうとか...

var
     RS:TResourceStream ;
     AFile: String;

procedure TForm1.FormCreate(Sender: TObject);
begin
     MediaPlayer1.Visible:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     //一旦ファイルに保存
     AFile:=ExtractFilePath(ParamStr(0))+'MyMIDI.mid';
     RS := TResourceStream.Create(hInstance,'MySound','Midi');
     try
       RS.SaveToFile(AFile);
     finally
       RS.Free;
     end;
     //演奏開始して終了したらファイルを削除
     if FileExists(AFile) then begin
       MediaPlayer1.FileName:=AFile;
       MediaPlayer1.Open;
       MediaPlayer1.Play;
     end;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
     MediaPlayer1.Close;
     DeleteFile(AFile);
end;


たっく  2005-02-14 03:44:21  No: 13139

Mr.XRAYさんお返事ありがとうございます。
やはりこのような方法しかないのですね。(残念)
もう少し自分でも調べてみますが、他の方法が無いようでしたら
この方法で対処させてもらいます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加