「VexFlow test content」の版間の差分
(→概要) |
(→概要) |
||
(同じ利用者による、間の25版が非表示) | |||
15行目: | 15行目: | ||
var UniqueIds; | var UniqueIds; | ||
var SteveNoteUniqueIds; | var SteveNoteUniqueIds; | ||
function getUniqueStaveNotesIds(notes, arr = []) { | function getUniqueStaveNotesIds(notes, arr = []) { | ||
142行目: | 71行目: | ||
} | } | ||
function updateAllFlagUniqueIds( | function updateAllFlagUniqueIds(FlagUniqueIds) { | ||
// allUniqueIdsにUniqueIdsを追加または結合 | // allUniqueIdsにUniqueIdsを追加または結合 | ||
if (allFlagUniqueIds.length === 0) { | if (allFlagUniqueIds.length === 0) { | ||
// allUniqueIdsが空の場合、UniqueIdsをそのままコピー | // allUniqueIdsが空の場合、UniqueIdsをそのままコピー | ||
allFlagUniqueIds = [... | allFlagUniqueIds = [...FlagUniqueIds];//スプレッド演算子で要素の中身を書き出す。 | ||
} else { | } else { | ||
FlagUniqueIds.forEach(id => { | |||
if (!allFlagUniqueIds.includes(id)) { | if (!allFlagUniqueIds.includes(id)) { | ||
allFlagUniqueIds.push(id); | allFlagUniqueIds.push(id); | ||
157行目: | 86行目: | ||
return allFlagUniqueIds; | return allFlagUniqueIds; | ||
} | } | ||
UniqueIds = getUniqueNoteheadIds(notes1[ | let nscale = 0.68 | ||
allUniqueIds = updateAllUniqueIds(UniqueIds); | let nwidth = 1040; | ||
let nheight = 420; | |||
let nHeadMargin = 70; | |||
let nStaveWidth = 350; | |||
const f = new VF.Factory({ | |||
renderer: { elementId: 'yonet202403Mid_Output01', width: nwidth, height: nheight * nscale } | |||
}); | |||
const ctx = f.getContext(); | |||
ctx.scale(nscale, nscale); | |||
const defaultStyle = { | |||
lineWidth: ctx.lineWidth, | |||
strokeStyle: ctx.strokeStyle, | |||
}; | |||
for (let i = 0; i <= nwidth * (1 / nscale); i += 10) { | |||
ctx.beginPath(); | |||
ctx.moveTo(0 + i, 0); | |||
ctx.lineTo(0 + i, nheight); | |||
if (i % 100 === 0){ | |||
ctx.setLineWidth(1); | |||
ctx.setStrokeStyle('rgba(200, 200, 200, 0.8)'); | |||
} | |||
else{ | |||
ctx.setLineWidth(0.5); | |||
ctx.setStrokeStyle('rgba(230, 230, 230, 0.8)'); | |||
} | |||
ctx.stroke(); | |||
} | |||
for (let i = 0; i <= nheight; i += 10) { | |||
ctx.beginPath(); | |||
ctx.moveTo(0, i); | |||
ctx.lineTo(nwidth * (1 / nscale), i); | |||
if (i % 100 === 0){ | |||
ctx.setLineWidth(1); | |||
ctx.setStrokeStyle('rgba(200, 200, 200, 0.8)'); | |||
} | |||
else{ | |||
ctx.setLineWidth(0.5); | |||
ctx.setStrokeStyle('rgba(230, 230, 230, 0.8)'); | |||
} | |||
ctx.stroke(); | |||
} | |||
ctx.lineWidth = defaultStyle.lineWidth; | |||
ctx.strokeStyle = defaultStyle.strokeStyle; | |||
const stave1 = new VF.Stave(10, 50, nHeadMargin + nStaveWidth).setContext(ctx); | |||
stave1.setClef("treble").setContext(ctx); | |||
stave1.setTimeSignature('4/4').setContext(ctx); | |||
stave1.draw(); | |||
const notes1 = [ | |||
new VF.StaveNote({ keys: ["a/5"], duration: "1" }), | |||
]; | |||
//SteveNoteUniqueIds = getUniqueStaveNotesIds(notes1, [0]); | |||
//allFlagUniqueIds = updateAllFlagUniqueIds(SteveNoteUniqueIds); | |||
//UniqueIds = getUniqueNoteheadIds(notes1[0]); | |||
//allUniqueIds = updateAllUniqueIds(UniqueIds); | |||
var stave1Voice = new Vex.Flow.Voice({ num_beats: 4, beat_value: 4 }); | var stave1Voice = new Vex.Flow.Voice({ num_beats: 4, beat_value: 4 }); | ||
201行目: | 189行目: | ||
if (element) { | if (element) { | ||
// 該当する要素があれば、描画内容を透明にする | // 該当する要素があれば、描画内容を透明にする | ||
let | let paths = element.querySelectorAll('path'); | ||
paths.forEach(path => { | |||
var dAttribute = path.getAttribute('d'); | var dAttribute = path.getAttribute('d'); | ||
// カンマで区切られた数値の数を数えます | // カンマで区切られた数値の数を数えます | ||
var numberOfValues = (dAttribute.match(/,/g) || []).length + 1; // カンマの数 + 1 = 数値の数 | var numberOfValues = (dAttribute.match(/,/g) || []).length + 1; // カンマの数 + 1 = 数値の数 | ||
// | if (numberOfValues === 9) { | ||
if (numberOfValues === | var firstCoord = dAttribute.split(',')[0]; | ||
path.setAttribute("fill", "none"); | if (dAttribute.startsWith('M')) { | ||
path.setAttribute("stroke", "none"); | var CnumberOfValues = (dAttribute.match(/C/g) || []).length; // カンマの数 + 1 = 数値の数 | ||
var LnumberOfValues = (dAttribute.match(/L/g) || []).length; // カンマの数 + 1 = 数値の数 | |||
// 座標の差を計算します | |||
if(CnumberOfValues > 0){ | |||
var coords = dAttribute.match(/[-+]?[0-9]*\.?[0-9]+/g).map(parseFloat); | |||
var xdiff = coords[0] - coords[2]; // xの差を計算 | |||
var ydiff = coords[1] - coords[3]; // yの差を計算 | |||
// xが0でyが0より大きい場合、描画内容を透明にします | |||
if (xdiff !== 0) { | |||
if(ydiff === 0){ | |||
path.setAttribute("fill", "none"); | |||
path.setAttribute("stroke", "none"); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
else if (numberOfValues === 1) { | |||
var firstCoord = dAttribute; | |||
if (dAttribute.startsWith('M')) { | |||
var LnumberOfValues = (dAttribute.match(/L/g) || []).length; // カンマの数 + 1 = 数値の数 | |||
// 座標の差を計算します | |||
if(LnumberOfValues > 0){ | |||
var coords = dAttribute.match(/[-+]?[0-9]*\.?[0-9]+/g).map(parseFloat); | |||
var xdiff = coords[0] - coords[2]; // xの差を計算 | |||
var ydiff = coords[1] - coords[3]; // yの差を計算 | |||
// xが0でyが0より大きい場合、描画内容を透明にします | |||
if (xdiff < -17) { | |||
if (xdiff > -18) { | |||
if(ydiff === 0){ | |||
path.setAttribute("fill", "none"); | |||
path.setAttribute("stroke", "none"); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
else if (numberOfValues === 35 || numberOfValues === 95 || numberOfValues === 41) { | |||
path.setAttribute("fill", "none"); | |||
path.setAttribute("stroke", "none"); | |||
} | } | ||
}); | }); |
2024年4月12日 (金) 22:28時点における最新版
概要