challenge Tiny MML

文字列の入力をとり、音を鳴らすプログラムを作ってください。

入力はcがド、dがレ、eがミ、fがファ、gがソ、aがラ、bがシ、rが休符とします。この8文字以外の文字は入力に含まれていないと仮定して構いません。おのおのの音符・休符は八分音符・八分休符とします。

オクターブや音の長さの変更、同時発音などの機能は不要です。

サンプル入力(カエルの歌)

cdefedcrefgagfercrcrcrcrcdefedcr

Posted feedbacks - JavaScript

これはなかなか素晴らしいツール。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(function playbeep(scr, quaver, beep){
	if(!beep) (beep = WSH.CreateObject("SfcMini.DynaCall")).Declare("kernel32", "Beep");
	if(!quaver) quaver = 250;
	var S = { c:262, d:294, e:330, f:349, g:392, a:440, b:494, r:0 };
	with(Math) scr.replace(/([a-grA-G])(\d?)(\+*)(-*)(\.?)/g, function($, s, t, p, m, d){
		var hz = s.charCodeAt(0) > 96 ? S[s] : round(S[s.toLowerCase()] * 1.06);
		var dr = round(quaver * pow(2, p.length) * pow(2, -m.length) * (d ? 1.5 : 1));
		if(hz) beep(t ? hz * pow(2, t - 3) : hz, dr);
		else WSH.Sleep(dr);
	});
})("e+g+c4++g+a+g++r.c-e.g-c4+b.a-g++.r++");
// 大文字は半音上,0~9で高さ指定(省略で3),+-.で長さ調整(伸び|縮み|付点)。

ADODB.Streamでsmfを吐いて、関連付けされたプレイヤーで再生。「音を鳴らすプログラム」・・・ではない。

-----------------------------------
C:\temp>cscript /nologo tinymml.js cdefedcrefgagfercrcrcrcrcdefedcr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
function arrayToFile(filename, array){
  var stream = WScript.CreateObject('ADODB.Stream');
  stream.Charset = 'iso-8859-1';
  stream.Open();
  for (var i=0; i < array.length; i++)
    stream.WriteText(String.fromCharCode(array[i]));
  stream.SaveToFile(filename, 2);
  stream.Close();
}

var note = {r:0,c:60,d:62,e:64,f:65,g:67,a:69,b:71};
var body = [];
WScript.Arguments.Item(0).toLowerCase().replace(/([a-gr])/g, function(n){
  body = body.concat([0,144,note[n],n=='r'?0:90,24,144,note[n],0]);});
var size = body.length + 4;
head = [77,84,104,100,0,0,0,6,0,0,0,1,0,48,77,84,114,107,
        size>>24&0xff, size>>16&0xff, size>>8&0xff, size&0xff];
arrayToFile('sample.mid', head.concat(body.concat([0,255,47,0])));
WScript.CreateObject('WScript.Shell').run('sample.mid');

Index

Feed

Other

Link

Pathtraq

loading...