forked from backup/30dayMakeOS
MML播放器
This commit is contained in:
@@ -23,7 +23,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \
|
||||
sosu/sosu.hrb sosu2/sosu2.hrb sosu3/sosu3.hrb \
|
||||
type/type.hrb iroha/iroha.hrb chklang/chklang.hrb \
|
||||
notrec/notrec.hrb bball/bball.hrb invader/invader.hrb \
|
||||
calc/calc.hrb tview/tview.hrb
|
||||
calc/calc.hrb tview/tview.hrb mmlplay/mmlplay.hrb
|
||||
$(EDIMG) imgin:../z_tools/fdimg0at.tek \
|
||||
wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \
|
||||
copy from:haribote/haribote.sys to:@: \
|
||||
@@ -57,6 +57,11 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \
|
||||
copy from:invader/invader.hrb to:@: \
|
||||
copy from:calc/calc.hrb to:@: \
|
||||
copy from:tview/tview.hrb to:@: \
|
||||
copy from:mmlplay/mmlplay.hrb to:@: \
|
||||
copy from:mmldata/kirakira.mml to:@: \
|
||||
copy from:mmldata/fujisan.mml to:@: \
|
||||
copy from:mmldata/daigo.mml to:@: \
|
||||
copy from:mmldata/daiku.mml to:@: \
|
||||
copy from:nihongo/nihongo.fnt to:@: \
|
||||
imgout:haribote.img
|
||||
|
||||
@@ -102,6 +107,7 @@ full :
|
||||
$(MAKE) -C invader
|
||||
$(MAKE) -C calc
|
||||
$(MAKE) -C tview
|
||||
$(MAKE) -C mmlplay
|
||||
$(MAKE) haribote.img
|
||||
|
||||
run_full :
|
||||
@@ -155,6 +161,7 @@ clean_full :
|
||||
$(MAKE) -C invader clean
|
||||
$(MAKE) -C calc clean
|
||||
$(MAKE) -C tview clean
|
||||
$(MAKE) -C mmlplay clean
|
||||
|
||||
src_only_full :
|
||||
$(MAKE) -C haribote src_only
|
||||
@@ -187,6 +194,7 @@ src_only_full :
|
||||
$(MAKE) -C invader src_only
|
||||
$(MAKE) -C calc src_only
|
||||
$(MAKE) -C tview src_only
|
||||
$(MAKE) -C mmlplay src_only
|
||||
-$(DEL) haribote.img
|
||||
|
||||
refresh :
|
||||
|
||||
BIN
30_day/mmldata/daigo.mml
Normal file
BIN
30_day/mmldata/daigo.mml
Normal file
Binary file not shown.
30
30_day/mmldata/daigo.org
Normal file
30
30_day/mmldata/daigo.org
Normal file
@@ -0,0 +1,30 @@
|
||||
/* <20>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>ȑ<EFBFBD>5<EFBFBD><35> <20>n<EFBFBD>Z<EFBFBD><5A> "<22>^<5E><>" op. 67<36>v<EFBFBD><76><EFBFBD><EFBFBD> Ludwig van Beethoven */
|
||||
|
||||
$E"SJIS"; $K"<22><><EFBFBD><EFBFBD><EFBFBD>ȑ<EFBFBD>5<EFBFBD>ԃn<D483>Z<EFBFBD><5A> %"<22>^<5E><>%" op.67";
|
||||
|
||||
T155Q7L8O4
|
||||
RGGGE-2.RFFFD4&D1
|
||||
RGGGQ8E-Q7A-A-A-Q8GQ7>E-E-E-C8&C2<GGG
|
||||
Q8DQ7A-A-A-Q8GQ7>FFFD8&D2GGF
|
||||
Q8E-Q7<E-E-FQ8G>Q7GGFQ8E-Q7<E-E-F
|
||||
Q8GQ7>GGFL4E-RCRG2.L8R<A-A-A-F4&F1
|
||||
RA-A-A-Q8FQ7DDDQ8<BQ7A-A-A-Q8GQ7<GGG
|
||||
>>E-A-A-A-Q8FQ7DDDQ8<BQ7A-A-A-Q8GQ7<GGG
|
||||
>>E-G>CCQ8C2Q7<BBB>DQ8D2Q7CCCE-Q8E-Q7DQ4DF
|
||||
Q8FQ7EQ4EGQ7GQ7FQ4FA-Q8A-Q7GQ4GB-Q8B-Q7A-Q4A->C
|
||||
Q8CQ7<BQ4B>DQ7CE-E-E-C<GGGE-C<GGE-CCC<B>>>FDD
|
||||
<BGFFD<BGFD<B>CCC>>E-E-E-
|
||||
C<AAAG-E-E-E-C<AAAA4R2R4B-4R4
|
||||
RB-B-B-E-2F2Q8<B-2>L4B->E-DE-FQ7CQ8CQ7<B-
|
||||
Q8B->E-DE-FQ7CQ8CQ7<B-Q8>B->E-DE-FQ7CQ8C<B-
|
||||
Q8<B->CD-Q7CQ8<B->C<B-Q7A-Q8>D-E-FQ7E-
|
||||
Q8D-E-D-Q7CQ8E-FG-FE-Q7FQ8G-FE-Q7FQ8G-F
|
||||
E-Q7FQ8G-FE-FG-FG-Q7AL8B-&B-2Q4>C<B-A-
|
||||
Q8A-Q7GQ4FE-Q8E-Q7DQ4CDQ8FQ7E-Q4<B-G
|
||||
Q8>DQ7CQ4<A-FQ8>CQ7<B-Q4GE-Q7<B-Q8>>AB-A
|
||||
B-AB-Q7AQ4B->C<B-A-Q8A-Q7GQ4FE-Q8E-Q7DQ4CD
|
||||
Q8FQ7E-Q4<B-GQ8>DQ7CQ4<A-FQ8>CQ7<B-Q4GE-
|
||||
Q7<B->B->B-B-E-GGGE-<B-B-B-GE-E-E-
|
||||
Q8<B-Q7>DDDQ8E-Q7>GGGE-<B-B-B-GE-E-E-
|
||||
Q8<B-Q7>B-B-B-B-4R4.B-B-B-B-4R4.>DDDE-4
|
||||
R1R4
|
||||
BIN
30_day/mmldata/daiku.mml
Normal file
BIN
30_day/mmldata/daiku.mml
Normal file
Binary file not shown.
17
30_day/mmldata/daiku.org
Normal file
17
30_day/mmldata/daiku.org
Normal file
@@ -0,0 +1,17 @@
|
||||
/* <20>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>ȑ<EFBFBD>9<EFBFBD><39> <20>j<EFBFBD>Z<EFBFBD><5A> "<22><><EFBFBD><EFBFBD>" op.125<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ludwig van Beethoven <20><><EFBFBD><EFBFBD><EFBFBD>씪<EFBFBD>쎌 */
|
||||
|
||||
$E"SJIS"; T110L4
|
||||
|
||||
O4
|
||||
$K"<22><><EFBFBD>ꂽ<EFBFBD><EA82BD><EFBFBD><EFBFBD> <20>Y<EFBFBD><59><EFBFBD>_<EFBFBD><5F>"; F+F+GA AGF+E DDEF+ F+.E8E2
|
||||
$K"<22><><EFBFBD><EFBFBD><EFBFBD>͉̂<CD89><CC82><EFBFBD> <20>тɐX<C990><58>"; F+F+GA AGF+E DDEF+ E.D8D2
|
||||
$K"<22>S<EFBFBD>͑u<CD91>₩ <20><><EFBFBD>і<EFBFBD><D196><EFBFBD><EFBFBD><EFBFBD>"; EEF+D EF+8G8F+D EF+8G8F+E DE<A>
|
||||
$K"<22><><EFBFBD><EFBFBD><EFBFBD>킷<EFBFBD><ED82B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>邫<EFBFBD>Ί<EFBFBD>"; F+& F+F+GA AGF+E DDEF+ E.D8D2
|
||||
|
||||
O5
|
||||
$K"<22>ԍ炭<D48D>u<EFBFBD>ׂ<EFBFBD> <20>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>F<EFBFBD><46>"; F+F+GA AGF+E DDEF+ F+.E8E2
|
||||
$K"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>₩ <20>݂Ȃ<DD82><C882><EFBFBD><EFBFBD>z<EFBFBD>˂<EFBFBD>"; F+F+GA AGF+E DDEF+ E.D8D2
|
||||
$K"<22>S<EFBFBD>͉<EFBFBD><CD89>₩ <20>K<EFBFBD><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; EEF+D EF+8G8F+D EF+8G8F+E DE<A>
|
||||
$K"<22><><EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><CD89><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>т̉<D182>"; F+& F+F+GA AGF+E DDEF+ E.D8D2
|
||||
|
||||
$K""; R1
|
||||
BIN
30_day/mmldata/fujisan.mml
Normal file
BIN
30_day/mmldata/fujisan.mml
Normal file
Binary file not shown.
15
30_day/mmldata/fujisan.org
Normal file
15
30_day/mmldata/fujisan.org
Normal file
@@ -0,0 +1,15 @@
|
||||
/* <20>u<EFBFBD>x<EFBFBD>m<EFBFBD>R<EFBFBD>v <20><><EFBFBD><EFBFBD><EFBFBD>ȏ<EFBFBD><C88F><EFBFBD> <20>ޒJ<DE92><4A><EFBFBD>g<EFBFBD>쎌 */
|
||||
|
||||
$E"SJIS"; T120L4O4
|
||||
|
||||
$K"<22><><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>_<EFBFBD>̏<EFBFBD><CC8F>ɏo<C98F><6F>"; G.G8AGEC8D8E2 D.G8GF8E8D2.R
|
||||
$K"<22>l<EFBFBD><6C><EFBFBD>̎R<CC8E><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>낵<EFBFBD><EB82B5>"; G.G8ECA.B8>C<A G.A8G8F8E8D8C2.R
|
||||
$K"<22><><EFBFBD>݂Ȃ肳<C882>܂<EFBFBD><DC82><EFBFBD><EFBFBD>ɕ<EFBFBD><C995><EFBFBD>"; D.D8DDC8D8E8F8G2 A.B8>C<AG2.R
|
||||
$K"<22>x<EFBFBD>m<EFBFBD>͓<EFBFBD><CD93>{<7B><><EFBFBD>̎R"; >C2<AGE.E8AG FED.C8C2.R
|
||||
|
||||
$K"<22><C28B><F38D8282><EFBFBD><EFBFBD>т<EFBFBD><D182><EFBFBD><EFBFBD><EFBFBD>"; G.G8AGEC8D8E2 D.G8GF8E8D2.R
|
||||
$K"<22><><EFBFBD>炾<EFBFBD>ɐ<EFBFBD><C990>̒<EFBFBD><CC92><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; G.G8ECA.B8>C<A G.A8G8F8E8D8C2.R
|
||||
$K"<22><><EFBFBD>̂<EFBFBD><CC82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><67>"; D.D8DDC8D8E8F8G2 A.B8>C<AG2.R
|
||||
$K"<22>x<EFBFBD>m<EFBFBD>͓<EFBFBD><CD93>{<7B><><EFBFBD>̎R"; >C2<AGE.E8AG FED.C8C2.R
|
||||
|
||||
$K""; R1R1
|
||||
BIN
30_day/mmldata/kirakira.mml
Normal file
BIN
30_day/mmldata/kirakira.mml
Normal file
Binary file not shown.
13
30_day/mmldata/kirakira.org
Normal file
13
30_day/mmldata/kirakira.org
Normal file
@@ -0,0 +1,13 @@
|
||||
/* <20>u<EFBFBD><75><EFBFBD>炫<EFBFBD>琯<EFBFBD>v <20>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD>w <20><><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>q<EFBFBD>쎌 */
|
||||
|
||||
$E"SJIS"; T120L4O4
|
||||
|
||||
$K"<22><><EFBFBD>炫<EFBFBD><E782AB><EFBFBD>Ђ<EFBFBD><D082><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̐<EFBFBD><CC90><EFBFBD>"; CCGGAAG2 FFEEDDC2
|
||||
$K"<22>܂<DC82><CE82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD> <20>݂<EFBFBD><DD82>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>Ă<EFBFBD>"; GGFFEED2 GGFFEED2
|
||||
$K"<22><><EFBFBD>炫<EFBFBD><E782AB><EFBFBD>Ђ<EFBFBD><D082><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̐<EFBFBD><CC90><EFBFBD>"; CCGGAAG2 FFEEDDC2
|
||||
$K""; R1
|
||||
|
||||
$K"<22><><EFBFBD>炫<EFBFBD><E782AB><EFBFBD>Ђ<EFBFBD><D082><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̐<EFBFBD><CC90><EFBFBD>"; CCGGAAG2 FFEEDDC2
|
||||
$K"<22>݂<EFBFBD><DD82>Ȃ̉̂<CC89> <20>͂<EFBFBD><CD82>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD>"; GGFFEED2 GGFFEED2
|
||||
$K"<22><><EFBFBD>炫<EFBFBD><E782AB><EFBFBD>Ђ<EFBFBD><D082><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̐<EFBFBD><CC90><EFBFBD>"; CCGGAAG2 FFEEDDC2
|
||||
$K""; R1 R1
|
||||
1
30_day/mmlplay/!cons_9x.bat
Normal file
1
30_day/mmlplay/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/mmlplay/!cons_nt.bat
Normal file
1
30_day/mmlplay/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
5
30_day/mmlplay/Makefile
Normal file
5
30_day/mmlplay/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
APP = mmlplay
|
||||
STACK = 132k
|
||||
MALLOC = 0k
|
||||
|
||||
include ../app_make.txt
|
||||
1
30_day/mmlplay/make.bat
Normal file
1
30_day/mmlplay/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
271
30_day/mmlplay/mmlplay.c
Normal file
271
30_day/mmlplay/mmlplay.c
Normal file
@@ -0,0 +1,271 @@
|
||||
#include "apilib.h"
|
||||
|
||||
#include <string.h> /* strlen */
|
||||
|
||||
int strtol(char *s, char **endp, int base); /*标准函数<stdlib.h> */
|
||||
|
||||
void waittimer(int timer, int time);
|
||||
void end(char *s);
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
char winbuf[256 * 112], txtbuf[100 * 1024];
|
||||
char s[32], *p, *r;
|
||||
int win, timer, i, j, t = 120, l = 192 / 4, o = 4, q = 7, note_old = 0;
|
||||
|
||||
/*音号与频率(mHz)的对照表*/
|
||||
/*例如,04A为440Hz,即440000 */
|
||||
/*第16八度的A为1802240Hz,即1802240000 */
|
||||
/*以下为第16八度的列表(C~B) */
|
||||
static int tonetable[12] = {
|
||||
1071618315, 1135340056, 1202850889, 1274376125, 1350154473, 1430438836,
|
||||
1515497155, 1605613306, 1701088041, 1802240000, 1909406767, 2022946002
|
||||
};
|
||||
static int notetable[7] = { +9, +11, +0 /* C */, +2, +4, +5, +7 };
|
||||
|
||||
/*命令行解析*/
|
||||
api_cmdline(s, 30);
|
||||
for (p = s; *p > ' '; p++) { } /*一直读到空格为止*/
|
||||
for (; *p == ' '; p++) { } /*跳过空格*/
|
||||
i = strlen(p);
|
||||
if (i > 12) {
|
||||
file_error:
|
||||
end("file open error.\n");
|
||||
}
|
||||
if (i == 0) {
|
||||
end(0);
|
||||
}
|
||||
|
||||
/*准备窗口*/
|
||||
win = api_openwin(winbuf, 256, 112, -1, "mmlplay");
|
||||
api_putstrwin(win, 128, 32, 0, i, p);
|
||||
api_boxfilwin(win, 8, 60, 247, 76, 7);
|
||||
api_boxfilwin(win, 6, 86, 249, 105, 7);
|
||||
|
||||
/*载入文件*/
|
||||
i = api_fopen(p);
|
||||
if (i == 0) {
|
||||
goto file_error;
|
||||
}
|
||||
j = api_fsize(i, 0);
|
||||
if (j >= 100 * 1024) {
|
||||
j = 100 * 1024 - 1;
|
||||
}
|
||||
api_fread(txtbuf, j, i);
|
||||
api_fclose(i);
|
||||
txtbuf[j] = 0;
|
||||
r = txtbuf;
|
||||
i = 0; /*通常模式*/
|
||||
for (p = txtbuf; *p != 0; p++) { /*为了方便处理,将注释和空白删去*/
|
||||
if (i == 0 && *p > ' ') { /*不是空格或换行符*/
|
||||
if (*p == '/') {
|
||||
if (p[1] == '*') {
|
||||
i = 1;
|
||||
} else if (p[1] == '/') {
|
||||
i = 2;
|
||||
} else {
|
||||
*r = *p;
|
||||
if ('a' <= *p && *p <= 'z') {
|
||||
*r += 'A' - 'a'; /*将小写字母转换为大写字母*/
|
||||
}
|
||||
r++;
|
||||
}
|
||||
} else if (*p == 0x22) {
|
||||
*r = *p;
|
||||
r++;
|
||||
i = 3;
|
||||
} else {
|
||||
*r = *p;
|
||||
r++;
|
||||
}
|
||||
} else if (i == 1 && *p == '*' && p[1] == '/') { /*段注释*/
|
||||
p++;
|
||||
i = 0;
|
||||
} else if (i == 2 && *p == 0x0a) { /*行注释*/
|
||||
i = 0;
|
||||
} else if (i == 3) { /*字符串*/
|
||||
*r = *p;
|
||||
r++;
|
||||
if (*p == 0x22) {
|
||||
i = 0;
|
||||
} else if (*p == '%') {
|
||||
p++;
|
||||
*r = *p;
|
||||
r++;
|
||||
}
|
||||
}
|
||||
}
|
||||
*r = 0;
|
||||
|
||||
/*定时器准备*/
|
||||
timer = api_alloctimer();
|
||||
api_inittimer(timer, 128);
|
||||
|
||||
/*主体*/
|
||||
p = txtbuf;
|
||||
for (;;) {
|
||||
if (('A' <= *p && *p <= 'G') || *p == 'R') { /*音符、休止符*/
|
||||
/*计算频率*/
|
||||
if (*p == 'R') {
|
||||
i = 0;
|
||||
s[0] = 0;
|
||||
} else {
|
||||
i = o * 12 + notetable[*p - 'A'] + 12;
|
||||
s[0] = 'O';
|
||||
s[1] = '0' + o;
|
||||
s[2] = *p;
|
||||
s[3] = ' ';
|
||||
s[4] = 0;
|
||||
}
|
||||
p++;
|
||||
if (*p == '+' || *p == '-' || *p == '#') {
|
||||
s[3] = *p;
|
||||
if (*p == '-') {
|
||||
i--;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
if (i != note_old) {
|
||||
api_boxfilwin(win + 1, 32, 36, 63, 51, 8);
|
||||
if (s[0] != 0) {
|
||||
api_putstrwin(win + 1, 32, 36, 10, 4, s);
|
||||
}
|
||||
api_refreshwin(win, 32, 36, 64, 52);
|
||||
if (28 <= note_old && note_old <= 107) {
|
||||
api_boxfilwin(win, (note_old - 28) * 3 + 8, 60, (note_old - 28) * 3 + 10, 76, 7);
|
||||
}
|
||||
if (28 <= i && i <= 107) {
|
||||
api_boxfilwin(win, (i - 28) * 3 + 8, 60, (i - 28) * 3 + 10, 76, 4);
|
||||
}
|
||||
if (s[0] != 0) {
|
||||
api_beep(tonetable[i % 12] >> (17 - i / 12));
|
||||
} else {
|
||||
api_beep(0);
|
||||
}
|
||||
note_old = i;
|
||||
}
|
||||
/*音长计算*/
|
||||
if ('0' <= *p && *p <= '9') {
|
||||
i = 192 / strtol(p, &p, 10);
|
||||
} else {
|
||||
i = l;
|
||||
}
|
||||
for (; *p == '.'; ) {
|
||||
p++;
|
||||
i += i / 2;
|
||||
}
|
||||
i *= (60 * 100 / 48);
|
||||
i /= t;
|
||||
if (s[0] != 0 && q < 8 && *p != '&') {
|
||||
j = i * q / 8;
|
||||
waittimer(timer, j);
|
||||
api_boxfilwin(win, 32, 36, 63, 51, 8);
|
||||
if (28 <= note_old && note_old <= 107) {
|
||||
api_boxfilwin(win, (note_old - 28) * 3 + 8, 60, (note_old - 28) * 3 + 10, 76, 7);
|
||||
}
|
||||
note_old = 0;
|
||||
api_beep(0);
|
||||
} else {
|
||||
j = 0;
|
||||
if (*p == '&') {
|
||||
p++;
|
||||
}
|
||||
}
|
||||
waittimer(timer, i - j);
|
||||
} else if (*p == '<') { /*八度-- */
|
||||
p++;
|
||||
o--;
|
||||
} else if (*p == '>') { /*八度++ */
|
||||
p++;
|
||||
o++;
|
||||
} else if (*p == 'O') { /*八度指定*/
|
||||
o = strtol(p + 1, &p, 10);
|
||||
} else if (*p == 'Q') { /* Q参数指定*/
|
||||
q = strtol(p + 1, &p, 10);
|
||||
} else if (*p == 'L') { /*默认音长指定*/
|
||||
l = strtol(p + 1, &p, 10);
|
||||
if (l == 0) {
|
||||
goto syntax_error;
|
||||
}
|
||||
l = 192 / l;
|
||||
for (; *p == '.'; ) {
|
||||
p++;
|
||||
l += l / 2;
|
||||
}
|
||||
} else if (*p == 'T') { /*速度指定*/
|
||||
t = strtol(p + 1, &p, 10);
|
||||
} else if (*p == '$') { /*扩展命令*/
|
||||
if (p[1] == 'K') { /*卡拉OK命令*/
|
||||
p += 2;
|
||||
for (; *p != 0x22; p++) {
|
||||
if (*p == 0) {
|
||||
goto syntax_error;
|
||||
}
|
||||
}
|
||||
p++;
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (*p == 0) {
|
||||
goto syntax_error;
|
||||
}
|
||||
if (*p == 0x22) {
|
||||
break;
|
||||
}
|
||||
if (*p == '%') {
|
||||
s[i] = p[1];
|
||||
p += 2;
|
||||
} else {
|
||||
s[i] = *p;
|
||||
p++;
|
||||
}
|
||||
}
|
||||
if (i > 30) {
|
||||
end("karaoke too long.\n");
|
||||
}
|
||||
api_boxfilwin(win + 1, 8, 88, 247, 103, 7);
|
||||
s[i] = 0;
|
||||
if (i != 0) {
|
||||
api_putstrwin(win + 1, 128 - i * 4, 88, 0, i, s);
|
||||
}
|
||||
api_refreshwin(win, 8, 88, 248, 104);
|
||||
}
|
||||
for (; *p != ';'; p++) {
|
||||
if (*p == 0) {
|
||||
goto syntax_error;
|
||||
}
|
||||
}
|
||||
p++;
|
||||
} else if (*p == 0) {
|
||||
p = txtbuf;
|
||||
} else {
|
||||
syntax_error:
|
||||
end("mml syntax error.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void waittimer(int timer, int time)
|
||||
{
|
||||
int i;
|
||||
api_settimer(timer, time);
|
||||
for (;;) {
|
||||
i = api_getkey(1);
|
||||
if (i == 'Q' || i == 'q') {
|
||||
api_beep(0);
|
||||
api_end();
|
||||
}
|
||||
if (i == 128) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void end(char *s)
|
||||
{
|
||||
if (s != 0) {
|
||||
api_putstr0(s);
|
||||
}
|
||||
api_beep(0);
|
||||
api_end();
|
||||
}
|
||||
Reference in New Issue
Block a user