首页
社区
课程
招聘
[求助]delphi无法播放的MIDI
发表于: 2009-1-20 18:39 7915

[求助]delphi无法播放的MIDI

2009-1-20 18:39
7915


delphi 播放其他MIDI序列都没问题,就只有一个游戏里的背景音乐MIDI序列。

怎么也不播放。是很久前DOS游戏里金庸群侠传里的一个midi。  不明白了。

谁能告诉我这是为什么

下面是那个MIDI文件~

我还发现这个文件用千千静听转换 MP3或是WAV 也不能转。

里面对应的还有一个相同文件名的.xmi文件。   到底如何才能调用这个呢

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (28)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
难道是DOS游戏调用的MIDI文件 用delphi调用就不行么?

如何解决呢?
2009-1-21 00:11
0
雪    币: 342
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
千千静听可以播放,你用 mciSendString 函数试下吧,要在 uses 里加入 mmsystem 单元...
2009-1-21 00:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
WINDOWS自带的也能放,但到程序里就不行了。

你那个方法我早试过了~
2009-1-21 09:47
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
小虾怎么还不出现。急死了!!!!
2009-1-21 11:46
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
//测试了一下mciSendString函数可以正常播放,没问题。
procedure TForm1.Button1Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Open d:\long.mid alias OpenFile type MPEGVideo',c,sizeof(c),0)
end;

procedure TForm1.Button2Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Play OpenFile',c,sizeof(c),0)
end;

procedure TForm1.Button3Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Stop OpenFile',c,sizeof(c),0)
end;

procedure TForm1.Button4Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Close OpenFile',c,sizeof(c),0)
end;
2009-1-21 12:23
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我这个文件吗??? 我试了各种方法也不行, 别人做好的例子程序,放别的midi都行.

一换成这个就没声音..

这是我的代码:

procedure TForm1.FormCreate(Sender: TObject);
begin
    mciSendString('open test.mid alias midi',nil,0,0);
    mciSendString('play midi',nil,0,0);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    mciSendString('pause midi',nil,0,0);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    mciSendString('play midi',nil,0,0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    mciSendString('close midi',nil,0,0);
end;
2009-1-21 12:27
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
是你的例子文件。
2009-1-21 12:29
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个MIDI文件一定 是有问题吧?

那别的用我这个代码都能放啊.

而且别的MIDI用mediaplayer也能放啊

你真的成功 了吗?

同样的代码放别的midi都行,只要文件名一换成这个就不能放或是 说损坏格式不对等..
2009-1-21 12:34
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
我当然是试成功了。
2009-1-21 12:39
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那小虾为什么这个midi文件会出现这样的问题呢.

你知道是为什么么.还有你的代码和我的不一样,你的那些参数是什么意思啊.
2009-1-21 12:41
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
12
你有没有测试我给你的代码?如果你那里不成功我就不太清楚了(唯一要注意的地方就是用mci函数播放的文件路径必须使用doc下的8.3路径)。
2009-1-21 12:43
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
doc下的8.3路径? 是什么意思?   我同一路径下的两个midi文件这个不能另一个就能放..

还有你试试用mediaplayer播放就不行.  是不是这个midi被人做了怎么手脚?
2009-1-21 12:46
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
14
我的mediaplayer播放器可以播放这个文件(注我的系统是Win2003,mediaplayer版本是10)。
doc下的8.3路径就是像这样的路径。c:\xxxxxx~1\xxxx.mid这样的路径。
2009-1-21 12:49
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
D:\计算机技术\09年\播放MIDI音乐\播放MIDI音乐\test.mid

你的代码在我这现在这个以前能放的也没声音了.为什么

我是XP系统  版本是9.00.00
2009-1-21 12:55
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
16
D:\计算机~1\09年\播放MI~1\播放MI~1\test.mid这样试试。
2009-1-21 12:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
还是不行...........................这.............
2009-1-21 13:05
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
18
//你用这个代码试试。
procedure TForm1.Button1Click(Sender: TObject);
var c:array[0..255] of char;
    OpenName:TOpenDialog;
    s:array[0..255] of char;
begin
  OpenName := TOpenDialog.Create(self);
  try
    OpenName.Files.Add('mid files(*.mid)|*.mid|All files(*.*)|*.*||') ;
    if OpenName.Execute then
    begin
      ZeroMemory(@c,sizeof(c));
      ZeroMemory(@s,sizeof(s));
      GetShortPathName(pChar(OpenName.FileName),s,sizeof(s));
      Edit1.Text := s;
      mciSendString(pAnsiChar('Open ' + String(s) + ' alias OpenFile type MPEGVideo'),c,sizeof(c),0)
    end;
  finally
    OpenName.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Play OpenFile',c,sizeof(c),0)
end;

procedure TForm1.Button3Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Stop OpenFile',c,sizeof(c),0)
end;

procedure TForm1.Button4Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Close OpenFile',c,sizeof(c),0)
end;
2009-1-21 13:11
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=小虾;568087]//你用这个代码试试。
procedure TForm1.Button1Click(Sender: TObject);
var c:array[0..255] of char;
    OpenName:TOpenDialog;
    s:array[0..255] of char;
b...[/QUOTE]

这样的确能放了..........WHY...
2009-1-21 13:31
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
小虾你还在么?  这样没办法做成打开就自动放背景音乐呀.

为什么我的会是这样...........
2009-1-21 14:20
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
21
procedure TForm1.Button1Click(Sender: TObject);
var lResult, sTmpPath:Array[0..255] of char;
begin
    ZeroMemory(@lResult, sizeof(lResult));
    ZeroMemory(@sTmpPath, sizeof(sTmpPath));
    GetShortPathName('D:\计算机技术\09年\播放MIDI音乐\播放MIDI音乐\long.mid', sTmpPath, sizeof(sTmpPath));
    mciSendString(pAnsiChar('Open ' + String(sTmpPath) + ' alias OpenFile type MPEGVideo'),lResult,sizeof(lResult),0)
end;

procedure TForm1.Button2Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Play OpenFile',c,sizeof(c),0)
end;

procedure TForm1.Button3Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Stop OpenFile',c,sizeof(c),0)
end;

procedure TForm1.Button4Click(Sender: TObject);
var c:array[0..255] of char;
begin
  ZeroMemory(@c,sizeof(c));
  mciSendString('Close OpenFile',c,sizeof(c),0)
end;
2009-1-21 14:38
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
[QUOTE=小虾;568120]procedure TForm1.Button1Click(Sender: TObject);
var lResult, sTmpPath:Array[0..255] of char;
begin
    ZeroMemory(@lResult, sizeof(lResult));
    ...[/QUOTE]

这样就放不出了.

我想给做成这种....的:

procedure TForm1.FormCreate(Sender: TObject);
var
   lResult, sTmpPath:Array[0..255] of char;
   c:array[0..255] of char;
begin
    ZeroMemory(@lResult, sizeof(lResult));
    ZeroMemory(@sTmpPath, sizeof(sTmpPath));
    ZeroMemory(@c,sizeof(c));
    GetShortPathName('D:\计算机技术\09年\播放MIDI音乐\播放MIDI音乐\game10.MID', sTmpPath, sizeof(sTmpPath));
    mciSendString(pAnsiChar('Open ' + String(sTmpPath) + ' alias OpenFile type MPEGVideo'),lResult,sizeof(lResult),0)
    mciSendString('Play OpenFile',c,sizeof(c),0)
end;

这....小虾 是因为dos游戏调用的 midi文件和现在的不同吗.?怎么会这样...
2009-1-21 14:54
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
小 虾, 你上面那个代码我又改了改, 把button1的放到form1.create里

把button2的放到了一个timer里了..  背景音乐成功了~!

不知道这样会不会循环的播放呢...暂时问题是解决了. (不过这个MIDI文件肯定和其他的有区别)

别的直接就能.用. 总之太感谢你了
2009-1-21 16:08
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
你好像是在内存中播放的音乐,这样的话我在form1.timer1打开的如果form1.hide了。在form10上的时候。放完一遍会不会就不放了呢。。??

    ZeroMemory(@lResult, sizeof(lResult));
    ZeroMemory(@sTmpPath, sizeof(sTmpPath)); //在内存中开辟一块空白区?

    GetShortPathName('D:\long.mid', sTmpPath, sizeof(sTmpPath)); //获取短路径名存到内存中?

    mciSendString(pAnsiChar('Open ' + String(sTmpPath) + ' alias OpenFile type MPEGVideo'),lResult,sizeof(lResult),0)         //在内存中打开文件?
end;

ZeroMemory(@c,sizeof(c));
  mciSendString('Play OpenFile',c,sizeof(c),0)  //在开辟一块用来播放文件?

。。。。。不知道我理解的对不对。

突然发现:难道是用timer的原因?声音断断续续..... 而且只放一次不能循环..
2009-1-21 16:20
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
25
不是开辟内存来播放文件,那个缓冲区是用来保存mciSendString函数返回的一些信息用的。
GetShortPathName函数是将你的长文件路径名转换成以前dos格式的短文件路径名。
2009-1-21 18:21
0
游客
登录 | 注册 方可回帖
返回