之前在旧馆发过制作歌词卡用的一段程式。。。
现在完善了一些。。。
为了能正常运行一些功能,
翻了很多的saori以及SSP相关的资料,
至少能正常的跑了。。。(笑)
可是别太期待这段代码会有非常好的表现,
因为并没有加入除错机制。。。
所以现在完成的仅仅是个能用的雏形。。。
已完成的功能:
1.把丢给人格的一种格式的lrc文件处理成伪春菜用格式;
2.播放歌的时候同步播放歌词;(歌名与歌词卡名字必须相同)
使用步骤当然是先做好歌词卡,然后再用橘花的播放功能来播放
想到但是未完成的功能:
1.已做歌词卡“数据库”,避免歌词卡重复制作;
2.伪春菜播放歌的时候搜索“数据库文件”中是否有对应的歌词卡,有则同步播放;
3.如果“数据库”中没有对应的歌词卡时可到网站搜索并自动下载来做成伪春菜用歌词卡;(喘气)这个有难度,就当前的Saori而言= =
4.暂时还没想到。。。XD
与code的战争才刚刚打响,
更庞大的工程还在后面。。。(远目)
以下是目前能够正常运行的代码。。。
大部分的地方都加了注释,
应该能看明白一些。。。
可以的话。。。请完善她吧~~~(殴)
这里以橘花为例子,
(迷之声:其实我是萌御姐的啊!!>。<)
因为改动了非常多的地方,
下文可能会有遗漏,
请大家指正。。。m(_ _)m
p.s新人的话还是先暂停往下看,
因为可能会造成你的人格无法正常运行等无法预料的后果。
(拍手)那觉得自己有能力进行手术的同学们!
先需要准备一些手术用具(被踹飞)
繁琐的手术要开始了(化作天边的星辰)
一共需要准备的各种saori:
ssu.dll、edittext.dll、ki.dll、mciaudior.dll
橘花已经有了ki.dll跟mciaudior.dll,
剩下的这2个因为有版权的关系。。。
可能在公开场合发布了作者会生气吧。。。
嗯。大家知道怎么做了吧?呐呐?(笑)
下面是运作的方法和原理。。。
不想看的可以直接去下载附件里面已经修改完成的txt文件。
嘛、、、接下来
首先。。。国际惯例。。。
修改misaka.ini
加入
LrcMaker.txt
LrcPlay.txt
在ai_0.txt的$_Variable中加入
複製內容到剪貼板
代碼:
//---歌词卡显示预设变量
{$LrcMinute=0}
{$LrcSecond=0}
{$LrcMillisecond=0}
{$LrcMinute1=0}
{$LrcSecond1=0}
{$LrcMillisecond1=0}
{$LrcTemp=0}
{$LrcTemp1=0}
{$LrcLineNumber=0}
{$LrcTotalLine=0}
{$LrcTxtTemp=0}
{$LrcAppearTime=0}
{$FileNameTemp=0}
{$pathTemp=""}
{$LrcFileName=0}
其实自己设置的太多了,
没有留意到底有多少是没被用到的。。。@_@
然后是$_Constant中加入
複製內容到剪貼板
代碼:
//歌词卡用
{$loadsaori("lrc\edittext.dll")}
{$loadsaori("saori\ssu.dll")}
ai_1.txt、ai_2.txt、ai_2t.txt、ai_3.txt最顶端的
複製內容到剪貼板
代碼:
#_Common
{$if ({$mode}==0)}
修改为
複製內容到剪貼板
代碼:
#_Common
{$if (({$mode}==0) && ({$LrcShow}==0))}
接着在ai_1.txt中加入以下
複製內容到剪貼板
代碼:
//启动时获取Lrc文件存放完整路径,此段专属SSP跟Crow语法。。。
$OnNotify_OnNotifySelfInfo
{
{$pathTemp={$reference(4)}}
{$pathTemp={$substringl({$pathTemp},{$index(shell,{$pathTemp})})}}
{$pathTemp={$saori("ssu.dll","replace","{$pathTemp}","/","\")}}
{$pathTemp={$pathTemp}ghost\master\lrc\}
}
//---丢入LRC文件---
$OnFileDrop2;{$if ({$insentence({$reference(0)},".lrc")})}
{
{$filename={$reference(0)}}
\0\s[0]是歌词卡文件哦,\w8制作歌词卡中{$LrcMaker}
\e
}
$OnFileDrop2;{$if ({$insentence({$reference(0)},".LRC")})}
{
{$filename={$reference(0)}}
\0\s[0]是歌词卡文件哦,\w8制作歌词卡中{$LrcMaker}
\e
}
ai_2.txt中的
複製內容到剪貼板
代碼:
$Select.MusicStart_0
\0\s[0]{$saori("mciaudior.dll","stop")}{$saori("mciaudior.dll","load","{$filename}")}{$saori("mciaudior.dll","play")}好的、\w9那麽开始播放。\e
[code]
修改为:
[code]
$Select.MusicStart_0
{
{$LrcShow=1}
{$LrcPlay}\e
}
然后把附件里面的LrcMaker.txt跟LrcPlay.txt放到ghost\master文件夹下
LrcMaker.txt的内容在这里:
複製內容到剪貼板
代碼:
#_Common
{$if (({$mode}==0) && ({$LrcShow}==1))}
$LrcMaker
{
//复制LRC文件到人格目录下
{$saori("ki.dll","filecopy","{$filename}","{$pathTemp}")}
{$filename={$extractfilename({$filename})}}
//以LRC标准格式来说,从第5行开始搜索
//{$LrcTemp={$saori("edittext.dll","{$filename}","GetLine2","4")}}
//读取LRC文件中一共有几行。
{$LrcTotalLine={$saori("edittext.dll","{$filename}","GetLineNum")}}
{$LrcLineNumber=4}
{$LrcLineCreating}
\e
}
//完成一行的构建
//如果预读的行小于总行数
$LrcLineCreating
{
{$if ({$LrcLineNumber}<{$LrcTotalLine}) { {$Creating} } else { {$CreatingFalse} } }
}
$Creating
{
//从第4行开始读取
{$LrcTemp={$saori("edittext.dll","01 - 梦里花.lrc","GetLine2","{$LrcLineNumber}")}}
//分析第N行的内容并保存
{$GetLyrics}
{$GetTime}
{$Time1={$LrcAppearTime}}
//算出一行的延迟时间
{$LrcLineNumber++}
{$GetLyricsDelay}
//保存一行
{$SaveLyris}
//保存后继续返回处理下一行
{$LrcLineCreating}
}
$CreatingFalse
{
{$if ({$LrcLineNumber}=={$LrcTotalLine}) { {$LastLrc} } else { {$LastLrcNo} } }
}
$LastLrc
{
{$LrcTemp1={$saori("edittext.dll","{$filename}","GetLine2","{$LrcLineNumber}+1")}}
{$saori("edittext.dll","{$FileNameTemp}.txt","Append","{$Temp}","//结束")}
//给Lrc完成索引文件,未完成功能
//{$saori("edittext.dll","LrcList.txt","Append","0","{$FileNameTemp}")}
}
$LastLrcNo
{
\0\s[0]保存失败\n\e
}
$GetLyrics
{
{$LrcTxtTemp={$substring({$LrcTemp},11,{$length({$LrcTemp}-11)})}}
}
$GetTime
{
{$GetMinute}
{$GetSecond}
{$GetMillisecond}
{$GetLineAppearTime}
}
//计算歌词出现时间
$GetLineAppearTime
{
{$LrcAppearTime={$calc({$LrcMinute}*60000+{$LrcSecond}*1000+{$LrcMillisecond}*10)}}
}
//保存一行
$SaveLyris
{
{$Temp={$calc({$LrcLineNumber}-1)}}
{$LrcTemp1="{$LrcTxtTemp}\_w[{$LrcAppearTime}]\n"}
//获取Lrc除去Lrc后缀之后的名字
{$FileNameTemp={$substringl({$filename},{$calc({$length({$filename})}-4)})}}
{$saori("edittext.dll","{$FileNameTemp}.txt","Append","{$Temp}","{$LrcTemp1}")}
}
//算出上下一句之间的间隔延迟时间,可以取到倒数第2行
$GetLyricsDelay
{
{$if ({$LrcLineNumber}<{$LrcTotalLine}) { {$GetLyricsDelayOK} } else { {$GetLyricsDelayFalse} } }
}
$GetLyricsDelayOK
{
{$LrcTemp={$saori("edittext.dll","{$filename}","GetLine2","{$LrcLineNumber}")}}
{$GetTime}
{$Time2={$LrcAppearTime}}
{$LrcAppearTime={$calc({$Time2}-{$Time1})}}
}
//X固定出上下一句之间的间隔延迟时间,取最后1行
$GetLyricsDelayFalse
{$if ({$LrcLineNumber}=={$LrcTotalLine})}
{
//{$LrcAppearTime=5000}
}
//取分存分
$GetMinute
{
{$LrcMinute={$substring({$LrcTemp},2,2)}}
//判断是否是10以下数字,是10以下则重新赋值为个位数
{$if ({$substringfirst({$LrcMinute})}==0) { {$LrcMinute={$substringlast({$LrcMinute})}} } }
}
//取秒存秒
$GetSecond
{
{$LrcSecond={$substring({$LrcTemp},5,2)}}
//判断是否是10以下数字,是10以下则重新赋值为个位数
{$if ({$substringfirst({$LrcSecond})}==0) { {$LrcSecond={$substringlast({$LrcSecond})}} } }
}
//取毫秒存毫秒
$GetMillisecond
{
{$LrcMillisecond={$substring({$LrcTemp},8,2)}}
//判断是否是10以下数字,是10以下则重新赋值为个位数
{$if ({$substringfirst({$LrcMillisecond})}==0) { {$LrcMillisecond={$substringlast({$LrcMillisecond})}} } }
}
以下是LrcPlay.txt的内容(测试用临时写的。。。)
複製內容到剪貼板
代碼:
#_Common
{$if (({$mode}==0) && ({$LrcShow}==1))}
$LrcPlay
{
{$saori("mciaudior.dll","stop")}{$saori("mciaudior.dll","load","{$filename}")}{$saori("mciaudior.dll","play")}
//去掉路径,以及.mp3获取歌名,
{$FileNameTemp={$substringl({$extractfilename({$filename})},{$calc({$length({$extractfilename({$filename})})}-4)})}}
//读取txt文件中一共有几行。
{$LrcTotalLine={$saori("edittext.dll","{$FileNameTemp}.txt","GetLineNum")}}
//初始化行计数器
{$TxtLineNumber=0}
{$GetLineLyrics}
}
//获取一行歌词
$GetLineLyrics
{
//判断计数器的值是否与总行数相等
{$if ({$TxtLineNumber}<{$LrcTotalLine}) { {$GontinueGetLyrics} } else { {$EndOfTxt} } }
}
//继续获取一行歌词
$GontinueGetLyrics
{
{$LrcTemp={$saori("edittext.dll","{$FileNameTemp}.txt","GetLine2","{$TxtLineNumber}")}}
\0\s[21,3]\c\_q{$LrcTemp}\_q\n
{$TxtLineNumber++}
{$GetLineLyrics}
}
$EndOfTxt
{
\0\s[0]呼。。。结束了。。
\e
}
//---------------------
$OnBoot
{
\1\s[10]\0\s[7]歌没唱完就让我走了!\w9\w5\0\s[-1]\1\s[10]喂!\w8\n你去拿手雷干吗!!??\w8\n给我回来!!!\w8\n\0\s[35]不高兴了。\w8\n
{$LrcShow=0}\e
}
$OnClose
{
\0\s[3]啊!\w3等等!{$ValClear}\w8\-\e
}
$OnGhostChanging
{
\0\s[7]真扫兴{$ValClear}\w8\w9\e
}
//---- 双击事件 -------------------
$OnMouseDoubleClick
{
\0\s[0]不需要我唱了吗?\n\n
\q[嗯,辛苦你了,LrcStop]\n
\q[你走音了,LrcPlayReset]\n
\e
}
$OnChoiceSelect,{$if ({$reference(0)}==LrcStop)}
{
{$saori("mciaudior.dll","stop")}
\0\s[0]真扫兴。\1\s[10]你还是适合拿枪吧。
{$LrcShow=0}
\e
}
$OnChoiceSelect,{$if ({$reference(0)}==LrcPlayReset)}
{
{$LrcPlay}
}
//**** 変数初期化 *****************************************************************************************************
$ValClear
{
{$temp=""}{$temp1=""}{$temp2=""}{$temp3=""}{$temp4=""}{$temp5=""}
{$WorkKind=""}{$TimeWork=""}{$timezone=""}
{$DisplayBpp=""}{$DisplayWidth=""}{$DisplayHeight=""}
{$talkcount=""}{$TestTalk=""}{$lastchangedghost=""}
{$TestTalk=""}
}
大致是以上这样了。。。可能会有遗漏的地方。。。
请大家对着附件里面的看了。。。囧
p.s橘花042506版因为用的美坂版本比较低,无法使用这些代码。
而且有几个bug,感谢CG的ucggamer告诉我这些。。。m(_ _)m
引用之前在CG发的。。。虽然被无视了。。。
[引用]
附上使用了新版本的伪AI后出现沟通无法进行的解决方案。
旧版语法:
$Select.Communicate
\![open,communicatebox]\0\s[26]?\e
改成
新版语法:
$Select.Communicate
{
\![open,inputbox,communicatebox,-1]
\0\s[26]?\e
}
旧版:
$_OnGhostCommunicateReceive;{$if ({$sender}==User)}
{$UserCommunicate}\w9\w9\e
新版:
$OnUserInput,{$if ({$reference(0)}=="communicatebox")}
{
\1\s[10]
{$UserCommunicate}\w9\w9\e
}
然后用记事本的Ctrl+H把{$inlastsentence(替换成{$insentence({$reference(1)},就可以了。
旧版的橘花原作者写代码时忽略了语法的正确性,
赋值写错了。。。请大家手动修正下,
用记事本打开ai_1.txt
然后Ctrl+H
查找内容为($temp)
替换内容为({$temp})
[引用]
0.0.101.13870版本美坂的已经加附件里面。。。
弄了这么多迷糊了。。。
闪去玩FF7CC XD。。。(殴)
闪回。。。欢迎大家提意见啊。。。>。<
10.19 修正了几个小问题。。。第一个档无法正常使用的话请下载下面的...Or2
10.27 囧,拖了这么久。。。好多天都死在战地2142里了。。。(踹)XD
总之。。。附件已经更新到0.003了,做了啥改动里面有写的哈。。。
[
本帖最後由 KS喵 於 2007-10-28 01:42 編輯 ]