「VexFlow 音符」の版間の差分
(→音符の種類) |
(→音符の種類) |
||
141行目: | 141行目: | ||
: 音符に旗が付く場合、1で上向き -1で下向きにできます。 | : 音符に旗が付く場合、1で上向き -1で下向きにできます。 | ||
== '''音符の種類''' == | |||
小節において何拍分を鳴らすかの違いで音符の種類が異なります。まずは、種類について見てみましょう。 | |||
<div id="yonet202302_Output01"></div> | |||
<yjavascript></script> | |||
<script> | |||
(function(){ | |||
const { | |||
Factory, | |||
Stave, | |||
StaveNote, | |||
Formatter, | |||
Voice, | |||
Barline, | |||
} = Vex.Flow; | |||
const f = new Factory({ renderer: { elementId: 'yonet202302_Output01', width: 1500, height: 195 } }); | |||
const ctx = f.getContext(); | |||
const stave1 = new Stave(10, 50, 350).setContext(ctx).draw(); | |||
stave1.addClef("treble").setContext(ctx).draw(); | |||
stave1.addTimeSignature('C').setContext(ctx).draw(); | |||
const notes1 = [ | |||
new StaveNote({ keys: ["c/4", "e/4", "g/4"], duration: "1" }), | |||
]; | |||
Formatter.FormatAndDraw(ctx, stave1, notes1); | |||
const stave2 = new Stave(360, 50, 350).setContext(ctx).draw(); | |||
const notes2 = [ | |||
new StaveNote({ keys: ["c/4", "e/4", "g/4"], duration: "2" }), | |||
new StaveNote({ keys: ["d/4"], duration: "4" }), | |||
new StaveNote({ keys: ["e/4"], duration: "4" }), | |||
]; | |||
Formatter.FormatAndDraw(ctx, stave2, notes2); | |||
const stave3 = new Stave(710, 50, 450).setEndBarType(Barline.type.DOUBLE).setContext(ctx).draw(); | |||
const notes3 = [ | |||
new StaveNote({ keys: ["c/4"], duration: "8" }), | |||
new StaveNote({ keys: ["d/4"], duration: "8" }), | |||
new StaveNote({ keys: ["e/4"], duration: "16" }), | |||
new StaveNote({ keys: ["f/4"], duration: "16" }), | |||
new StaveNote({ keys: ["g/4"], duration: "16" }), | |||
new StaveNote({ keys: ["a/4"], duration: "16" }), | |||
new StaveNote({ keys: ["c/4"], duration: "8" }), | |||
new StaveNote({ keys: ["d/4"], duration: "8" }), | |||
new StaveNote({ keys: ["e/4"], duration: "16" }), | |||
new StaveNote({ keys: ["f/4"], duration: "16" }), | |||
new StaveNote({ keys: ["g/4"], duration: "16" }), | |||
new StaveNote({ keys: ["a/4"], duration: "16" }), | |||
]; | |||
notes3.forEach((StaveNote) => StaveNote.setStave(stave3)); | |||
const voice3 = new Voice({beat_value: 4, num_beats: 4}).setMode(3).addTickables(notes3); | |||
new Formatter().joinVoices([voice3]).formatToStave([voice3], stave3); | |||
stave3.setContext(ctx).draw(); | |||
voice3.setContext(ctx).draw(); | |||
})(); | |||
</yjavascript> | |||
<syntaxhighlight lang="JavaScript" line start="1"> | |||
</syntaxhighlight> | |||
[[VexFlow 使い方]]に戻る。 | [[VexFlow 使い方]]に戻る。 |
2023年2月9日 (木) 23:39時点における版
VexFlow 使い方に戻る。
概要
音符を記述するまでにその土台となる楽譜の構造を知らなければならなかったので、遅くなりましたが、ようやっと本文をえがけるようになるという感じです。ただし、音符も構成要素は複雑なので、ここではシンプルな音符の機能のみを紹介したいと思います。旗同士を繋ぐ連桁(れんこう:英 Beem ビーム)、連符や休符については別の項目で記します。この先の3つあたりまで把握できてやっと音を記録する楽譜というものが構成できるようになります。あと3つ先までは音符の範疇。ここでは、その一部しか紹介しないことに注意しておいて下さい。
音符の種類
小節において何拍分を鳴らすかの違いで音符の種類が異なります。まずは、種類について見てみましょう。
<div id="yonet202302_Output01"></div>
<script>
(function(){
const {
Factory,
Stave,
StaveNote,
Formatter,
Voice,
Barline,
} = Vex.Flow;
const f = new Factory({ renderer: { elementId: 'yonet202302_Output01', width: 1500, height: 195 } });
const ctx = f.getContext();
const stave1 = new Stave(10, 50, 350).setContext(ctx).draw();
stave1.addClef("treble").setContext(ctx).draw();
stave1.addTimeSignature('C').setContext(ctx).draw();
const notes1 = [
new StaveNote({ keys: ["c/4"], duration: "1" }),
];
Formatter.FormatAndDraw(ctx, stave1, notes1);
const stave2 = new Stave(360, 50, 350).setContext(ctx).draw();
const notes2 = [
new StaveNote({ keys: ["c/4"], duration: "2" }),
new StaveNote({ keys: ["d/4"], duration: "4" }),
new StaveNote({ keys: ["e/4"], duration: "4" }),
];
Formatter.FormatAndDraw(ctx, stave2, notes2);
const stave3 = new Stave(710, 50, 450).setEndBarType(Barline.type.END).setContext(ctx).draw();
const notes3 = [
new StaveNote({ keys: ["c/4"], duration: "8" }),
new StaveNote({ keys: ["d/4"], duration: "8" }),
new StaveNote({ keys: ["e/4"], duration: "16" }),
new StaveNote({ keys: ["f/4"], duration: "16" }),
new StaveNote({ keys: ["g/4"], duration: "16" }),
new StaveNote({ keys: ["a/4"], duration: "16" }),
new StaveNote({ keys: ["c/4"], duration: "8" }),
new StaveNote({ keys: ["d/4"], duration: "8" }),
new StaveNote({ keys: ["e/4"], duration: "16" }),
new StaveNote({ keys: ["f/4"], duration: "16" }),
new StaveNote({ keys: ["g/4"], duration: "16" }),
new StaveNote({ keys: ["a/4"], duration: "16" }),
];
notes3.forEach((StaveNote) => StaveNote.setStave(stave3));
const voice3 = new Voice({beat_value: 4, num_beats: 4}).setMode(3).addTickables(notes3);
new Formatter().joinVoices([voice3]).formatToStave([voice3], stave3);
stave3.setContext(ctx).draw();
voice3.setContext(ctx).draw();
})();
</script>
行19~21までが一小節目の音符について記述しているところです。自分で作った定数変数note1に一小節分の音符情報を配列にして記述します。StaveNoteオブジェクトをコンストラクタに引数を渡してものが一つの音符となるようにして、づづけて記載していきますが、ここでは全音符を指定したので、一小節にはこの情報だけになります。これ以上の配列追加をすると、一小節の情報に矛盾が発生し始めます。このように、一小節にわたされる要素数と一小節を構築する音の長さの総和が拍子記号で設定された値と矛盾していないかについてはすべて、作成者が管理しなければなりません。
StaveNoteオブジェクトの引数には以下のような要素を持つオブジェクトが指定できます。
- keys
- 音の高さを指定しますト音記号の五線譜の下に追加した線の一つ目が C/4 という音になり、Do ド にあたります。順番にC/4, D/4, E/4, F/4, G/4, A/4, B/4, C/5, D/5, E/5… というように音が高くなっていきます。ヘ音記号の場合は、通常、第5線の上に追加した線の上、高音のラにあたるところが、C/4になります。音部記号まで反映した値にするには、オブジェクトの要素に clef を与えなければなりません。詳細は後に記述します。小節に描く音がどんな音部記号に従っているかは、連動していません。この値の中で閉じた世界でどのように指定するかをすべての情報を記載することで、振る舞いが変わります。 配列にして渡す必要があります。配列要素が2個以上になるものは和音として描画されます。音の名前の後ろに/x1, /x2, /x3 とつけるとそれぞれのパターンの × マークが丸の代わりに描かれます。Mute音やパーカッション音に利用できます。
- duration
- 音の長さを指定します。1 = 全音符(w)、2 = 2分音符(h)、4 = 4分音符(q)、 8 = 8分音符、16 = 16分音符と対応しています。
- clef
- 音部記号を指定できます。keysに指定する音の高さがどの音部記号に従うかを設定するモノです。
- stem_direction
- 音符に旗が付く場合、1で上向き -1で下向きにできます。
音符の種類
小節において何拍分を鳴らすかの違いで音符の種類が異なります。まずは、種類について見てみましょう。
VexFlow 使い方に戻る。