VexFlow使ってみた
MOONGIFTさんで紹介されていたVexFlowが面白そうだったので試してみた。
が、思いのほか面倒だったので軽くまとめてみる。
まず判ったことは
仕方ないのでVexFlowのサンプルを覗いてみたのだけど、JavaScripterでない自分には分かりづらい! なにjqunitって!
同じような人がいるかもしれないので、ガンガン削ってシンプルな状態にしたソースを公開してみる。
が、思いのほか面倒だったので軽くまとめてみる。
まず判ったことは
- VexFlowはJavaScriptのライブラリ。
- VexFlowには楽譜のパーツを指定位置に描画する機能しかない。
- VexTabはVexFlowを利用したライブラリ。
- VexTabは、簡易言語からタブ譜(+通常の楽譜)を生成してくれる。
仕方ないのでVexFlowのサンプルを覗いてみたのだけど、JavaScripterでない自分には分かりづらい! なにjqunitって!
同じような人がいるかもしれないので、ガンガン削ってシンプルな状態にしたソースを公開してみる。
- まずはここからzipをダウンロード。
gitをインストールしなきゃいけないのかと思ったけどそんなことはなかった。 - sconsを使ってライブラリを圧縮。
sconsはmakeのようなビルドツール。python1.5.2以上の環境が必要らしい。
うまくいけばhttp://www.vexflow.com/vexflow.jsにあるようなのが出来上がる。 - 以下のようなソースを書く。
test.html
<html> <head> <title>VexFlow Tests</title> <style type="text/css"> div.testcanvas .vex-tabdiv { background: #eed; padding: 10px; border: 10px solid #ddc; } div.testcanvas .name { font-family: Arial, sans-serif; font-size: 18px; padding: 10px; color: #554; } </style> <!-- Compiled Source --> <script src="../vexflow.js"></script> <!-- Test Sources --> <script src="support/jquery.js"></script> <script src="test_helper.js"></script> <script src="test.js"></script> <script> $(function() { Vex.Flow.Test.StaveNote.Start(); }); </script> </head> <body> <div id="vexflow_testoutput"></div> </body> </html>
test_helper.js
/** * Simple VexFlow Test Support Library * forked from "VexFlow Test Support Library" by Mohit Muthanna 2010 */ Vex.Flow.Test = {} Vex.Flow.Test.genID = function() { return Vex.Flow.Test.genID.ID++; } Vex.Flow.Test.genID.ID = 0; Vex.Flow.Test.createTestCanvas = function(canvas_sel_name, test_name) { var sel = Vex.Flow.Test.createTestCanvas.sel; var test_div = $('<div></div>').addClass("testcanvas"); test_div.append($('<div></div>').addClass("name").text(test_name)); test_div.append($('<canvas></canvas>').addClass("vex-tabdiv"). attr("id", canvas_sel_name). addClass("name").text(name)); $(sel).append(test_div); } Vex.Flow.Test.createTestCanvas.sel = "#vexflow_testoutput"; /** Canvasを連番IDで作成し、登録された関数で譜面の描画を行う。 name 譜面のタイトル func 登録する関数 params パラメータ **/ Vex.Flow.Test.runTest = function(name, func, params) { test_canvas_sel = "canvas_" + Vex.Flow.Test.genID(); test_canvas = Vex.Flow.Test.createTestCanvas(test_canvas_sel, name); func({ canvas_sel: test_canvas_sel, params: params }, Vex.Flow.Renderer.getCanvasContext); }
test.js
/** * VexFlow - Simple Score * forked from "Basic Tests" by Mohit Muthanna 2010 */ Vex.Flow.Test.StaveNote = {} Vex.Flow.Test.StaveNote.Start = function() { Vex.Flow.Test.runTest("Basic Score", Vex.Flow.Test.StaveNote.displacements); } Vex.Flow.Test.StaveNote.showNote = function(note_struct, stave, ctx, x) { var note = new Vex.Flow.StaveNote(note_struct); var tickContext = new Vex.Flow.TickContext(); tickContext.addTickable(note).preFormat().setX(x).setPixelsUsed(20); // 左端からのオフセット座標 note.setContext(ctx).setStave(stave); note.draw(); return note; } Vex.Flow.Test.StaveNote.displacements = function(options, contextBuilder) { var ctx = new contextBuilder(options.canvas_sel, 600, 140); ctx.scale(0.9, 0.9); // スケール ctx.fillStyle = "#221"; // 色 var stave = new Vex.Flow.Stave(10, // X座標 10, // Y座標 550); // 横幅 stave.setContext(ctx); stave.draw(); var showNote = Vex.Flow.Test.StaveNote.showNote; var notes = [ { keys: ["c/4", "e/4", "a/4"], duration: "w"}, { keys: ["c/4", "e/4", "a/4"], duration: "h"}, { keys: ["c/4", "e/4", "a/4"], duration: "q"}, { keys: ["c/4", "e/4", "a/4"], duration: "8"}, { keys: ["c/4", "e/4", "a/4"], duration: "16"}, { keys: ["c/4", "e/4", "a/4"], duration: "32"}, { keys: ["c/4", "e/4", "a/4"], duration: "h", stem_direction: -1}, { keys: ["c/4", "e/4", "a/4"], duration: "q", stem_direction: -1}, { keys: ["c/4", "e/4", "a/4"], duration: "8", stem_direction: -1}, { keys: ["c/4", "e/4", "a/4"], duration: "16", stem_direction: -1}, { keys: ["c/4", "e/4", "a/4"], duration: "32", stem_direction: -1}, { keys: ["c/4"], duration: "wr"}, { keys: ["c/4"], duration: "hr"}, { keys: ["c/4"], duration: "qr"}, { keys: ["c/4"], duration: "8r"}, { keys: ["c/4"], duration: "16r"}, { keys: ["c/4"], duration: "32r"}, { keys: ["x/4"], duration: "h"} ]; // stave.drawVerticalBar(310); // 小節線 for (var i = 0; i < notes.length; ++i) { var note = notes[i]; var staveNote = showNote(note, stave, ctx, (i + 1) * 25); } }
おしまい。
ここからどうしようかなー。
« GAE上のdjangoで日本語版truncateを作る | トップページ | あけましておめでとう2011 »
「javascript」カテゴリの記事
- WebMidiLinkでアレPadっぽいもの作ってみた(2012.07.15)
- Melofu(2011.06.14)
- VexFlow使ってみた(2010.10.16)
この記事へのコメントは終了しました。
コメント