<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>QBMusicParser</title>
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
<meta name="ProgId" content="VisualStudio.HTML">
<meta name="Originator" content="Microsoft Visual Studio.NET 7.0">
<meta name="Author" content="LvYou,吕游">
</head><body MS_POSITIONING="GridLayout" onload=WebMain()>
<OBJECT ID="DAControl" style="height:1px;width:1px" CLASSID="CLSID:B6FFC24C-7E13-11D0-9B47-00C04FC2F51D" >
</OBJECT>把QB的乐谱放进来试试:
<select onchange="txtMusic.value=value">
<option value="o2a4b4>c4d8e8e4d4c4o2b4a4b4o3c4o2b8a8a1o2a4b4o3c4d8e8e8a4e8e4d4c4c4c8d8c8e8e1o3a8a4a8a4e4g8g4g8g4e8d8d8c8c4c4g8e8e1o3a8a4a8a4b8a8g8g4g8g4e8d8c4c4o2b8a8g4a1o3d8d8d8e8g4e8g8o2a1o4c8c8c8c8o3b4a8g8g1o3d8d8d8e8g8f8e4d8d4e8g8e8e4d8d8d8e8g4o4c8o3b8a1">歌曲1</option>
<option value="o3g16a8g16o4c8o3a16g16e2d16e8g16e8d16e16o2a2o3c16c8o2a16g8a8o3c8.d16c4d16d8c16o2a8o3e8d2o3g16e8g16e8g8a16a8o4c16o3a8g8e16e8d16e8g8e2o3g16e8g16e8g8a16a8o4c16o3a8g8e16e8d16e8g8e2o3d8.e16d8e8g8.a16g8a8o4c4.o3a8o4c2o3a16a8a16g8a8g8.e16d8e8g1o3d16d8c16o2a8o3d16e16c2">歌曲2</option>
<option value="o3e16g16a4a8g16a16a4p8a16e16g8g8g8a16g16g4d8e16d16o3d4d8e16d16d4c8d16e16e2.p8e16g16o3a4a8g16a16a4p8a16o4c16d8d8d8c16d16d4d8c16o3a16o3a4g16a8g16e4g8e16a16a1a4p4p4p8a16o4c16o4d8d8d8c16d16d4p8d16e16d8d8c16d8c16o3a4p8a16o4c16o4d16d8.c16d8.d8d8c16d8o3b16b2.p8a16o4c16d8d8d8c16d16d4p8d16e16o4d8d8c16d8c16o3a4p8a16o4c16d8d8c16d8.d8d8c16d8o3b16b2.p8e16g16o3a4a8g16a16a4p8a16e16g8g8g8a16g16g4d8e16d16d4d8e16d16d4c8d16e16e2.g8e16a16a1">歌曲3</option>
</select><textarea id=txtMusic rows=10 cols=40></textarea>
<button onclick="Play(txtMusic.value)">播放</button>
<button onclick="Stop()">停止</button>
</body>
</html><script language=javascript>
<!--/************************************
JScript+DirectAnimation播放QB音乐程序
10/10/2002  4:03初稿
其中有很多QB音乐指令还不支持
未完成,未整理,仅供参考研究
LvYou 吕游 [email protected]
************************************/
function CPlayer(){
this.PlaySoundFont=PlaySoundFont
this.AdjustSpeed=AdjustSpeed
this.AdjustLevel=AdjustLevel
this.AdjustLevelUp=AdjustLevelUp
this.AdjustLevelDown=AdjustLevelDown
this.getTimeStandard=getTimeStandardvar m_sfpm=80; //每分钟多少个8分音符
var SFLength=100;
var CurrentLevel=4;function PlaySoundFont(sf,sflength){
status=sf
snd.SwitchTo(m.SinSynth.Rate(GetFrq(sf)))
return
}
function AdjustSpeed(sfpm){
m_sfpm=sfpm
}function getTimeStandard(){
return 20000/m_sfpm*8;
}function AdjustLevel(sflv){
CurrentLevel=sflv;
}
function AdjustLevelUp(){
CurrentLevel++;
}function AdjustLevelDown(){
CurrentLevel--;
}function GetFrq(sf){
var feq=0;
switch (sf){
case "C":
feq=264
break;
case "D":
feq=297
break;
case "E":
feq=330
break;
case "F":
feq=352
break;
case "G":
feq=396
break;
case "A":
feq=440
break;
case "B":
feq=495
break;
case "P":
feq=0;
break;
default:
feq=0;
break;
}
feq=feq*Math.pow(2,CurrentLevel-2)
return feq
}
function GetInterval(sflen){
return 100;
}
}
function parseCommand(strMusic){
var cmdstr="";var SoundFont=/^([CDEFGABP])(\d{0,2})(\.?)/ivar LevelAdjust=/^O([123456])/i
var LevelUP=/^>/i
var LevelDown=/^</ivar SpeedAdjust=/^T(\d{1,})/ivar result;result=strMusic.match(SoundFont)
if (result!=null){
if (RegExp.$2=="")
cmdstr="SF " + RegExp.$1 + " 8" //默认8分音符
else
if (RegExp.$3=="") //不带附点
cmdstr="SF " + RegExp.$1 + " " + RegExp.$2
else //带附点
cmdstr="SF " + RegExp.$1 + " " + parseInt(RegExp.$2)*2/3return new Array(cmdstr,RegExp.lastIndex)
}result=strMusic.match(LevelAdjust)
if (result!=null){
cmdstr="LA " + RegExp.$1
return new Array(cmdstr,RegExp.lastIndex)
}
result=strMusic.match(LevelUP)
if (result!=null){
cmdstr="LU"
return new Array(cmdstr,RegExp.lastIndex)
}
result=strMusic.match(LevelDown)
if (result!=null){
cmdstr="LD"
return new Array(cmdstr,RegExp.lastIndex)
}result=strMusic.match(SpeedAdjust)
if (result!=null){
cmdstr="SA " + RegExp.$1
return new Array(cmdstr,RegExp.lastIndex)
}
}
var MusicBuffer
var PlayInProgress=false
var TimerIDfunction DoPlayMusic(strMusic){PlayInProgress=trueif (MusicBuffer!=""){
strMusic+=MusicBuffer
MusicBuffer=""
}
var ParseResult=parseCommand(strMusic)
if (typeof(ParseResult)=='undefined'){
Player.PlaySoundFont("P",sflength)
PlayInProgress=false
return 
}
//alert(ParseResult)
var cmd=ParseResult[0]
var idx=ParseResult[1]cmd=cmd.split(" ")
//alert(cmd)
//alert(strMusic.substr(idx))
switch(cmd[0]){ //命令种类
case "SF": //soundfont
var sf=cmd[1].toUpperCase();
var sflength=parseInt(cmd[2])
Player.PlaySoundFont(sf,sflength)
//alert(5000/sflength)
TimerID=setTimeout("DoPlayMusic('" + strMusic.substr(idx) + "')",Player.getTimeStandard()/sflength)
break;
case "LA": //Level Adjust
Player.AdjustLevel(cmd[1])
TimerID=setTimeout("DoPlayMusic('" + strMusic.substr(idx) + "')",0)
break;
case "LU": //Level Adjust
Player.AdjustLevelUp()
TimerID=setTimeout("DoPlayMusic('" + strMusic.substr(idx) + "')",0)
break; 
case "LD": //Level Adjust
Player.AdjustLevelDown()
TimerID=setTimeout("DoPlayMusic('" + strMusic.substr(idx) + "')",0)
break; 
case "SA": //Speed Adjust
Player.AdjustSpeed(cmd[1])
TimerID=setTimeout("DoPlayMusic('" + strMusic.substr(idx) + "')",0)
break;
}
}
function Play(MusicSegment){
if (!PlayInProgress)
DoPlayMusic(MusicSegment)
else
MusicBuffer+=MusicSegment
}function Stop(){
clearTimeout(TimerID)
Player.PlaySoundFont("P",1)
PlayInProgress=false
}
function WebMain(){m = DAControl.MeterLibrary;
snd=m.ModifiableBehavior(m.Silence);
DAControl.Image=m.EmptyImage;
DAControl.Sound=snd
DAControl.Start()Player=new CPlayer()}
//-->
</script>