// onwork0009 - ver 190228 lunch // 190226 night : add multi touch // 190228 lunch : alter key value to katakana //var inputfile='https://recruit-lattice.jp/wp-content/uploads/2018/01/test2.json'; var inputfile='https://recruit-lattice.jp/wp-content/uploads/2018/01/ElectricalFan_test1.json'; //var inputfile='hotx.gltf'; //var inputfile='ElectricalFan_test1.json'; window.onload = function() { var divPage = document.getElementById("page"); if(divPage){ var currentStyle = divPage.getAttribute("style"); if (currentStyle) { divPage.setAttribute("style", currentStyle + ";z-index: -1"); } else { divPage.setAttribute("style", "z-index: -1"); } console.log(divPage); } var button_vr = document.getElementById("button_vr"); if(button_vr){ //console.log(button_vr.onclick.toString()); button_vr.onclick = function (event) { //current_onclick(); testVRhtml(); var ctrlVowel = document.getElementById("ctrlVowel"); //console.log(ctrlVowel); ctrlVowel.style.visibility="visible"; webmidiinit(); } } //console.log(button_vr); } // test document.write("
" //+"" // D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z /* +""//onclick=\"modelprocXYZ(-1, 0, 0)\">" +""//onclick=\"modelprocXYZ(+1, 0, 0)\">" +""//onclick=\"modelprocXYZ( 0,-1, 0)\">" +""//onclick=\"modelprocXYZ( 0,+1, 0)\">" +""//onclick=\"moveCenter()\">" +""//onclick=\"modelprocXYZ( 0, 0,-1)\">" +""//onclick=\"modelprocXYZ( 0, 0,+1)\">" */ +""//onclick=\"modelprocXYZ(-1, 0, 0)\">" +""//onclick=\"modelprocXYZ(+1, 0, 0)\">" +""//onclick=\"modelprocXYZ( 0,-1, 0)\">" +""//onclick=\"modelprocXYZ( 0,+1, 0)\">" +""//onclick=\"moveCenter()\">" +""//onclick=\"modelprocXYZ( 0, 0,-1)\">" +""//onclick=\"modelprocXYZ( 0, 0,+1)\">" +"" +"
" +"
"); function sleep(sleeptime){ var time0 = new Date().getTime(); var time1 = new Date().getTime(); while (time1 < time0 + sleeptime){ time1 = new Date().getTime(); } return; } var currentval_range01 = -1; //document.getElementById("range01").value var isMouseOnInputRange01 = false; var elemRange01 = document.getElementById("range01"); elemRange01.onmousedown = function (){isMouseOnInputRange01 = true;} elemRange01.onmouseup = function (){isMouseOnInputRange01 = false;} console.log( elemRange01 ); if(window.TouchEvent){ // イベントリスナーに対応している if(window.addEventListener){ elemRange01.addEventListener("touchmove", function (itEvent){isMouseOnInputRange01 = true; } ); elemRange01.addEventListener("touchstart", function (itEvent){isMouseOnInputRange01 = true; } ); elemRange01.addEventListener("touchend", function (itEvent){isMouseOnInputRange01 = false; } ); // javascript フリック js - 一時的にスクロールを無効にする方法は? // https://code.i-harness.com/ja-jp/q/48c8e9 var elemEstmVowel = document.getElementById("estmVowel"); elemEstmVowel.addEventListener("touchmove", function (itEvent){itEvent.preventDefault(); } ); } } var elm_btnC = document.getElementById("btnC"); var elm_btnD = document.getElementById("btnD"); var elm_btnE = document.getElementById("btnE"); var elm_btnF = document.getElementById("btnF"); var elm_btnG = document.getElementById("btnG"); var elm_btnA = document.getElementById("btnA"); var elm_btnB = document.getElementById("btnB"); elm_btnC.onmouseup = function (){ eventOutC(); } elm_btnC.onmousedown = function (){ eventInC(0.8); } elm_btnD.onmouseup = function (){ eventOutD(); } elm_btnD.onmousedown = function (){ eventInD(0.8); } elm_btnE.onmouseup = function (){ eventOutE(); } elm_btnE.onmousedown = function (){ eventInE(0.8); } elm_btnF.onmouseup = function (){ eventOutF(); } elm_btnF.onmousedown = function (){ eventInF(0.8); } elm_btnG.onmouseup = function (){ eventOutG(); } elm_btnG.onmousedown = function (){ eventInG(0.8); } elm_btnA.onmouseup = function (){ eventOutA(); } elm_btnA.onmousedown = function (){ eventInA(0.8); } elm_btnB.onmouseup = function (){ eventOutB(); } elm_btnB.onmousedown = function (){ eventInB(0.8); } if(window.TouchEvent){ // イベントリスナーに対応している if(window.addEventListener){ elm_btnC.addEventListener("touchstart", function (itEvent){ eventInC(0.8); } ); elm_btnC.addEventListener("touchend", function (itEvent){ eventOutC(); } ); elm_btnD.addEventListener("touchstart", function (itEvent){ eventInD(0.8); } ); elm_btnD.addEventListener("touchend", function (itEvent){ eventOutD(); } ); elm_btnE.addEventListener("touchstart", function (itEvent){ eventInE(0.8); } ); elm_btnE.addEventListener("touchend", function (itEvent){ eventOutE(); } ); elm_btnF.addEventListener("touchstart", function (itEvent){ eventInF(0.8); } ); elm_btnF.addEventListener("touchend", function (itEvent){ eventOutF(); } ); elm_btnG.addEventListener("touchstart", function (itEvent){ eventInG(0.8); } ); elm_btnG.addEventListener("touchend", function (itEvent){ eventOutG(); } ); elm_btnA.addEventListener("touchstart", function (itEvent){ eventInA(0.8); } ); elm_btnA.addEventListener("touchend", function (itEvent){ eventOutA(); } ); elm_btnB.addEventListener("touchstart", function (itEvent){ eventInB(0.8); } ); elm_btnB.addEventListener("touchend", function (itEvent){ eventOutB(); } ); } } // mic range ctrl var coefScaleVol = 1.5; var coefRotBlade = 1.5; var coefPosSprt = 1.5; var userAgent = window.navigator.userAgent.toLowerCase(); // iOSのデバイス if(userAgent.indexOf('iphone') != -1 || userAgent.indexOf('ipad') != -1 || userAgent.indexOf('ipod') != -1) { } // Androidのfirefox if(userAgent.indexOf('android') != -1 && userAgent.indexOf('firefox') != -1) { } var objPosOrig = null; function parseChGetPos(groupObject3D, objPosOrig){ var n_ch = 0; for (n_ch = 0; n_ch < groupObject3D.children.length; n_ch++) { var target = groupObject3D.children[n_ch]; //if (target.name=='') {target.name = String(objPosOrig.length());} target.name = String(Object.keys(objPosOrig).length) +'_'+ target.name; objPosOrig[target.name] = target.position.clone(); objPosOrig = parseChGetPos(target, objPosOrig); //target.__dirtyPosition = true; //target.__dirtyRotation = true; } return objPosOrig; } function parseChAppCoef(groupObject3D, Coef){ var n_ch = 0; for (n_ch = 0; n_ch < groupObject3D.children.length; n_ch++) { var target = groupObject3D.children[n_ch]; if(target.name!=''){//console.log(target.name); var posorig = objPosOrig[target.name]; if (posorig.x != 0.0 || posorig.y != 0.0 || posorig.z != 0.0) { //target.position.set( Coef * posorig.x,Coef * posorig.y,Coef * posorig.z); target.position.x = Coef * posorig.x; target.position.y = Coef * posorig.y; target.position.z = Coef * posorig.z; target.updateMatrix(); } } parseChAppCoef(target, Coef); } } function parseChResetPos(groupObject3D){ parseChAppCoef(groupObject3D, 1.0); }; function init_objPosOrig(){ var iframe1 = document.getElementById("iframe1"); var winelem =iframe1.contentWindow; var element = iframe1.contentDocument.getElementById("div_a-scene"); var element2 = iframe1.contentDocument.getElementById("obj2"); var groupObject3D = element2.object3D; if(objPosOrig == null) { console.log("objPosOrig==null"); objPosOrig = {}; objPosOrig = parseChGetPos(groupObject3D, objPosOrig); }else{parseChResetPos(groupObject3D);} console.log(objPosOrig); } var scaleScaleVol = 1.0; var scalePosSprt = 1.0; function moveCenter(){ var iframe1 = document.getElementById("iframe1"); var winelem =iframe1.contentWindow; var element = iframe1.contentDocument.getElementById("div_a-scene"); var rotcamera = iframe1.contentDocument.getElementById('camera'); var curposition = rotcamera.getAttribute('position'); var rottarget = iframe1.contentDocument.getElementById('obj'); //console.log(rottarget); var rotation = rottarget.getAttribute('rotation'); // console.log(rotation); //curposition.x = 0; //curposition.y = 0; //rottarget.setAttribute('rotation', rotation); //rotcamera.setAttribute('position', curposition); /* scaleScaleVol = 1.0; scalePosSprt = 1.0; var scale = rottarget.getAttribute('scale'); if (scale == null) {scale = new THREE.Vector3();} scale.x = 1.0; scale.y = 1.0; scale.z = 1.0; rottarget.setAttribute('scale', scale); if(objPosOrig != null){ var element2 = iframe1.contentDocument.getElementById("obj2"); var groupObject3D = element2.object3D; parseChResetPos(groupObject3D); } document.getElementById("range01").value = 0.0; if(intervalId != null) { isMouseOnInputRange01 = true; } */ var curposition = rottarget.getAttribute('position'); if (curposition == null) {curposition = new THREE.Vector3();} curposition.x *= scaleScaleVol*0.5; curposition.y *= scaleScaleVol*0.5; curposition.z *= scaleScaleVol*0.5; if(Math.abs(curposition.x) < 0.01) {curposition.x = 0;} if(Math.abs(curposition.y) < 0.01) {curposition.y = 0;} if(Math.abs(curposition.z) < 0.01) {curposition.z = 0;} rottarget.setAttribute('position', curposition); } function ctrlRotBlade() { var iframe1 = document.getElementById("iframe1"); console.log(iframe1.contentWindow); var winelem =iframe1.contentWindow; var element = iframe1.contentDocument.getElementById("div_a-scene"); console.log(element); var element2 = iframe1.contentDocument.getElementById("obj2"); console.log(element2); // https://github.com/aframevr/aframe/blob/master/docs/core/entity.md var groupObject3D = element2.object3D; //console.log(groupObject3D.parent); var targetrot = groupObject3D.children[0].children[0].children[0].children[1]; // Blade_Assy var val_range01 = document.getElementById("range01").value * 1.0 / 255; var varOpe = val_range01; var coefrot = varOpe*0.85; //console.log(element2.object3D.children[0].children[0].children[0].children[1].children[2].name); element2.object3D.children[0].children[0].children[0].children[1].children[2].rotateZ(-coefrot); element2.object3D.children[0].children[0].children[0].children[1].children[2].updateMatrix(); } function modelproc() { console.log("modelproc"); if(recogCommand == null) {return;} noticeBox3.textContent = recogCommand; if(recogCommand == '中'){moveCenter();return;} if(recogCommand == '羽'){ctrlRotBlade();return;} var iframe1 = document.getElementById("iframe1"); var winelem =iframe1.contentWindow; var element = iframe1.contentDocument.getElementById("div_a-scene"); var rotcamera = iframe1.contentDocument.getElementById('camera'); var curposition = rotcamera.getAttribute('position'); //console.log(curposition); // //var rotation = rotcamera.getAttribute('rotation'); // //console.log(rotation); var rottarget = iframe1.contentDocument.getElementById('obj'); //console.log(rottarget); var rotation = rottarget.getAttribute('rotation'); // console.log(rotation); var scaleScaleVol = 1.0; var val_range01 = document.getElementById("range01").value * 1.0 / 255; scaleScaleVol = val_range01 * 5; var curposition = rottarget.getAttribute('position'); if (curposition == null) {curposition = new THREE.Vector3();} if(recogCommand == '右') curposition.x += scaleScaleVol*scalePosSprt; if(recogCommand == '左') curposition.x -= scaleScaleVol*scalePosSprt; if(recogCommand == '上') curposition.y += scaleScaleVol*scalePosSprt; if(recogCommand == '下') curposition.y -= scaleScaleVol*scalePosSprt; if(recogCommand == '前') curposition.z += scaleScaleVol*scalePosSprt; if(recogCommand == '奥') curposition.z -= scaleScaleVol*scalePosSprt; rottarget.setAttribute('position', curposition); recogCommand = null; } function modelprocXYZ(midi_x,midi_y,midi_z) { var iframe1 = document.getElementById("iframe1"); var winelem =iframe1.contentWindow; var element = iframe1.contentDocument.getElementById("div_a-scene"); var rotcamera = iframe1.contentDocument.getElementById('camera'); var curposition = rotcamera.getAttribute('position'); var rottarget = iframe1.contentDocument.getElementById('obj'); var rotation = rottarget.getAttribute('rotation'); var scaleScaleVol = 1.0; var val_range01 = document.getElementById("range01").value * 1.0 / 255; scaleScaleVol = val_range01 * 5; var curposition = rottarget.getAttribute('position'); if (curposition == null) {curposition = new THREE.Vector3();} if(midi_x > 0) curposition.x += scaleScaleVol*scalePosSprt; if(midi_x < 0) curposition.x -= scaleScaleVol*scalePosSprt; if(midi_y > 0) curposition.y += scaleScaleVol*scalePosSprt; if(midi_y < 0) curposition.y -= scaleScaleVol*scalePosSprt; if(midi_z > 0) curposition.z += scaleScaleVol*scalePosSprt; if(midi_z < 0) curposition.z -= scaleScaleVol*scalePosSprt; rottarget.setAttribute('position', curposition); recogCommand = null; } window.AudioContext = window.AudioContext ||window.webkitAudioContext ||window.mozAudioContext ||window.oAudioContext ||window.msAudioContext; var intervalId = null; var intervalfunc = null; // https://qiita.com/ShoheiOno/items/34ae96c2563586982490 // MIDI Key var midiKeyStatus = { C : 0, D : 0, E : 0, F : 0, G : 0, A : 0, B : 0, }; var midiKeyXYZreserved = { X : 0, Y : 0, Z : 0 } function eventInC(eventVal){ modelprocXYZ( 0, 0,+1); midiKeyStatus.C = eventVal; if(midiKeyXYZreserved.Z == 0){midiKeyXYZreserved.Z = +1} } function eventInD(eventVal){ modelprocXYZ(-1, 0, 0); midiKeyStatus.D = eventVal; if(midiKeyXYZreserved.X == 0){midiKeyXYZreserved.X = -1} } function eventInE(eventVal){ modelprocXYZ(+1, 0, 0); midiKeyStatus.E = eventVal; if(midiKeyXYZreserved.X == 0){midiKeyXYZreserved.X = +1} } function eventInF(eventVal){ modelprocXYZ( 0,-1, 0); midiKeyStatus.F = eventVal; if(midiKeyXYZreserved.Y == 0){midiKeyXYZreserved.Y = -1} } function eventInG(eventVal){ modelprocXYZ( 0,+1, 0); midiKeyStatus.G = eventVal; if(midiKeyXYZreserved.Y == 0){midiKeyXYZreserved.Y = +1} } function eventInA(eventVal){ moveCenter(); midiKeyStatus.A = eventVal; } function eventInB(eventVal){ modelprocXYZ( 0, 0,-1); midiKeyStatus.B = eventVal; if(midiKeyXYZreserved.Z == 0){midiKeyXYZreserved.Z = -1} } function eventOutC(){ midiKeyStatus.C = 0; if(midiKeyStatus.B > 0){midiKeyXYZreserved.Z = -1} else {midiKeyXYZreserved.Z = 0} // C } function eventOutD(){ midiKeyStatus.D = 0; if(midiKeyStatus.E > 0){midiKeyXYZreserved.X = +1} else {midiKeyXYZreserved.X = 0} // D } function eventOutE(){ midiKeyStatus.E = 0; if(midiKeyStatus.D > 0){midiKeyXYZreserved.X = -1} else {midiKeyXYZreserved.X = 0} // E } function eventOutF(){ midiKeyStatus.F = 0; if(midiKeyStatus.G > 0){midiKeyXYZreserved.Y = +1} else {midiKeyXYZreserved.Y = 0} // F } function eventOutG(){ midiKeyStatus.G = 0; if(midiKeyStatus.F > 0){midiKeyXYZreserved.Y = -1} else {midiKeyXYZreserved.Y = 0} // G } function eventOutA(){ midiKeyStatus.A = 0; // A } function eventOutB(){ midiKeyStatus.B = 0; if(midiKeyStatus.C > 0){midiKeyXYZreserved.Z = +1} else {midiKeyXYZreserved.Z = 0} // B } // MIDIデバイス var midiDevices = { inputs: {}, outputs: {} }; function webmidiinit() { console.log("webmidiinit"); /* // 成功したときの処理 function requestSuccess(data) { console.log('success!!!', data); } */ // 成功したときの処理 function requestSuccess(data) { // Inputデバイスの配列を作成 var inputIterator = data.inputs.values(); for (var input = inputIterator.next(); !input.done; input = inputIterator.next()) { var value = input.value; // デバイス情報を保存 midiDevices.inputs[value.name] = value; // イベント登録 value.addEventListener('midimessage', inputEvent, false); } /* // Outputデバイスの配列を作成 var outputIterator = data.outputs.values(); for (var output = outputIterator.next(); !output.done; output = outputIterator.next()) { var value = output.value; // デバイス情報を保存 midiDevices.outputs[value.name] = value; } */ } // 失敗したときの処理 function requestError(error) { console.error('error!!!', error); } // MIDIデバイスにアクセスする function requestMIDI() { if (navigator.requestMIDIAccess) { navigator.requestMIDIAccess().then(requestSuccess, requestError); } else { requestError(); } } requestMIDI(); // interval intervalfunc = function(){ var x_chk = 0; var y_chk = 0; var z_chk = 0; //console.log("x : " + x_chk + " y : " + y_chk + " z : " + z_chk); //console.log(midiKeyXYZreserved); //console.log(midiKeyStatus); if(midiKeyXYZreserved.X == -1) {x_chk = midiKeyXYZreserved.X * midiKeyStatus.D; } if(midiKeyXYZreserved.X == +1) {x_chk = midiKeyXYZreserved.X * midiKeyStatus.E; } if(midiKeyXYZreserved.Y == -1) {y_chk = midiKeyXYZreserved.Y * midiKeyStatus.F; } if(midiKeyXYZreserved.Y == +1) {y_chk = midiKeyXYZreserved.Y * midiKeyStatus.G; } if(midiKeyXYZreserved.Z == -1) {z_chk = midiKeyXYZreserved.Z * midiKeyStatus.B; } if(midiKeyXYZreserved.Z == +1) {z_chk = midiKeyXYZreserved.Z * midiKeyStatus.C; } if( x_chk != 0 || y_chk != 0 || z_chk != 0) { modelprocXYZ( x_chk, y_chk, z_chk ); } if(midiKeyStatus.A > 0) { moveCenter(); } }; intervalId = setInterval(intervalfunc, 10); }; // webmidiinit // Inputを受け取ったときのイベント function inputEvent(e) { var target = e.target; //var device = midiDevices.outputs[target.name]; var message = ''; var numArray = []; // 2桁の16進数にして表示する event.data.forEach(function(val) { numArray.push(('00' + val.toString(16)).substr(-2)); }); message = numArray.join(' '); // InputしたDeviceに結果を送信する //device.send(e.data); // 2桁の16進数を表示 console.log(message); if(event.data[0] == 8*16) { switch (event.data[1] % 12) { // D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z case 0 : eventOutC(); break; // C case 2 : eventOutD(); break; // D case 4 : eventOutE(); break; // E case 5 : eventOutF(); break; // F case 7 : eventOutG(); break; // G case 9 : eventOutA(); break; // A case 11 : eventOutB(); break; // B } } else if(event.data[0] == 9*16) { switch (event.data[1] % 12) { // D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z case 0 : eventInC(event.data[2]/80); break; // C case 2 : eventInD(event.data[2]/80); break; // D case 4 : eventInE(event.data[2]/80); break; // E case 5 : eventInF(event.data[2]/80); break; // F case 7 : eventInG(event.data[2]/80); break; // G case 9 : eventInA(event.data[2]/80); break; // A case 11 : eventInB(event.data[2]/80); break; // B } } } // inputEvent // https://www.ipentec.com/document/javascript-accept-keydown // https://web-designer.cman.jp/javascript_ref/keyboard/keycode/ var bStatusShift = false; var bStatusCtrl = false; // apple logic 1.5oct C-F : ASDFGHJKL;: -> 65 83 68 70 71 72 74 75 76 186 186 ... document.onkeyup = function (e){ switch (e.keyCode) { // D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z case 75 : case 65 : eventOutC(); break; // C case 83 : eventOutD(); break; // D case 68 : eventOutE(); break; // E case 70 : eventOutF(); break; // F case 71 : eventOutG(); break; // G case 72 : eventOutA(); break; // A case 74 : eventOutB(); break; // B case 16 : buttonValShift(false); break; // shift case 17 : buttonValCtrl(false); break; // ctrl } } document.onkeydown = function (e){ switch (e.keyCode) { // D :-x, E :+x, F :-y, G:+y, A:c, B:-z, C:+z case 75 : case 65 : eventInC(1); break; // C case 83 : eventInD(1); break; // D case 68 : eventInE(1); break; // E case 70 : eventInF(1); break; // F case 71 : eventInG(1); break; // G case 72 : eventInA(1); break; // A case 74 : eventInB(1); break; // B case 16 : buttonValShift(true); break; // shift case 17 : buttonValCtrl(true); break; // ctrl } } /* var elm_btnC = document.getElementById("btnC"); var elm_btnD = document.getElementById("btnD"); var elm_btnE = document.getElementById("btnE"); var elm_btnF = document.getElementById("btnF"); var elm_btnG = document.getElementById("btnG"); var elm_btnA = document.getElementById("btnA"); var elm_btnB = document.getElementById("btnB"); */ function buttonValShift(bIn) { // A[SDFGHJK];: if(bIn){ bStatusShift = true; elm_btnD.value = "S"; elm_btnE.value = "D"; elm_btnF.value = "F"; elm_btnG.value = "G"; elm_btnA.value = "H"; elm_btnB.value = "J"; elm_btnC.value = "K"; } else{ bStatusShift = false; if(bStatusCtrl) {buttonValCtrl(true); return;} elm_btnD.value = "レ"; elm_btnE.value = "ミ"; elm_btnF.value = "ファ"; elm_btnG.value = "ソ"; elm_btnA.value = "ラ"; elm_btnB.value = "シ"; elm_btnC.value = "ド"; } } function buttonValCtrl(bIn) { // A[SDFGHJK];: if(bIn){ bStatusCtrl = true; elm_btnD.value = "-x"; elm_btnE.value = "+x"; elm_btnF.value = "-y"; elm_btnG.value = "+y"; elm_btnA.value = "c"; elm_btnB.value = "-z"; elm_btnC.value = "+z"; } else{ bStatusCtrl = false; if(bStatusShift) {buttonValShift(true); return;} elm_btnD.value = "レ"; elm_btnE.value = "ミ"; elm_btnF.value = "ファ"; elm_btnG.value = "ソ"; elm_btnA.value = "ラ"; elm_btnB.value = "シ"; elm_btnC.value = "ド"; } }