From b2d31a8e54644b4416befefa069a958cdd2fd4d0 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Fri, 20 May 2016 13:38:43 +0800 Subject: [PATCH] =?UTF-8?q?MML=E6=92=AD=E6=94=BE=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 30_day/Makefile | 10 +- 30_day/mmldata/daigo.mml | Bin 0 -> 487 bytes 30_day/mmldata/daigo.org | 30 ++++ 30_day/mmldata/daiku.mml | Bin 0 -> 358 bytes 30_day/mmldata/daiku.org | 17 +++ 30_day/mmldata/fujisan.mml | Bin 0 -> 302 bytes 30_day/mmldata/fujisan.org | 15 ++ 30_day/mmldata/kirakira.mml | Bin 0 -> 195 bytes 30_day/mmldata/kirakira.org | 13 ++ 30_day/mmlplay/!cons_9x.bat | 1 + 30_day/mmlplay/!cons_nt.bat | 1 + 30_day/mmlplay/Makefile | 5 + 30_day/mmlplay/make.bat | 1 + 30_day/mmlplay/mmlplay.c | 271 ++++++++++++++++++++++++++++++++++++ 14 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 30_day/mmldata/daigo.mml create mode 100644 30_day/mmldata/daigo.org create mode 100644 30_day/mmldata/daiku.mml create mode 100644 30_day/mmldata/daiku.org create mode 100644 30_day/mmldata/fujisan.mml create mode 100644 30_day/mmldata/fujisan.org create mode 100644 30_day/mmldata/kirakira.mml create mode 100644 30_day/mmldata/kirakira.org create mode 100644 30_day/mmlplay/!cons_9x.bat create mode 100644 30_day/mmlplay/!cons_nt.bat create mode 100644 30_day/mmlplay/Makefile create mode 100644 30_day/mmlplay/make.bat create mode 100644 30_day/mmlplay/mmlplay.c diff --git a/30_day/Makefile b/30_day/Makefile index 710ced7..0853d9d 100644 --- a/30_day/Makefile +++ b/30_day/Makefile @@ -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 : diff --git a/30_day/mmldata/daigo.mml b/30_day/mmldata/daigo.mml new file mode 100644 index 0000000000000000000000000000000000000000..57337fed7acb83722bd68e13ae20677795ccee12 GIT binary patch literal 487 zcmVC*Y+EtG!x8h~L>go*%VfgI7nWmR2lqaw~wZq)n4GsC_*nEVo1D$%hvbEIL^C^8E zLq`3_VMmD*T6tVgAdcXeQo#IbklKD>cdBhbIyB23%*E$P**2@YDL!P;{Ft0{E>c=2 z0>2UHx_P^ZX4gNPaszWlm-ON(O#tD0*{~vpY+c*@gQ8C(Z-cV{Rrs=Jo~j&u;(RhE z6<>K**6@$L85*kG?gtpW!(;*XO|L;vY7CCoF(Zj3F97B?Q*LQp(RAIb?x%i%N&h+ zoKKQP?aYuV!D_L5-l^K8zNntgndOj3-h0wvm&!48L&KDuAmRDqvZvo37T?Zw6cr+mK1U8b$&7wu! z2QwKFDlpd56zWbf1P^}oGbXz!izls}E-E-E-C8&C2FFFD8&D2GGF +Q8E-Q7Q7GGFQ8E-Q7GGFL4E-RCRG2.L8R>E-A-A-A-Q8FQ7DDDQ8>E-G>CCQ8C2Q7DQ8D2Q7CCCE-Q8E-Q7DQ4DF +Q8FQ7EQ4EGQ7GQ7FQ4FA-Q8A-Q7GQ4GB-Q8B-Q7A-Q4A->C +Q8CQ7DQ7CE-E-E-C>>FDD +CCC>>E-E-E- +CL4B->E-DE-FQ7CQ8CQ7E-DE-FQ7CQ8CQ7B->E-DE-FQ7CQ8CCD-Q7CQ8CD-E-FQ7E- +Q8D-E-D-Q7CQ8E-FG-FE-Q7FQ8G-FE-Q7FQ8G-F +E-Q7FQ8G-FE-FG-FG-Q7AL8B-&B-2Q4>CDQ7CQ4CQ7>AB-A +B-AB-Q7AQ4B->CDQ7CQ4CQ7B->B-B-E-GGGE-DDDQ8E-Q7>GGGE-B-B-B-B-4R4.B-B-B-B-4R4.>DDDE-4 +R1R4 diff --git a/30_day/mmldata/daiku.mml b/30_day/mmldata/daiku.mml new file mode 100644 index 0000000000000000000000000000000000000000..f2d320f189a820ef1f48569ecb77e0d39addd77b GIT binary patch literal 358 zcmV-s0h#`Z|Ns910000_Q$bTpLrqW$1qA`FuseE$z^GZk(i3eTMRk$|TI_Y|QF?vT z2`6Q$$+r1KC@AB7+T5Or$pkM!&U`ww%Su*SiTeQudgMs`{3<+8%eS8O?PzF{B%AV7 z!e;sF%_Oo?hU};^)g%=|>@lT1 z2jrf3M5h88yZw&9kOre6U#CEBgccdoH_5M@pJ4=g&YB;Wmbv&aZG^n!0Kn>&{l{L3 zKM5~Q<-$B47i_L;rzm(DRs*c0`YfI+JJ^LI3~& literal 0 HcmV?d00001 diff --git a/30_day/mmldata/daiku.org b/30_day/mmldata/daiku.org new file mode 100644 index 0000000..abf86fc --- /dev/null +++ b/30_day/mmldata/daiku.org @@ -0,0 +1,17 @@ +/* 「交響曲第9番 ニ短調 "合唱" op.125」より Ludwig van Beethoven 尾崎喜八作詞 */ + +$E"SJIS"; T110L4 + + O4 +$K"晴れたる青空 漂う雲よ"; F+F+GA AGF+E DDEF+ F+.E8E2 +$K"小鳥は歌えり 林に森に"; F+F+GA AGF+E DDEF+ E.D8D2 +$K"心は爽やか 喜び満ちて"; EEF+D EF+8G8F+D EF+8G8F+E DE +$K"見交わす我らの 明るき笑顔"; F+& F+F+GA AGF+E DDEF+ E.D8D2 + + O5 +$K"花咲く丘べに 憩える友よ"; F+F+GA AGF+E DDEF+ F+.E8E2 +$K"吹く風爽やか みなぎる陽射し"; F+F+GA AGF+E DDEF+ E.D8D2 +$K"心は穏やか 幸せ溢れ"; EEF+D EF+8G8F+D EF+8G8F+E DE +$K"響くは我らの 喜びの歌"; F+& F+F+GA AGF+E DDEF+ E.D8D2 + +$K""; R1 diff --git a/30_day/mmldata/fujisan.mml b/30_day/mmldata/fujisan.mml new file mode 100644 index 0000000000000000000000000000000000000000..fc9a778a0c59ad8d5d562259c33ad9ae273c9008 GIT binary patch literal 302 zcmV+}0nz@6|Ns910000_Q$bTpLrqW!F$Dp(FAkDb0 z=3*SoEOVcNEW3IrX^QQg{g6xU=#OjeM0H>`(^>E>&@P}kmSm~l+8y7yE&hYSg;aNO zj+71hONrS){G!(tLwS{ljr1N*BlAH>c1Lb(%46F1E+ZpwtqgI+waT2wad}cvl7}Go zyEvSYvp4U_vAzO6={%_)y5BXOI{uCr0b~oe0nYMQ=f~fk^Qcm A_y7O^ literal 0 HcmV?d00001 diff --git a/30_day/mmldata/fujisan.org b/30_day/mmldata/fujisan.org new file mode 100644 index 0000000..23c1fe6 --- /dev/null +++ b/30_day/mmldata/fujisan.org @@ -0,0 +1,15 @@ +/* 「富士山」 文部省唱歌 巌谷小波作詞 */ + +$E"SJIS"; T120L4O4 + +$K"あたまを雲の上に出し"; G.G8AGEC8D8E2 D.G8GF8E8D2.R +$K"四方の山を見おろして"; G.G8ECA.B8>CCC2CCC2f+jv#ZsD*(Svkn)UCL!_@Jk1o zFhR~_yI+^E9?;(x@d$k!q{SU6O%@LONU4trk5d<{7oTh07iH6#R#o)@W4tY?B2BcW;2kr-^P+1%9z3A6yOf#msNx`;;U_b literal 0 HcmV?d00001 diff --git a/30_day/mmldata/kirakira.org b/30_day/mmldata/kirakira.org new file mode 100644 index 0000000..85f5a62 --- /dev/null +++ b/30_day/mmldata/kirakira.org @@ -0,0 +1,13 @@ +/* 「きらきら星」 フランス民謡 武鹿悦子作詞 */ + +$E"SJIS"; T120L4O4 + +$K"きらきらひかる お空の星よ"; CCGGAAG2 FFEEDDC2 +$K"まばたきしては みんなを見てる"; GGFFEED2 GGFFEED2 +$K"きらきらひかる お空の星よ"; CCGGAAG2 FFEEDDC2 +$K""; R1 + +$K"きらきらひかる お空の星よ"; CCGGAAG2 FFEEDDC2 +$K"みんなの歌が 届くといいな"; GGFFEED2 GGFFEED2 +$K"きらきらひかる お空の星よ"; CCGGAAG2 FFEEDDC2 +$K""; R1 R1 diff --git a/30_day/mmlplay/!cons_9x.bat b/30_day/mmlplay/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/30_day/mmlplay/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/30_day/mmlplay/!cons_nt.bat b/30_day/mmlplay/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/30_day/mmlplay/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/30_day/mmlplay/Makefile b/30_day/mmlplay/Makefile new file mode 100644 index 0000000..ad3f1fe --- /dev/null +++ b/30_day/mmlplay/Makefile @@ -0,0 +1,5 @@ +APP = mmlplay +STACK = 132k +MALLOC = 0k + +include ../app_make.txt diff --git a/30_day/mmlplay/make.bat b/30_day/mmlplay/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/30_day/mmlplay/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/30_day/mmlplay/mmlplay.c b/30_day/mmlplay/mmlplay.c new file mode 100644 index 0000000..0e4254c --- /dev/null +++ b/30_day/mmlplay/mmlplay.c @@ -0,0 +1,271 @@ +#include "apilib.h" + +#include /* strlen */ + +int strtol(char *s, char **endp, int base); /*譬蜃蜃ス謨ー */ + +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蜈ォ蠎ヲ逧Б荳コ1802240Hzシ悟叉1802240000 */ + /*莉・荳倶クコ隨ャ16蜈ォ蠎ヲ逧蛻苓。ィシCス曖シ */ + 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') { /*蜊。諡碓K蜻ス莉、*/ + 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(); +}