「VexFlow test content」の版間の差分
(→概要) |
(→概要) |
||
(同じ利用者による、間の29版が非表示) | |||
11行目: | 11行目: | ||
var VF = Vex.Flow; | var VF = Vex.Flow; | ||
var allUniqueIds = []; | var allUniqueIds = []; | ||
var allFlagUniqueIds = []; | |||
(function(){ | (function(){ | ||
var UniqueIds; | var UniqueIds; | ||
var SteveNoteUniqueIds; | var SteveNoteUniqueIds; | ||
function getUniqueStaveNotesIds(notes, arr = []) { | |||
//すべてのidを格納するためのセットを作成 | |||
let tempnote; | |||
uniqueIds = new Set(); | |||
for(let i = 0; i < arr.length || i == 0; i++){ | |||
//notesのchildrenの各要素について処理 | |||
if(arr.length === 0){ | |||
tempnote = notes; | |||
} | |||
else{ | |||
tempnote = notes[arr[i]]; | |||
} | |||
if (tempnote.attrs){ | |||
if(tempnote.attrs.type === "StaveNote") { | |||
uniqueIds.add(tempnote.attrs.id); | |||
} | |||
} | |||
} | |||
// セットを配列に変換して戻り値として返す | |||
return Array.from(uniqueIds); | |||
} | |||
function getUniqueNoteheadIds(notes) { | |||
// すべてのidを格納するためのセットを作成 | |||
uniqueIds = new Set(); | |||
// notesのchildrenの各要素について処理 | |||
notes.children.forEach(child => { | |||
// typeが"notehead"であるかチェックし、idを取得 | |||
if (child.attrs){ | |||
if(child.attrs.type === "NoteHead") { | |||
uniqueIds.add(child.attrs.id); | |||
} | |||
} | |||
}); | |||
// セットを配列に変換して戻り値として返す | |||
return Array.from(uniqueIds); | |||
} | |||
function updateAllUniqueIds(UniqueIds) { | |||
// allUniqueIdsにUniqueIdsを追加または結合 | |||
if (allUniqueIds.length === 0) { | |||
// allUniqueIdsが空の場合、UniqueIdsをそのままコピー | |||
allUniqueIds = [...UniqueIds];//スプレッド演算子で要素の中身を書き出す。 | |||
} else { | |||
UniqueIds.forEach(id => { | |||
if (!allUniqueIds.includes(id)) { | |||
allUniqueIds.push(id); | |||
} | |||
}); | |||
} | |||
// 更新されたallUniqueIdsを戻り値として返す | |||
return allUniqueIds; | |||
} | |||
function updateAllFlagUniqueIds(FlagUniqueIds) { | |||
// allUniqueIdsにUniqueIdsを追加または結合 | |||
if (allFlagUniqueIds.length === 0) { | |||
// allUniqueIdsが空の場合、UniqueIdsをそのままコピー | |||
allFlagUniqueIds = [...FlagUniqueIds];//スプレッド演算子で要素の中身を書き出す。 | |||
} else { | |||
FlagUniqueIds.forEach(id => { | |||
if (!allFlagUniqueIds.includes(id)) { | |||
allFlagUniqueIds.push(id); | |||
} | |||
}); | |||
} | |||
// 更新されたallUniqueIdsを戻り値として返す | |||
return allFlagUniqueIds; | |||
} | |||
let nscale = 0.68 | let nscale = 0.68 | ||
let nwidth = 1040; | let nwidth = 1040; | ||
68行目: | 142行目: | ||
stave1.setClef("treble").setContext(ctx); | stave1.setClef("treble").setContext(ctx); | ||
stave1.setTimeSignature('4/4').setContext(ctx); | stave1.setTimeSignature('4/4').setContext(ctx); | ||
stave1.draw(); | stave1.draw(); | ||
const notes1 = [ | const notes1 = [ | ||
new VF.StaveNote({ keys: [" | new VF.StaveNote({ keys: ["a/5"], duration: "1" }), | ||
]; | ]; | ||
//SteveNoteUniqueIds = getUniqueStaveNotesIds(notes1, [0]); | |||
//allFlagUniqueIds = updateAllFlagUniqueIds(SteveNoteUniqueIds); | |||
SteveNoteUniqueIds = getUniqueStaveNotesIds(notes1, [0 | |||
UniqueIds = getUniqueNoteheadIds(notes1[ | //UniqueIds = getUniqueNoteheadIds(notes1[0]); | ||
allUniqueIds = updateAllUniqueIds(UniqueIds); | //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 }); | ||
160行目: | 166行目: | ||
// 透明にするIDの配列 | // 透明にするIDの配列 | ||
// 例としてここでIDを指定 | // 例としてここでIDを指定 | ||
let autoUniqueIds = allUniqueIds.map(id => "vf-" + id); | let autoUniqueIds = allUniqueIds.map(id => "vf-" + id); | ||
172行目: | 179行目: | ||
path.setAttribute("fill", "none"); | path.setAttribute("fill", "none"); | ||
path.setAttribute("stroke", "none"); | path.setAttribute("stroke", "none"); | ||
}); | |||
} | |||
}); | |||
let autoFlagUniqueIds = allFlagUniqueIds.map(id => "vf-" + id); | |||
autoFlagUniqueIds.forEach(id => { | |||
// 該当するIDの要素を取得 | |||
let element = svgElement.getElementById(id); | |||
if (element) { | |||
// 該当する要素があれば、描画内容を透明にする | |||
let paths = element.querySelectorAll('path'); | |||
paths.forEach(path => { | |||
var dAttribute = path.getAttribute('d'); | |||
// カンマで区切られた数値の数を数えます | |||
var numberOfValues = (dAttribute.match(/,/g) || []).length + 1; // カンマの数 + 1 = 数値の数 | |||
if (numberOfValues === 9) { | |||
var firstCoord = dAttribute.split(',')[0]; | |||
if (dAttribute.startsWith('M')) { | |||
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時点における最新版
概要